مستعجل؟ حوّل ملفات .strings المستقلة إلى كتالوج مباشرة في متصفحك: مجانًا، دون تسجيل، ودون رفع أي ملف.
قبل الترحيل
احتياطان يجنّبانك معظم المفاجآت السيئة:
- شجرة Git نظيفة، على فرع مخصص. كل ما يستحق التحقق بعد الترحيل موجود في الـdiff، لذا تريد هذا الـdiff منفصلًا.
- بناء ناجح قبل الترحيل. يملأ Xcode الكتالوج بفحص الكود أثناء البناء. إذا لم يُبنَ المشروع، يبقى الكتالوج ناقصًا دون أن تعرف السبب.
الترحيل نفسه
في مستعرض المشروع (project navigator)، انقر بالزر الأيمن على Localizable.strings، ثم اختر Migrate to String Catalog. يسرد Xcode الملفات والأهداف (targets) المعنية؛ قد تتغير الصياغة الدقيقة بين إصدارات Xcode، لكن الفكرة لا تتغير.
تُستبدل الملفات fr.lproj/Localizable.strings وde.lproj/Localizable.strings… بملف واحد Localizable.xcstrings يضم كل اللغات. وتصبح التعليقات الموجودة في ملفات .strings تعليقًا لكل مفتاح.
كيف يبدو الملف
ملف String Catalog هو JSON. مفتاح بسيط:
{
"sourceLanguage" : "en",
"strings" : {
"welcome_user" : {
"comment" : "Home screen greeting",
"localizations" : {
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bon retour, %@ !"
}
}
}
}
},
"version" : "1.0"
}
وصيغة جمع، مخزنة تحت variations:
"items_left" : {
"localizations" : {
"fr" : {
"variations" : {
"plural" : {
"one" : { "stringUnit" : { "state" : "translated", "value" : "%lld article restant" } },
"other" : { "stringUnit" : { "state" : "translated", "value" : "%lld articles restants" } }
}
}
}
}
}
لاحظ التنسيق: مسافة قبل كل نقطتين، بالطريقة التي يكتبها Xcode. الأداة التي تعيد كتابة الملف بصيغة JSON «قياسية» ستنتج diff ضخمًا دون أن تغيّر ترجمة واحدة.
في كتالوج يتضمن العربية، يحتوي plural على الفئات الست: zero وone وtwo وfew وmany وother، ولكل منها stringUnit خاص بها.
ما يجب مراجعته في الـdiff
المفاتيح الموسومة Stale. بعد البناء، يرصد Xcode المفاتيح التي لم يعد يجدها في الكود. ليست بالضرورة مفاتيح ميتة: المفتاح الذي يُبنى أثناء التشغيل (NSLocalizedString(variable, comment: "")، أو مفتاح يُقرأ من ملف إعدادات) غير مرئي للفحص. تحقق قبل الحذف.
مفاتيح جديدة مستخرجة من الكود. قد يضيف البناء نصوصًا لم تضعها قط في Localizable.strings، وهي عادةً النصوص الحرفية في Text("…") بـSwiftUI، القابلة للتوطين افتراضيًا. تصل دون ترجمة، فتنخفض النسبة التي يعرضها Xcode لكل لغة. هذا متوقع.
الحالات. لكل قيمة حالة: translated أو needs_review أو new لنص لم يترجمه أحد بعد. وبعد ثلاثة أشهر، بهذه الحالات تعرف ما رُوجع فعلًا.
محددات التنسيق. نص SwiftUI مثل Text("\(count) items left") ينتج المفتاح %lld items left. إذا كان ملف .strings القديم يستخدم %d للجملة نفسها، فلديك الآن مفتاحان شبه مكررين؛ احتفظ بالذي يستخدمه الكود فعلًا.
وماذا عن إصدارات iOS الأقدم؟
لا حاجة إلى iOS 17. الكتالوج صيغة مصدرية: أثناء البناء، يحوّله Xcode إلى ملفات .strings عادية داخل حزمة التطبيق. ولا يتغير الحد الأدنى لإصدار النظام.
تحرير الكتالوج خارج Xcode
محرر Xcode مناسب لعدد قليل من النصوص. أما لمراجعة لغة كاملة، أو الترجمة بالجملة، أو فحص المتغيرات، فالأداة المخصصة تساعد. يفتح LocalePilot ملفات .xcstrings ويعيد كتابتها بأسلوب Xcode: الكتالوج الذي لم يتغير يخرج مطابقًا بايتًا ببايت، والتعديل لا يغيّر إلا أسطره، والقيمة المعدَّلة تنتقل إلى الحالة translated. صيغ الجمع وتنويعات الأجهزة قابلة للتحرير؛ أما المفاتيح ذات الاستبدالات (%#@count@) والمفاتيح الموسومة shouldTranslate: false فتبقى كما هي، لتحررها في Xcode.