回退翻译文化>语言>默认

Fallback translations culture > language > default

我正在开发 Ionic2 应用程序 (Typescript) 并添加 i18n。

我正在使用我的母语 (en) 进行开发 - 并希望支持语言的文化变体(例如 fr vs fr-CA vs fr-BE...)。随着时间的推移,这些变体将被开发和添加。

我在过去的项目中使用过 requirejs i18n,它能够在 3 个以上级别上进行语言 fallback/merge:即 fr-CA-Quebec > fr-CA > fr > en

我无法在 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'),结果应该是:

似乎没有人能够为我回答这个问题,所以我想出了一个解决方案,它看起来不够优雅,但效果很好。

首先,我设置了一个 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);