带有Express / Jade的I18N:具有嵌入式标签和插值的字符串

时间:2012-03-08 10:14:03

标签: internationalization express template-engine pug

tl;博士:我正在寻找一种在Jade模板中进行国际化的优雅方法。本质上问题归结为我必须对变量中的字符串进行插值,而不是逐字代码。

问题详情:

在单语Jade模板中,我可以创建一个带有嵌入式标签和变量的元素,如下所示:

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

获得类似

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

但是当我想要将其国际化时,我需要一个字符串,因为每种语言的字顺序都不一样。此外,我想隐藏翻译人员的html详细信息,并给他们这样一行:

Posted by #{author} on #{date}

现在,当我将此字符串的i18n-ed版本作为i18n.posted_by_on传递给Jade模板时,它不会对其进行插值,所以我能做的最好的是:

- 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

这主要取决于漂亮的Jade模板,因为我必须手动进行所有插值。是否有任何方法更好,更紧凑,可读?

2 个答案:

答案 0 :(得分:5)

您现在可能已找到解决方案(如果是,请告诉我们它是什么),但如果您没有,则可能需要查看i18next-node库。它支持变量,因此您可以执行以下操作:

// 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.'
     }
   }
};

然后,在你的玉器模板中,你会这样做:

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

图书馆的文档确实很好,但是,如果你很匆忙,我发现这里的an article很有用,作为快速介绍。

答案 1 :(得分:3)

正如我们在短文档上看到的那样,有一个spring style函数 https://github.com/mashpie/i18n-node 我认为这有助于您实现目标