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 для форм множини та виразів select. 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, перекладіть файли локалей за допомогою ШІ. У Вашому IDE попросіть асистента ШІ перекласти вихідний файл JSON або скористайтеся CLI i18n Agent у pipeline 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 →