هل يمكنني الاتصال وتعيين وحدة gettext بيثون في مكتبة وحدة استخدامه في نفس الوقت؟

StackOverflow https://stackoverflow.com/questions/246137

سؤال

وايم الترميز مكتبة inluding ردود الفعل نصية أنني بحاجة إلى ترجمة.

وأضع الأسطر التالية في وحدة نمطية _config.py أن أقوم باستيراد كل مكان في تطبيقي:

import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("messages", localdir)

ولدي الملفات * .mo في ./locale/lang_LANG/LC_MESSAGES وأتقدم بطلب وظيفة _ () لجميع السلاسل التي تحتاج إلى أن تترجم.

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

lib_object.message = "My message"

واعتدت خصائص لجعلها نظيفة، ولكن ماذا لو كانت لغتي المستعمل ماذا يكون لترجمة كود خاص به (التي تستخدم الألغام) ويفعل شيئا مثل:

import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("user_app", localdir)

lib_object.message = _("My message")

هل من مشكلة؟ ماذا يمكنني أن أفعل لتجنب المتاعب دون أن يكلف نفسه عناء المستخدم الخاص بي؟

هل كانت مفيدة؟

المحلول

ويمكنك استخدام فئة استنادا gettext المعهد لعزل كتالوجات الرسالة. وهذا هو أيضا ما أوصى به الثعبان gettext الوثائق .

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

import gettext

class MyClass(object):
    def __init__(self, locale_for_instance):
        self.lang = gettext.translation("appname", localedir, \
                                         locale=locale_for_instance)

    def some_method(self, arg):
        return self.lang.gettext("You called some method")

    def other_method(self, arg): # does the same thing
        _ = self.lang.gettext
        return _("You called some method")

هل يمكن أن عصا رمز لإضافة _() في الديكور، لذلك كل الأساليب التي تحتاج إلى أنها مسبوقة مع شيء من هذا القبيل @with_local_gettext

و(لاحظ، أنا لم تختبر ما سبق يمكن ولكن يجب أن تعمل على ما يرام (TM))

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

نصائح أخرى

ويمكنك فقط gettext.install () مرة واحدة. بشكل عام انها غير مجدية للعمل المكتبة - gettext.install () لن تفعل سوى الشيء الصحيح إذا وحدة اصفا إياه بأنه هو المسؤول عن البرنامج كله، لأنه سيوفر لكم فقط مع كتالوج واحد لتحميل من. كود مكتبة يجب أن تفعل شيئا أقرب إلى ما لا ميلمان: أن يكون المجمع الخاص بهم لgettext () الذي يمر الحجج المناسبة لهذه الوحدة، ثم تستورد بأنه '_' في كل وحدة التي تريد استخدامها

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