Aller au contenu
Angular i18n

Solution i18n Angular

Composants standalone, signals et support SSR pour les applications Angular.

Setup

Des traductions à l'exécution dans Angular, en trois étapes

L'i18n intégré d'Angular compile un bundle par langue. Pour des traductions qui changent sans reconstruction, ngx-translate les lit depuis Better I18N à l'exécution.

Installer les dépendances du loader

ngx-translate fournit le pipe, le service et le contrat de loader ; core récupère les messages et les met en cache.

terminalbash
npm install @ngx-translate/core @better-i18n/core

# @better-i18n/core ships zero dependencies —
# it is the same client our React SDKs are built on.

Écrire un TranslateLoader adossé au CDN

TranslateLoader attend un Observable par langue : le from() de rxjs autour de getMessages constitue donc tout l'adaptateur.

src/app/better-i18n.loader.tsts
import { Injectable } from '@angular/core'
import { TranslateLoader } from '@ngx-translate/core'
import { createI18nCore } from '@better-i18n/core'
import { from, Observable } from 'rxjs'

// Module scope: the 60s in-memory cache lives on the instance, so one
// client per app — not one per component.
const betterI18n = createI18nCore({
  projectId: 'your-org/your-project', // Settings → General → Project ID
  defaultLocale: 'en',
})

@Injectable({ providedIn: 'root' })
export class BetterI18nLoader implements TranslateLoader {
  // TranslateLoader's contract: one Observable of messages per language.
  getTranslation(lang: string): Observable<Record<string, unknown>> {
    return from(betterI18n.getMessages(lang))
  }
}

export { betterI18n }

Le fournir et changer de langue à l'exécution

Un seul provider dans bootstrapApplication, puis use() change de langue sans recharger la page et sans build par langue.

src/main.tsts
import { bootstrapApplication } from '@angular/platform-browser'
import { importProvidersFrom } from '@angular/core'
import { TranslateModule, TranslateLoader } from '@ngx-translate/core'
import { AppComponent } from './app/app.component'
import { BetterI18nLoader } from './app/better-i18n.loader'

bootstrapApplication(AppComponent, {
  providers: [
    importProvidersFrom(
      TranslateModule.forRoot({
        defaultLanguage: 'en',
        loader: { provide: TranslateLoader, useClass: BetterI18nLoader },
      })
    ),
  ],
})

How it works

D'où vient une chaîne dans Angular

Pas de bundle par langue : le loader résout une langue à l'exécution et l'edge la renvoie.

Read path — every locale load

Your Angular app

The translate pipe reads what TranslateService already loaded.

0 network calls per render

@better-i18n/core

getMessages(lang) inside the TranslateLoader — cached per language.

60s TTL · 0 deps

CDN edge

Cloudflare worker answers from the nearest edge cache.

max-age=60 · always 200

R2 object store

The published translation files the sync worker wrote.

source of truth

Fallback chain — tried in order when a hop fails

1In-memory TTL cache
2CDN fetch, with timeout and one retry
3Persistent storage, if configured
4staticData bundled with the app
5Throw — after everything above missed

Write path — dashboard to app

AI or translator

Proposal reviewed in the dashboard, glossary enforced.

MCP · dashboard · CLI

Publish

Sync worker writes the locale files to R2.

better-i18n publish

CDN purge

Fire-and-forget purge of the affected keys and the manifest.

non-critical by design

Live in the app

The next getMessages() past the TTL returns the new copy.

~60s worst case

0dependencies in core
60scache TTL, client and edge
200CDN status, even on failure
5fallback layers before an error
Switching locale

Démarrage rapide

Ajoutez l’i18n à votre app Angular avec des pipes et des services.

src/app/locale-switcher.component.tsts
import { Component, inject } from '@angular/core'
import { TranslateModule, TranslateService } from '@ngx-translate/core'
import { betterI18n } from './better-i18n.loader'

@Component({
  selector: 'app-locale-switcher',
  standalone: true,
  imports: [TranslateModule],
  template: `
    <select (change)="switchTo($any($event.target).value)">
      <option *ngFor="let l of languages" [value]="l.code">{{ l.name }}</option>
    </select>
  `,
})
export class LocaleSwitcherComponent {
  private translate = inject(TranslateService)
  languages: { code: string; name: string }[] = []

  async ngOnInit() {
    // Locales come from the project manifest, not a hardcoded array.
    this.languages = await betterI18n.getLanguages()
  }

  switchTo(lang: string) {
    // use() calls the loader, which hits the cache or the CDN.
    this.translate.use(lang)
  }
}
In a template

In a template

Le pipe translate et le service lisent tous deux depuis le loader : aucun de vos composants ne connaît le CDN.

src/app/app.component.htmlhtml
<!-- app.component.html -->
<h1>{{ 'home.title' | translate }}</h1>
<p>{{ 'home.greeting' | translate: { name: 'World' } }}</p>

<!-- ICU plurals authored in the Better i18n dashboard -->
<p>{{ 'cart.items' | translate: { count: 3 } }}</p>

<app-locale-switcher />
Capabilities

Fonctionnalités

Support des composants standalone
Support des signals
Pipes de traduction
Directives i18n
Services injectables
Chargement différé des modules
SSR Angular Universal
Support de compilation AOT
Intégration Angular CLI
Works with

Compatible avec les bibliothèques i18n populaires d'Angular

Better I18N complète votre bibliothèque i18n Angular — gérez les traductions visuellement, collaborez avec les traducteurs et déployez via CDN.

Better I18N + @ngx-translate/core

La bibliothèque de traduction Angular la plus utilisée. Traductions à l'exécution avec pipes, directives et injection de service.Better I18N exporte au format JSON ngx-translate. Modifiez les traductions dans notre tableau de bord, synchronisez automatiquement avec votre dépôt.

Better I18N + Angular i18n (built-in)

Le système i18n officiel d'Angular avec compilation AOT, expressions ICU et extraction des traductions à la compilation.Export au format Angular XLIFF. Better I18N gère le workflow de traduction, Angular CLI construit les bundles spécifiques à chaque locale.

Better I18N + Transloco

Bibliothèque i18n moderne et légère pour Angular avec chargement différé, plugins riches et excellent support TypeScript.Synchronisez les traductions au format JSON Transloco via l'intégration GitHub de Better I18N. Mises à jour en temps réel avec livraison CDN.

Découvrez d'autres guides sur les frameworks

Get started

Better I18N vs les alternatives

Offre gratuite disponible. Aucune carte bancaire requise.