普段はフロントエンドエンジニアとしてJavaScript/TypeScript/Aangular/GraphQLを
メインに開発業務を行なっています。
今回はAngularのngx-translateについて使用する機会がありましたのでその導入方法について、記事にしていきたいと思います。
1. ngx-trsnalateとは?
ngx-translateとは、Webアプリケーションを日本語以外の多言語にする際にとても便利なAngularのi18nライブラリです。
i18nとは国際化を意味する「internationalization」の略で、世界で共通して使えることを指します。
以下ngx-translateの公式ドキュメントです。
実は、ngx-translateライブラリを使用しなくても、Angularでは標準でi18n機能を装備しています。Angularで国際化対応 - 闘うITエンジニアの覚え書きでも触れられていますが、使い比べてみると、翻訳する箇所が増える度に、翻訳用のファイルを新たに作る必要があったりと、ngx-translate の方が全然使いやすいと思います。
2. アプリケーションを他言語にする方法
それでは、Angularでngx-translateを導入していきたいと思います。ngx-translateを利用するにはまず、npmでライブラリをインストールする必要があります。
npm install @ngx-translate/core --save
次にappModule内に、TranslateModule.forRoot()をインポートします。これを記述することで、ngx-translateのTranslateModuleをアプリが認識してくれるようになります。
import {BrowserModule} from '@angular/platform-browser'; import {NgModule} from '@angular/core'; import {TranslateModule} from '@ngx-translate/core'; //追加 @NgModule({ imports: [ BrowserModule, TranslateModule.forRoot() //追加 ], bootstrap: [AppComponent] }) export class AppModule { }
※ Lazy loadedを使用している場合は、forChildを使用します。
@NgModule({ imports: [ TranslateModule.forChild({ loader: {provide: TranslateLoader, useClass: CustomLoader}, compiler: {provide: TranslateCompiler, useClass: CustomCompiler}, parser: {provide: TranslateParser, useClass: CustomParser}, missingTranslationHandler: {provide: MissingTranslationHandler, useClass: CustomHandler}, isolate: true }) ] }) export class LazyLoadedModule { }
さらに、ngx-translateはHttpClientを使用する為、HttpLoaderをインストールします。
npm install @ngx-translate/http-loader --save
HttpLoaderをインストールできたら、TranslateModule.forRootを以下のように書き換えます。
TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: HttpLoaderFactory, deps: [HttpClient] }, defaultLanguage: 'ja' })
TranslateHttpLoaderを使用する為、app.module.tsに、HttpLoaderFactoryメソッドを追加します。
export function HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http); }
コードの全体像としては以下の通りとなります。
import {NgModule} from '@angular/core'; import {BrowserModule} from '@angular/platform-browser'; import {HttpClientModule, HttpClient} from '@angular/common/http'; import {TranslateModule, TranslateLoader} from '@ngx-translate/core'; import {TranslateHttpLoader} from '@ngx-translate/http-loader'; import {AppComponent} from './app'; exportfunction HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http); } @NgModule({ imports: [ BrowserModule, HttpClientModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: HttpLoaderFactory, deps: [HttpClient] }, defaultLanguage: 'ja' }) ], bootstrap: [AppComponent] }) exportclass AppModule { }
これでngx-translateの導入は完了です。
3. 言語ファイルの作成
ngx-translateの導入が完了したら、次は翻訳をするための言語ファイルを作成します。ファイルは通常はJSON形式でasset/i18nフォルダの中に記載します。フォルダ名は英語に翻訳する場合はen.jsonで良いかと思います。
{ "ログイン": "Login", "registration" : { "メールアドレス": "Mail", "パスワード": "Password", "会員登録": "Member registration", } ... }
4. 記載方法
次に、JSONフォルダの記述をもとに、翻訳したいHTMLテンプレートにtransalteを記載していきます。タグに translate ディレクティブをつけるだけで翻訳をすることが出来ます。
<h2 class="title" translate>ログイン</h2> <p class="caption" translate>メールアドレス</p> <p class="caption" translate>パスワード</p>
placeholderなどのhtml属性の場合は、translate をpipeとして使うことでplaceholderのhtml属性を翻訳することができます。
<input type="text" matInput placeholder="{{ 'ログイン' | translate }}">
本日はここまでとなります。ここまでお読みいただきありがとうございました。