2010-01-07 5 views
8

Tengo un par de aplicaciones escritas en PyQt4 donde he usado la biblioteca de gettext estándar de Python para la internacionalización y localización de la GUI. Funciona bien para mí. Pero he seleccionado gettext simplemente porque ya he tenido conocimiento y experiencia en el uso de gettext, y cero experiencia con el enfoque Qt4 tr().Ventajas y desventajas de usar gettext en lugar de QObject.tr() para la localización de la aplicación PyQt4?

Ahora me gustaría comparar mejor ambos enfoques y entender lo que me falta mediante el uso de gettext en lugar de QObject.tr, y ¿hay alguna razón seria por la que no debería usar gettext para las aplicaciones Qt4/PyQt4?

en mi entendimiento ventajas del uso de gettext son:

  • GNU gettext es madura y parece ser estándar de-facto en el mundo GNU/Linux.
  • Hay suficientes editores especiales para los archivos PO para simplificar el trabajo de los traductores, aunque la naturaleza textual de las plantillas PO hace que no sea estrictamente necesario.
  • Incluso hay servicios web disponibles que se pueden usar para traducciones colaborativas.
  • gettext es la biblioteca de Python estándar, por lo que no es necesario instalar nada especial para usarlo en tiempo de ejecución.
  • Tiene muy buen soporte para la selección de formas singulares/plurales a través de ngettext().

Lo que veo como ventajas de QObject.tr():

  • Esta es una tecnología nativa para Qt4/PyQt4 así que tal vez va a funcionar mejor/más rápido (aunque no tengo datos para probar).
  • Los mensajes a traducir pueden tener información de contexto adicional que ayudará a los traductores a elegir las mejores variantes para palabras homónimas, p. Ej. la palabra inglesa "Letter" puede traducirse como "Character", "Mail" o incluso como "Paper size" dependiendo del contexto real.

Lo que veo como desventajas de QObject.tr() vs gettext:

  • no me encontré en la documentación de Qt cómo está apoyado selección singular/plural allí.
  • La plantilla de traducción Qt4 TS está en formato XML y, por lo tanto, es más compleja de editar sin editor especial (QT Linguist) y parece que no hay otras soluciones de terceros o servicios web. Por lo tanto, sería necesario que los traductores aprendieran una nueva herramienta (si ya están familiarizados con las herramientas de PO).

Pero todos los elementos anteriores no son lo suficientemente críticos como para decir claramente que una herramienta es mejor que otra. Y no quiero comenzar una guerra de fuego sobre lo que es mejor porque es muy subjetivo. Solo quiero saber lo que me faltan como pros y contras de QObject.tr() versus gettext.

Respuesta

-1

Puede agregar que los argumentos se manejan de manera diferente ...

Con Gettext, podemos hacer

_("Hello %(name)s from %(city)s") % {person.__dict__}

mientras que en PyQt, hacemos

self.tr("Hello %1 from %2").arg(person.name).arg(person.city)

2

Una razón simple de usar QObject.tr() es:

Es que la guarda es necesario instalar gettext en Windows, facilitando el trabajo multiplataforma. Intento tener las menores dependencias binarias posibles en Windows.

2

Todos tienen sus pros y sus contras, pero para definirlos con mayor claridad, primero deberá definir si tiene como objetivo un entorno móvil o un entorno de escritorio.

Dentro de nuestra empresa, utilizamos diferentes métodos simplemente porque la solución ideal aún no existe. Para el desarrollo de escritorio, usamos archivos PO simplemente porque los botones no están escalados y, por lo tanto, el texto encajará. Para desarrollo móvil, la traducción de una cadena depende del tamaño del botón, que podría ser diferente en los dispositivos de paisaje y retrato. Esto lo complica un poco porque un archivo PO solo puede tener 1 traducción de una palabra determinada. Así que seleccionamos XLIFF para esto, por lo que podríamos asignar identificaciones únicas a una cadena. Esta no es una tarea fácil también, porque no hay buenas soluciones para convertir archivos .RC a archivos XLIFF. (Debido a que las herramientas actuales convierten TODAS las cadenas entre "" que es, por supuesto, un comportamiento no deseado). Así que escribí un convertidor para esta tarea.

Sin embargo, al pensar en la localización, las formas en plural son muy importantes, por lo que no tener esto no es una buena solución de localización. Por lo tanto, yo diría que vaya por PO gettext.

Saludos, Floris.

2

En el momento actual, Qt no se ocupa de las formas plurales cuando se está haciendo uso de QT_TRANSLATE_NOOP

+1

me gustaría añadir que 'tr ("elemento% n Ha seleccionado (s)",, item.count()) 'parece que podría funcionar, pero está muy mal documentado en el sistema de Qt y realmente no explica cómo poner las cosas si digamos que realmente quieres dos (o más) cadenas diferentes en lugar de solo un sufijo:' tr (" % n elemento {is | s are} ahora en selección. ",, item.count())' – SlySven

Cuestiones relacionadas