2008-11-11 11 views
29

EDITAR: Realmente me gustaría ver un debate general sobre los formatos, sus pros y sus contras.i18n: mejores prácticas para la internacionalización: XLIFF, gettext, INI, ...?

EDIT2: The 'bounty no ayudó realmente a crear la discusión necesaria, hay algunas respuestas interesantes pero la cobertura completa del tema aún no se encuentra. Seis personas marcaron la pregunta como favoritas, lo que me muestra que hay interés en esta discusión.

Al decidir acerca de internacionalización la parte más difícil de la OMI es la elección del formato de almacenamiento.

Por ejemplo el Marco de Zend PHP ofrece los siguientes adaptadores que cubren casi todas mis opciones:

  • matriz: no hay, difícil de mantener
  • CSV: No lo sé, posibles problemas con la codificación
  • Gettext: utiliza con frecuencia, poEdit para todas las plataformas disponibles, pero complicados
  • INI: no se sabe, posible ible problemas con la codificación
  • TBX: no hay pista
  • TMX: ¿demasiado grande? sin editores disponibles gratuitamente.
  • QT: no muy extendido, sin herramientas gratuitas
  • XLIFF: el estándar que viene? PERO no hay herramientas gratuitas disponibles.
  • XMLTM: no, no es lo que necesito

básicamente tengo que cargar con las opciones del 4 'negrita'. Me gustaría utilizar archivos INI pero estoy leyendo acerca de los problemas de codificación ... ¿es realmente un problema si utilizo UTF-8 (archivos, conexiones, bases de datos, etc.) estrictos?

Estoy en Windows y traté de averiguar cómo funciona poEdit pero simplemente no lo logró. Tampoco hay tutoriales en la web, ¿es gettext todavía una opción o una especie en peligro de todos modos?

¿Qué hay de XLIFF, alguien ha trabajado con él? ¿Algún consejo sobre qué herramientas usar?

Alguna idea para Eclipse integración de cualquiera de estas tecnologías?

Respuesta

12

Siempre hay Translate Toolkit que permiten traducir entre creo que todos los formatos mencionados, y gettext (po) y XLIFF preferidos.

1

puede utilizar INI si lo desea, es solo que INI no tiene manera de decirle a nadie que está en UTF8, por lo que si alguien abre su INI con un editor, podría dañar su archivo.

Así que la idea es que, si puede confiar en que el usuario lo edite con una codificación UTF8.

Puede agregar una lista de materiales al comienzo del archivo, algunos editores lo saben.

¿Qué desea que almacene? contenido generado por el usuario o los recursos de su aplicación?

+0

Quiero que el INI para almacenar las cadenas de idioma. Entonces tendría una ini para cada idioma y cada módulo. como default.en, default.de, por defecto. fr ... – markus

+0

entonces puede usar un INI simple, solo necesita indicar en su documento que los archivos de traducción NECESITAN estar en UTF8. Y si el traductor no lo hace, es su culpa :) – CiNN

+0

Hice una variante de esto (por ejemplo, un archivo de tipo INI por idioma) y lo cargué en una tabla hash personalizada. Fue rápido y funcionó bien, excepto para trabajar con OO de cosecha propia en la aplicación C. – torial

15

POEdit no es realmente difícil de aprender. Simplemente cree un nuevo archivo .po, luego dígale que importe cadenas de archivos fuente. El programa escanea tus archivos PHP para cualquier llamada de función que coincida con _("Text"), gettext("Text"), etc. Incluso puedes especificar tus propias funciones para buscar.

Luego introduce una traducción en el cuadro correspondiente. Cuando guardas tu archivo .po, se genera automáticamente un archivo .mo. Es solo una versión binaria de las traducciones que gettext puede analizar fácilmente.

En su script PHP haga una llamada al bindtextdomain() indicándole dónde se encuentra su archivo .mo. Ahora se traducirán todas las cadenas pasadas a gettext (o la función de subrayado).

Hace que sea muy fácil mantener sus archivos de traducción actualizados. POEdit también tiene algunas características interesantes como permitir comentarios, mostrar cadenas modificadas y eliminadas y permitir coincidencias difusas, lo que significa que no tiene que volver a traducir cadenas que se han modificado ligeramente.

1

Trabajé con dos de estos formatos en el lado l18n: TMX y XLIFF. Ellos son bastante similares. TMX es más popular ahora, pero XLIFF está ganando soporte rápidamente. Había al menos un editor XLIFF gratuito la última vez que lo busqué: Transolution pero no se está desarrollando ahora.

