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

Sitecore 检查项目是否以当前语言存在?,sitecore,Sitecore,我有一个Sitecore解决方案,其中启用了3种不同的语言。在页面顶部,有一个指向每种语言的链接。当您单击此链接时,您将获得所选语言的当前页面 但并非所有页面都能翻译成所有语言。因此,如果我站在英文版的第x页,而该页只有英文版和德文版,但没有中文版,则不应显示中文链接 所以问题是-如何检查当前项目是否有特定语言的版本?要查看当前项目是否有版本,可以执行以下操作:Sitecore.Context.item.Versions.Count>0 [更新以供评论] 我并不认为这是确定项目是否有语言版本的最

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

但并非所有页面都能翻译成所有语言。因此,如果我站在英文版的第x页,而该页只有英文版和德文版,但没有中文版,则不应显示中文链接


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

要查看当前项目是否有版本,可以执行以下操作:
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;
}

您可以检索项目内容语言(即项目包含内容的语言)的集合(
LanguageCollection

LanguageCollection collection=ItemManager.GetContentLanguages(Sitecore.Context.Item);
foreach(集合中的变量lang)
{
var itm=Sitecore.Context.Database.GetItem(Sitecore.Context.Item.ID,lang);
如果(itm.Versions.Count>0)
{
回答。写(“发现语言”+lang+“
”); } }
希望这有帮助:)

NB:添加一条评论。。请不要随便修改我的答案。这是最无礼的

编辑:更正。。结果表明,该方法不考虑该语言的现有版本---

为了澄清,ItemManager.GetContentLanguages不会为您提供给定项上的语言列表。它给出了您选择在环境中包括的所有语言的列表。在幕后,它做了两件事(基于sitecore 7.2的反编译代码):

  • 它调用LanguageManager.GetLanguages(item.Database))
  • 它通过调用item.Database.DataManager.DataSource.GetLanguages(item.ID)将步骤1中尚未添加的任何语言添加到该文件中
    如果列表中有上下文项,请使用Linq表达式:

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

    我完全搞不懂为什么x.Version.Number与使用x.Versions.Count相比语法不正确,因为x.Versions内联文档声明它返回项目的所有语言版本,这意味着x.Versions.Count应该返回所有语言的所有版本的计数,当我们真的只想查看该项是否有当前上下文语言的版本时。

    请看这篇文章中的一个方法,该方法返回一个项有版本的语言列表:

    我对该项使用以下扩展方法。当然,这假设您有一个项目要开始

      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();
    }
    

    这对我来说很有魅力:

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

    有时不要忘记回退选项

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

    会更好

    但是如果我使用英语,我想检查当前项目是否有德语版本-我将如何进行?使用“Sitecore.Context.item.Versions.GetLatestVersion(language)”@Alex,该方法将以该语言返回项目,但是您仍然需要检查版本。计数>0。这对我不起作用。。。它总是告诉我语言版本不存在…为了更有效地检查:
     if (item.Versions.Count > 0 && !item.IsFallback)