تنفيذ الوراثة في ملفات الترجمة لنظام iOS





تحياتي أيها القراصنة الأعزاء!



أريد اليوم أن أشارك تجربة ممتعة في حل مشكلة الترجمة. في نظام iOS ، يتم ترتيب الترجمة بشكل ملائم تمامًا من وجهة نظر هدف واحد ، أو عدة أهداف لا تتكرر فيها المفاتيح في السلاسل المحلية . لكن كل شيء يصبح أكثر تعقيدًا عندما يكون لديك عشرات الأهداف ، حيث يتم تكرار أكثر من نصف المفاتيح ، ولكن في نفس الوقت لها معاني مختلفة ، وهناك أيضًا مجموعة من المفاتيح الفريدة لهدف معين.



بالنسبة لأولئك الذين لم يواجهوا هذا بعد ، سأشرح المشكلة بمزيد من التفصيل بمثال.



لنفترض أن لدينا مشروعًا كبيرًا فيه 90٪ من الكود العام و 3 أهداف : MyApp1 و MyApp2 و MyApp3 ، والتي تحتوي على عدد من الشاشات المحددة ، وكذلك لكل منها اسمها ونصوصها الخاصة. في الأساس ، الهدف هو تطبيق مستقل. يجب ترجمة كل منها إلى 10 لغات. ومع ذلك ، لا نريد إضافة مفاتيح الترجمة مثل app1_localizable_key1 ، app2_localizable_key1 ، إلخ. نريد أن يكون كل شيء جميلًا في الكود وأن يتم توطينه في سطر واحد



NSLocalizedString(@"localizable_key1", nil)


بدون أي إذا و ifdef ، لذلك عند إضافة هدف جديد ، لا يتعين علينا البحث عن أماكن باستخدام NSLocalizedString في جميع أنحاء كود مشروع ضخم وتسجيل مفاتيح جديدة هناك. نريد أيضًا ربط بعض المفاتيح بشاشات مستهدفة محددة ، أي كانت هناك مفاتيح app2_screen1_key ، app3_screen2_key .



يمكنك الآن القيام بما يلي باستخدام أدوات Xcode القياسية:



  • انسخ الجزء الشائع localizable.strings في كل هدف ، وسوف نحصل على 3 نسخ من هذه الملفات.
  • أضف مفاتيح خاصة بالهدف إلى localizable.strings المقابل.


ما هي المشاكل التي نواجهها:



  • من المكلف للغاية إضافة مفتاح عام جديد إلى المشروع. عدد المقاعد يساوي عدد الأهداف مضروبا في عدد اللغات. في مثالنا ، هذا 30 مكانًا.
  • هناك فرصة لحدوث خطأ عندما أضفنا سطرًا إلى هدفين أو هدفين حاليين نعمل بهما بنشاط ، وبعد عام قرروا إحياء هدف واحد أو أكثر. سيتعين عليك مزامنة الترجمات يدويًا مع بعضها البعض ، أو كتابة نص برمجي لذلك. وإذا ظهر بعض الإهمال عند إضافة أو دمج الفروع ، واختلطت المفاتيح العامة بأخرى محددة ، فسيكون هناك بحث حقيقي.
  • حجم ملفات الترجمة. كلها تنمو باستمرار ، وهذا يجعل من الصعب العمل معهم ويزيد من فرص التعارض عند دمج الفروع.


ماذا اريد:



  • للاحتفاظ بجميع المفاتيح العامة في ملف منفصل.
  • لكل هدف ، كان هناك ملف تم تخزين المفاتيح الخاصة به فقط ، بالإضافة إلى مفاتيح عامة بقيم لهذا الهدف.


على سبيل المثال لدينا ، وجود ملف مشترك localizable.strings مع سلاسل



"shared_localizable_key1" = "MyApp title"
"shared_localizable_key2" = "MyApp description"
"shared_localizable_key3" = "Shared text1"
"shared_localizable_key4" = "Shared text2"


أرغب في الحصول على ملف localizable_app2.strings بالمفاتيح



"shared_localizable_key1" = "MyApp2 another title"
"shared_localizable_key2" = "MyApp2 another description"
"app2_screen1_key" = "Profile screen title"


أولئك. تنظيم مبدأ الميراث في ملفات التعريب .



لسوء الحظ ، لم يتم تصميم Xcode لهذا الغرض ، لذلك اضطررت إلى إعادة اختراع "دراجتي" الخاصة ، والتي لم أرغب في الذهاب إليها لفترة طويلة نظرًا لحقيقة أن Xcode هنا وهناك وضعت العصي في العجلات.



لدينا مشروع به 18 هدفًا و 12 لغة. وهذه ليست مزحة ، المشروع كبير حقًا وهناك حاجة إلى العديد من الأهداف. في كل مرة نحتاج فيها إلى إضافة مفتاح عام جديد للترجمة ، نتعامل مع 216 ملفًا للترجمة. ياخذ الكثير من الوقت. وتؤدي إضافة هدف جديد إلى حقيقة أنك بحاجة إلى نسخ 12 سلسلة أخرى قابلة للترجمة فيه . بشكل عام ، أدركنا في مرحلة ما أنه كان من المستحيل العيش على هذا النحو بعد الآن وكان علينا البحث عن حل.



لن أتحدث لفترة طويلة عن جميع الأساليب التي تمكنت من اختبارها في هذه العملية ، وسأنتقل مباشرة إلى حل العمل.



