Skip to main content

Angular i18n ด้วย Transloco : คู่มือการตั้งค่าและแปล

ตั้งแต่ติดตั้งจนถึงระบบจริง กำหนดค่า Transloco จัดการพหูพจน์ด้วยไวยากรณ์ ICU เพิ่มการใช้ภาษาสำรองอัจฉริยะ แล้วทำให้การแปลเป็นอัตโนมัติด้วย AI

1

ติดตั้ง Transloco

Transloco เป็นไลบรารี i18n ของบุคคลที่สามยอดนิยมที่สุดสำหรับ Angular มีการโหลดคำแปลขณะรัน รองรับรูปแบบข้อความ ICU ขอบเขตที่โหลดแบบหน่วงเวลา และ API เทมเพลตที่สะอาดพร้อมทั้งคำสั่งเชิงโครงสร้างและไปป์

เหตุใดจึงเลือก Transloco แทน i18n ในตัวของ Angular? โซลูชันในตัวของ Angular ต้องมีบิลด์แยกต่อภาษาและไม่รองรับการสลับภาษาขณะรัน ส่วน Transloco โหลดคำแปลขณะรัน คุณจึงส่งบิลด์เดียวแล้วสลับภาษาได้ทันที
Terminal
npm install @jsverse/transloco
2

กำหนดค่า Transloco

ลงทะเบียน Transloco ในการกำหนดค่าแอปพลิเคชัน คุณต้องระบุภาษาที่มี ตั้งภาษาเริ่มต้น และกำหนดค่าตัวโหลดคำแปล Transloco รองรับทั้งคอมโพเนนต์แบบสแตนด์อโลน (Angular 14+) และรูปแบบ NgModule

คอมโพเนนต์แบบสแตนด์อโลน (แนะนำ)

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

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 {}
หากคำแปลแสดงคีย์ดิบอย่าง “nav.home” แทน “Home” สาเหตุที่พบบ่อยที่สุดคือ TranslocoHttpLoader หาไฟล์ JSON ไม่พบ ตรวจว่าไฟล์แปลอยู่ใน src/assets/i18n/ และอาร์เรย์ assets ใน angular.json รวมพาธนี้

สร้างไฟล์แปล

สร้างไฟล์ JSON หนึ่งไฟล์ต่อภาษาใน src/assets/i18n/ ใช้คีย์ซ้อนเพื่อจัดระเบียบข้อความตามฟีเจอร์ Transloco ใช้รูปแบบข้อความ ICU สำหรับพหูพจน์และตัวแปร

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

ใช้คำแปลในเทมเพลตและบริการ

Transloco มีสามวิธีในการแปลในเทมเพลต ได้แก่ คำสั่งเชิงโครงสร้าง (*transloco) ไปป์ (| transloco) และบริการ (TranslocoService) สำหรับโค้ด TypeScript แนะนำให้ใช้คำสั่งเชิงโครงสร้างในกรณีส่วนใหญ่ เพราะสร้างการสมัครเพียงครั้งเดียวและให้ฟังก์ชันแปลกับบล็อกเทมเพลตทั้งหมด

การแปลในเทมเพลต

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>
ใช้พารามิเตอร์ read ในคำสั่งเชิงโครงสร้างเพื่อจำกัดคำแปลไว้ที่คีย์ซ้อน วิธีนี้ไม่ต้องใส่คำนำหน้าซ้ำในทุกการเรียก t() และทำให้เทมเพลตสะอาดขึ้น

