تكرار السؤال: …
الإجابة المختصرة
تكتب النصوص في ملفات ARB لكل لغة، وتولّد أداة gen-l10n كلاس AppLocalizations بدوال typed للنصوص ذات المعاملات والجمع، ثم تسجّل الـ delegates واللغات المدعومة في MaterialApp.
الشرح
يُفعَّل التوليد بـ flutter: generate: true وملف l10n.yaml. يحتوي ملف ARB القالب (app_en.arb) النصوص وأوصافها ومعاملاتها، وتُنسخ الملفات الأخرى بالترجمات. تدعم صيغة ICU الجمع (plural) والاختيار (select)، وهي مهمة في العربية لأن لها حالات جمع متعددة (zero/one/two/few/many/other). تتكفل flutter_localizations بترجمة مكونات Material نفسها، ويُحدَّد اتجاه الكتابة من اللغة تلقائيًا. تجنب تجميع الجمل بالدمج النصي لأن ترتيب الكلمات يختلف بين اللغات.
مثال بالكود
# pubspec.yaml
# flutter:
# generate: true
# dependencies:
# flutter_localizations: { sdk: flutter }
# intl: any
# l10n.yaml
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
// lib/l10n/app_ar.arb
// {
// "@@locale": "ar",
// "greeting": "مرحبًا {name}",
// "@greeting": { "placeholders": { "name": { "type": "String" } } },
// "itemCount": "{count, plural, =0{لا توجد عناصر} =1{عنصر واحد} =2{عنصران} few{{count} عناصر} other{{count} عنصرًا}}",
// "@itemCount": { "placeholders": { "count": { "type": "int" } } }
// }
// main.dart
MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const HomePage(),
);
// usage
Text(AppLocalizations.of(context)!.greeting('Mona'));
Text(AppLocalizations.of(context)!.itemCount(3));أخطاء شائعة
- بناء الجمل بدمج نصوص مترجمة (مثل 'Hello ' + name) فيختل ترتيب الكلمات في اللغات الأخرى؛ استخدم معاملات ARB.
- نسيان قواعد الجمع في العربية (zero/one/two/few/many/other) وكتابة صيغة واحدة للجمع.