Skip to main content

i18n в Angular із Transloco: посібник із налаштування та перекладу

Від встановлення до розгортання у виробничому середовищі: налаштуйте Transloco, обробляйте форми множини за допомогою синтаксису ICU, додайте розумні резервні локалі й автоматизуйте переклади з використанням ШІ.

1

Встановити Transloco

Transloco — найпопулярніша стороння бібліотека i18n для Angular. Вона забезпечує завантаження перекладів під час виконання, підтримку формату повідомлень ICU, області перекладів із відкладеним завантаженням і зручний API шаблонів зі структурними директивами та каналами перетворення.

Чому варто вибрати Transloco замість вбудованого рішення i18n в Angular? Вбудоване рішення Angular потребує окремого складання для кожної мови й не підтримує перемикання мов під час виконання. Transloco завантажує переклади під час виконання, тож Ви випускаєте одну збірку й можете миттєво перемикати мови.
Terminal
npm install @jsverse/transloco
2

Налаштувати Transloco

Зареєструйте Transloco в конфігурації застосунку. Потрібно вказати доступні мови, встановити мову за замовчуванням і налаштувати завантажувач перекладів. Transloco підтримує як автономні компоненти (Angular 14+), так і шаблони NgModule.

Автономні компоненти (рекомендовано)

app.config.ts
// 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
// 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 {}
Якщо замість перекладів відображаються необроблені ключі на кшталт "nav.home" замість "Home", найчастіше TranslocoHttpLoader не може знайти Ваші файли JSON. Переконайтеся, що файли перекладів розміщено в src/assets/i18n/ і що масив assets у angular.json містить цей шлях.

Створити файли перекладів

Створіть окремий файл JSON для кожної мови в src/assets/i18n/. Використовуйте вкладені ключі, щоб упорядкувати рядки за функціональністю. Для форм множини та змінних Transloco використовує формат повідомлень ICU.

assets/i18n/*.json
// 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}}"
  }
}
3

Використати переклади в шаблонах і сервісах

Transloco пропонує три способи перекладу в шаблонах: структурну директиву (*transloco), канал перетворення (| transloco) і сервіс (TranslocoService) для коду TypeScript. Для більшості випадків рекомендовано структурну директиву, оскільки вона створює одну підписку й надає функцію перекладу всьому блоку шаблону.

Переклад у шаблоні

component.html
<!-- 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>
Використовуйте параметр read структурної директиви, щоб обмежити переклади вкладеним ключем. Завдяки цьому не потрібно повторювати префікс у кожному виклику t(), а шаблони стають охайнішими.

Переклад у сервісі (TypeScript)

notification.component.ts
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);
  }
}
Канал перетворення transloco створює нову підписку для кожного використання. У шаблонах із великою кількістю перекладених рядків надавайте перевагу структурній директиві *transloco, яка створює одну підписку для всього блоку.
4

Обробити форми множини за допомогою формату повідомлень ICU

Transloco використовує формат повідомлень ICU для форм множини та виразів select. ICU автоматично обробляє складні правила множини — арабська (6 форм), російська (3 форми), японська (1 форма) — в одному рядку повідомлення. Визначте правила множини у файлах перекладів, і Transloco вибере правильну форму під час виконання.

ICU plural syntax
// 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>
Ніколи не реалізуйте власну логіку множини в компонентах. Правила множини в різних мовах дуже відрізняються, а специфікація ICU вже враховує ці відмінності. Доручіть цю роботу Transloco та ICU — Вам потрібно лише визначити правильні форми множини у файлах перекладів.

Розумні резервні локалі з angular-locale-chain

За замовчуванням Transloco використовує Вашу локаль за замовчуванням, якщо ключ перекладу відсутній. Тому користувач локалі pt-BR бачить англійський текст замість цілком придатного перекладу pt-PT. angular-locale-chain виправляє це, виконуючи глибоке об’єднання перекладів із налаштовуваного ланцюжка резервних локалей перед передаванням їх до Transloco. Заповнюється кожен ключ — без прогалин і відсутніх перекладів.

Terminal
npm install angular-locale-chain
app.config.ts (with 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(),
    },
  ],
};
angular-locale-chain — це бібліотека з відкритим кодом, яка усуває помилку Transloco #574: відсутність резервного значення для окремого ключа, якщо файл перекладу заповнений лише частково.

Рекомендована структура файлів

Project Structure
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 для повністю автоматизованої локалізації.

Terminal
# 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-validate. Тестуйте інтерфейс із псевдоперекладами за допомогою i18n-pseudo ще до появи справжніх перекладів.

Поширені помилки

Замість перекладів відображаються необроблені ключі

TranslocoHttpLoader не може знайти Ваші файли JSON. Переконайтеся, що файли розміщено в src/assets/i18n/, масив assets у angular.json містить цей шлях, а назви файлів точно відповідають Вашій конфігурації availableLangs з урахуванням регістру.

Ключі областей не розпізнаються

Під час використання областей Transloco файли перекладів мають розміщуватися в assets/i18n/[scope]/[lang].json, а не в кореневій папці i18n. Також переконайтеся, що область зареєстровано в масиві providers компонента за допомогою TRANSLOCO_SCOPE.

Попередження в консолі у виробничому середовищі

Для виробничих збірок установіть prodMode: true у конфігурації Transloco. Без цього Transloco записує в консоль попередження про відсутні ключі. Це налаштування також вимикає перевірки часу розробки, які створюють додаткове навантаження.

Переклади блимають під час переходу між маршрутами

Маршрути з відкладеним завантаженням отримують переклади після відтворення компонента, через що на мить з’являються неперекладені ключі. Використовуйте вбудований TRANSLOCO_LOADING_TEMPLATE у Transloco, щоб показувати стан завантаження, або попередньо завантажуйте переклади в захиснику маршруту.

Користувачі регіональної локалі бачать англійський текст замість батьківської локалі

Вбудований резервний механізм Transloco спрацьовує лише за відсутності всього файла локалі, а не окремих ключів. Використовуйте angular-locale-chain для глибокого об’єднання перекладів із пов’язаних локалей (наприклад, для pt-BR резервною спочатку буде pt-PT, потім pt, а тоді англійська).

Спробуйте i18n Agent зараз

Перетягніть сюди файл для перекладу

JSON, YAML, PO, XML, CSV, Markdown, Properties

або натисніть, щоб вибрати

Цільові мови

Реєстрація не потрібнаМиттєвий розрахунок

Резервні локалі з angular-locale-chain

Якщо ключ перекладу відсутній у регіональній локалі на кшталт pt-BR, TranslocoLoader в Angular одразу переходить до локалі за замовчуванням, не перевіряючи спочатку батьківську локаль pt.

Terminal
npm install angular-locale-chain
Configuration
import { 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 →

Часті запитання про i18n в Angular