似乎tapi18n被设计为在任何给定时间只有一种活动语言。
我正在显示一个包含多种语言的相同字段的表单。我想翻译标签和占位符,因为它是填写表单的人的有用信息,但由于我只能访问当前语言,所以我无法显示其他人的文字。
我想这样:
## Description ##
English
[ enter the description ... ]
Español
[ enter the description ... ]
Deutsch
[ enter the description ... ]
看起来像这样:
## Description ##
English
[ enter the description ... ]
Español
[ introduzca la descripción ... ]
Deutsch
[ placeholder in german... ]
我可以想到创建一个预处理器,就像创建一个预处理器,将每个json文件中的{ "description_placeholder_$$": "introduzca la description" }
等密钥复制到每个其他json文件,将$$替换为语言代码,因此每种语言都包含所有包含$的密钥来自其他所有语言的$。
另一个技巧是将所有json文件加载到内存中,独立于tapi18n,并直接访问所需的单词。
有更优雅的方法可以解决这个问题吗?
答案 0 :(得分:2)
正如@kyll所提到的,这就是它应该如何运作:
TAPi18n.__('amusing spaghetti', { lng: 'ru'});
但它无法按需加载语言。作为解决方法,我在客户端预加载语言并设置会话变量以指示已加载所有语言。
var langs = [
{ code: 'en', name: 'English' },
{ code: 'es', name: 'Español' },
{ code: 'de', name: 'Deutsch' }
];
Meteor.startup(function () {
_.each(langs, function(lang) {
TAPi18n._loadLanguage(lang.code).done(function() {
Session.set('langsLoaded',
langs.length == TAPi18n._loaded_languages.length);
});
});
});
然后,在模板中我有:
{{trToLang 'amusing spaghetti' 'ru'}}
最后是帮手:
trToLang: function(key, lang) {
return Session.get('langsLoaded') ? TAPi18n.__(key, { lng: lang }) : '';
}
需要会话变量,因为如果没有它,有时会在模板渲染之前加载语言,并且会破坏TAPi18n。
我希望有人发布更美妙的解决方案。
答案 1 :(得分:0)