2009-10-08 35 views
5

Nos usar gettext las traducciones de nuestro producto, pero han tenido muchos problemas con él:Los reemplazos de gettext

  • No se puede utilizar un lenguaje a menos que el sistema lo soporta.

En Solaris 9 Sparc, si reiniciamos el entorno a varias configuraciones regionales en inglés, el mensaje aún no se traducirá, si la máquina no tiene la configuración regional correspondiente. El archivo de traducción está presente, pero no podemos acceder a él.

  • Usos entorno para trabajar el lenguaje

Esto causa problemas en los servidores que quieren traducir los mensajes en diferentes idiomas. En teoría, esta podría ser una operación totalmente paralela y segura para subprocesos, pero gettext significa que debemos tener un bloqueo global en torno a la traducción.

  • No se puede establecer un idioma por defecto

Con esto no quiero decir el texto en el código. Usamos MsgID en el código, por lo que lo que quiero es poder especificar una traducción alternativa a la que ir, si el entorno actual define el idioma no está disponible. Pero gettext no lo permite: tengo que intentarlo, luego restablecer el entorno antes de que ordene mirar una traducción diferente. (Usando MsgIDs no era mi elección - que quería seguir los estándares de gettext y el uso de Inglés como las identificaciones, pero fue invalidado, y sería mucho trabajo para cambiar ahora)

  • Codificación de la SE devuelto varían entre UTF-8 y la codificación local actual.

No me refiero a los archivos .po - están todos en UTF-8 (molesto porque msgfmt no maneja la lista de materiales, pero lo que sea). Me refiero a la salida de gettext ngettext, etc., que están en UTF-8 (independientemente de la codificación local/terminal) en AIX y HPUX, pero la codificación local en Solaris/Linux/FreeBSD, aunque eso podría deberse a problemas de iconv.

En cualquier caso, sería bueno no tener que tener un código especial para diferentes plataformas - Tendré que investigar si puedo obtener bind_textdomain_codeset(domain,codepage); para ayudar a evitar este problema.


¿Alguien sabe de una biblioteca de traducción de código abierto que proporciona una interfaz más útil?

Respuesta

5

Estamos usando ICU resource bundles y estamos bastante satisfechos con esto. La interfaz de la ICU no es "moderna", pero es potente, los principios subyacentes son sólidos, y el empaquetado de recursos (con la herramienta genrb) es bastante flexible. Sus capacidades de message formatting también son buenas.

Sobre sus comentarios específicos:

No se puede utilizar un lenguaje a menos que el sistema lo soporta.

No lo entiendo. Esto puede deberse al hecho de que la única "experiencia" que tengo con gettext es haber leído su documentación.

Usos entorno para trabajar el lenguaje

La interfaz UCI tiene un Locale como entrada, por lo que tiene un control completo. También tiene un concepto de "configuración regional predeterminada" si es más conveniente para usted.

No se puede establecer un idioma por defecto

UCI tiene un elaborado fallback mechanism, que involucra un conjunto "default"

que codifica el son devueltos variar entre UTF-8 y codificación local actual .

cadena ResourceBundle s (otros tipos de datos también son posibles) siempre se representan como UnicodeString, que está codificada internamente en UTF-16. UTF-32 con UnicodeString es bastante fácil, ya que su interfaz expone varios métodos que permiten manipularlo en el nivel del punto de código. Para otras codificaciones, code conversion es posible.

+0

no hubiera ver cosas traducción UCI antes - Me pareció que era simplemente la conversión de codificaciones ... sin duda interesante, ya que Creo que la UCI podría convertirse en una dependencia nuestra en algún momento de todos modos. –

+0

sobre la dependencia del sistema de gettext - p. No se puede traducir un mensaje al japonés a menos que se admita la configuración regional del sistema ja_JP.UTF-8, incluso si se está ejecutando en un sistema UTF-8, y es muy posible que pueda mostrar japonés. –

+0

O incluso un servidor que desea generar japonés, p. Ej.para un correo electrónico, requiere que la configuración regional esté disponible solo para obtener un mensaje de traducción. –

1

También puede convertir paquetes de recursos de ICU desde y hacia el formato XLIFF basado en XML para la traducción.

+0

Ahora, si la ICU tiene la capacidad de leer archivos .mo, eso sería aún mejor ... –

