Skip to main content

i18n Angular avec Transloco : guide de configuration et de traduction

De l'installation à la production : configurez Transloco, gérez les pluriels avec la syntaxe ICU, ajoutez des replis linguistiques intelligents et automatisez les traductions avec l'IA.

1

Installer Transloco

Transloco est la bibliothèque i18n tierce la plus populaire pour Angular. Elle offre le chargement des traductions à l'exécution, la prise en charge du format de message ICU, des portées à chargement différé, ainsi qu'une API de modèle claire avec directives structurelles et pipes.

Pourquoi choisir Transloco plutôt que la solution i18n intégrée à Angular ? La solution intégrée d'Angular nécessite un build distinct par langue et ne prend pas en charge le changement de langue à l'exécution. Transloco charge les traductions à l'exécution : vous livrez donc un seul build et changez de langue à la volée.
Terminal
npm install @jsverse/transloco
2

Configurer Transloco

Enregistrez Transloco dans la configuration de votre application. Vous devez fournir les langues disponibles, définir une langue par défaut et configurer le chargeur de traductions. Transloco prend en charge aussi bien les composants standalone (Angular 14+) que le modèle NgModule.

Composants standalone (recommandé)

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

Modèle 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 traductions s'affichent sous forme de clés brutes comme « nav.home » au lieu de « Home », la cause la plus fréquente est que TranslocoHttpLoader ne trouve pas vos fichiers JSON. Vérifiez que vos fichiers de traduction se trouvent dans src/assets/i18n/ et que le tableau assets de votre angular.json inclut bien ce chemin.

Créer des fichiers de traduction

Créez un fichier JSON par langue dans src/assets/i18n/. Utilisez des clés imbriquées pour organiser les chaînes par fonctionnalité. Transloco utilise le format de message ICU pour les pluriels et 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

Utiliser les traductions dans les modèles et les services

Transloco propose trois façons de traduire dans les modèles : la directive structurelle (*transloco), le pipe (| transloco) et le service (TranslocoService) pour le code TypeScript. La directive structurelle est recommandée dans la plupart des cas, car elle crée un seul abonnement et met la fonction de traduction à disposition de tout le bloc de modèle.

Traduction dans les modèles

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>
Utilisez le paramètre read de la directive structurelle pour restreindre les traductions à une clé imbriquée. Cela évite de répéter le préfixe à chaque appel de t() et rend les modèles plus lisibles.

Traduction via le service (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);
  }
}
Le pipe transloco crée un nouvel abonnement à chaque utilisation. Dans les modèles contenant de nombreuses chaînes traduites, préférez la directive structurelle *transloco, qui crée un seul abonnement pour tout le bloc.
4

Gérer les pluriels avec le format de message ICU

Transloco utilise le format de message ICU pour les pluriels et les expressions select. ICU gère automatiquement les règles de pluriel complexes — arabe (6 formes), russe (3 formes), japonais (1 forme) — le tout à partir d'une seule chaîne de message. Définissez vos règles de pluriel dans les fichiers de traduction, et Transloco sélectionne la forme correcte à l'exécution.

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>
N'implémentez jamais de logique de pluriel personnalisée dans vos composants. Les langues ont des règles de pluriel radicalement différentes, que la spécification ICU gère déjà. Laissez Transloco et ICU faire le travail : votre rôle est de définir les bonnes formes de pluriel dans vos fichiers de traduction.

Replis linguistiques intelligents avec angular-locale-chain

Par défaut, Transloco se rabat sur votre langue par défaut lorsqu'une clé de traduction est manquante. Un utilisateur pt-BR voit alors de l'anglais au lieu de traductions pt-PT pourtant parfaitement valables. angular-locale-chain corrige ce problème en fusionnant en profondeur les traductions d'une chaîne de repli configurable avant de les transmettre à Transloco. Chaque clé est ainsi renseignée : aucune lacune, aucune traduction manquante.

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 est une bibliothèque open source qui résout le bug #574 de Transloco : l'absence de repli par clé lorsqu'un fichier de traduction est partiellement complété.

Structure de fichiers recommandée

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

Automatiser les traductions

Une fois votre configuration Transloco terminée, traduisez vos fichiers de langue à l'aide de l'IA. Dans votre IDE, demandez à votre assistant IA de traduire votre fichier JSON source, ou utilisez le CLI i18n Agent dans votre pipeline CI/CD pour une localisation entièrement automatisée.

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
Traduisez de façon incrémentale : lorsque vous ajoutez de nouvelles clés à votre fichier source, ne traduisez que le diff plutôt que de régénérer tous les fichiers. Cela préserve les traductions déjà relues par un humain et évite des changements inutiles.

Automatiser la qualité des traductions

Détectez les clés manquantes et les espaces réservés cassés avant leur mise en production grâce à i18n-validate. Testez votre interface avec des pseudo-traductions grâce à i18n-pseudo avant l'arrivée des traductions réelles.

Pièges courants

Les traductions affichent des clés brutes

Le TranslocoHttpLoader ne trouve pas vos fichiers JSON. Vérifiez que les fichiers se trouvent dans src/assets/i18n/, que le tableau assets de votre angular.json inclut bien ce chemin, et que les noms de fichiers correspondent exactement à votre configuration availableLangs (sensible à la casse).

Les clés à portée limitée ne se résolvent pas

Lorsque vous utilisez des portées Transloco, les fichiers de traduction doivent se trouver dans assets/i18n/[scope]/[lang].json, et non dans le dossier i18n racine. Vérifiez également que la portée est enregistrée dans le tableau providers du composant à l'aide de TRANSLOCO_SCOPE.

Avertissements dans la console en production

Définissez prodMode: true dans votre configuration Transloco pour les builds de production. Sans cela, Transloco consigne dans la console des avertissements pour les clés manquantes. Cela désactive également les vérifications de développement qui ajoutent une surcharge.

Un flash de traductions apparaît lors de la navigation entre les routes

Les routes à chargement différé récupèrent les traductions après le rendu du composant, ce qui provoque un bref affichage de clés non traduites. Utilisez le TRANSLOCO_LOADING_TEMPLATE intégré de Transloco pour afficher un état de chargement, ou préchargez les traductions dans un garde de route.

Les utilisateurs régionaux voient l'anglais au lieu de la locale parente

Le repli intégré de Transloco ne se déclenche que lorsqu'un fichier de langue entier est manquant, pas pour des clés manquantes individuelles. Utilisez angular-locale-chain pour fusionner en profondeur les traductions des langues apparentées (par exemple, pt-BR se rabat sur pt-PT, puis pt, puis l'anglais).

Essayez i18n Agent maintenant

Déposez votre fichier de traduction ici

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

ou cliquez pour parcourir

Langues cibles

Aucune inscription requiseEstimation instantanée

Repli linguistique avec angular-locale-chain

Lorsqu'une clé de traduction est manquante dans une langue régionale comme pt-BR, le TranslocoLoader d'Angular passe directement à la langue par défaut au lieu de vérifier d'abord la langue parente 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',
});

Consultez notre guide de repli de locale pour découvrir la liste complète des frameworks pris en charge et les 75 chaînes intégrées. Learn more →

FAQ i18n Angular