I18N с Express / Jade: строки со встроенными тегами и интерполяцией - PullRequest
7 голосов
/ 08 марта 2012

tl; dr: я ищу элегантный метод интернационализации в шаблонах 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-версию этой строки в шаблон Jade как i18n.posted_by_on, он не будет выполнять интерполяцию, поэтому лучшее, что я могу сделать, это:

- 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 ]

6 голосов
/ 27 ноября 2013

Возможно, вы уже нашли решение (если да, пожалуйста, сообщите нам, что это такое), но если вы этого не сделали, вы можете обратиться к библиотеке 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 });

Библиотека действительно хорошо документирована, но, если вы спешите, вот статья , которую я нашел полезным для быстрого ознакомления.

3 голосов
/ 02 июня 2012

Как мы видим на коротком документе, есть функция в стиле sprinf https://github.com/mashpie/i18n-node Я думаю, это поможет вам достичь вашей цели

...