Solution i18n Angular
Composants standalone, signals et support SSR pour les applications Angular.
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.
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.
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.
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
The translate pipe reads what TranslateService already loaded.
0 network calls per render
getMessages(lang) inside the TranslateLoader — cached per language.
60s TTL · 0 deps
Cloudflare worker answers from the nearest edge cache.
max-age=60 · always 200
The published translation files the sync worker wrote.
source of truth
Fallback chain — tried in order when a hop fails
Write path — dashboard to app
Proposal reviewed in the dashboard, glossary enforced.
MCP · dashboard · CLI
Sync worker writes the locale files to R2.
better-i18n publish
Fire-and-forget purge of the affected keys and the manifest.
non-critical by design
The next getMessages() past the TTL returns the new copy.
~60s worst case
Démarrage rapide
Ajoutez l’i18n à votre app Angular avec des pipes et des services.
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
Le pipe translate et le service lisent tous deux depuis le loader : aucun de vos composants ne connaît le CDN.
<!-- 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 />Fonctionnalités
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.
En lien
Découvrez d'autres guides sur les frameworks
Get started
Better I18N vs les alternatives
Offre gratuite disponible. Aucune carte bancaire requise.