Angular предоставляет несколько подходов для интернационализации (i18n) приложений. Рассмотрим основные методы с примерами реализации.
Подход: Разные сборки для разных языков.
<h1 i18n="@@welcomeHeader">Welcome</h1>
<p i18n="@@welcomeMessage">Hello, user!</p>
ng extract-i18n --output-path src/locale
<trans-unit id="welcomeHeader">
<source>Welcome</source>
<target>Bienvenue</target>
</trans-unit>
ng build --prod --i18n-file src/locale/messages.fr.xlf --i18n-format xlf --i18n-locale fr
Плюсы:
Минусы:
Подход: Загрузка переводов во время выполнения.
npm install @ngx-translate/core @ngx-translate/http-loader
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
@NgModule({
imports: [
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
]
})
{
"welcome": {
"header": "Welcome",
"message": "Hello, user!"
}
}
constructor(private translate: TranslateService) {
translate.setDefaultLang('en');
translate.use('en');
}
<h1>{{ 'welcome.header' | translate }}</h1>
<p [translate]="'welcome.message'"></p>
Плюсы:
Минусы:
Комбинация статической и динамической загрузки:
// en.json
{
"inbox": {
"zero": "No messages",
"one": "One message",
"other": "{{count}} messages"
}
}
<div [translate]="'inbox'" [translateParams]="{count: messages.length}"></div>
// В компоненте
today = new Date();
value = 1234.56;
// В шаблоне
<p>{{ today | date:'fullDate' }}</p>
<p>{{ value | number }}</p>
changeLanguage(lang: string) {
this.translate.use(lang);
localStorage.setItem('userLanguage', lang);
// Для дат/чисел
this.localeId = lang;
}
Организация переводов:
Работа с динамическими значениями:
{
"greeting": "Hello, {{name}}!"
}
<p [translate]="'greeting'" [translateParams]="{name: userName}"></p>
Инструменты:
SEO оптимизация:
Angular предлагает гибкие решения для i18n - от статической компиляции до динамической загрузки переводов. Выбор подхода зависит от требований проекта: для высоконагруженных приложений лучше подходит встроенный i18n, для динамических систем - ngx-translate. Гибридный подход дает преимущества обоих методов.