0

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

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

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

我无法在 ng2-translate 中解决如何使用.use('')and获得超过 2 个级别的任何内容.setDefaultLang('')

我想要实现的是:

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')and setDefaultLang('en'),结果应该是:

  • 晚餐 > 汤
  • 你好>你好 << this is the problem
  • 标题 > 我的标题
4

1 回答 1

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);
于 2017-02-23T04:26:16.850 回答