Puis-je appeler et définir le module Python gettext dans une bibliothèque et un module l'utilisant simultanément?

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

Question

Je suis en train de coder une bibliothèque, y compris les commentaires textuels que je dois traduire.

Je mets les lignes suivantes dans un module _config.py que j'importe partout dans mon application:

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

J'ai les fichiers * .mo dans ./locale/lang_LANG/LC_MESSAGES et j'applique la fonction _ () à toutes les chaînes devant être traduites.

Maintenant, je viens d'ajouter une fonctionnalité permettant à l'utilisateur, soi-disant un programmeur, de créer ses propres messages. Je ne veux pas qu'il se soucie de l'implémentation sous-jacente, alors je veux qu'il soit Apple pour en faire quelque chose de simple, comme:

lib_object.message = "My message"

J'ai utilisé des propriétés pour le rendre propre, mais que se passe-t-il si mon utilisateur souhaite traduire son propre code (qui utilise le mien) et faire quelque chose comme:

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

Est-ce un problème? Que puis-je faire pour éviter les ennuis sans déranger mon utilisateur?

Était-ce utile?

La solution

Vous pouvez utiliser l’API gettext basée sur les classes pour isoler les catalogues de messages. C’est également ce qui est recommandé dans la documentation python gettext .

L’inconvénient est que vous, ou l’autre dev, devrez utiliser la méthode gettext ou définir la méthode _ () dans la portée locale, liée à la classe gettext spécifique. Exemple de classe avec son propre catalogue de chaînes:

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

Vous pouvez coller le code permettant d'ajouter le _ () dans un décorateur. Ainsi, toutes les méthodes qui en ont besoin sont précédées de quelque chose comme @with_local_gettext

.

(Remarque, je n'ai pas testé ce qui précède, mais cela devrait fonctionner correctement (tm))

Si l'objectif est de ne pas déranger votre utilisateur (et qu'il ne soit pas très bon), vous pouvez utiliser l'approche basée sur les classes dans votre code et laisser l'utilisateur utiliser l'application globale.

Autres conseils

Vous ne pouvez utiliser qu'une seule fois gettext.install (). En général, cela ne sert à rien pour le travail en bibliothèque - gettext.install () ne fera le bon choix que si le module qui l’appelle est en charge de tout le programme, puisqu’il ne vous fournira qu’un catalogue à charger. Le code de la bibliothèque devrait ressembler à ce que fait Mailman: avoir son propre wrapper pour gettext () qui transmet les bons arguments pour ce module, puis l’importe en tant que '_' dans chaque module qui souhaite l’utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top