+2

Una forma sería usar: .mo a .po: http://weblogtoolscollection.com/archives/2007/03/06/wp-translations-mo-y-po-files/ .po a xliff: http://translate.sourceforge.net/wiki/toolkit/xliff2po Quizás no sea lo que se desea. Puede presentar un error en la UCI. –

2

1. No se puede utilizar un idioma a menos que el sistema lo admita.

Wrong. Puedes especificar el idioma manualmente. El uso de entornos variable LANGUAGE

int main() 
{ 
     setlocale(LC_ALL,""); 
     setenv("LANGUAGE","foo"); 
} 

Esto funciona, incluso si no existe la configuración regional (foo lenguaje has visto alguna vez?)

2. Usos entorno para trabajar el lenguaje

¿Cuál es el problema con eso? Esto le da al usuario más control.

3. No se puede establecer un idioma por defecto

incorrecto, véase más arriba.

4. La codificación que se devuelve varía entre UTF-8 y la codificación local actual.

incorrecto, Ver bind_textdomain_codeset(domain,codepage);

Mi recomendación fuerte - Permanezca withing gettext. Es una de las herramientas más compatibles y mejores. Los traductores estarán agradecidos de utilizar una herramienta normal y útil.

Hay otro punto importante: gran soporte de formas plurales que tienen bastante soporte en herramientas no basadas en gettext.


Solo hay 1 límite de gettext: no puede usar más de un idioma por proceso. No es seguro para cambiar el idioma. Afortunadamente, la mayoría de los programas que interactúan con seres humanos hablan en un idioma.

Esto puede ser una limitación solo para servicios de subprocesamiento múltiple.

EDITAR: Pero incluso esto no es un problema real. Implementé una versión segura de gettext para una vez para mi proyecto. Consulte http://art-blog.no-ip.info/cppcms/blog/post/16, basado en el lector de archivos mo.

+0

mo archivos no son el problema - las bibliotecas para acceder a ellos son. Por lo tanto, miraré con interés a su biblioteca, que parece exactamente lo que busco. –

0

El cambio de idioma en el navegador Google Chrome está muy bien hecho. Es posible cambiar entre idiomas mientras el programa se está ejecutando. No sé qué sistema usan, pero puede valer la pena investigar, ya que es un navegador de código abierto.

0

No se puede utilizar un idioma a menos que el sistema lo admita.

Eso no tiene nada que ver con GNU gettext - porque eso solo maneja la parte de traducción. Pero es verdad, que si el sistema no puede mostrar ningún carácter chino, entonces tendrá problemas con China.

Usos entorno para trabajar el lenguaje

Esa es una buena opción, pero siempre se puede ajustar el idioma mismo, anulando el medio ambiente. De esta forma, puede hacer que use cualquier idioma, según su elección.

No se puede establecer un idioma por defecto

Eso es incorrecto - idioma por defecto es siempre el lenguaje integrado, y si usted quiere tener otro idioma, simplemente cambiar a ella. Simplemente no puede ser más simple que una línea de código.

La codificación que se devuelve varía entre UTF-8 y la codificación local actual.

Si está en posición de elegir una herramienta de internacionalización, entonces también puede elegir qué codificación de caracteres desea usar para sus textos. Algunos proyectos usan utf-8 para todos los idiomas (mi preferencia), algunos usan la codificación de locale.

¿Alguien sabe de una biblioteca de traducción de código abierto que proporciona una interfaz más útil?

No, lo siento - No veo ningún problema con GNU gettext :-)

+0

Tal vez deba preguntar cómo resolver sus problemas en lugar de saltearse la herramienta ... se sorprenderá de lo bueno que es. –

+0

Cuando dice que el idioma predeterminado es el incorporado, ¿quiere decir el texto que se puso en el código? Usamos MsgID en el código, así que lo que quiero es poder especificar una ** traducción ** alternativa a la que ir, si el idioma de definición del entorno actual no está disponible. Pero gettext no lo permite: tengo que intentarlo, luego restablecer el entorno antes de que ordene mirar una traducción diferente. –

+0

Usar el entorno para resolver el problema está bien para los programas de línea de comandos, pero falla para los servidores. Y falla si el texto incorporado no está en un idioma predeterminado. –

Cuestiones relacionadas