0

Un enfoque bastante simple es simplemente usar un archivo de recursos y un script de recursos. Los programas como MSVC no tienen problemas para editarlos. También son razonablemente amigables con otros sistemas (y también con los editores de textos). Puede simplemente crear tablas de cadenas separadas (y tablas de mapas de bits) para cada idioma, y ​​marcar cada tabla con el idioma en que está.

0

Ninguna de esas opciones me parece muy apetecible.

Si envía archivos para traducir en varios idiomas, entonces puede confiar en que las codificaciones son correctas, especialmente si nadie en su equipo habla esos idiomas. A veces es difícil detectar un problema de codificación en un idioma extranjero, y es demasiado fácil corromper las codificaciones de archivos involuntariamente si dejas que tu sistema operativo 'adivine'.

Realmente desea un formato que declare su codificación. De lo contrario, los traductores o sus herramientas de traducción podrían seleccionar algo diferente a UTF-8. Por mi dinero, cualquier tipo de formato XML simple es lo mejor, pero parece que tendrías que hacer tu propio en Zend. XLIFF y TMX son ciertamente excesivos.

Un formato como los recursos XML de Java sería ideal.

+0

¿Por qué necesitarías tirar el tuyo? ¿Has usado ZF? –

1

Realizo el almacenamiento de datos utilizando un diseño personalizado: todo el texto que se muestra se almacena en la base de datos.

Tengo dos tablas. La primera tabla tiene un valor de identidad, un campo varchar de 32 caracteres (indexado en este campo) y una descripción en inglés de 200 caracteres de la frase.

Mi segunda tabla tiene el valor de identidad de la primera tabla, un código de idioma (EN_UK, EN_US, etc.) y una columna NVARCHAR para el texto.

Utilizo un nvarchar para el texto porque admite otros juegos de caracteres que aún no uso.

El varchar de 32 caracteres en la primera tabla almacena algo así como 'pleaselogin', mientras que la segunda tabla realmente almacena el completo "Por favor, introduzca su nombre de usuario y contraseña a continuación".

He creado una enorme lista de valores dinámicos que sustituyo en el tiempo de ejecución. Un ejemplo sería "Tienes {[dynamic: passworddaysremain]} days para cambiar tu contraseña". - Esto me permite trabajar con el orden de palabras en diferentes idiomas.

Hasta ahora solo he tenido que ocuparme de los números arábigos, pero tendré que resolver algo para el primer usuario que necesite números no árabes.

De hecho, extraigo esta información de la base de datos en un intervalo de 2 horas y la guardo en el disco en un archivo para cada idioma en XML. Se usa ampliamente el CDATA.

Hay muchas opciones disponibles, para el rendimiento puede usar plantillas html para cada idioma: mi método funciona bien, pero usa el XML DOM mucho en tiempo de ejecución para crear las páginas.

+0

¿Y qué herramienta (s) proporciona (n) para los traductores? – dolmen

0

Esto podría ser un poco diferente de lo que se ha publicado hasta ahora y puede no ser exactamente lo que estás buscando, pero pensé que lo agregaría, si no por otra cosa sino por un enfoque diferente. Fui con un enfoque orientado a objetos. Lo que hice fue crear un sistema que encapsula archivos de idiomas en una clase almacenándolos en una matriz de cadenas => pares de traducción. El acceso a la traducción es a través de un método llamado traducir con la cadena clave como parámetro. Las clases extendidas heredan el conjunto de idiomas del padre y pueden agregarlo o sobrescribirlo. Debido a que las clases son extensibles, puede cambiar una clase base y hacer que los cambios se propaguen a través de los elementos secundarios, haciendo que sea más fácil de mantener que una matriz por sí misma. Además, solo llamas a las clases que necesitas.

0

Acabamos de almacenar las cadenas en la base de datos y tenemos un modo de traductor integrado en la aplicación para manejar en realidad la adición de cadenas para diferentes idiomas.

En la aplicación que utilizamos varios trucos para crear ID de texto, como

£("btn_save") 
£(Order.class,"amt") 

Las traducciones se carga desde el PP cuando se inicia el sistema, o cuando una recarga se activa manualmente. El método £ se encarga de buscar la cadena traducida según el idioma especificado en la sesión del usuario.