لماذا يحتاج تطبيقك إلى التدويل؟
تخيل: لقد كتبت تطبيق iOS رائعًا. إنه يعمل بشكل مثالي، واجهته جميلة، والمستخدمون من روسيا يمنحونه خمس نجوم. ولكن ماذا لو تحدث كودك باللغة الإنجليزية؟ أو الصينية؟ أو العربية، حيث يُقرأ النص من اليمين إلى اليسار؟
التدويل في Swift ليس مجرد ترجمة للأزرار. إنه نهج معماري يسمح لتطبيقك بالتحدث بلغة المستخدم، واحترام خصائصه الثقافية (تنسيقات التواريخ، العملات، وحدات القياس) وعدم الانهيار عند تغيير الإعدادات المحلية.
في هذه المقالة، سنشرح كيفية تنفيذ i18n (التدويل) بشكل صحيح في مشروع Swift باستخدام أدوات Xcode الحديثة وأفضل الممارسات. هل أنت مستعد لجعل كودك مواطنًا عالميًا؟ هيا بنا!
أساسيات الترجمة في Swift: من NSLocalizedString إلى String Catalog
النهج الكلاسيكي: NSLocalizedString
الأداة الأساسية هي الماكرو NSLocalizedString. يبحث عن الترجمة في ملفات .strings، وإذا لم يجدها، يعرض المفتاح (أو القيمة الافتراضية).
let hello = NSLocalizedString("hello_world", comment: "تحية على الشاشة الرئيسية")
print(hello) // سيعرض الترجمة حسب لغة الجهاز
التعليق ليس مجرد إجراء شكلي. إنه يساعد المترجمين على فهم السياق: "hello_world" قد تكون تحية أو اسم قسم. اكتب دائمًا تعليقًا ذا معنى.
String Catalog - المعيار الجديد (Xcode 15+)
انسَ العشرات من ملفات Localizable.strings. في Xcode 15، ظهرت String Catalogs (.xcstrings). إنه ملف واحد يدعم لغات متعددة، وصيغ الجمع، والملاحظات السياقية.
لإنشاء كتالوج: File → New → File → String Catalog. أضفت مفتاحًا - وانتهى الأمر:
// الكود يبقى كما هو!
let welcome = NSLocalizedString("welcome_message", comment: "تحية لمستخدم جديد")
// في String Catalog، تضيف ببساطة الترجمات لـ en, ru, ar إلخ.
المزايا: لا حاجة لمزامنة الملفات، فرصة أقل للخطأ في الترميز، دعم مدمج لصيغ الجمع.
تنسيق الأرقام والتواريخ: الكود الثقافي
الخطأ: تحديد تنسيق التاريخ بشكل ثابت مثل "dd.MM.yyyy". في الولايات المتحدة يكتبون "MM/dd/yyyy"، في اليابان - "yyyy年MM月dd日". Swift ينقذنا بـ DateFormatter و NumberFormatter.
تواريخ لا تخجل من عرضها
let date = Date()
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none
formatter.locale = Locale.current // يتكيف تلقائيًا مع لغة الجهاز
let localizedDate = formatter.string(from: date)
// لـ en: "January 15, 2025"
// لـ ru: "15 января 2025 г."
// لـ de: "15. Januar 2025"
print(localizedDate)
لا تستخدم سلاسل dateFormat! استخدم .short، .medium، .long - فهي تراعي القواعد الثقافية بالفعل.
الأرقام والعملات: احترم الفواصل والنقاط
في روسيا، يُكتب الرقم 1234.56 كـ "1 234,56"، وفي الولايات المتحدة - "1,234.56". NumberFormatter يعرف ذلك:
let price = 1234.56
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.locale = Locale.current
let localizedPrice = numberFormatter.string(from: NSNumber(value: price))!
// لـ en_US: "$1,234.56"
// لـ ru_RU: "1 234,56 ₽"
// لـ de_DE: "1.234,56 €"
print(localizedPrice)
صيغ الجمع: واحد، اثنان، كثير - لا تخمن
قاعدة "واحد - كثير" تعمل فقط في الإنجليزية. في الروسية هناك "1 минута"، "2 минуты"، "5 минут". في العربية - ست صيغ! String Catalog و NSStringPluralRule يحلان ذلك بأناقة.
في String Catalog، تضيف مفتاحًا، تحدد النوع "Plural" وتملأ الصيغ:
// في الكود
```