اضافة الـ Localization في مشروعك

Apple في السنوات الاخيره سهلت موضوع ترجمة التطبيق الى عدة لغات بشكل رهيب!

في السابق لكي تضيف ترجمة يتوجب عليك نسخ كل نص مكتوب في التطبيق بشكل يدوي ومن تم اضافته داخل ملف Localizable.String !

بما جعل بعض المطورين يطوروا سكربت يسهل المهمه ، يتوجب عليك اضافته في كل مشروع

لكن في اخر اصدارات الـ Xcode لن تحتاج لإضافة اي سكربت في مشروعك او تحميل اي مكتبة للـLocalization ، فالامر اصبح تلقائي ضمن الـ Xcode

الشرح

اضافة اللغات

اتبع الخطوات في هذه الصورة

  1. اضغط على اسم المشروع
  2. اضغط على اسم المشروع الموجود في اسفل Product
  3. اضغط على زر + لإضافة اللغات
  4. اختار اللغة ، في هذا المثال سوف نختار اللغة العربية

التأكد من النصوص التي تريد ترجمتها

تقريبا اغلب الـ View بشكل تلقائي تدعم الترجمة مثل
Text, Button, TextField الخ

تحديداً اي View يدعم LocalizedStringKey

فإذا كتبت نص مباشره في داخل Text او Button الخ
سيتم استخراجه بشكل تلقائي

لكن اذا كنت تستخدم اريه مثلا من نوع String لن يتم استخراجه !

مثال للمشكلة

 struct NoteItem: Identifiable {
        let id = UUID()
        var note: String
        var creationDate: String
        var isComplete: Bool
    }
    
    @State var notesArray: [NoteItem] = [
        NoteItem(note: "Discuss budget constraints", creationDate: "22 Jan 2023", isComplete: false),
        NoteItem(note: "Assign tasks for next week", creationDate: "23 Jan 2023", isComplete: false),
    ]

لاحظ بأني عرفت الـ note كـ String

لن تستطيع ترجمته !
لكن في حال غيرت من String الى LocalizedStringKey
سوف تستطيع ترجمته

 struct NoteItem: Identifiable {
        let id = UUID()
        var note: LocalizedStringKey
        var creationDate: String
        var isComplete: Bool
    }
    
    @State var notesArray: [NoteItem] = [
        NoteItem(note: "Discuss budget constraints", creationDate: "22 Jan 2023", isComplete: false),
        NoteItem(note: "Assign tasks for next week", creationDate: "23 Jan 2023", isComplete: false),
    ]

الخطوه السابقه مهمه!
لتجنب مشكلة وجود بعض النصوص وعدم وجود نصوص اخرى !

إستخدام الأداة لترجمة النصوص

افتح قائمة Product ومن ثم اختار Export Localizations

بعد الانتهاء سوف تجد ملف باسم التطبيق ينتهبي بكلمة Localizations

عند فتح الملف سوف تجد ملفين
ما يهمنا هو ملف اللغة العربية ، لا تحتاج الى تعديل ملف اللغة الإنجليزية

افتح ملف ar

تستطيع الان ترجمت الملف او حتى ارساله لمترجم لكي يقوم بترجمة جميع الجمل والكلمات

لاحظ بأن اي نص جديد سوف تجد حالته NEW يتم تغيير الى علامة صح بعد الضغط على زر Enter

بعد الانتهاء من الترجمة احفظ الملف ومن تم اضيفه للـ Xcode
افتح قائمة Product ومن ثم اختار Import Localizations

فقط تحتاج تضيف ملف اللغة العربية

بعدها سوف تظهر صفحة اضغط على Import

الان سوف تلاحظ وجود ملف Localizable.xcstrings داخل التطبيق

إختبار الترجمة

اسهل طريقة لفعل ذلك هي عن طريق تغيير لغة التطبيق اثناء الـ Run

ولكن عند اطلاق التطبيق لا تنسى بأن تعيد الخيار الى System Language
في حال لم تقم بتغيير هذا الخيار، سوف يصبح التطبيق باللغة التي اخترتها وليست بلغة نظام المستخدم!

الخطوات كالتالي اضغط على اسم المشروع ومن ثم اختار Edit Scheme

ومن تم قم بتغيير خيار App Language الى اللغة العربية

بهذه الطريقة سوا شغلت التطبيق على Simulator او iPhone او حتى الـ Preview كلها سوف تتغير الى اللغة العربية

منع ترجمة النصوص في حاله معينه

في بعض الحالات قد تريد منع الترجمة على بعض الحقول
مثلا تريد الاعتماد على الـ Title الي نوعه LocalizedStringKey
وتستخدمه في Image الي تحتاج الى نوع String
الـ Compiler سوف يظهر خطأ في حال عملت ذلك !

كيف تحل المشكله ؟

اضيف هذا الـ extension في مشروعك

extension LocalizedStringKey {
    var stringKey: String? {
        Mirror(reflecting: self).children.first(where: { $0.label == "key" })?.value as? String
    }
    
    func stringValue(locale: Locale = .current) -> String? {
        guard let stringKey = self.stringKey else { return nil }
        let language = locale.language.languageCode!.identifier
        guard let path = Bundle.main.path(forResource: language, ofType: "lproj") else { return stringKey }
        guard let bundle = Bundle(path: path) else { return stringKey }
        let localizedString = NSLocalizedString(stringKey, bundle: bundle, comment: "")
        return localizedString
    }
}

الان تستطيع منع اي نص من الترجمة في حال كان من نوع LocalizedStringKey

مثال
في هذا المثال اضفت صورة قطة واعطيتها اسم cat

لاحظ بأني استخدمت نفس الـ object

item.title

//مع الصورة
item.title.stringKey ?? ""