我正在开发一个Ionic2应用程序(Typescript),只是添加了i18n。
我正在用我的母语(en)开发 - 并且希望支持语言的文化变体(例如fr vs fr-CA vs vs fr-BE ......)。随着时间的推移,将开发和添加这些变体。
我在过去的项目中使用了requirejs i18n,并且能够在3 +级别进行语言回退/合并:即fr-CA-Quebec> fr-CA> fr>烯
我无法解决ng2-translate如何使用.use('')
和.setDefaultLang('')
获得2级以上的任何内容
我想要达到的目标是:
file: /i18n/fr-CA.json:
{
"dinner": "souper"
}
file: /i18n/fr.json:
{
"hello": "bonjour",
"dinner": "dîner"
}
file: /i18n/en.json:
{
"title" "my title",
"hello": "hello",
"dinner": "dinner"
}
因此,对于加拿大用户,我设置.use('fr-CA')
和setDefaultLang('en')
,结果应为:
<< this is the problem
答案 0 :(得分:0)
似乎没有人能够为我回答这个问题,所以我想出了一个解决方案,看起来不那么优雅,但是工作得很好。
首先,我设置了一个onLangChange
处理程序:
translate.onLangChange.subscribe((event: LangChangeEvent) => {
var langs = translate.getLangs();
if (langs.length === 3) {
var baseObs = translate.getTranslation(langs[1]);
baseObs.subscribe(x => {
//Here, I extend the cultural language with keys from the base language
translate.setTranslation(langs[2], x, true);
});
}
});
接下来,我在基础和文化语言变体上调用lang.use(如果这种语言有文化部分)
translate.setDefaultLang('en');
let defLang = translate.getBrowserCultureLang();
const langParts = defLang.split('-');
if (langParts.length > 1 && langParts[0] !== 'en')
translate.use(langParts[0]);
translate.use(defLang);