Skip to main content

Angular i18n med Transloco: Oppsett og oversettelsesguide

Fra installasjon til produksjon: konfigurer Transloco, håndter flertallsformer med ICU-syntaks, legg til smarte reservekjeder for språkvarianter, og automatiser oversettelser med AI.

1

Installer Transloco

Transloco er det mest populære tredjeparts-i18n-biblioteket for Angular. Det tilbyr innlasting av oversettelser ved kjøretid, støtte for ICU-meldingsformat, lat-innlastede scopes, og et ryddig template-API med både strukturelle direktiver og pipes.

Hvorfor Transloco fremfor Angulars innebygde i18n? Angulars innebygde løsning krever et separat bygg per språk og støtter ikke språkbytte ved kjøretid. Transloco laster oversettelser ved kjøretid, så du driftsetter ett bygg og bytter språk direkte.
Terminal
npm install @jsverse/transloco
2

Konfigurer Transloco

Registrer Transloco i applikasjonskonfigurasjonen. Du må oppgi tilgjengelige språk, sette et standardspråk, og konfigurere oversettelseslasteren. Transloco støtter både standalone-komponenter (Angular 14+) og NgModule-mønstre.

Standalone-komponenter (anbefalt)

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 oversettelser vises som rå nøkler, som «nav.home» i stedet for «Home», er den vanligste årsaken at TranslocoHttpLoader ikke finner JSON-filene dine. Kontroller at oversettelsesfilene ligger i src/assets/i18n/, og at assets-arrayet i angular.json inkluderer denne stien.

Opprett oversettelsesfiler

Opprett én JSON-fil per språk i src/assets/i18n/. Bruk nøstede nøkler for å organisere strenger etter funksjon. Transloco bruker ICU-meldingsformatet for flertallsformer 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

Bruk oversettelser i templates og tjenester

Transloco tilbyr tre måter å oversette på i templates: det strukturelle direktivet (*transloco), pipen (| transloco), og tjenesten (TranslocoService) for TypeScript-kode. Det strukturelle direktivet anbefales i de fleste tilfeller fordi det oppretter ett enkelt abonnement og gjør oversettelsesfunksjonen tilgjengelig for hele template-blokken.

Oversettelse i template

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>
Bruk read-parameteren på det strukturelle direktivet for å avgrense oversettelser til en nøstet nøkkel. Dette unngår at du må gjenta prefikset i hvert t()-kall, og gjør templates ryddigere.

Oversettelse via tjeneste (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);
  }
}
Transloco-pipen oppretter et nytt abonnement for hver bruk. I templates med mange oversatte strenger bør du foretrekke det strukturelle direktivet *transloco, som oppretter ett enkelt abonnement for hele blokken.
4

Håndter flertallsformer med ICU-meldingsformat

Transloco bruker ICU-meldingsformatet for flertallsformer og select-uttrykk. ICU håndterer kompliserte flertallsregler automatisk — arabisk (6 former), russisk (3 former), japansk (1 form) — alt fra én og samme meldingsstreng. Definer flertallsreglene dine i oversettelsesfilene, så velger Transloco riktig form ved kjøretid.

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 aldri egen flertallslogikk i komponentene dine. Språk har svært ulike flertallsregler som ICU-spesifikasjonen allerede håndterer. La Transloco og ICU gjøre jobben — din oppgave er å definere riktige flertallsformer i oversettelsesfilene.

Smarte språkfallbacker med angular-locale-chain

Som standard faller Transloco tilbake til standardspråket ditt når en oversettelsesnøkkel mangler. En pt-BR-bruker ser engelsk i stedet for helt gode pt-PT-oversettelser. angular-locale-chain løser dette ved å slå sammen oversettelser rekursivt fra en konfigurerbar reservekjede før de sendes videre til Transloco. Hver nøkkel blir fylt inn — ingen hull, ingen manglende oversettelser.

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 bibliotek med åpen kildekode som løser Transloco-feil #574 — manglende reserve per nøkkel når en oversettelsesfil er delvis fullført.

Anbefalt 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 oversettelser

Når Transloco-oppsettet er fullført, kan du oversette språkfilene dine ved hjelp av AI. I IDE-en din kan du be AI-assistenten om å oversette kilde-JSON-filen, eller bruke i18n Agent-CLI-en i CI/CD-pipelinen din for helautomatisert 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
Oversett trinnvis — når du legger til nye nøkler i kildefilen, bør du kun oversette diffen i stedet for å regenerere alle filene. Dette bevarer eventuelle manuelt gjennomgåtte oversettelser og unngår unødvendig ekstraarbeid.

Automatiser oversettelseskvalitet

Fang opp manglende nøkler og ødelagte plassholdere med i18n-validate før de driftsettes. Test brukergrensesnittet med pseudo-oversettelser ved hjelp av i18n-pseudo før de virkelige oversettelsene er klare.

Vanlige fallgruver

Oversettelser viser rå nøkler

TranslocoHttpLoader finner ikke JSON-filene dine. Sjekk at filene ligger i src/assets/i18n/, at assets-arrayet i angular.json inkluderer denne stien, og at filnavnene stemmer nøyaktig overens med availableLangs-konfigurasjonen (skiller mellom store og små bokstaver).

Avgrensede nøkler blir ikke funnet

Når du bruker Transloco-scopes, må oversettelsesfilene ligge i assets/i18n/[scope]/[lang].json, ikke i rotmappen for i18n. Sørg også for at scopet er registrert i komponentens providers-array med TRANSLOCO_SCOPE.

Konsollvarsler i produksjon

Sett prodMode: true i Transloco-konfigurasjonen for produksjonsbygg. Uten dette logger Transloco varsler om manglende nøkler til konsollen. Innstillingen slår også av kontroller under utvikling som medfører ekstra ressursbruk.

Oversettelser blinker ved rutenavigasjon

Lat-innlastede ruter henter oversettelser etter at komponenten er gjengitt, noe som fører til et kort blink av uoversatte nøkler. Bruk Translocos innebygde TRANSLOCO_LOADING_TEMPLATE for å vise en innlastingsstatus, eller forhåndslast oversettelser i en rutevakt.

Regionale brukere ser engelsk i stedet for overordnet språk

Translocos innebygde fallback utløses kun når en hel språkfil mangler, ikke for enkeltnøkler som mangler. Bruk angular-locale-chain til å slå sammen oversettelser fra beslektede språk (f.eks. faller pt-BR tilbake til pt-PT, deretter pt, deretter engelsk).

Prøv i18n Agent nå

Slipp oversettelsesfilen din her

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

eller klikk for å bla gjennom

Målspråk

Ingen registrering krevesUmiddelbart estimat

Språkfallback med angular-locale-chain

Når en oversettelsesnøkkel mangler i et regionalt språk som pt-BR, hopper Angulars TranslocoLoader rett til standardspråket i stedet for først å sjekke det overordnede språket 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 guiden vår for språkfallback for den fullstendige listen over støttede rammeverk og 75 innebygde kjeder. Learn more →

Ofte stilte spørsmål om Angular i18n