Skip to main content

Angular i18n med Transloco: Opsætnings- og oversættelsesguide

Fra installation til produktion: Konfigurer Transloco, håndter flertalsformer med ICU-syntaks, tilføj intelligente lokaleindstillinger og automatiser oversættelser med AI.

1

Installer Transloco

Transloco er det mest populære i18n-tredjepartsbibliotek til Angular. Det tilbyder indlæsning af oversættelser under kørsel, understøttelse af ICU-meddelelsesformatet, scopes med doven indlæsning og en enkel skabelon-API med både strukturelle direktiver og pipes.

Hvorfor vælge Transloco frem for Angulars indbyggede i18n? Angulars indbyggede løsning kræver et separat build for hvert sprog og understøtter ikke sprogskift under kørsel. Transloco indlæser oversættelser under kørsel, så du kan udgive ét build og skifte sprog med det samme.
Terminal
npm install @jsverse/transloco
2

Konfigurer Transloco

Registrer Transloco i din applikationskonfiguration. Du skal angive de tilgængelige sprog, vælge et standardsprog og konfigurere oversættelsesindlæseren. Transloco understøtter både selvstændige komponenter (Angular 14+) og NgModule-mønstre.

Selvstændige komponenter (anbefales)

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

NgModule-mønster

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 {}
Hvis oversættelser vises som rå nøgler såsom "nav.home" i stedet for "Home", er den mest almindelige årsag, at TranslocoHttpLoader ikke kan finde dine JSON-filer. Kontrollér, at dine oversættelsesfiler ligger i src/assets/i18n/ og at assets-arrayet i angular.json indeholder denne sti.

Opret oversættelsesfiler

Opret én JSON-fil pr. sprog i src/assets/i18n/. Brug indlejrede nøgler til at organisere strenge efter funktion. Transloco bruger ICU-meddelelsesformatet til flertalsformer og variabler.

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

Brug oversættelser i skabeloner og tjenester

Transloco tilbyder tre måder at oversætte i skabeloner på: det strukturelle direktiv (*transloco), pipen (| transloco) og tjenesten (TranslocoService) til TypeScript-kode. Det strukturelle direktiv anbefales til de fleste anvendelser, fordi det opretter ét abonnement og stiller oversættelsesfunktionen til rådighed for hele skabelonblokken.

Skabelonoversættelse

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>
Brug parameteren read på det strukturelle direktiv til at afgrænse oversættelser til en indlejret nøgle. Så undgår du at gentage præfikset i hvert t()-kald og skabelonerne bliver mere overskuelige.

Tjenesteoversættelse (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);
  }
}
Pipen transloco opretter et nyt abonnement for hver anvendelse. I skabeloner med mange oversatte strenge bør du foretrække det strukturelle direktiv *transloco, som opretter ét abonnement for hele blokken.
4

Håndter flertalsformer med ICU-meddelelsesformatet

Transloco bruger ICU-meddelelsesformatet til flertalsformer og select-udtryk. ICU håndterer automatisk komplekse flertalsregler — arabisk (6 former), russisk (3 former), japansk (1 form) — alt sammen fra én meddelelsesstreng. Definer dine flertalsregler i oversættelsesfilerne, så vælger Transloco den korrekte form under kørsel.

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>
Implementer aldrig din egen flertalslogik i komponenterne. Sprog har meget forskellige flertalsregler, som ICU-specifikationen allerede håndterer. Lad Transloco og ICU gøre arbejdet — din opgave er at definere de korrekte flertalsformer i oversættelsesfilerne.

Intelligente lokaleindstillinger med angular-locale-chain

Som standard falder Transloco tilbage til din standardlandestandard, når en oversættelsesnøgle mangler. En pt-BR-bruger ser engelsk i stedet for fuldt brugbare pt-PT-oversættelser. angular-locale-chain løser dette ved at dybdeflette oversættelser fra en konfigurerbar fallbackkæde, før de videregives til Transloco. Hver nøgle udfyldes — ingen huller og ingen manglende oversættelser.

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 er et open source-bibliotek, der løser Transloco-fejl nr. 574 — manglende fallback pr. nøgle, når en oversættelsesfil kun er delvist færdig.

Anbefalet filstruktur

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 oversættelser

Når din Transloco-opsætning er færdig, kan du oversætte dine landestandardfiler med AI. Bed din AI-assistent i dit IDE om at oversætte din JSON-kildefil eller brug i18n Agent CLI i din CI/CD-pipeline til fuldautomatisk lokalisering.

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
Oversæt trinvist — når du føjer nye nøgler til kildefilen, skal du kun oversætte ændringerne i stedet for at generere alle filer igen. Dermed bevares eventuelle oversættelser, som er gennemgået af mennesker, mens unødvendige ændringer undgås.

Automatiser oversættelseskvaliteten

Find manglende nøgler og ødelagte pladsholdere med i18n-validate, før de udgives. Test din brugergrænseflade med pseudooversættelser ved hjælp af i18n-pseudo, inden de rigtige oversættelser er klar.

Almindelige faldgruber

Oversættelser viser rå nøgler

TranslocoHttpLoader kan ikke finde dine JSON-filer. Kontrollér, at filerne ligger i src/assets/i18n/, at assets-arrayet i angular.json indeholder denne sti og at filnavnene svarer nøjagtigt til din availableLangs-konfiguration (der skelnes mellem store og små bogstaver).

Afgrænsede nøgler kan ikke fortolkes

Når du bruger Transloco-scopes, skal oversættelsesfilerne ligge i assets/i18n/[scope]/[lang].json og ikke i i18n-rodmappen. Sørg også for, at scopet er registreret i komponentens providers-array ved hjælp af TRANSLOCO_SCOPE.

Konsoladvarsler i produktion

Indstil prodMode: true i din Transloco-konfiguration til produktionsbuilds. Uden denne indstilling logger Transloco advarsler om manglende nøgler i konsollen. Den deaktiverer også kontroller under udvikling, som giver ekstra belastning.

Oversættelser blinker ved rutenavigation

Ruter med doven indlæsning henter oversættelser, efter at komponenten er gengivet, hvilket kortvarigt viser uoversatte nøgler. Brug Translocos indbyggede TRANSLOCO_LOADING_TEMPLATE til at vise en indlæsningstilstand eller forudindlæs oversættelser i en route guard.

Regionale brugere ser engelsk i stedet for den overordnede landestandard

Translocos indbyggede fallback aktiveres kun, når en hel landestandardfil mangler, ikke når enkelte nøgler mangler. Brug angular-locale-chain til at dybdeflette oversættelser fra beslægtede landestandarder (f.eks. falder pt-BR tilbage til pt-PT, derefter pt og til sidst engelsk).

Prøv i18n Agent nu

Slip din oversættelsesfil her

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

eller klik for at vælge en fil

Målsprog

Kræver ingen tilmeldingEstimat med det samme

Lokalt fallback med angular-locale-chain

Når en oversættelsesnøgle mangler i en regional landestandard som pt-BR, går Angulars TranslocoLoader direkte til standardlandestandarden i stedet for først at kontrollere den overordnede landestandard 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',
});

Se vores guide til lokale fallbackmekanismer for at få den komplette liste over understøttede frameworks og 75 indbyggede kæder. Learn more →

Ofte stillede spørgsmål om Angular i18n