2011-11-22 21 views
9

Tengo una solución de Sitecore donde hay 3 idiomas diferentes habilitados. En la parte superior de la página, hay un enlace a cada idioma. Cuando hace clic en este enlace, obtiene la página actual en la que se encuentra, en el idioma seleccionado.Verifique si los artículos existen en el idioma actual?

Pero no todas las páginas están traducidas a todos los idiomas. Entonces, si estoy parado en la página x en idioma inglés, y esta página solo está disponible en inglés y alemán, pero no en chino, entonces no se debe mostrar el enlace chino.

Entonces la pregunta es: ¿cómo puedo verificar si el elemento actual tiene una versión de un idioma específico?

Respuesta

13

Para ver si hay una versión del elemento actual se puede hacer esto: Sitecore.Context.Item.Versions.Count > 0

[actualizado para hacer comentarios]

No pretendo que esta es la forma más eficiente para determinar Si un artículo tiene una versión en un idioma, pero esto va a funcionar:

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; 
} 
+0

Pero digo que estoy en el idioma inglés y quiero comprobar si hay una versión en alemán del artículo actual, ¿cómo lo haré? – brother

+0

Use "Sitecore.Context.Item.Versions.GetLatestVersion (language)" –

+0

@Alex, ese método devolverá el artículo en el idioma, pero igual tendrá que verificar si Versions.Count> 0. –

6

Es posible recuperar una colección (LanguageCollection) de los artículos de idiomas de contenido (es decir, los idiomas para que la. el artículo tiene contenido).

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 />"); 
     } 
    } 

Espero que esto ayude :)

NB: Añadir un comentario tio .. Por favor, no acaba de hacer cambios al azar a mi respuesta. Este es el colmo de la rudeza.

Editar: Corrección .. Resulta que el método no tiene en cuenta las versiones de que el lenguaje existente .---

para aclarar, ItemManager.GetContentLanguages ​​no le consigue la lista de idiomas en un artículo dado. Proporciona la lista de todos los idiomas que ha elegido incluir en su entorno. Debajo del capó, hace 2 cosas (basado en código descompilado para el sitio 7.2):

  1. llama a LanguageManager.GetLanguages ​​(item.Database));
  2. agrega a esto cualquier idioma que no haya sido agregado en el paso 1 al llamar a item.Database.DataManager.DataSource.GetLanguages ​​(item.ID);
1

Si usted tiene los elementos de contexto en una lista, utilice una expresión LINQ:

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

estoy totalmente confundido en cuanto a por qué x.Version.Number no sería la sintaxis correcta vs .utilizando x.Versions.Count porque la documentación en línea de x.Versions indica que devuelve todas las versiones de idioma del elemento, lo que significa que x.Versions.Count debe devolver un recuento de todas las versiones en todos los idiomas, cuando realmente solo desea ver si el artículo tiene una versión para el idioma de contexto actual.

0

utilizo el siguiente método de extensión sobre el punto. Esto supone que tienes un elemento para empezar, por supuesto.

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

Si usted no tiene el artículo en la memoria que podría cambiar esto a un método 'normal' y pasar el ID del tema como un segundo parámetro ..

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

Esto funciona como encanto para mí:

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