web-dev-qa-db-ja.com

Angular:AOTを使用するときに実行時に現在のロケールを取得する方法

私は私のプロジェクトを次のものでコンパイルしています:

ng serve --aot --i18nFile=client/locale/messages.fr.xlf --i18nFormat=xlf --locale=fr

実行時にロケールIDにアクセスするにはどうすればよいですか?ロケールに基づいて要素を表示/非表示にします。

PS。 JITコンパイルを使用すると、これを簡単に行えることがわかります。

providers: [ { provide: LOCALE_ID, useValue: 'fr' } ]

しかし、私はAOTソリューションを探しています。また、ホスト名またはそのようなものに基づいてロケールを推測することも避けます。

7
Baconbeastnz

コンストラクターにLOCALE_IDを挿入するだけです。

import { LOCALE_ID } from '@angular/core';

...

constructor(
  @Inject(LOCALE_ID) public locale: string
) { }
24
Baconbeastnz

インジェクショントークンLOCALE_IDはユーザーの言語またはロケールを提供しない、静的でデフォルトは'en-US'異なる値を指定しない限り( docs ):

providers: [{provide: LOCALE_ID, useValue: 'en-GB' }]

ユーザーの優先言語/ロケールを取得するメソッドは次のとおりです。

  getUsersLocale(defaultValue: string): string {
    if (typeof window === 'undefined' || typeof window.navigator === 'undefined') {
      return defaultValue;
    }
    const wn = window.navigator as any;
    let lang = wn.languages ? wn.languages[0] : defaultValue;
    lang = lang || wn.language || wn.browserLanguage || wn.userLanguage;
    return lang;
  }
4
inorganik