Подтвердить что ты не робот

Как сделать продвинутый i18n с Mustache.js?

Кажется, что Twitter использует fork Mustache.js предоставить i18n своим шаблонам?

Может ли кто-нибудь дать краткий пример того, как это делается, и, возможно, также указать, какая семантика необходима для перераспределения этих переводов?

Конечно, этот простой пример:

var template = "{{_i}}{{name}} is using mustache.js!{{/i}}"

var view = {
  name: "Matt"
};

var translationTable = {
  // Welsh, according to Google Translate
  "{{name}} is using mustache.js!": "Mae {{name}} yn defnyddio mustache.js!"
};

function _(text) {
  return translationTable[text] || text;
}

alert(Mustache.to_html(template, view));
// alerts "Mae Matt yn defnyddio mustache.js!"

Но я хотел бы получить более подробную информацию о том, как структурировать функцию _ (text) и translationTable, чтобы обеспечить условные, сингулярные, множественные числа и т.д. Примеры решения более сложных вариантов использования были бы высоко оценены.

4b9b3361

Ответ 1

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

{
    title : {
        key: 'título',
        value: 'bienvenida'
    }
}

и

{
    title : {
        key: 'لقب',
        value: 'ترحيب'
    }
}

Затем просто создайте шаблон:

<h1>{{title.key}}: {{title.value}}</h1>

и

<h1>{{title.value}} {{title.key}}</h1>

Все, что вам нужно поддерживать, - это сопоставление 1:1 между шаблонами и данными.

Mustache.render(data[language], template[language]);

Держите его просто:)

Ответ 2

Структурирование более сложных случаев, включая условные обозначения, циклы и т.д., выполняется точно так же, как и с обычной библиотекой Mustache. Вы можете использовать новые теги I18N {{_i}} и {{i}} для обертывания частей вашего шаблона для целей перевода.

Если вы используете шаблон:

<h1>Title: {{title}}</h1>
<ul>
   {{#a_list}}
      <li>{{label}}</li>
   {{/a_list}}
</ul>

вы можете просто обернуть первую строку

<h1>{{_i}}Title: {{title}}{{/i}}</h1>

и включить внутреннюю часть в карту перевода.

Для полного примера см. http://jsfiddle.net/ZsqYG/2/.

Ответ 3

Я считаю, что вы хотите использовать функции i18n с Усы. Это может быть достигнуто путем перегрузки метода Mustache.render следующим образом:

var lang = {
    'is_using_pre': 'Mae ',
    'is_using': 'yn defnyddio'
};

var Mustache = (function (Mustache) {
    var _render = Mustache.render;

    Mustache.render = function (template, view, partials) {
        view['lang'] = lang;
        return _render (template, view, partials);
    };

    return Mustache;
}(Mustache));

var template = "{{_i}}{{lang.is_using_pre}}{{name}} {{lang.is_using}} mustache.js!{{/i}}";
var view = {
  name: "Matt"
};

alert(Mustache.to_html(template, view));