2017-01-25 64 views
0

我正在開發一個Ionic2應用程序(Typescript),只是添加國際化。備用翻譯文化>語言>默認

我正在用我的母語(en)進行開發 - 並且希望支持語言的文化變體(例如fr vs fr-CA vs vs fr-BE ...)。這些變體將隨着時間的推移而被開發和添加。

我在過去的項目中使用requirejs i18n,這是能夠做到的語言回退/在3+級別合併:即FR-CA-魁北克> FR-CA> FR> EN

我不能在制定NG2-翻譯如何獲得任何超出2個水平與.use('').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')setDefaultLang('en'),其結果應該是:

  • 晚餐> souper
  • 你好>卓悅<< this is the problem
  • 標題>我的標題

回答

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);