Skip to main content

Angular i18n z Transloco: przewodnik po konfiguracji i tłumaczeniu

Od instalacji po produkcję: skonfiguruj Transloco, obsłuż liczbę mnogą za pomocą składni ICU, dodaj inteligentne języki rezerwowe i zautomatyzuj tłumaczenia z AI.

1

Zainstaluj Transloco

Transloco to najpopularniejsza zewnętrzna biblioteka i18n dla Angulara. Zapewnia wczytywanie tłumaczeń podczas działania, obsługę formatu wiadomości ICU, leniwie wczytywane zakresy oraz przejrzyste API szablonów z dyrektywami strukturalnymi i potokami.

Dlaczego Transloco zamiast wbudowanego rozwiązania i18n Angulara? Wbudowane rozwiązanie Angulara wymaga osobnej kompilacji dla każdego języka i nie obsługuje zmiany języka podczas działania. Transloco wczytuje tłumaczenia podczas działania, dzięki czemu publikujesz jedną kompilację i zmieniasz języki bez przeładowania.
Terminal
npm install @jsverse/transloco
2

Skonfiguruj Transloco

Zarejestruj Transloco w konfiguracji aplikacji. Podaj dostępne języki, ustaw język domyślny i skonfiguruj moduł wczytujący tłumaczenia. Transloco obsługuje zarówno komponenty samodzielne (Angular 14+), jak i wzorce NgModule.

Komponenty samodzielne (zalecane)

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,
    }),
  ],
};

Wzorzec 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 {}
Jeśli zamiast „Home” tłumaczenia wyświetlają surowe klucze takie jak „nav.home”, najczęściej TranslocoHttpLoader nie może znaleźć plików JSON. Sprawdź, czy pliki tłumaczeń znajdują się w src/assets/i18n/ i czy tablica assets w angular.json zawiera tę ścieżkę.

Utwórz pliki tłumaczeń

Utwórz po jednym pliku JSON dla każdego języka w src/assets/i18n/. Użyj zagnieżdżonych kluczy, aby uporządkować teksty według funkcji. Transloco używa formatu wiadomości ICU do liczby mnogiej i zmiennych.

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

Używaj tłumaczeń w szablonach i usługach

Transloco udostępnia trzy sposoby tłumaczenia w szablonach: dyrektywę strukturalną (*transloco), potok (| transloco) oraz usługę (TranslocoService) dla kodu TypeScript. Dyrektywa strukturalna jest zalecana w większości przypadków, ponieważ tworzy jedną subskrypcję i udostępnia funkcję tłumaczącą całemu blokowi szablonu.

Tłumaczenie w szablonie

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>
Użyj parametru read dyrektywy strukturalnej, aby ograniczyć tłumaczenia do zagnieżdżonego klucza. Pozwala to uniknąć powtarzania prefiksu w każdym wywołaniu t() i upraszcza szablony.

Tłumaczenie w usłudze (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);
  }
}
Potok transloco tworzy nową subskrypcję przy każdym użyciu. W szablonach zawierających wiele przetłumaczonych tekstów wybieraj dyrektywę strukturalną *transloco, która tworzy jedną subskrypcję dla całego bloku.
4

Obsłuż liczbę mnogą za pomocą formatu wiadomości ICU

Transloco używa formatu wiadomości ICU do liczby mnogiej i wyrażeń select. ICU automatycznie obsługuje złożone reguły liczby mnogiej — arabski (6 form), rosyjski (3 formy), japoński (1 forma) — w jednym tekście wiadomości. Zdefiniuj reguły w plikach tłumaczeń, a Transloco podczas działania wybierze właściwą formę.

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>
Nigdy nie implementuj własnej logiki liczby mnogiej w komponentach. Reguły różnią się znacznie między językami, a specyfikacja ICU już je obsługuje. Pozwól Transloco i ICU wykonać tę pracę — Twoim zadaniem jest zdefiniowanie właściwych form liczby mnogiej w plikach tłumaczeń.

Inteligentne języki rezerwowe z angular-locale-chain

