Apple في السنوات الاخيره سهلت موضوع ترجمة التطبيق الى عدة لغات بشكل رهيب!
في السابق لكي تضيف ترجمة يتوجب عليك نسخ كل نص مكتوب في التطبيق بشكل يدوي ومن تم اضافته داخل ملف Localizable.String !
بما جعل بعض المطورين يطوروا سكربت يسهل المهمه ، يتوجب عليك اضافته في كل مشروع
لكن في اخر اصدارات الـ Xcode لن تحتاج لإضافة اي سكربت في مشروعك او تحميل اي مكتبة للـLocalization ، فالامر اصبح تلقائي ضمن الـ Xcode
الشرح
اضافة اللغات
اتبع الخطوات في هذه الصورة

- اضغط على اسم المشروع
- اضغط على اسم المشروع الموجود في اسفل Product
- اضغط على زر + لإضافة اللغات
- اختار اللغة ، في هذا المثال سوف نختار اللغة العربية
نصيحة دائما برمج تطبيقك باللغة الإنجليزية اولاً ومن ثم قم بترجمته للغة العربية لتجنب الكثير من المشاكل!
التأكد من النصوص التي تريد ترجمتها
تقريبا اغلب الـ 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 ?? ""
