¿Puedo llamar y configurar el módulo gettext de Python en una biblioteca y en un módulo que lo use al mismo tiempo?

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

Pregunta

Estoy codificando una biblioteca con comentarios textuales que necesito traducir.

Pongo las siguientes líneas en un módulo _config.py que importo en todas partes de mi aplicación:

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

Tengo los archivos * .mo en ./locale/lang_LANG/LC_MESSAGES y aplico la función _ () a todas las cadenas que necesitan ser traducidas.

Ahora acabo de agregar una función para que el usuario, supuestamente un programador, pueda crear sus propios mensajes. No quiero que se preocupe por la implementación subyacente, así que quiero que sea Apple para que sea algo sencillo como:

lib_object.message = "My message"

Utilicé propiedades para limpiarlo, pero ¿qué ocurre si mi usuario traduce su propio código (que usa el mío) y hace algo como:

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

¿Es un problema? ¿Qué puedo hacer para evitar problemas sin molestar a mi usuario?

¿Fue útil?

Solución

Puede usar la API gettext basada en clases para aislar los catálogos de mensajes. Esto también es lo que se recomienda en la documentación de Python gettext .

El inconveniente es que usted, o el otro desarrollador, tendrá que usar el método gettext o definir el método _ () en el ámbito local, vinculado a la clase específica gettext. Un ejemplo de una clase con su propio catálogo de cadenas:

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

Puede pegar el código para agregar el _ () en un decorador, por lo que todos los métodos que lo necesiten tienen el prefijo algo como @with_local_gettext

(Nota, no he probado lo anterior pero podría funcionar bien (tm))

Si el objetivo es no molestar a su usuario (y él no es muy bueno), supongo que podría usar el enfoque basado en clases en su código y dejar que el usuario use el global.

Otros consejos

Solo puedes obtener text.install () una vez. En general, es inútil para el trabajo de la biblioteca: gettext.install () solo hará lo correcto si el módulo que lo llama está a cargo de todo el programa, ya que solo le proporcionará un catálogo para cargar. El código de la biblioteca debería hacer algo similar a lo que hace Mailman: tener su propio contenedor para gettext () que pasa los argumentos correctos para este módulo, luego lo importa como '_' en cada módulo que quiera usarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top