Kann ich die Python-Modul gettext in einer Bibliothek und ein Modul, um es zur gleichen Zeit anrufen und setze mit?

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

Frage

Im a Codierung eine Bibliothek inluding Text Feedback, das ich brauche, um zu übersetzen.

Ich habe die folgenden Zeilen in einem _config.py Modul, das ich überall in meiner app importieren:

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

Ich habe die * .mo-Dateien in ./locale/lang_LANG/LC_MESSAGES und ich gelten die _ () Funktion auf alle Strings, die übersetzt werden müssen.

Jetzt habe ich nur noch eine Funktion für den Benutzer, die angeblich einen Programmierer, der Lage sein, seine eigenen Nachrichten zu erstellen. Ich will nicht, ihn über die zugrunde liegende Implementierung kümmern, so will ich ihn Apfel sein, um es etwas zu machen einfach wie:

lib_object.message = "My message"

habe ich Eigenschaften, um es sauber zu machen, aber was ist, wenn mein Benutzer was seinen eigenen Code zu übersetzen (das verwendet Mine) und tut so etwas wie:

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")

Ist es ein Problem? Was kann ich tun, Probleme zu vermeiden, ohne meinen Benutzer stört?

War es hilfreich?

Lösung

Sie können mit der Klasse basiert gettext api Nachrichtenkataloge isolieren. Dies ist auch das, was in der Python gettext Dokumentation .

Der Nachteil ist, dass Sie oder die anderen Entwickler, haben die gettext Methode verwenden oder die _() Methode im lokalen Bereich definieren, auf die spezifische gettext Klasse gebunden. Ein Beispiel für eine Klasse mit einem eigenen String-Katalog:

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")

Sie können den Code halten die _() in Dekorateur für das Hinzufügen, so dass alle Methoden, die es brauchen, ist mit so etwas wie @with_local_gettext Präfix

(Beachten Sie, ich habe könnte die oben nicht getestet, aber es sollte gut funktionieren (tm))

Wenn das Ziel ist es, nicht Ihre Benutzer zu stören (und er ist nicht sehr gut) Ich denke, man die Klasse basierten Ansatz in Ihrem Code verwenden könnte und läßt die Benutzer die global verwendet werden.

Andere Tipps

Sie können nur gettext.install () einmal. Im Allgemeinen ist es nutzlos für die Bibliotheksarbeit - gettext.install () wird nur das Richtige tun, wenn das Modul nennt es verantwortlich für das gesamte Programm ist, da es nur Sie mit einem Katalog zur Verfügung stellt laden aus. Bibliothek Code sollte so etwas wie das tun, was Mailman tut. Haben ihre eigenen Wrapper für gettext (), die die richtigen Argumente für dieses Modul übergibt, dann importiert, dass als ‚_‘ in jedem Modul, das es verwenden möchte

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top