Skip to main content

Internacionalització d’Angular amb Transloco: guia de configuració i traducció

De la instal·lació a producció: configuri Transloco, gestioni els plurals amb la sintaxi d’ICU, afegeixi cadenes intel·ligents de configuracions regionals alternatives i automatitzi les traduccions amb IA.

1

Instal·lar Transloco

Transloco és la biblioteca d’internacionalització de tercers més popular per a Angular. Ofereix càrrega de traduccions en temps d’execució, compatibilitat amb el format de missatges d’ICU, àmbits de càrrega diferida i una API de plantilles clara amb directives estructurals i pipes.

Per què cal triar Transloco en lloc de la internacionalització integrada d’Angular? La solució integrada d’Angular requereix una compilació independent per a cada llengua i no permet canviar de llengua en temps d’execució. Transloco carrega les traduccions en temps d’execució, de manera que només cal publicar una compilació i es pot canviar de llengua al moment.
Terminal
npm install @jsverse/transloco
2

Configurar Transloco

Registri Transloco a la configuració de l’aplicació. Cal indicar les llengües disponibles, establir-ne una de predeterminada i configurar el carregador de traduccions. Transloco és compatible tant amb els components autònoms (Angular 14+) com amb els patrons d’NgModule.

Components autònoms (opció recomanada)

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

Patró d’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 {}
Si les traduccions apareixen com a claus sense processar, com ara "nav.home", en lloc de "Home", la causa més habitual és que TranslocoHttpLoader no pot trobar els fitxers JSON. Comprovi que els fitxers de traducció siguin a src/assets/i18n/ i que la matriu d’actius d’angular.json inclogui aquest camí.

Crear els fitxers de traducció

Creï un fitxer JSON per a cada llengua a src/assets/i18n/. Faci servir claus imbricades per organitzar les cadenes segons la funcionalitat. Transloco utilitza el format de missatges d’ICU per als plurals i les variables.

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

Utilitzar les traduccions en plantilles i serveis

Transloco ofereix tres maneres de traduir en plantilles: la directiva estructural (*transloco), la pipe (| transloco) i el servei (TranslocoService) per al codi TypeScript. La directiva estructural és l’opció recomanada en la majoria de casos perquè crea una única subscripció i proporciona la funció de traducció a tot el bloc de la plantilla.

Traducció en plantilles

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>
Utilitzi el paràmetre read de la directiva estructural per limitar les traduccions a una clau imbricada. D’aquesta manera, evitarà repetir el prefix en cada crida a t() i obtindrà plantilles més netes.

Traducció en serveis (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 subscripció nova cada vegada que s’utilitza. En plantilles amb moltes cadenes traduïdes, és preferible emprar la directiva estructural *transloco, que crea una única subscripció per a tot el bloc.
4

Gestionar els plurals amb el format de missatges d’ICU

Transloco utilitza el format de missatges d’ICU per als plurals i les expressions de selecció. ICU gestiona automàticament regles de plural complexes —àrab (6 formes), rus (3 formes), japonès (1 forma)— a partir d’una única cadena de missatge. Defineixi les regles de plural als fitxers de traducció i Transloco seleccionarà la forma correcta en temps d’execució.

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>
No implementi mai una lògica de pluralització pròpia als components. Les regles de plural varien molt entre llengües i l’especificació d’ICU ja les gestiona. Deixi que Transloco i ICU facin aquesta feina; només cal definir les formes de plural correctes als fitxers de traducció.

Cadenes intel·ligents de configuracions regionals alternatives amb angular-locale-chain

De manera predeterminada, Transloco recorre a la configuració regional predeterminada quan falta una clau de traducció. Per tant, un usuari de pt-BR veu el text en anglès en lloc de les traduccions perfectament vàlides de pt-PT. angular-locale-chain ho resol fusionant en profunditat les traduccions d’una cadena configurable de configuracions regionals alternatives abans de lliurar-les a Transloco. Totes les claus queden emplenades: no hi ha buits ni traduccions absents.

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 és una biblioteca de codi obert que resol l’error núm. 574 de Transloco: l’absència d’una alternativa per clau quan un fitxer de traducció només està complet parcialment.

Estructura de fitxers recomanada

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

Automatitzar les traduccions

Un cop completada la configuració de Transloco, tradueixi els fitxers de configuració regional amb IA. Demani a l’assistent d’IA de l’IDE que tradueixi el fitxer JSON d’origen o utilitzi la CLI d’i18n Agent a la canalització de CI/CD per automatitzar completament la localització.

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
Tradueixi de manera incremental: quan afegeixi claus noves al fitxer d’origen, tradueixi només les diferències en lloc de tornar a generar tots els fitxers. Així conservarà les traduccions revisades per persones i evitarà canvis innecessaris.

Automatitzar la qualitat de les traduccions

Detecti amb i18n-validate les claus absents i els marcadors de posició malmesos abans que arribin a producció. Provi la interfície amb pseudotraduccions mitjançant i18n-pseudo abans que arribin les traduccions reals.

Errors habituals

Les traduccions mostren les claus sense processar

TranslocoHttpLoader no pot trobar els fitxers JSON. Comprovi que els fitxers siguin a src/assets/i18n/, que la matriu d’actius d’angular.json inclogui aquest camí i que els noms dels fitxers coincideixin exactament amb la configuració d’availableLangs (distingeix entre majúscules i minúscules).

Les claus dels àmbits no es resolen

Quan utilitzi àmbits de Transloco, els fitxers de traducció han de ser a assets/i18n/[scope]/[lang].json, no pas a l’arrel de la carpeta i18n. Comprovi també que l’àmbit estigui registrat a la matriu de proveïdors del component mitjançant TRANSLOCO_SCOPE.

Avisos a la consola en producció

Estableixi prodMode: true a la configuració de Transloco per a les compilacions de producció. Altrament, Transloco registra avisos sobre claus absents a la consola. Aquesta opció també desactiva les comprovacions de desenvolupament que afegeixen sobrecàrrega.

Les traduccions parpellegen en navegar entre rutes

Les rutes de càrrega diferida obtenen les traduccions després que es renderitzi el component, fet que provoca un breu parpelleig de claus sense traduir. Utilitzi el TRANSLOCO_LOADING_TEMPLATE integrat de Transloco per mostrar un estat de càrrega o precarregui les traduccions en un protector de ruta.

Els usuaris regionals veuen l’anglès en lloc de la configuració regional superior

El mecanisme alternatiu integrat de Transloco només s’activa quan falta tot un fitxer de configuració regional, no pas quan falten claus concretes. Utilitzi angular-locale-chain per fusionar en profunditat les traduccions de configuracions regionals relacionades (p. ex., pt-BR recorre a pt-PT, després a pt i finalment a l’anglès).

Provar i18n Agent ara

Arrossegar aquí el fitxer de traducció

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

o fer clic per explorar

Idiomes de destinació

No cal registrePressupost instantani

Configuració regional alternativa amb angular-locale-chain

Quan falta una clau de traducció en una configuració regional com pt-BR, TranslocoLoader d’Angular passa directament a la configuració regional predeterminada en lloc de comprovar primer la configuració regional pare (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',
});

Consulti la guia de configuracions regionals alternatives per veure la llista completa d’entorns de treball compatibles i les 75 cadenes integrades. Learn more →

Preguntes freqüents sobre la internacionalització d’Angular