Проверьте, существуют ли элементы на текущем языке?

У меня есть решение Sitecore, в котором есть 3 разных языка. В верхней части страницы есть ссылка на каждый язык. Когда вы нажимаете эту ссылку, вы получаете текущую страницу, на которой вы находитесь, на выбранном языке.

Но не все страницы переведены на все языки. Поэтому, если я стою на странице x на английском языке, и эта страница доступна только на английском и немецком языках, но не на китайском, тогда китайская ссылка не должна отображаться.

Итак, вопрос: как проверить, имеет ли текущий элемент версию определенного языка?

Ответ 1

Чтобы узнать, есть ли версия текущего элемента, вы можете сделать это: 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;
}

Ответ 2

Вы можете получить коллекцию (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: добавьте комментарий чувак.. пожалуйста, просто не делайте случайные изменения в свой ответ. Это высота грубости.

Изменить: Исправление.. Оказывается, метод не учитывает версии существующего языка.---

чтобы уточнить, ItemManager.GetContentLanguages ​​не дает вам список языков для данного элемента. Он дает список всех языков, которые вы включили в свою среду. Под капотом он делает 2 вещи (на основе декомпилированного кода для sitecore 7.2):

  • он вызывает LanguageManager.GetLanguages ​​(item.Database));
  • он добавляет к этому любые языки, которые еще не добавлены шагом 1, вызывая item.Database.DataManager.DataSource.GetLanguages ​​(item.ID);

Ответ 3

Если у вас есть элементы контекста в списке, используйте выражение Linq:

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

Я полностью смущен тем, почему x.Version.Number не будет правильным синтаксисом против использования x.Versions.Count, потому что встроенная документация x.Versions заявляет, что возвращает все языковые версии элемента, что означает, что x.Versions.Count должен возвращать количество всех версий на всех языках, когда мы действительно хотим видеть, имеет ли элемент версию для текущего языка.

Ответ 4

Это работает как прелесть для меня:

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

Ответ 5

взгляните на этот пост для метода, который возвращает список языков, в которых элемент имеет версии: fooobar.com/questions/586194/...

Ответ 6

Я использую следующий метод расширения для элемента. Это предполагает, что у вас есть предмет, чтобы начать, конечно.

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

Если у вас нет элемента в памяти, вы можете изменить его на "обычный" метод и передать идентификатор элемента в качестве второго параметра.

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

Ответ 7

иногда не забывайте про запасной вариант

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

будет работать лучше