i18n es un paquete que intenta simplificar el flujo de trabajo y el desarrollo de aplicaciones internacionalizadas. & Nbsp; Es una envoltura delgada alrededor de las herramientas existentes, en particular gettext y babel.
El uso básico
# Demo.py
#
desde i18n.translator importación Traductor
supported_languages = ['it_IT', 'es_ES', 'es_ES']
# Activan traducciones italianas
tr = Traductor ('/ ruta / a / root', supported_languages, 'it_IT')
tr impresión ._ ('¡Hola, mundo! ")
donde / path / to / root / es el directorio raíz de tu proyecto. Cuando una instancia, la clase Traductor crea automáticamente un directorio llamado / ruta / a / root / idiomas donde se almacenan las traducciones.
mensajes Extracción
Antes de hacer la traducción en sí, es necesario extraer los mensajes de los archivos de origen, invocando el comando de extracción en el módulo i18n, que es una envoltura alrededor de extracto pybabel y actualización pybabel:
& Nbsp; python -m i18n --root = / ruta / a / root --languages = it_IT, fr_FR, es_ES extracto
extracto busca todos los mensajes envueltos dentro de las llamadas a _ (), gettext () o ngettext () y produce un archivo llamado idiomas / template.pot. Este es un file` po gettext estándar que contiene todos los mensajes que se encuentran en la aplicación.
Por otra parte, extraer () también crea un archivo de catálogo de mensajes para cada uno de los idiomas admitidos como idiomas / $ CODE / LC_MESSAGES / messages.po, donde $ CODE es una de las lenguas enumeradas en supported_languages (it_IT, fr_FR de_DE y en el ejemplo anterior ).
Los archivos de catálogo ya están listos para ser traducidos utilizando una de las muchas herramientas existentes, por ejemplo QT lingüista o Poedit. Para el correcto funcionamiento de la aplicación, el enteros idiomas / jerarquía necesita ser preservado. Le sugerimos para hacer un seguimiento de los diversos archivos messages.po en sistema de control de versiones, junto con los otros archivos pertenecientes a la aplicación.
Actualización de mensajes
Durante el desarrollo de la aplicación, seguramente añadir nuevos mensajes a traducir. El comando extract manejar automáticamente este caso: si encuentra archivos de catálogo existentes, su contenido (incluyendo las traducciones existentes) se fusionó con los mensajes recién extraídos.
catálogos Compilar
Es necesario compilar los archivos de catálogo antes de usarlos con gettext. Por defecto, nuestro objeto Traductor compila automáticamente todos los catálogos que se encuentran en idiomas /, produciendo los archivos correspondientes .mo. La compilación se realiza sólo cuando el archivo de catálogo se ha modificado. Esto significa que en la mayoría de los casos usted no tiene que preocuparse de la compilación de los catálogos.
Si usted prefiere tener más control sobre este paso, puede pasar autocompilado = False al constructor del traductor y compilar manualmente desde la línea de comandos:
& Nbsp; python -m i18n --root = / ruta / a / root --languages = it_IT, fr_FR, es_ES compilar
Almacenamiento de traducciones en una base de datos
Para algunas aplicaciones es útil para permitir al usuario definir nuevas traducciones y / o los valores por defecto. i18n soporta este caso de uso con la clase DBTranslator, que es una subclase de Translator. Al traducir, DBTranslator busca primero en la base de datos: si no se encuentra el mensaje, delega en el comportamiento gettext estándar.
DBTranslator se basa en sqlalchemy. Su constructor toma un parámetro adicional del motor:
desde i18n.dbtranslator DBTranslator importación
desde create_engine importación sqlalchemy
motor = create_engine ('sqlite: ///db.sqlite')
ROOT = '/ ruta / a / root'
IDIOMAS = ['it_IT', 'es_ES']
DEST_LANGUAGE = 'it_IT'
tr = DBTranslator (ROOT, IDIOMAS, DEST_LANGUAGE, motor = motor)
tr impresión ._ ("hola mundo")
DBTranslator crea automáticamente los translation_entries tabla en la base de datos. A continuación, le corresponde a la aplicación para proporcionar una interfaz de usuario para manipular la tabla. Para la prueba, se puede utilizar el método add_translation () para insertar una nueva traducción en el PP:
tr.add_translation ("it_IT", "hola mundo", "Ciao mondo")
tr impresión ._ ("Hello World") # imprime "Ciao mondo"
¿Cómo utilizar un traductor global
Por diseño, i18n trata de evitar por completo cualquier estado global. Esto significa que usted puede crear una instancia como muchos Traductor y DBTranslator como quieras, cada uno referido a un directorio y / o base de datos diferente. Esto es especialmente útil para la prueba.
Sin embargo, en la práctica la mayoría de los proyectos quieren usar un traductor global que sabe acerca de los mensajes de todos los componentes del proyecto. La aplicación de demostración muestra una manera de hacerlo en el módulo translate.py:
py importación
desde i18n.translator importación Traductor
# Coloca en la raíz del proyecto al directorio que contiene este archivo
ROOT = py.path.local (__ __ archivo). Dirpath ()
IDIOMAS = ['it_IT', 'es_ES', 'es_ES']
tr = Traductor (ROOT, IDIOMAS, 'it_IT')
= _ Tr._
ngettext = tr.ngettext
if __name__ == '__main__':
& Nbsp; tr.cmdline (sys.argv)
De esta manera, el resto de la aplicación simplemente puede importar y utilizar _ () y ngettext () desde translate.py. O, en su preferencia, importar directamente los objetos y el uso tr tr ._ () y tr.ngettext () para traducir los mensajes.
Las dos últimas líneas del código permite una forma conveniente para llamar extracto y compilar desde la línea de comandos sin tener que especificar manualmente el directorio raíz y los idiomas soportados. Solo corre:
& Nbsp; extracto translate.py python # ... o compilar
Requisitos :
- Python
Comentarios que no se encuentran