2012-08-27 15 views
5

He estado tratando de resolver este problema desde esta mañana, y sé que me falta algo obvio aquí, pero parece que no puedo encontrarlo.Uso de cadenas de traducción en los enlaces de componentes

Estamos utilizando un archivo XML que se publica en el servidor que contiene traducciones de todas las palabras estándar, como 'leer más'. Es una página con un componente que está localizado en la publicación apropiada.

En nuestras plantillas Razor utilizamos el siguiente código debajo de un elemento de resumen de noticias simple que a su vez vincula al artículo completo.

<a tridion:href="@news.ID" class="more" ><%=DefaultLabels.TranslatedTerm(((HomePage)Page).Location, "read_more")%></a> 

La cosa es que la etiqueta del servidor funciona muy bien, pero se resuelve como

<tridion:ComponentLink runat="server" PageURI="tcm:15-407-64" ComponentURI="tcm:15-1475" TemplateURI="tcm:0-0-0" AddAnchor="false" LinkText="&lt;%= DefaultLabels.TranslatedTerm(((HomePage)Page).Location, &#34;read_more&#34;) %&gt;" LinkAttributes=" class=&#34;more&#34;" TextOnFail="true"/> 

Como se puede notar, que se escribe como texto sin formato en la página (no hay sorpresa porque el parámetro LinkText se declara como cadena en primer lugar de acuerdo con LiveDocs).

Si yo quite la

tridion:href 

en el primer ejemplo, y escribo como

href 

Funciona bien, el código se resuelve en una cadena traducida y es aún vinculado ... a nada más que la ID TCM del componente, no la página correcta con la noticia completa en él.

He intentado crear una función en Razor, intenté reemplazar el texto de enlace, intenté configurar el ComponentLink en la plantilla, pero fue en vano. Siento que debería funcionar con solo un pequeño ajuste en el código de esta plantilla, pero no lo veo y comencé a buscar TBB personalizados para manejar el código.

¿Alguien tiene una idea de cómo resolver esto?

EDIT:

respuesta de Chris era en realidad el que yo estaba buscando en esta situación particular, pero siento que debo señalar que la función de Priyank es algo que debe ser considerado como tal también. Así que gracias a los dos por la ayuda, ¡me hizo la vida algo más fácil ahora!

Respuesta

2

Yo sugeriría que no utilizan las plantillas predeterminadas para la resolución de sus enlaces, en lugar de salida del enlace a sí mismo algo como esto:

<tridion:ComponentLink runat="server" PageURI="tcm:15-407-64" 
    ComponentURI="tcm:15-1475" TemplateURI="tcm:0-0-0" 
    AddAnchor="false" LinkAttributes=" class=&#34;more&#34;" 
    TextOnFail="true"> 
     <%=DefaultLabels.TranslatedTerm(((HomePage)Page).Location, &#34;read_more&#34;) %> 
</tridionComponentLink> 

Mejor aún que podría considerar la salida TCDL en lugar de la Taglib/ServerControl

+0

Chris, ¿podría explicar por qué no debería usar las plantillas predeterminadas para resolver enlaces y usar esta sintaxis en su lugar? ¿Y qué pasa con la salida de TCDL? Gracias. – MDa

+1

El valor predeterminado "Resolver enlaces TBB" encuentra todos los enlaces que contienen TCM URI, y los convierte a TCDL, que más tarde se convierte a REL, JSP, ASP.NET etc. Construye el TCDL colocando el texto del enlace en un atributo (que para usted no está siendo ejecutado por su control ASP.NET).Para hacer que su código se ejecute, lo más fácil es que el texto del enlace (o en su caso un poco de código) en el cuerpo de la etiqueta (en lugar de un atributo). El código que proporcioné directamente hace referencia al control del servidor ComponentLink que cargará el texto del enlace del cuerpo del control si no está en el atributo. –

8

Espero que esta función de afeitar te ayude mucho. Esta es una función muy útil para representar la etiqueta de enlace desde el enlace del componente o el enlace externo.

@helper RenderLink(
    dynamic link,      // the link to render. Handles components + internal/external links 
    string cssClass = null,    // optional custom CSS class 
    string title = null     // optional link text (default is the title of the component being linked to) 
    ) 
{ 
    if(link == null) 
    { 
      return; 
    } 

    if (title == null) 
    { 
     title = link.title; 
    } 

    string classAttr = string.IsNullOrEmpty(cssClass) ? "" : " class='" + cssClass + "'"; 
    dynamic href; 
    string tridionLink = ""; 
    string targetAttr = ""; 

    if (link.Schema.Title == "External Link") 
    { 
     href = link.link; 
    } 
    else if (link.Schema.Title == "Internal Link") 
    { 
     href = link.link; 
     tridionLink = "tridion:"; 
    } 
    else 
    { 
     href = link; 
     tridionLink = "tridion:"; 
    }  

    if(link.target != null) 
    { 
     targetAttr = link.target == "New window" || link.target == "Popup" ? " target='_blank'" : ""; 
    }  

    <a @(tridionLink)href="@href"@[email protected]>@title</a> 
} 
Cuestiones relacionadas