2012-03-08 12 views
7

tl; dr: Estoy buscando un método elegante de internacionalización en las plantillas de Jade. Esencialmente, el problema se reduce a que tengo que hacer interpolación en cadenas en variables, en lugar de código literal.I18N con Express/Jade: cadenas con etiquetas incrustadas e interpolación

Detalles del problema:

en una plantilla de Jade monolingüe sólo puedo hacer que un elemento con las etiquetas y las variables asociadas de esta manera:

p Posted by 
    span.author= post.author 
    | on 
    span.date= post.author 

a conseguir algo como

<p>Posted by <span style="author">The Author</span> on 
<span style="date">2012-03-08</span></p> 

Pero cuando Quiero internacionalizar esto, necesito una sola cadena, ya que el orden de las palabras no es el mismo en todos los idiomas. Además, me gustaría ocultar los detalles del HTML de traductores, y sólo les dan una línea como esta:

Posted by #{author} on #{date} 

Ahora cuando pase la versión i18n-ed de esta cadena a la plantilla de Jade como i18n.posted_by_on, se no va a hacer la interpolación en él, así que lo mejor que puedo hacer es:

- var author = '<span class="author">$</span>'.replace('$',post.author); 
- var date = '<span class="date">$</span>'.replace('$',post.date); 
- var header = i18n.posted_by_on 
     .replace('#{author}',author) 
     .replace('#{date}',date); 
p!= header 

Esta mayoría se pierde el punto de la bonita plantillas Jade, ya que tengo que hacer toda la interpolación de forma manual. ¿Hay algún método que lo haga de forma más agradable, compacta y legible?

Respuesta

4

posible que haya encontrado una solución a estas alturas (en caso afirmativo, informe a nosotros lo que es), pero si no lo hizo, es posible que desee mirar la biblioteca i18next-node. Es compatible con las variables, por lo que podría hacer cosas como:

// Localized resources 
{   
    'en-GB': { 
    translation: { 
     space_temperature_is: 'Space temperature is __COUNT__ degrees Celsius.' 
    } 
    } 
    'fr-FR': { 
    translation: { 
     space_temperature_is: 'Température de l'espace est de __COUNT__ degrés Celsius.' 
    } 
    } 
}; 

A continuación, en la plantilla de jade, que haría:

// This translates to "Space temperature is 28 degrees Celsius." 
i18n.t('space_temperature_is', { COUNT: 28 }); 

La biblioteca está muy bien documentada, pero, si estás en A toda prisa, aquí está an article que encontré útil como una introducción rápida.

+0

Nunca encontré una respuesta (se cambiaron las prioridades), pero parece que encaja, así que lo aceptaré :) –

3

Como podemos ver en el corto doc, hay una función de estilo sprinf https://github.com/mashpie/i18n-node Creo que esto le ayudaría a achive se meta

+0

Hola, disculpe la respuesta un poco tarde :). Esa herramienta no parece ajustarse a la factura porque usa argumentos posicionales. –

Cuestiones relacionadas