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 {}
Если вместо "Home" отображаются исходные ключи вроде "nav.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 для множественного числа и выражений выбора. 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 переведите файлы локалей с помощью ИИ. Попросите ИИ-помощника перевести исходный файл JSON в своей IDE или используйте CLI i18n Agent в конвейере 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 срабатывает только при отсутствии всего файла локали, а не отдельных ключей. Используйте 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