Skip to main content

i18n di Angular con Transloco: guida alla configurazione e alla traduzione

Dall'installazione alla produzione: configuri Transloco, gestisca i plurali con la sintassi ICU, aggiunga fallback intelligenti tra lingue e automatizzi le traduzioni con l'IA.

1

Installare Transloco

Transloco è la biblioteca i18n di terze parti più diffusa per Angular. Offre caricamento delle traduzioni durante l'esecuzione, supporto del formato dei messaggi ICU, ambiti a caricamento differito e un'API pulita per i modelli, con direttive strutturali e pipe.

Perché scegliere Transloco anziché l'i18n integrata di Angular? La soluzione integrata di Angular richiede una compilazione separata per ogni lingua e non supporta il cambio di lingua durante l'esecuzione. Transloco carica le traduzioni durante l'esecuzione, consentendo di distribuire un'unica compilazione e cambiare lingua al volo.
Terminal
npm install @jsverse/transloco
2

Configurare Transloco

Registri Transloco nella configurazione dell'applicazione. Deve indicare le lingue disponibili, impostare una lingua predefinita e configurare il caricatore delle traduzioni. Transloco supporta sia i componenti standalone (Angular 14 e versioni successive) sia i pattern NgModule.

Componenti standalone (consigliati)

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

Pattern 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 {}
Se le traduzioni appaiono come chiavi non elaborate, ad esempio "nav.home", anziché come "Home", la causa più comune è che TranslocoHttpLoader non trova i file JSON. Verifichi che i file di traduzione si trovino in src/assets/i18n/ e che l'array assets di angular.json includa tale percorso.

Creare i file di traduzione

Crei un file JSON per ogni lingua in src/assets/i18n/. Usi chiavi annidate per organizzare le stringhe per funzionalità. Transloco usa il formato dei messaggi ICU per plurali e variabili.

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

Usare le traduzioni nei modelli e nei servizi

Transloco offre tre modi per tradurre nei modelli: la direttiva strutturale (*transloco), la pipe (| transloco) e il servizio (TranslocoService) per il codice TypeScript. La direttiva strutturale è consigliata nella maggior parte dei casi, perché crea un'unica sottoscrizione e rende disponibile la funzione di traduzione all'intero blocco del modello.

Traduzione nei modelli

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>
Usi il parametro read nella direttiva strutturale per limitare le traduzioni a una chiave annidata. In questo modo evita di ripetere il prefisso in ogni chiamata t() e rende i modelli più ordinati.

Traduzione nei servizi (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);
  }
}
La pipe transloco crea una nuova sottoscrizione a ogni utilizzo. Nei modelli con molte stringhe tradotte, preferisca la direttiva strutturale *transloco, che crea un'unica sottoscrizione per l'intero blocco.
4

Gestire i plurali con il formato dei messaggi ICU

Transloco usa il formato dei messaggi ICU per i plurali e le espressioni select. ICU gestisce automaticamente regole plurali complesse: arabo (6 forme), russo (3 forme), giapponese (1 forma), il tutto da un'unica stringa. Definisca le regole del plurale nei file di traduzione e Transloco selezionerà la forma corretta durante l'esecuzione.

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>
Non implementi mai una logica plurale personalizzata nei componenti. Le lingue hanno regole del plurale molto diverse, già gestite dalla specifica ICU. Lasci che Transloco e ICU svolgano il lavoro; deve soltanto definire le forme plurali corrette nei file di traduzione.

Fallback intelligenti tra lingue con angular-locale-chain

Per impostazione predefinita, quando manca una chiave di traduzione Transloco passa alla lingua predefinita. Un utente pt-BR vede l'inglese anziché traduzioni pt-PT perfettamente valide. angular-locale-chain risolve il problema combinando ricorsivamente le traduzioni di una catena di fallback configurabile prima di passarle a Transloco. Ogni chiave viene completata: nessuna lacuna o traduzione mancante.

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 è una biblioteca open source che risolve il bug n. 574 di Transloco: la mancanza di un fallback per singola chiave quando un file di traduzione è parzialmente completo.

Struttura dei file consigliata

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

Automatizzare le traduzioni

Dopo aver completato la configurazione di Transloco, traduca i file di lingua con l'IA. Nell'IDE, chieda all'assistente IA di tradurre il file JSON di origine oppure usi la CLI di i18n Agent nella pipeline CI/CD per una localizzazione completamente automatizzata.

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
Traduca in modo incrementale: quando aggiunge nuove chiavi al file di origine, traduca soltanto il diff anziché rigenerare tutti i file. In questo modo preserva le traduzioni revisionate da persone ed evita modifiche superflue.

Automatizzare la qualità

Con i18n-validate, rilevi chiavi mancanti e segnaposto non validi prima del rilascio. Testi l'interfaccia con le pseudotraduzioni di i18n-pseudo prima che arrivino le traduzioni reali.

Problemi comuni

Le traduzioni mostrano le chiavi grezze

TranslocoHttpLoader non trova i file JSON. Controlli che si trovino in src/assets/i18n/, che l'array assets in angular.json includa tale percorso e che i nomi dei file corrispondano esattamente alla configurazione availableLangs, rispettando maiuscole e minuscole.

Le chiavi con ambito non vengono risolte

Quando usa gli ambiti Transloco, i file di traduzione devono trovarsi in assets/i18n/[scope]/[lang].json, non nella cartella i18n principale. Verifichi inoltre che l'ambito sia registrato nell'array providers del componente tramite TRANSLOCO_SCOPE.

Avvisi nella console in produzione

Imposti prodMode: true nella configurazione Transloco per le compilazioni di produzione. Senza questa impostazione, Transloco registra nella console gli avvisi relativi alle chiavi mancanti. Vengono inoltre disabilitati i controlli in fase di sviluppo che comportano un carico aggiuntivo.

Le traduzioni compaiono brevemente durante la navigazione tra route

Le route a caricamento differito recuperano le traduzioni dopo il rendering del componente, causando la breve comparsa di chiavi non tradotte. Usi TRANSLOCO_LOADING_TEMPLATE integrato in Transloco per mostrare uno stato di caricamento oppure precarichi le traduzioni in un route guard.

Gli utenti regionali vedono l'inglese anziché la lingua principale

Il fallback integrato di Transloco si attiva soltanto quando manca un intero file di lingua, non per singole chiavi mancanti. Usi angular-locale-chain per combinare ricorsivamente le traduzioni di lingue correlate (ad esempio, pt-BR passa a pt-PT, poi a pt e infine all'inglese).

Provi subito i18n Agent

Trascinare qui il file di traduzione

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

oppure fare clic per selezionarlo

Lingue di destinazione

Nessuna registrazione richiestaPreventivo immediato

Fallback della lingua con angular-locale-chain

Quando manca una chiave di traduzione in una lingua regionale come pt-BR, TranslocoLoader di Angular passa direttamente alla lingua predefinita anziché controllare prima la lingua principale 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',
});

Consultare la Guida al fallback delle lingue per l'elenco completo dei framework supportati e delle 75 catene integrate. Learn more →

Domande frequenti sull'i18n di Angular