检查当前语言中是否存在项目?

时间:2011-11-22 18:39:04

标签: sitecore

我有一个Sitecore解决方案,其中启用了3种不同的语言。在页面顶部,有一个指向每种语言的链接。单击此链接后,您将以所选语言获取当前页面。

但并非所有页面都翻译成所有语言。因此,如果我站在第x页上的英语,并且此页面仅提供英语和德语,但不提供中文,则不应显示中文链接。

所以问题是 - 如何检查当前项目是否具有特定语言的版本?

7 个答案:

答案 0 :(得分:14)

要查看当前项目的版本是否可以执行此操作:Sitecore.Context.Item.Versions.Count > 0

[更新评论]

我并不是说这是确定某个项目是否包含某种语言版本的最有效方法,但这样可行:

bool hasVersion = HasLanguageVersion(Sitecore.Context.Item, "en");

private bool HasLanguageVersion(Sitecore.Data.Items.Item item, string languageName)
{
    var language = item.Languages.FirstOrDefault(l => l.Name == languageName);
    if (language != null)
    {
        var languageSpecificItem = global::Sitecore.Context.Database.GetItem(item.ID, language);
        if (languageSpecificItem != null && languageSpecificItem.Versions.Count > 0)
        {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:6)

您可以检索项目内容语言的集合(LanguageCollection)(即项目具有内容的语言)。

  LanguageCollection collection = ItemManager.GetContentLanguages(Sitecore.Context.Item);
  foreach (var lang in collection)
  {
      var itm = Sitecore.Context.Database.GetItem(Sitecore.Context.Item.ID,lang);                  
      if(itm.Versions.Count > 0)
      {
          Response.Write("Found language " + lang + "<br />");
      }
  }

希望这会有所帮助:)

NB :添加评论dude ..请不要随意编辑我的答案。这是粗鲁的高度。

编辑:更正..原来该方法没有考虑现有语言的版本.---

澄清一下,ItemManager.GetContentLanguages没有为您提供给定项目的语言列表。它提供了您选择在您的环境中包含的所有语言的列表。在引擎盖下,它做两件事(基于sitecore 7.2的反编译代码):

  1. 它调用LanguageManager.GetLanguages(item.Database));
  2. 它通过调用item.Database.DataManager.DataSource.GetLanguages(item.ID);
  3. 将此步骤1中尚未添加的任何语言添加到此处

答案 2 :(得分:1)

如果列表中有上下文项,请使用Linq表达式:

List<Item> languageContentItems = 
contentItems.Where(x=> x.Version != null && x.Versions.Count > 0).ToList();

我完全混淆了为什么x.Version.Number与使用x.Versions.Count不正确的语法,因为x.Versions inline-documentation表明它返回该项的所有语言版本,这意味着当我们真的只想查看该项目是否具有当前上下文语言的版本时,x.Versions.Count应返回所有语言中所有版本的计数。

答案 3 :(得分:1)

这对我来说就像魅力一样:

item.Versions.GetVersions(false).Any();

答案 4 :(得分:0)

查看此帖子,了解一个方法,该方法返回项目包含版本的语言列表:https://stackoverflow.com/a/31351810/551811

答案 5 :(得分:0)

我在Item上使用以下扩展方法。这假设您有一个项目可以从当然开始。

  public static bool HasVersionInLanguage(this Item item, Sitecore.Globalization.Language lang)
  {
        return ItemManager.GetVersions(item, lang).Any();
  }

如果您没有内存中的项目,可以将其更改为“正常”状态。方法并将项目的ID作为第二个参数传递..

public bool HasVersionInLanguage(ID itemId, Sitecore.Globalization.Language lang)
{
     return ItemManager.GetVersions(item, lang).Any();
}

答案 6 :(得分:0)

有时不要忘记后备选项

 if (item.Versions.Count > 0 && !item.IsFallback)

会更好