我有两个注册助手:“_ i”用于翻译ui字符串,“pluralize”用于复制字符串。我经常将它们嵌套,就像这里:
{{#_i}}{{num_hidden}} hidden {{#pluralize}}comment,comments,{{num_hidden}}{{/pluralize}}{{/_i}}
(这会产生类似“5隐藏评论”的内容)。
UI字符串翻译的工作方式是查找字典中_i标记内的整个字符串然后替换它,例如西班牙语:
{{num_hidden}} {{#pluralize}}comentario escondido,comentarios escondidos,{{num_hidden}}{{/pluralize}}
然后我会在这个字符串上运行pluralize helper。当我们在调用胡子之前动态扩展视图时,这适用于胡子。然而,使用Handlebars帮助程序,它首先执行复数帮助程序(最内部),然后我得到一个没有翻译的UI字符串。
我认为我做错了什么。
答案 0 :(得分:0)
相反,您可以使用一个帮助器和MessageFormat.js库进行嵌套:https://github.com/SlexAxton/messageformat.js - 它允许以不同语言显示“消息”,包括复数和性别规则。
这是车把助手:
Handlebars.registerHelper('i18n', function (text) {
var options,
compiledText;
options = arguments[arguments.length - 1];
if (compiled[locale].hasOwnProperty(text)) {
compiledText = compiled[locale][text];
} else {
compiledText = mf.compile(dictionary[locale][text]);
compiled[locale][text] = compiledText;
}
return compiledText(options.hash);
});
dictonary
对象是包含所有翻译的对象:
dictionary = {
en: {
"You have MESSAGES_COUNT messages": "You have {MESSAGE_COUNT, plural, one {1 message} other {# messages}}",
},
pl: {
"You have MESSAGES_COUNT messages": "Masz {MESSAGE_COUNT, plural, one {1 wiadomość} other {# wiadomości}}"
}
};
和compiled
对象是存储“消息”的缓存版本的对象,不会在每次使用时对其进行编译。您还可以在构建时编译“消息”。
答案 1 :(得分:0)
我最终使用Hogan.js而不是Handlebars,因为它与胡子和小胡子lambda函数具有更好的兼容性。