i18n Angular с Transloco: руководство по настройке и переводу
От установки до рабочей среды: настройте Transloco, обработайте формы множественного числа с помощью синтаксиса ICU, добавьте умные резервные локали и автоматизируйте перевод с помощью ИИ.
Установить Transloco
Transloco — самая популярная сторонняя библиотека i18n для Angular. Она предлагает загрузку переводов во время выполнения, поддержку формата сообщений ICU, области с отложенной загрузкой и понятный API шаблонов со структурными директивами и каналами.
npm install @jsverse/translocoНастроить Transloco
Зарегистрируйте Transloco в конфигурации приложения. Необходимо указать доступные языки, задать язык по умолчанию и настроить загрузчик переводов. Transloco поддерживает и автономные компоненты (Angular 14+), и шаблоны NgModule.
Автономные компоненты (рекомендуется)
// app.config.ts
import { ApplicationConfig } from '@angular/core';
import { provideHttpClient } from '@angular/common/http';
import {
provideTransloco,
TranslocoHttpLoader,
} from '@jsverse/transloco';
export const appConfig: ApplicationConfig = {
providers: [
provideHttpClient(),
provideTransloco({
config: {
availableLangs: ['en', 'de', 'ja', 'es', 'fr'],
defaultLang: 'en',
fallbackLang: 'en',
reRenderOnLangChange: true,
prodMode: true,
},
loader: TranslocoHttpLoader,
}),
],
};Шаблон NgModule
// app.module.ts
import { NgModule } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import {
TranslocoModule,
TRANSLOCO_LOADER,
TranslocoHttpLoader,
provideTransloco,
} from '@jsverse/transloco';
@NgModule({
imports: [TranslocoModule],
providers: [
provideTransloco({
config: {
availableLangs: ['en', 'de', 'ja', 'es', 'fr'],
defaultLang: 'en',
fallbackLang: 'en',
reRenderOnLangChange: true,
prodMode: true,
},
loader: TranslocoHttpLoader,
}),
],
})
export class AppModule {}Создать файлы перевода
Создайте по одному файлу JSON для каждого языка в src/assets/i18n/. Организуйте строки по функциям с помощью вложенных ключей. Transloco использует формат сообщений ICU для форм множественного числа и переменных.
// assets/i18n/en.json
{
"nav": {
"home": "Home",
"about": "About",
"settings": "Settings"
},
"greeting": "Hello, {{ name }}!",
"cart": {
"itemCount": "{count, plural, one {# item} other {# items}}"
}
}
// assets/i18n/de.json
{
"nav": {
"home": "Startseite",
"about": "Uber uns",
"settings": "Einstellungen"
},
"greeting": "Hallo, {{ name }}!",
"cart": {
"itemCount": "{count, plural, one {# Artikel} other {# Artikel}}"
}
}Использовать переводы в шаблонах и службах
Transloco предлагает три способа перевода в шаблонах: структурную директиву (*transloco), канал (| transloco) и службу TranslocoService для кода TypeScript. Структурная директива рекомендуется для большинства случаев, поскольку создаёт одну подписку и предоставляет функцию перевода всему блоку шаблона.
Перевод в шаблоне
<!-- Using the transloco directive (recommended) -->
<ng-container *transloco="let t">
<h1>{{ t('greeting', { name: userName }) }}</h1>
<nav>
<a routerLink="/">{{ t('nav.home') }}</a>
<a routerLink="/about">{{ t('nav.about') }}</a>
</nav>
</ng-container>
<!-- Using the transloco pipe -->
<h1>{{ 'greeting' | transloco:{ name: userName } }}</h1>
<!-- Using the structural directive with read -->
<ng-container *transloco="let t; read: 'nav'">
<a routerLink="/">{{ t('home') }}</a>
<a routerLink="/about">{{ t('about') }}</a>
</ng-container>Перевод в службе (TypeScript)
import { Component, inject } from '@angular/core';
import { TranslocoService } from '@jsverse/transloco';
@Component({
selector: 'app-notification',
template: '<span>{{ message }}</span>',
})
export class NotificationComponent {
private translocoService = inject(TranslocoService);
message = '';
showSuccess() {
// Translate in TypeScript
this.message = this.translocoService.translate('notifications.saved');
}
switchLanguage(lang: string) {
this.translocoService.setActiveLang(lang);
}
}Обработать формы множественного числа с помощью формата сообщений ICU
Transloco использует формат сообщений ICU для множественного числа и выражений выбора. ICU автоматически обрабатывает сложные правила: 6 форм в арабском, 3 в русском и 1 в японском — в одной строке сообщения. Определите правила множественного числа в файлах перевода, и Transloco выберет правильную форму во время выполнения.
// assets/i18n/en.json
{
"cart": {
"itemCount": "{count, plural, one {# item} other {# items}}",
"emptyMessage": "Your cart is empty"
},
"notifications": {
"unread": "{count, plural, =0 {No new notifications} one {# new notification} other {# new notifications}}"
}
}
// assets/i18n/ar.json — Arabic has 6 plural forms
{
"cart": {
"itemCount": "{count, plural, zero {لا عناصر} one {عنصر واحد} two {عنصران} few {# عناصر} many {# عنصرًا} other {# عنصر}}"
}
}
// Template usage:
// <span>{{ t('cart.itemCount', { count: cartItems.length }) }}</span>Умные резервные локали с angular-locale-chain
По умолчанию Transloco при отсутствии ключа перевода переходит на локаль по умолчанию. Пользователь pt-BR видит английский вместо подходящего перевода pt-PT. angular-locale-chain устраняет эту проблему: глубоко объединяет переводы из настраиваемой цепочки резервных локалей, прежде чем передать их Transloco. Каждый ключ заполняется — никаких пробелов и отсутствующих переводов.
npm install angular-locale-chain// app.config.ts — with angular-locale-chain
import { ApplicationConfig } from '@angular/core';
import { provideHttpClient } from '@angular/common/http';
import {
provideTransloco,
TranslocoHttpLoader,
TRANSLOCO_LOADER,
TRANSLOCO_FALLBACK_STRATEGY,
} from '@jsverse/transloco';
import {
LocaleChainLoader,
LocaleChainFallbackStrategy,
} from 'angular-locale-chain';
export const appConfig: ApplicationConfig = {
providers: [
provideHttpClient(),
provideTransloco({
config: {
availableLangs: ['en', 'fr', 'fr-CA', 'pt', 'pt-BR', 'de', 'de-AT'],
defaultLang: 'en',
fallbackLang: 'en',
reRenderOnLangChange: true,
prodMode: true,
},
}),
{
provide: TRANSLOCO_LOADER,
useFactory: () => {
const inner = new TranslocoHttpLoader();
return new LocaleChainLoader(inner, {
defaultLocale: 'en',
});
},
},
{
provide: TRANSLOCO_FALLBACK_STRATEGY,
useFactory: () => new LocaleChainFallbackStrategy(),
},
],
};Рекомендуемая структура файлов
my-angular-app/
├── src/
│ ├── assets/
│ │ └── i18n/
│ │ ├── en.json # Source language
│ │ ├── de.json # German
│ │ ├── ja.json # Japanese
│ │ ├── es.json # Spanish
│ │ └── fr.json # French
│ ├── app/
│ │ ├── app.config.ts # Transloco provider config
│ │ ├── app.component.ts
│ │ └── components/
│ │ └── lang-switcher/
│ │ └── lang-switcher.component.ts
│ └── main.ts
├── angular.json
└── package.jsonАвтоматизировать перевод
После завершения настройки Transloco переведите файлы локалей с помощью ИИ. Попросите ИИ-помощника перевести исходный файл JSON в своей IDE или используйте CLI i18n Agent в конвейере CI/CD для полностью автоматизированной локализации.
# In your IDE, ask your AI assistant:
> Translate src/assets/i18n/en.json to German, Japanese, and Spanish
✓ de.json created (1.2s)
✓ ja.json created (1.5s)
✓ es.json created (1.1s)
# Or use the CLI in CI/CD:
npx i18n-agent translate src/assets/i18n/en.json --lang de,ja,esАвтоматизировать контроль качества перевода
Распространённые ошибки
Вместо переводов отображаются исходные ключи
Ключи областей не разрешаются
Предупреждения в консоли в рабочей среде
Переводы мерцают при переходе между маршрутами
Региональные пользователи видят английский вместо родительской локали
Попробовать i18n Agent
Перетащите сюда файл перевода
JSON, YAML, PO, XML, CSV, Markdown, Properties
или нажмите, чтобы выбрать
Целевые языки
Резервные локали с angular-locale-chain
Когда в региональной локали, например pt-BR, отсутствует ключ перевода, TranslocoLoader в Angular сразу переходит на локаль по умолчанию, не проверяя сначала родительскую локаль pt.
npm install angular-locale-chainimport { LocaleChainLoader } from 'angular-locale-chain';
new LocaleChainLoader(innerLoader, {
fallbacks: {
'pt-BR': ['pt', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
},
defaultLocale: 'en',
});Полный список поддерживаемых фреймворков и 75 встроенных цепочек приведён в нашем руководстве по резервным локалям. Learn more →