Как реализовать интернационализацию (i18n)?
Интернационализация (i18n) в Angular — это механизм, позволяющий адаптировать интерфейс приложения под разные языки и локали. Angular предоставляет встроенные средства для i18n, а также поддерживает внешние библиотеки, такие как @ngx-translate/core, которые позволяют реализовать динамическую смену языка без перекомпиляции приложения.
1. Интернационализация с помощью встроенного Angular i18n
1.1 Активация i18n в шаблоне
Чтобы отметить строку как переводимую, используется директива i18n:
<h1 i18n>Добро пожаловать</h1>
<button i18n="@@submitBtn">Отправить</button>
Атрибуты:
-
i18n — пометка текста для перевода;
-
@@submitBtn — кастомный ID для строки (опционально);
-
i18n-title, i18n-placeholder и т.п. — для атрибутов:
<input type="text" placeholder="Введите имя" i18n-placeholder />
1.2 Генерация xlf-файла переводов
Для извлечения строк переводов используется Angular CLI:
ng extract-i18n --output-path src/locale
Это создаёт файл messages.xlf (или .xtb, .json при других опциях).
1.3 Перевод и локализация
Создаются копии файла messages.xlf для каждого языка:
-
messages.ru.xlf
-
messages.en.xlf
-
messages.uz.xlf
В каждом — оригинальные строки и их переводы:
<trans-unit id="submitBtn">
<source>Отправить</source>
<target>Submit</target>
</trans-unit>
1.4 Конфигурация angular.json
Для каждого языка добавляются сборки:
"projects": {
"app-name": {
"architect": {
"build": {
"configurations": {
"ru": {
"localize": \["ru"\],
"outputPath": "dist/app-ru",
"i18nFile": "src/locale/messages.ru.xlf",
"i18nLocale": "ru",
"i18nFormat": "xlf"
},
"en": {
"localize": \["en"\],
"outputPath": "dist/app-en",
"i18nFile": "src/locale/messages.en.xlf",
"i18nLocale": "en",
"i18nFormat": "xlf"
}
}
}
}
}
}
1.5 Сборка с локалью
ng build --configuration=ru
ng build --configuration=en
1.6 Отображение дат, валют и чисел
Используются пайпы:
{{ today | date:'longDate':'':'ru' }}
{{ price | currency:'RUB':'symbol-narrow':'1.2-2':'ru' }}
Локаль должна быть зарегистрирована в main.ts:
import { registerLocaleData } from '@angular/common';
import localeRu from '@angular/common/locales/ru';
registerLocaleData(localeRu);
2. Динамическая интернационализация с @ngx-translate/core
Встроенная i18n требует сборки под каждый язык. Для динамической смены языка в рантайме применяется ngx-translate.
2.1 Установка
npm install @ngx-translate/core @ngx-translate/http-loader
```python
#### **2.2 Настройка TranslateModule**
```python
import { HttpClient } from '@angular/common/http';
import { TranslateLoader, TranslateModule } 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\]
}
})
\]
})
export class AppModule {}
2.3 Структура файлов переводов
Создаётся папка assets/i18n/:
-
en.json
-
ru.json
-
uz.json
// ru.json
{
"WELCOME": "Добро пожаловать",
"SEND": "Отправить"
}
2.4 Использование в шаблоне
<h1>{{ 'WELCOME' | translate }}</h1>
<button>{{ 'SEND' | translate }}</button>
2.5 Смена языка в рантайме
constructor(private translate: TranslateService) {
translate.addLangs(\['en', 'ru', 'uz'\]);
translate.setDefaultLang('ru');
const browserLang = translate.getBrowserLang();
translate.use(browserLang.match(/en|ru|uz/) ? browserLang : 'ru');
}
// Программно:
this.translate.use('en');
2.6 Перевод в TS
this.translate.get('WELCOME').subscribe((res: string) => {
console.log(res);
});
2.7 Параметры в строках
{
"HELLO_USER": "Привет, {{name}}"
}
<p>{{ 'HELLO_USER' | translate:{ name: 'Алексей' } }}</p>
2.8 Использование с директивой translate
<p translate>WELCOME</p>
2.9 Асинхронная подгрузка переводов
Файлы могут загружаться динамически в зависимости от конфигурации или типа пользователя.
3. Поддержка языка через маршруты
Можно использовать параметры URL:
{ path: ':lang/home', component: HomeComponent }
И автоматически переключать язык в зависимости от параметра:
this.translate.use(this.route.snapshot.params\['lang'\]);
4. Настройка локали Angular
В app.module.ts:
providers: \[
{ provide: LOCALE_ID, useValue: 'ru' }
\]
Для динамического изменения можно использовать APP_INITIALIZER или кастомный LOCALE_ID через InjectionToken.
5. Angular Localize (Angular 9+)
Можно подключить @angular/localize для использования $localize в коде:
ng add @angular/localize
import '@angular/localize/init';
console.log($localize\`Пример перевода\`);
6. Сравнение Angular i18n и ngx-translate
Возможность | Angular i18n | ngx-translate |
---|---|---|
Поддержка динамической смены языка | ❌ (только при сборке) | ✅ |
--- | --- | --- |
Простота настройки | Средняя | Простая |
--- | --- | --- |
Работа в шаблоне и коде | ✅ | ✅ |
--- | --- | --- |
Форматы переводов | XLF | JSON |
--- | --- | --- |
Поддержка параметров и вложенности | Ограничена | Расширенная |
--- | --- | --- |
Работа с лэйаутом, атрибутами и aria | ✅ | Частично |
--- | --- | --- |
Интернационализация в Angular может быть реализована как через встроенные средства с i18n, так и с помощью сторонних библиотек вроде ngx-translate. Выбор зависит от требований: если нужен простой и стабильный перевод с предкомпиляцией — подходит встроенный i18n. Если необходима динамическая смена языка и работа с JSON — лучше использовать ngx-translate.