การแปลในบริการ (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 สร้างการสมัครใหม่ทุกครั้งที่ใช้ ในเทมเพลตที่มีข้อความแปลจำนวนมาก ควรใช้คำสั่งเชิงโครงสร้าง *transloco ซึ่งสร้างการสมัครเพียงครั้งเดียวสำหรับทั้งบล็อก
4

จัดการพหูพจน์ด้วยรูปแบบข้อความ ICU

Transloco ใช้รูปแบบข้อความ ICU สำหรับพหูพจน์และนิพจน์ select โดย ICU จัดการกฎพหูพจน์ซับซ้อนอัตโนมัติ ทั้งภาษาอาหรับ 6 รูป รัสเซีย 3 รูป และญี่ปุ่น 1 รูปจากข้อความเดียว กำหนดกฎพหูพจน์ในไฟล์แปล แล้ว Transloco จะเลือกรูปแบบที่ถูกต้องขณะรัน

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>
อย่าเขียนตรรกะพหูพจน์เองในคอมโพเนนต์ แต่ละภาษามีกฎพหูพจน์แตกต่างกันมาก ซึ่งข้อกำหนด ICU จัดการไว้แล้ว ให้ Transloco กับ ICU ทำงาน ส่วนคุณกำหนดรูปพหูพจน์ที่ถูกต้องในไฟล์แปล

การใช้ภาษาสำรองอัจฉริยะด้วย angular-locale-chain

ตามค่าเริ่มต้น Transloco จะถอยไปใช้ภาษาเริ่มต้นเมื่อไม่มีคีย์คำแปล ผู้ใช้ pt-BR จึงเห็นภาษาอังกฤษแทนคำแปล pt-PT ที่ใช้ได้ดี angular-locale-chain แก้ปัญหานี้ด้วยการผสานคำแปลเชิงลึกตามลำดับภาษาสำรองที่กำหนดค่าได้ก่อนส่งให้ Transloco ทุกคีย์จึงครบ ไม่มีช่องว่างหรือคำแปลที่หายไป

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 เป็นไลบรารีโอเพนซอร์สที่แก้ข้อบกพร่อง Transloco #574 ซึ่งไม่มีการใช้ค่าสำรองรายคีย์เมื่อไฟล์แปลยังไม่ครบ

โครงสร้างไฟล์ที่แนะนำ

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

ทำให้การแปลเป็นอัตโนมัติ

เมื่อตั้งค่า Transloco เสร็จแล้ว ให้แปลไฟล์ภาษาด้วย AI โดยบอกผู้ช่วย AI ใน IDE ให้แปลไฟล์ JSON ต้นฉบับ หรือใช้ CLI ของ i18n Agent ในไปป์ไลน์ CI/CD เพื่อทำโลคัลไลเซชันอัตโนมัติเต็มรูปแบบ

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
แปลแบบเพิ่มทีละส่วน เมื่อเพิ่มคีย์ใหม่ในไฟล์ต้นฉบับ ให้แปลเฉพาะส่วนต่างแทนการสร้างทุกไฟล์ใหม่ วิธีนี้ช่วยรักษาคำแปลที่มนุษย์ตรวจทานแล้วและหลีกเลี่ยงการเปลี่ยนแปลงที่ไม่จำเป็น

ทำให้คุณภาพการแปลเป็นอัตโนมัติ

ใช้ i18n-validate จับคีย์ที่หายไปและตัวยึดตำแหน่งเสียหายก่อนส่งขึ้นใช้งาน แล้วทดสอบ UI ด้วยคำแปลจำลองผ่าน i18n-pseudo ก่อนคำแปลจริงจะมาถึง

ข้อผิดพลาดที่พบบ่อย

คำแปลแสดงคีย์ดิบ

TranslocoHttpLoader หาไฟล์ JSON ไม่พบ ตรวจว่าไฟล์อยู่ใน src/assets/i18n/ อาร์เรย์ assets ใน angular.json รวมพาธนี้ และชื่อไฟล์ตรงกับการกำหนดค่า availableLangs ทุกตัวอักษร

ค้นหาคีย์ตามขอบเขตไม่สำเร็จ

เมื่อใช้ขอบเขต Transloco ไฟล์แปลต้องอยู่ที่ assets/i18n/[scope]/[lang].json ไม่ใช่โฟลเดอร์ i18n ราก และต้องลงทะเบียนขอบเขตในอาร์เรย์ providers ของคอมโพเนนต์ด้วย TRANSLOCO_SCOPE

คำเตือนในคอนโซลของระบบจริง

ตั้ง prodMode: true ในการกำหนดค่า Transloco สำหรับบิลด์ระบบจริง หากไม่มี Transloco จะบันทึกคำเตือนคีย์ที่หายไปในคอนโซล ค่านี้ยังปิดการตรวจสอบช่วงพัฒนาที่เพิ่มภาระด้วย

คำแปลกะพริบเมื่อเปลี่ยนเส้นทาง

เส้นทางที่โหลดแบบหน่วงเวลาจะดึงคำแปลหลังคอมโพเนนต์เรนเดอร์ ทำให้คีย์ที่ยังไม่แปลกะพริบชั่วครู่ ใช้ TRANSLOCO_LOADING_TEMPLATE ในตัวของ Transloco เพื่อแสดงสถานะโหลด หรือโหลดคำแปลล่วงหน้าใน route guard

ผู้ใช้รายภูมิภาคเห็นภาษาอังกฤษแทนภาษาหลัก

ค่าสำรองในตัวของ Transloco ทำงานเมื่อไฟล์ภาษาทั้งไฟล์หายไปเท่านั้น ไม่ทำงานกับคีย์แต่ละรายการที่หาย ใช้ angular-locale-chain ผสานคำแปลเชิงลึกจากภาษาที่เกี่ยวข้อง เช่น pt-BR ถอยไปใช้ pt-PT แล้ว pt และภาษาอังกฤษ

ลองใช้ i18n Agent ตอนนี้

ลากและวางไฟล์แปลของคุณที่นี่

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

หรือคลิกเพื่อเลือกไฟล์

ภาษาเป้าหมาย

ไม่ต้องลงทะเบียนประเมินราคาได้ทันที

การใช้ภาษาสำรองด้วย angular-locale-chain

เมื่อไม่มีคีย์คำแปลในภาษาตามภูมิภาคอย่าง pt-BR TranslocoLoader ของ Angular จะข้ามไปใช้ภาษาเริ่มต้นทันทีแทนที่จะตรวจภาษาหลัก 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',
});

ดูคู่มือการใช้ภาษาสำรองของเราสำหรับรายการเฟรมเวิร์กที่รองรับทั้งหมดและลำดับสำเร็จรูป 75 รายการ Learn more →

คำถามที่พบบ่อยเกี่ยวกับ Angular i18n