Skip to main content

Angular i18n с Transloco: ръководство за настройване и превод

От инсталирането до внедряването в производствена среда: настройте Transloco, обработвайте множествено число със синтаксиса на ICU, добавете интелигентни резервни езикови версии и автоматизирайте преводите с ИИ.

1

Инсталирайте Transloco

Transloco е най-популярната външна i18n библиотека за Angular. Тя предлага зареждане на преводи по време на изпълнение, поддръжка на формата за съобщения ICU, обхвати с отложено зареждане и изчистен API за шаблони както със структурни директиви, така и с pipe-ове.

Защо да изберете 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), pipe-а (| 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);
  }
}
Pipe-ът 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 е библиотека с отворен код, която решава грешка #574 в Transloco — липса на резервен превод за отделните ключове, когато преводният файл е попълнен само частично.

Препоръчителна файлова структура

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 файл или използвайте i18n Agent CLI във Вашия 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, за да покажете състояние на зареждане, или заредете преводите предварително чрез guard на маршрута.

Регионалните потребители виждат английски вместо родителската езикова версия

Вграденият резервен механизъм на 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 →

Често задавани въпроси за Angular i18n