لذلك ، نحتاج أولاً إلى العثور على جميع المفاتيح المشتركة. يمكن القيام بذلك باستخدام برنامج نصي ، ولن أخوض في التفاصيل ، فهذه مهمة تافهة إلى حد ما.



علاوة على ذلك ، عندما تلقينا ملف ترجمة مشترك (أساسي) ، أو بالأحرى 12 ملفًا فعليًا ، بالإضافة إلى مجموعة من الملفات لكل هدف ، انتقل إلى Xcode ، وأضف جميع الملفات هناك. في نفس الوقت ، لا نقوم بإرفاق ملفات بأي هدف ، أي يجب إلغاء تحديد الجزء الأيمن ضمن العضوية المستهدفة.







سنقوم بتعيين هذه العلامات للملف فقط ، والتي ستكون نتيجة عمل البرنامج النصي لتجميع الملفات.



ثم تبدأ نفس "الدراجة":



  • Localization, build_localization.py.
  • Localizable. localizable.strings.
  • Localizable .






نحن نحتاجه فقط من أجل إضافة رابط إلى الملفات في المشروع بشكل صحيح ، ولكي يتعرف Xcode عليها بشكل صحيح. وإلا فلن يستخدمهم للعثور على المفاتيح. على سبيل المثال، إذا قمت بإنشاء القابلة للترجمة المجلد مع صحيح localizable.strings ملفات الداخل، وإضافته إلى المشروع باعتباره المراجع مجلد ، ثم لا يهم ما سوف كسكودي لا نفهم أننا أعطاه توطين المفاتيح. لذلك ، خذ المجلد Localizable ، واسحبه كمجموعة ( إنشاء مجموعة ) وقم بإلغاء تحديد خانة الاختيار نسخ العناصر إذا لزم الأمر ، بحيث تبدو مثل الصورة أدناه.







احذف المجلد القابل للترجمةوإضافته إلى استثناءات gita. نظرًا لأننا لسنا بحاجة إلى نتيجة البرنامج النصي في gita ، فسوف تتغير لكل هدف وتؤدي إلى انسداد الالتزامات.



الآن نحن بحاجة إلى إضافة البرنامج النصي إلى مرحلة البناء. للقيام بذلك ، في مراحل البناء ، انقر فوق New Run Script Phase واكتب البرنامج النصي الخاص بنا مع المعلمات. 




python3 ${SRCROOT}/Localization/build_localization.py -b “${SRCROOT}/BaseLocalization" -s "${SRCROOT}/Target1Localization" -d "${SRCROOT}/Localization/Localizable"


b هو المجلد الذي يحتوي على الترجمة الأساسية ، s هو ترجمة الهدف الحالي ، d هو مجلد النتيجة.



قم بتحريك المرحلة الجديدة لأعلى ، يجب ألا تقل عن مرحلة موارد حزمة النسخ . أولئك. أولاً ، يُنشئ البرنامج النصي الملفات ، وعندها فقط يتم نقلها إلى الحزمة.







من المهم الآن إخبار Xcode أنه أثناء تنفيذ البرنامج النصي ، يتم تغيير الملفات ، وإلا ، عند البناء ، سيؤدي ذلك إلى ظهور خطأ عدم تمكنه من العثور على الملفات. علاوة على ذلك ، سيكون الخطأ في تجميع نظيف فقط ، ولن يتضح على الفور ماهية المشكلة. في مرحلة البناء ، أضف جميع ملفات الترجمة إلى ملفات الإخراج







هذا يحتاج إلى القيام به لكل هدف. أسهل طريقة للقيام بذلك هي فتح المشروع باستخدام محرر نصوص ، لأن Xcode لن يتمكن من نسخ / لصق المرحلة بين الأهداف. وفقًا لذلك ، ستكون معلمات البرنامج النصي -s لكل هدف مختلفة.



الآن، في كل بناء، فإن السيناريو تأخذ ملف قاعدة التوطين، ولفة على التغييرات من الملف الهدف (إضافة أو مفاتيح الاستبدال) وتوليد توطين في القابلة للترجمة مجلد ، والتي سوف تستخدم iOS إلى العثور على المفاتيح.



بشكل عام حصلنا على ما تم التخطيط له عند تطبيق آلية الميراث:



  • توجد المفاتيح المشتركة في ملف واحد ولا تتداخل مع الملفات الأخرى. تم تقليل وقت عملية إدخال المفاتيح الجديدة بمقدار 18! زمن.
  • توجد المفاتيح المتعلقة بهدف معين في الملف المقابل.
  • انخفض حجم الملف بشكل ملحوظ. تخلصنا من فوضى السطور المتكررة.
  • يتم أيضًا تبسيط عملية إضافة لغة جديدة إلى المشروع بشكل كبير.
  • عند إنشاء هدف جديد ، لا تحتاج إلى نسخ الترجمة بمجموعة من الأسطر غير الضرورية. قم بإنشاء ملف جديد يسمى localizable.strings وأضف فقط ما هو مطلوب لهذا الهدف.
  • إذا قررت إعادة إحياء الهدف القديم ، فلن تحتاج إلى فعل أي شيء مع الأسطر على الإطلاق ، فسيتم سحب كل شيء من الملف الأساسي.
  • لا يتناثر النص في البوابة ، وتبقى نتيجة العمل محليًا ويمكن إزالتها دون ألم.


→ يمكن أخذ النص النهائي هنا ،



أنا لا أتظاهر بأنني نص مثالي ، طلبات السحب مرحب بها.



All Articles