Skip to main content

Angular i18n مع Transloco: دليل الإعداد والترجمة

من التثبيت إلى الإنتاج: اضبط Transloco، وتعامل مع صيغ الجمع باستخدام صياغة ICU، وأضف سلاسل رجوع ذكية للإعدادات المحلية، وأتمت الترجمات بالذكاء الاصطناعي.

1

تثبيت Transloco

Transloco هي مكتبة i18n خارجية الأكثر شيوعًا لـ Angular. توفّر تنزيل الترجمات وقت التشغيل، ودعم تنسيق رسائل ICU، ونطاقات محمّلة كسولًا، وTemplate 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 صيغ)، واليابانية (صيغة واحدة)، وكل ذلك من سلسلة رسائل واحدة. عرّف قواعد الجمع في ملفات الترجمة، وسيختار 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 bug #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، ترجم ملفات الإعدادات المحلية باستخدام الذكاء الاصطناعي. في IDE لديك، اطلب من مساعد الذكاء الاصطناعي ترجمة ملف JSON المصدر، أو استخدم i18n Agent CLI ضمن خط أنابيب 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. اختبر واجهة المستخدم بترجمات زائفة باستخدام 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',
});

اطّلع على دليل Locale Fallback لدينا للحصول على القائمة الكاملة للأطر المدعومة و75 سلسلة مدمجة. Learn more →

الأسئلة الشائعة حول Angular i18n