Skip to main content

Angular i18n dengan Transloco: Panduan Penyiapan & Terjemahan

Dari instalasi hingga produksi: konfigurasikan Transloco, tangani bentuk jamak dengan sintaks ICU, tambahkan fallback bahasa cerdas, dan otomatiskan penerjemahan dengan AI.

1

Instal Transloco

Transloco adalah library i18n pihak ketiga paling populer untuk Angular. Library ini menyediakan pemuatan terjemahan saat runtime, dukungan format pesan ICU, scope yang dimuat lambat, dan API templat rapi dengan directive struktural serta pipe.

Mengapa Transloco, bukan i18n bawaan Angular? Solusi bawaan Angular memerlukan build terpisah untuk setiap bahasa dan tidak mendukung pengalihan bahasa saat runtime. Transloco memuat terjemahan saat runtime sehingga Anda merilis satu build dan mengalihkan bahasa secara langsung.
Terminal
npm install @jsverse/transloco
2

Konfigurasikan Transloco

Daftarkan Transloco dalam konfigurasi aplikasi. Anda harus menyediakan bahasa yang tersedia, mengatur bahasa default, dan mengonfigurasi pemuat terjemahan. Transloco mendukung komponen standalone (Angular 14+) dan pola NgModule.

Komponen Standalone (Disarankan)

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

Pola NgModule

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 {}
Jika terjemahan muncul sebagai kunci mentah seperti "nav.home", bukan "Home", penyebab paling umum adalah TranslocoHttpLoader tidak dapat menemukan file JSON. Pastikan file terjemahan berada di src/assets/i18n/ dan array assets dalam angular.json menyertakan jalur tersebut.

Buat File Terjemahan

Buat satu file JSON per bahasa di src/assets/i18n/. Gunakan kunci bertingkat untuk menyusun string menurut fitur. Transloco menggunakan format pesan ICU untuk bentuk jamak dan variabel.

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

Gunakan Terjemahan dalam Templat dan Layanan

Transloco menyediakan tiga cara menerjemahkan dalam templat: directive struktural (*transloco), pipe (| transloco), dan layanan (TranslocoService) untuk kode TypeScript. Directive struktural disarankan untuk sebagian besar kasus karena membuat satu langganan dan menyediakan fungsi terjemahan bagi seluruh blok templat.

Terjemahan Templat

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>
Gunakan parameter read pada directive struktural untuk membatasi terjemahan ke kunci bertingkat. Ini menghindari pengulangan awalan dalam setiap panggilan t() dan membuat templat lebih rapi.

Terjemahan Layanan (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);
  }
}
Pipe transloco membuat langganan baru untuk setiap penggunaan. Dalam templat dengan banyak string terjemahan, pilih directive struktural *transloco yang membuat satu langganan untuk seluruh blok.
4

Tangani Bentuk Jamak dengan Format Pesan ICU

Transloco menggunakan format pesan ICU untuk bentuk jamak dan ekspresi select. ICU menangani aturan bentuk jamak kompleks secara otomatis—bahasa Arab (6 bentuk), Rusia (3 bentuk), Jepang (1 bentuk)—semuanya dari satu string pesan. Tentukan aturan bentuk jamak dalam file terjemahan dan Transloco memilih bentuk yang benar saat runtime.

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>
Jangan pernah menerapkan logika bentuk jamak khusus dalam komponen. Bahasa memiliki aturan bentuk jamak yang sangat berbeda dan sudah ditangani spesifikasi ICU. Biarkan Transloco dan ICU menanganinya—tugas Anda adalah menentukan bentuk jamak yang benar dalam file terjemahan.

Fallback Bahasa Cerdas dengan angular-locale-chain

Secara default, Transloco beralih ke bahasa default saat kunci terjemahan hilang. Pengguna pt-BR melihat bahasa Inggris, bukan terjemahan pt-PT yang masih sesuai. angular-locale-chain memperbaikinya dengan menggabungkan terjemahan secara mendalam dari rantai fallback yang dapat dikonfigurasi sebelum menyerahkannya ke Transloco. Setiap kunci terisi—tanpa celah dan tanpa terjemahan hilang.

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 adalah library sumber terbuka yang mengatasi bug Transloco #574—fallback per kunci hilang saat file terjemahan hanya terisi sebagian.

Struktur File yang Disarankan

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

Otomatiskan Penerjemahan

Setelah penyiapan Transloco selesai, terjemahkan file bahasa dengan AI. Di IDE, minta asisten AI menerjemahkan file JSON sumber atau gunakan CLI i18n Agent dalam pipeline CI/CD untuk lokalisasi yang sepenuhnya otomatis.

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
Terjemahkan secara bertahap—saat menambahkan kunci baru ke file sumber, terjemahkan hanya diff, bukan membuat ulang semua file. Ini mempertahankan terjemahan yang telah ditinjau manusia dan menghindari perubahan tidak perlu.

Otomatiskan Kualitas Terjemahan

Temukan kunci hilang dan placeholder rusak sebelum dirilis dengan i18n-validate. Uji UI dengan terjemahan semu menggunakan i18n-pseudo sebelum terjemahan asli tersedia.

Kesalahan Umum

Terjemahan Menampilkan Kunci Mentah

TranslocoHttpLoader tidak dapat menemukan file JSON. Pastikan file berada di src/assets/i18n/, array assets dalam angular.json menyertakan jalur tersebut, dan nama file sama persis dengan konfigurasi availableLangs (peka huruf besar-kecil).

Kunci Berscope Tidak Ditemukan

Saat menggunakan scope Transloco, file terjemahan harus berada di assets/i18n/[scope]/[lang].json, bukan di folder root i18n. Pastikan juga scope didaftarkan dalam array providers komponen menggunakan TRANSLOCO_SCOPE.

Peringatan Konsol di Produksi

Atur prodMode: true dalam konfigurasi Transloco untuk build produksi. Tanpanya, Transloco mencatat peringatan kunci hilang ke konsol. Opsi ini juga menonaktifkan pemeriksaan waktu pengembangan yang menambah beban.

Terjemahan Berkedip Saat Navigasi Rute

Rute yang dimuat lambat mengambil terjemahan setelah komponen dirender sehingga kunci belum diterjemahkan tampil sesaat. Gunakan TRANSLOCO_LOADING_TEMPLATE bawaan Transloco untuk menampilkan status pemuatan atau muat terjemahan lebih awal dalam route guard.

Pengguna Regional Melihat Bahasa Inggris, Bukan Bahasa Induk

Fallback bawaan Transloco hanya dipicu saat seluruh file bahasa hilang, bukan untuk setiap kunci yang hilang. Gunakan angular-locale-chain untuk menggabungkan terjemahan secara mendalam dari bahasa terkait (misalnya pt-BR beralih ke pt-PT, lalu pt, kemudian Inggris).

Coba i18n Agent Sekarang

Lepaskan file terjemahan Anda di sini

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

atau klik untuk menjelajahi

Bahasa target

Tidak perlu mendaftarEstimasi instan

Fallback Bahasa dengan angular-locale-chain

Saat kunci terjemahan tidak ada dalam bahasa regional seperti pt-BR, TranslocoLoader Angular langsung beralih ke bahasa default alih-alih memeriksa bahasa induk pt terlebih dahulu.

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

Lihat Panduan Fallback Bahasa kami untuk daftar lengkap framework yang didukung dan 75 rantai bawaan. Learn more →

FAQ Angular i18n