Как сделать продвинутый 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, чтобы обеспечить условные, сингулярные, множественные числа и т.д. Примеры решения более сложных вариантов использования были бы высоко оценены.
Ответы
Ответ 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));