Domyślnie Transloco wraca do języka domyślnego, gdy brakuje klucza tłumaczenia. Użytkownik pt-BR widzi angielski zamiast w pełni poprawnych tłumaczeń pt-PT. angular-locale-chain rozwiązuje ten problem, głęboko scalając tłumaczenia z konfigurowalnego łańcucha rezerwowego przed przekazaniem ich do Transloco. Każdy klucz zostaje uzupełniony — bez luk i brakujących tłumaczeń.

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 to biblioteka o otwartym kodzie źródłowym, która rozwiązuje błąd Transloco nr 574 — brak wartości rezerwowej dla pojedynczego klucza, gdy plik tłumaczeń jest tylko częściowo uzupełniony.

Zalecana struktura plików

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

Zautomatyzuj tłumaczenia

Po skonfigurowaniu Transloco tłumacz pliki językowe za pomocą AI. Poproś asystenta AI w środowisku programistycznym o przetłumaczenie źródłowego pliku JSON albo użyj CLI i18n Agent w pipeline CI/CD, aby w pełni zautomatyzować lokalizację.

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
Tłumacz przyrostowo — po dodaniu nowych kluczy do pliku źródłowego przetłumacz tylko różnicę zamiast ponownie generować wszystkie pliki. Pozwala to zachować tłumaczenia sprawdzone przez człowieka i uniknąć niepotrzebnych zmian.

Zautomatyzuj kontrolę jakości tłumaczeń

Wykrywaj brakujące klucze i uszkodzone symbole zastępcze przed wydaniem za pomocą i18n-validate. Testuj interfejs z pseudotłumaczeniami przy użyciu i18n-pseudo, zanim pojawią się prawdziwe tłumaczenia.

Typowe pułapki

Tłumaczenia wyświetlają surowe klucze

TranslocoHttpLoader nie może znaleźć plików JSON. Sprawdź, czy znajdują się w src/assets/i18n/, tablica assets w angular.json zawiera tę ścieżkę, a nazwy plików dokładnie odpowiadają konfiguracji availableLangs z uwzględnieniem wielkości liter.

Klucze zakresowe nie są rozpoznawane

Podczas korzystania z zakresów Transloco pliki tłumaczeń muszą znajdować się w assets/i18n/[scope]/[lang].json, a nie w głównym folderze i18n. Upewnij się też, że zakres zarejestrowano w tablicy providers komponentu za pomocą TRANSLOCO_SCOPE.

Ostrzeżenia konsoli w wersji produkcyjnej

W kompilacjach produkcyjnych ustaw prodMode: true w konfiguracji Transloco. Bez tego Transloco zapisuje w konsoli ostrzeżenia o brakujących kluczach. Ustawienie wyłącza również kontrole deweloperskie, które zwiększają narzut.

Tłumaczenia migają podczas przechodzenia między trasami

Leniwie wczytywane trasy pobierają tłumaczenia po wyrenderowaniu komponentu, co powoduje krótkie mignięcie nieprzetłumaczonych kluczy. Użyj wbudowanego TRANSLOCO_LOADING_TEMPLATE Transloco, aby wyświetlić stan wczytywania albo wczytaj tłumaczenia wcześniej w strażniku trasy.

Użytkownicy wariantów regionalnych widzą angielski zamiast języka nadrzędnego

Wbudowany mechanizm rezerwowy Transloco uruchamia się tylko wtedy, gdy brakuje całego pliku językowego, a nie pojedynczych kluczy. Użyj angular-locale-chain do głębokiego scalania tłumaczeń z powiązanych języków (np. pt-BR wraca do pt-PT, następnie pt, a na końcu do angielskiego).

Wypróbuj i18n Agent

Upuść tutaj plik tłumaczenia

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

lub kliknij, aby go wybrać

Języki docelowe

Rejestracja nie jest wymaganaNatychmiastowa wycena

Rezerwowe ustawienia regionalne z angular-locale-chain

Gdy brakuje klucza tłumaczenia w regionalnym wariancie języka, takim jak pt-BR, TranslocoLoader Angulara przechodzi bezpośrednio do języka domyślnego, zamiast najpierw sprawdzić język nadrzędny 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',
});

Zobacz nasz przewodnik po rezerwowych ustawieniach regionalnych, aby poznać pełną listę obsługiwanych frameworków i 75 wbudowanych łańcuchów. Learn more →

Najczęstsze pytania o Angular i18n