Pregunta

Tengo una aplicación escrita en wxPython que quiero hacer multilingüe. Nuestras opciones son

  1. usando gettext http://docs.python.org/library/gettext.html
  2. separando todo el texto de la IU a un archivo messages.py y usándolo para traducir texto

Estoy muy inclinado hacia la segunda posición y no veo ningún beneficio en obtener el texto, usando la segunda forma, puedo tener todos mis mensajes en un lugar que no están en el código, por lo tanto, si necesito cambiar un mensaje, el código no necesita ser cambiado, en caso de gettext puedo tener constantes de mensajes confusos ya que simplemente envolveré el original msg en lugar de convertirlo en una constante en messages.py

básicamente en lugar de

wx.MessageBox(_("Hi stackoverflow!"))

Creo

wx.MessageBox(messages.GREET_SO)

es mejor, entonces ¿hay alguna ventaja en gettext way y desventaja 2nd way? y hay una tercera forma?

editar: También los archivos de idiomas de gettext parecen estar demasiado vinculados al código, y qué sucede si quiero dos mensajes iguales en inglés pero diferentes en francés, p. supongamos que el francés tiene una traducción más sutil para diferentes scnerarios para el inglés, uno está bien

experiencia: Ya he tomado el segundo camino, y debo decir que cada aplicación debe intentar extraer el texto de la interfaz de usuario del código, da la oportunidad de refactorizar, ver dónde la interfaz de usuario se está arrastrando al modelo y dónde se puede mejorar el texto de la interfaz de usuario, obtener el texto en comparación es mecánico, no da ninguna entrada para el codificador, y creo que sería más difícil de mantener.

y al crear un nombre para texto, p. PRINT_PROGRESS_MSG, da la oportunidad de ver que en muchos lugares, el mismo mensaje se usa de manera ligeramente diferente y se puede combinar en un solo nombre, lo que más adelante ayudará cuando necesite cambiar el mensaje solo una vez.

Conclusión: Todavía no estoy seguro de ninguna ventaja de usar gettext y estoy usando mi propio archivo de mensajes. pero he seleccionado la respuesta que al menos explica algunos puntos por los que gettext puede ser beneficioso. La solución final IMO es la que toma lo mejor de ambas formas, es decir, mi propio identificador de mensaje envuelto por gettext, por ejemplo,

wx.MessageBox(_("GREET_SO"))
¿Fue útil?

Solución

Gettext es el camino a seguir, en su ejemplo también puede usar gettext para evitar "almacenar las traducciones en el código":

wx.MessageBox(messages.GREET_SO)

podría ser lo mismo con gettext como:

wx.MessageBox(_("GREET_SO")) or wx.MessageBox(_("messages.GREET_SO"))

Gettext es prácticamente el estándar para aplicaciones multilingües, y estoy bastante seguro de que te beneficiarás de usarlo en el futuro. Por ejemplo, puede usar Poedit (u otra aplicación similar) para asignar traducciones a sus colaboradores o colaboradores y luego marcar uno o varios mensajes como no traducidos correctamente. Además, si faltan entradas / entradas adicionales poedit le avisará. No se engañe, gettext es la única forma confiable y comprobada de mantener las traducciones.

Otros consejos

Hay algunas ventajas de gettext:

  1. Una de las mayores ventajas es: cuando se utiliza poedit para hacer las traducciones, puede beneficiarse de la base de datos de traducción. Básicamente poedit puede escanear su disco duro y encontrar archivos ya traducidos y hará sugerencias cuando traduzca su archivo.
  2. Cuando le das el código a otras personas para que traduzcan, es posible que ya conozcan la forma de traducir gettext, mientras que tienes que explicarles tu forma de traducir.
  3. Tiene el texto en el contexto del código, por lo que debería ser más fácil de traducir cuando vea el código alrededor de la traducción
  4. Considere texto como: print _ ('% d archivos de% d archivos seleccionados')% (num, numTotal) e incluso situaciones más complicadas. Aquí realmente ayuda tener el código alrededor ...

Para la web (esto es PHP pero la idea es la misma), siempre creo múltiples archivos de idioma en un directorio específico. en.php, fr.php, etc. Esos archivos contienen definiciones de todo el texto de salida, en el idioma dado. La preferencia del usuario por el idioma determina cuál de esos archivos se incluye, por lo tanto, en qué idioma aparece la salida. Por ejemplo ...

en en.php:     TEXT_I_AM = " Soy "

en fr.php:     TEXT_I_AM = " Je suis "

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