Angular‑i18n‑Lösung
Standalone‑Components, Signals und SSR‑Support für Angular‑Anwendungen.
Laufzeit-Übersetzungen in Angular, in drei Schritten
Das eingebaute i18n von Angular kompiliert ein Bundle pro Sprache. Für Übersetzungen, die sich ohne Rebuild ändern, liest ngx-translate sie zur Laufzeit von Better I18N.
Loader-Abhängigkeiten installieren
ngx-translate liefert die Pipe, den Service und den Loader-Vertrag; core lädt die Messages und speichert sie im 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.Einen TranslateLoader auf Basis des CDN schreiben
TranslateLoader erwartet ein Observable pro Sprache, deshalb ist rxjs from() um getMessages der ganze Adapter.
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 }Bereitstellen und zur Laufzeit wechseln
Ein Provider in bootstrapApplication, dann wechselt use() die Sprache ohne Seiten-Reload und ohne Build pro Sprache.
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
Woher ein Angular-String kommt
Kein Bundle pro Sprache: Der Loader löst eine Sprache zur Laufzeit auf und das Edge liefert sie aus.
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
Schnellstart
Fügen Sie i18n zu Ihrer Angular‑App hinzu – mit Pipes und 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
Die translate-Pipe und der Service lesen beide vom Loader, daher weiß keine Ihrer Komponenten etwas vom 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 />Features
Funktioniert mit beliebten Angular i18n-Bibliotheken
Better I18N ergänzt Ihre Angular i18n-Bibliothek — verwalten Sie Übersetzungen visuell, arbeiten Sie mit Übersetzern zusammen und deployen Sie über CDN.
Better I18N + @ngx-translate/core
Die meistverwendete Angular-Übersetzungsbibliothek. Laufzeit-Übersetzungen mit Pipes, Direktiven und Service-Injection.Better I18N exportiert im ngx-translate JSON-Format. Bearbeiten Sie Übersetzungen im Dashboard, synchronisieren Sie automatisch mit Ihrem Repository.
Better I18N + Angular i18n (built-in)
Angulars offizielles i18n-System mit AOT-Kompilierung, ICU-Ausdrücken und Build-Zeit-Übersetzungsextraktion.Export im Angular XLIFF-Format. Better I18N verwaltet den Übersetzungsworkflow, Angular CLI erstellt locale-spezifische Bundles.
Better I18N + Transloco
Moderne, leichtgewichtige i18n-Bibliothek für Angular mit Lazy Loading, umfangreichen Plugins und exzellenter TypeScript-Unterstützung.Synchronisieren Sie Übersetzungen im Transloco JSON-Format über Better I18Ns GitHub-Integration. Echtzeit-Updates mit CDN-Auslieferung.
Ähnlich
Entdecken Sie weitere Leitfäden zu Frameworks
Get started
Better I18N vs. Alternativen
Kostenloser Tarif verfügbar. Keine Kreditkarte erforderlich.