سؤال

لدي تطبيق مكتوب بلغة wxPython وأريد أن أجعله متعدد اللغات.خياراتنا هي

  1. باستخدام gettext http://docs.python.org/library/gettext.html
  2. فصل جميع نص واجهة المستخدم إلى ملف messages.py ، واستخدامه لترجمة النص

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

في الأساس بدلا من

wx.MessageBox(_("Hi stackoverflow!"))

أظن

wx.MessageBox(messages.GREET_SO)

هو أفضل، فهل هناك أي ميزة في طريقة gettext وعيوب الطريقة الثانية؟وهل هناك طريقة ثالثة؟

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

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

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

خاتمة:ما زلت غير متأكد من أي فائدة لاستخدام gettext وأنا أستخدم ملف الرسائل الخاص بي.لكنني اخترت الإجابة التي أوضحت على الأقل بعض النقاط التي تجعل gettext مفيدًا.الحل النهائي IMO هو الذي يأخذ الأفضل من كلا الاتجاهين، أي معرف الرسالة الخاص بي ملفوفًا بواسطة gettext على سبيل المثال

wx.MessageBox(_("GREET_SO"))
هل كانت مفيدة؟

المحلول

Gettext هو الحل الأمثل، في المثال الخاص بك يمكنك أيضًا استخدام gettext "لتجنب تخزين الترجمات في الكود":

wx.MessageBox(messages.GREET_SO)

قد يكون هو نفسه مع gettext مثل:

wx.MessageBox(_("GREET_SO")) or wx.MessageBox(_("messages.GREET_SO"))

يعد Gettext إلى حد كبير هو المعيار للتطبيقات متعددة اللغات، وأنا متأكد من أنك ستستفيد من استخدامه في المستقبل.على سبيل المثال، يمكنك استخدام Poedit (أو تطبيق آخر مشابه) لتعيين ترجمات للمتعاونين أو المساهمين لديك ثم وضع علامة لاحقًا على رسالة واحدة أو عدة رسائل باعتبارها غير مترجمة بشكل صحيح.أيضًا إذا كانت هناك إدخالات مفقودة/إضافية فسوف يحذرك poedit.لا تخدع نفسك، فإن gettext هي الطريقة الوحيدة الموثوقة للحفاظ على الترجمات.

نصائح أخرى

هناك بعض مزايا gettext:

  1. واحدة من أكبر المزايا هي:عند استخدام poedit للقيام بالترجمات، يمكنك الاستفادة من قاعدة بيانات الترجمة.بشكل أساسي، يمكنك إجراء مسح ضوئي للقرص الصلب الخاص بك والعثور على الملفات المترجمة بالفعل وسيقدم اقتراحات عند ترجمة ملفك.
  2. عندما تعطي الكود لأشخاص آخرين لترجمته، فقد يعرفون بالفعل طريقة gettext للترجمة، بينما يتعين عليك أن تشرح لهم طريقتك في الترجمة.
  3. لديك النص في سياق الكود، لذلك يجب أن يكون من الأسهل ترجمته، عندما ترى الكود حول الترجمة
  4. النظر في نص مثل: print _('%d files of %d files selected') % (num, numTotal) وحتى المواقف الأكثر تعقيدًا.هنا يساعد حقًا وجود الكود ...

بالنسبة للويب (هذا هو PHP ولكن الفكرة هي نفسها)، أقوم دائمًا بإنشاء ملفات لغات متعددة في دليل محدد.en.php، fr.php، وما إلى ذلك.تحتوي هذه الملفات على تعريفات لكل النصوص الناتجة باللغة المحددة.يحدد تفضيل المستخدم للغة أي من هذه الملفات سيتم تضمينه، وبالتالي، اللغة التي يظهر بها الإخراج.على سبيل المثال...

في en.php:TEXT_I_AM = "أنا"

في fr.php:TEXT_I_AM = "أنا"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top