تعريب وترجمة تجربة العميل
النطاق الحالي
يدعم سطحا العميل العربية (ar) والإنجليزية (en):
| السطح | إطار الترجمة | مصدر النصوص | حفظ الاختيار |
|---|---|---|---|
| بوابة Next.js | next-intl | apps/customer/messages/{locale}.json | cookie باسم shambus_locale لمدة سنة |
| تطبيق Flutter | Flutter gen-l10n | apps/mobile/customer/lib/l10n/app_{locale}.arb | Hive داخل صندوق الإعدادات |
العربية هي اللغة الافتراضية. يضبط كل سطح اتجاه الصفحة كاملاً: RTL للعربية
وLTR للإنجليزية. يجب أن تستخدم أيقونات الرجوع والتقدم خصائص اتجاهية أو تدويراً
مرتبطاً بـdir، لا سهماً ثابتاً يفترض اتجاهاً واحداً.
بوابة العميل
- تحدد
src/i18n/config.tsاللغات المقبولة واللغة الافتراضية واتجاه النص. - يحل
src/proxy.tsاللغة من?lang=أو مسار/enأو cookie، ثم يمررها في ترويسة داخلية موثوقة إلى Server Components. - يحمّل
src/i18n/request.tsكتالوج الطلب، ويضبطapp/layout.tsxقيمتيlangوdirوموفرNextIntlClientProviderوبيانات SEO المطابقة للغة. يستخدم الموفر منطقة الأعمالAsia/Damascusنفسها على الخادم والمتصفح. - تمثل
src/lib/calendar-date.tsقيمYYYY-MM-DDكتاريخ تقويمي عند ظهر UTC، لا كلحظة منتصف ليل محلية. يجب استخدامها في شرائط الأيام والتنسيق والمقارنة حتى لا يتغير اليوم بين Node ومتصفح موجود في منطقة زمنية أخرى. - يستخدم مفتاح اللغة
router.refresh()بعد تحديث cookie، لذلك تبقى الصفحة الحالية ولا تُبنى نسختان متوازيتان من كل route. - لا تعرض الواجهة نص
errorالقادم من API. تحولsrc/i18n/errors.tserrorCodeوالحالة إلى رسالة من الكتالوج حتى لا تتسرب تفاصيل داخلية أو تظهر العربية داخل واجهة إنجليزية.
يفرض اختبار __tests__/i18n/catalog-parity.test.ts تطابق شجرة كتالوجي العربية
والإنجليزية، بما فيها أطوال المصفوفات وأنواع القيم، ويرفض النصوص الفارغة.
تطبيق العميل
- يعرّف
l10n.yamlمولد Flutter الرسمي، وتوفرAppLocalizationsاللغات المدعومة وdelegates Material وCupertino. - يقرأ
localeProviderاللغة المحفوظة ويتجاهل أي قيمة غير مدعومة، ثم يضبطMaterialApp.router.localeوDirectionality. - تعرض الإعدادات الخيارات مباشرة من
AppLocalizations.supportedLocalesحتى لا تنفصل القائمة عن الكتالوجات المشحونة. - تستخدم النماذج دوال
nameFor(languageCode)للمدن والشركات والمكافآت، مع رجوع إلى النص المتاح عند نقص ترجمة بيانات قاعدة البيانات. - تهيأ بيانات التواريخ لكل لغة مشحونة عند الإقلاع، وتستخدم الشاشات
Localizations.localeOf(context)بدلاً من افتراض العربية.
إضافة التركية لاحقاً
لا تضف شروط locale == 'tr' موزعة في الشاشات. اتبع هذا المسار:
- أضف
trإلىcustomerLocalesوأنشئapps/customer/messages/tr.jsonبنفس شكل الكتالوجين الحاليين. - وسّع حل اللغة وبيانات SEO واختبارات التطابق، وأضف تسمية التركية إلى مفتاح اللغة.
- أنشئ
apps/mobile/customer/lib/l10n/app_tr.arbكاملاً وشغّلflutter gen-l10n. - أضف
initializeDateFormatting('tr')واختبارات widget للاتجاهLTRوالتواريخ والجمع والتنسيق الرقمي. - اختبر البحث والحجز والتذكرة والدعم والولاء ومركز العرض بعرضي هاتف وسطح مكتب، ثم شغّل اختبارات الويب وFlutter الكاملة قبل النشر.
أي لغة جديدة لا تعتبر مدعومة لمجرد وجود كتالوج جزئي؛ يجب أن تنجح بوابات التطابق والبناء والاختبارات البصرية والوظيفية أولاً.