TAPi18n:如何以多种语言并排显示文本?

时间:2015-03-19 19:32:16

标签: meteor internationalization

似乎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,并直接访问所需的单词。

有更优雅的方法可以解决这个问题吗?

2 个答案:

答案 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)

不知道这是否仍然相关,但我在Sam的md-blog软件包中看到它的使用,也许它会有助于看到其他人的实现?

https://github.com/xolvio/md-blog

HTH