私は、国際化のためにangular.ioクックブック( https://angular.io/docs/ts/latest/cookbook/i18n.html#!#angular-i18n )をフォローしました。すべてが正常に機能します。index.htmlファイルでロケールを変更すると、次のようになります。
document.locale = 'en';
しかし、AngularJSで行っていたように、これを動的に変更したいと思います。私はこれのようないくつかの解決策を見つけました:
//mycomponent.component.ts
changeLang(){
localStorage.setItem('localeId', "es");
location.reload(true);
} //I hardcoded the locale, but you get the idea
外出先でドキュメントを翻訳する方法はありますか?このソリューションは実用的ではなく、リロード時間が長いためです。ご協力ありがとうございました!
つまり、翻訳作業はAngular
コンパイラによって行われるため、アプリをリロードせずにロケールを変更することはできません。
今日、公式Angular i18n
を使用する場合、 2つのオプション があります。
この場合、ロケールごとに個別のバンドルが作成され、アプリケーション全体を交換する必要があります。つまり、再ロードする必要があります。
AOTコンパイラーで国際化する場合、言語ごとに個別のアプリケーションパッケージを事前にビルドし、サーバー側の言語検出またはurlパラメーターに基づいて適切なパッケージを提供する必要があります。
このアプローチはパフォーマンスが低くなりますが、必ずしも言語ごとのバンドルは必要ありません。
この場合、webpack
を使用して翻訳ファイルをロードし、ブートストラップ中にAngular
コンパイラに提供します。
JITコンパイラーは、アプリがロードされるときにブラウザーでアプリをコンパイルします。 JITコンパイラを使用した変換は、次の動的プロセスです。
- 適切な言語翻訳ファイルを文字列定数としてインポートします。
- JITコンパイラーに対応する翻訳プロバイダーの作成。
- それらのプロバイダーでアプリをブートストラップする。
公式ドキュメントにはuseValue
プロバイダーの例しかありませんが、useFactory
を使用して、構成に基づいてTRANSLATIONS
とLOCALE_ID
を提供できると確信しています。 。
言語の変更時にアプリを再ブートストラップする必要があります。つまり、リロードを意味しますが、ユーザーはこのバンドルをブラウザーにキャッシュしているため、リロードはかなり高速になるはずです。
とにかく、今のところ、本当に動的な翻訳を取得したい場合は、 ngx-translate を使用することをお勧めします。translate
パイプとサービスの他に、このニース 投機的ポリフィル があるため、Angular i18n
。
JITコンパイルを使用している場合は、これを確実に実行できます。翻訳にはファクトリープロバイダーが必要です。ルートモジュールに次のようなものを追加します。
export function localeFactory(): string {
return (window.clientInformation && window.clientInformation.language) || window.navigator.language;
}
providers:
[
{
provide: TRANSLATIONS,
useFactory: (locale) => {
locale = locale || 'en'; // default to english if no locale provided
return require(`raw-loader!../locale/messages.${locale}.xlf`);
},
deps: [LOCALE_ID]
},
{
provide: LOCALE_ID,
useFactory: localeFactory
},
{provide: TRANSLATIONS_FORMAT, useValue: 'xlf'},
あなたはそれをチェックすることができます、私にとってはそれは完璧に動作し、素晴らしいパフォーマンスを持っています(ロード時間もリロードもない即時翻訳):
https://github.com/ocombe/ng2-translate
次に、ローカルストレージなどを使用して言語を設定できます。
translateService.use(window.localStorage.getItem('language'));
翻訳を1つのファイルに設定し、翻訳をJSON形式で注文できます(コンポーネントごとに1つのオブジェクトをカプセル化します)。
"PASSWORD_CONFIRM": {
"TITLE": "Merci !",
"DESCRIPTION": "Votre nouveau mot de passe a bien été enregistré. Vous pouvez désormais accéder à la plateforme !",
"BUTTON": "Entrer sur la plateforme"
},
...
次に、次のようにHTMLにテキストを設定できます。
<div class="title">{{'PASSWORD_CONFIRM.TITLE' | translate}}</div>
<div class="description">
{{'PASSWORD_CONFIRM.DESCRIPTION' | translate}}
</div>