Angular i18n مع Transloco: دليل الإعداد والترجمة
من التثبيت إلى الإنتاج: اضبط Transloco، وتعامل مع صيغ الجمع باستخدام صياغة ICU، وأضف سلاسل رجوع ذكية للإعدادات المحلية، وأتمت الترجمات بالذكاء الاصطناعي.
تثبيت Transloco
Transloco هي مكتبة i18n خارجية الأكثر شيوعًا لـ Angular. توفّر تنزيل الترجمات وقت التشغيل، ودعم تنسيق رسائل ICU، ونطاقات محمّلة كسولًا، وTemplate API نظيفًا باستخدام كلٍّ من التوجيهات البنيوية والأنابيب.
npm install @jsverse/translocoتهيئة Transloco
سجّل Transloco في إعدادات تطبيقك. ستحتاج إلى توفير اللغات المتاحة، وتعيين لغة افتراضية، وتهيئة مُحمّل الترجمات. يدعم Transloco كلًّا من المكوّنات المستقلة (Angular 14+) وأنماط NgModule.
المكوّنات المستقلة (موصى بها)
// 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
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 {}إنشاء ملفات الترجمة
أنشئ ملف JSON واحدًا لكل لغة ضمن src/assets/i18n/. استخدم مفاتيح متداخلة لتنظيم السلاسل حسب الميزة. يستخدم Transloco تنسيق رسائل ICU لصيغ الجمع والمتغيرات.
// 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}}"
}
}استخدام الترجمات في القوالب والخدمات
يوفّر Transloco ثلاث طرق للترجمة في القوالب: التوجيه البنيوي (*transloco)، والأنبوب (| transloco)، والخدمة (TranslocoService) لشيفرة TypeScript. يُوصى بالتوجيه البنيوي لمعظم حالات الاستخدام لأنه ينشئ اشتراكًا واحدًا ويوفّر دالة الترجمة لكتلة القالب كاملة.
ترجمة القالب
<!-- 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>ترجمة عبر الخدمة (TypeScript)
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);
}
}التعامل مع صيغ الجمع باستخدام تنسيق رسائل ICU
يستخدم Transloco تنسيق رسائل ICU لصيغ الجمع وتعبيرات select. يتعامل ICU تلقائيًا مع قواعد الجمع المعقّدة؛ العربية (6 صيغ)، والروسية (3 صيغ)، واليابانية (صيغة واحدة)، وكل ذلك من سلسلة رسائل واحدة. عرّف قواعد الجمع في ملفات الترجمة، وسيختار Transloco الصيغة الصحيحة وقت التشغيل.
// 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>سلاسل رجوع ذكية للإعدادات المحلية مع angular-locale-chain
افتراضيًا، يعود Transloco إلى الإعدادات المحلية الافتراضية عندما يكون مفتاح ترجمة مفقودًا. لذلك قد يرى مستخدم pt-BR الإنجليزية بدلًا من ترجمات pt-PT المتاحة. يعالج angular-locale-chain هذا الأمر عبر دمج الترجمات دمجًا عميقًا من سلسلة رجوع قابلة للتهيئة قبل تمريرها إلى Transloco. يُستكمَل كل مفتاح؛ بلا فجوات ولا ترجمات مفقودة.
npm install angular-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(),
},
],
};هيكل الملفات الموصى به
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 لأتمتة التوطين بالكامل.
# 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 Agent الآن
أفلت ملف الترجمة هنا
JSON, YAML, PO, XML, CSV, Markdown, Properties
أو انقر للاستعراض
اللغات المستهدفة
الرجوع إلى الإعدادات المحلية مع angular-locale-chain
عندما يكون مفتاح ترجمة مفقودًا في إعدادات محلية إقليمية مثل pt-BR، يقفز TranslocoLoader في Angular مباشرةً إلى الإعدادات المحلية الافتراضية بدلًا من التحقق أولًا من الإعدادات المحلية الأم pt.
npm install angular-locale-chainimport { 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 →