2010-01-05 14 views
35

Actualmente, el uso de Gettext en un proyecto y los archivos .po están muy bien guardados bajo control de versión.Archivos Gettext .po bajo el control de versión

archivos PO por supuesto contienen traducciones, pero además de que también contienen algunos metadatos - información sobre los archivos exactos y números de línea donde se encuentran las cadenas traducibles.

El problema es que cada vez que actualiza los archivos PO, los metadatos cambian mucho más que las traducciones reales. Esto hace que sea realmente difícil ver más tarde desde el control de versiones diff lo que en realidad fue cambiado - usted acaba de ver una miríada de cambios en los nombres de los archivos y la línea números. Al igual que:

- #: somefile.js:43 
- #: somefile.js:45 
- #: somefile.js:118 
+ #: somefile.js:203 
+ #: somefile.js:215 
    msgid "Translate me please" 
    msgstr "Tõlgi mind palun" 

- #: somefile.js:23 
- #: somefile.js:135 
+ #: otherfile.js:23 
+ #: otherfile.js:135 
    msgid "Note" 
    msgstr "Märkus" 

- #: andThatFile.js:18 
    #: orThisFile.js:131 
- msgid "Before I was like this" 
- msgstr "Selline olin ma enne" 
+ msgid "I happen to be changed" 
+ msgstr "Paistab, et mind muudeti" 

Por supuesto, una solución sencilla sería la de simplemente desactivar la generación de nombre de archivo/comentarios lineNumber en la producción xgettext. Pero en realidad encuentro esos nombres de archivos para ser pistas bastante útiles al traducir.

Seguramente no puedo ser el único a quien no le gusten las diferencias de sus archivos PO. Sugerencias?

+0

También podría intentar dividir ese cambio en 2 cambios: uno que actualice los metadatos y otro que actualice el editor. traducciones. Entonces podrías ignorar los cambios de metadatos. –

Respuesta

25

Una solución simple sería aplicar un filtro grep para eliminar los metadatos de comentarios de la diff vista. Usted puede hacer esto a la salida de la utilidad de control de versiones diff:

myVersionControl diff REV1 REV2 filea | grep -v '^..#' 

o puede ser capaz de instruir a la utilidad de control de versiones de diferencias para ignorar estos antes de que se hace la comparación, lo que probablemente dará lugar a una salida más fiable y más bonita:

no sé qué sistema de control de versiones se utiliza, pero Git (por ejemplo) que permite preprocesar la entrada a diff y quitar las líneas de comentarios para ciertos tipos de archivos (gracias VonC), vea man gitattributes y busque Realizando diffs de texto de archivos binarios. Aquí está el cuerpo de un script de ejemplo para guardar como /usr/local/bin/strippocomments que hará que:

grep -v '^#:' $1 

A continuación, puede decirle a Git para utilizar este script para procesar previamente los archivos po, añadiendo lo siguiente al archivo .git/info/attributes en su repositorio:

*.po diff=podiff 

y para el archivo .git/config en su repositorio:

[diff "podiff"] 
    textconv = /usr/local/bin/strippocomments 

Usando git diff debe entonces no incluye cualquier línea que comience con #:.

Tenga en cuenta que los difs generados a partir de git diff utilizando este enfoque no se deben usar para aplicar parches, pero git format-patch aún usará la diferencia predeterminada, por lo que los parches generados para enviar correos electrónicos seguirán siendo correctos.

+0

Parece que mi git no admite la opción --ignore-matching-lines. Usando la versión 1.6.5.2 –

+0

Pero filtrar el diff con grep realmente produce una salida mucho más limpia. ¿Cómo es que no pensé en esto por mi cuenta? Por supuesto, esto no ayuda cuando veo el diff a través de algo más que la interfaz de la consola, pero de hecho resuelve la mayor parte del problema. –

+0

¡de acuerdo, apuñalé que funcionaría basándome en el hecho de que muchas de las cosas que esperaba que funcionarían en el pasado en realidad! Sin embargo, git diff es muy flexible y probablemente pueda hacerlo. –

7

El paquete GNU gettext tiene numerosas utilidades útiles para realizar varias tareas con archivos PO. Hay msgcmp para comparar dos archivos PO, msgcomm para seleccionar mensajes comunes/únicos, msgattrib para seleccionar/filtrar/transformar archivos PO existentes. Depende de lo que realmente necesite del archivo PO, creo que necesita usar msgattrib o msgcomm.

Si necesita simplemente comparar dos archivos PO sin comentarios sobre el archivo/línea, entonces la secuencia de comandos simple para grep y guardar en el directorio temporal sus archivos PO viejos y nuevos sería suficiente.

7

Se podía ver las diferentes opciones que ofrece un custom diff a .gitattribute file, como la especificación de un diff especial para archivos po

[diff "mypodiff"] 
    command = mypodiff 
*.po diff=mypodiff 

con mypodiff un script llamando a cualquier herramienta diff capaz de filtrar la línea que WA wnt

+0

Gracias, he conseguido que esto funcione. Una parte un poco complicada fue conseguir que el orden de los argumentos fuera correcto para el comando diff externo. –

+0

BTW, ¿hay alguna manera de tener la opción '--ext-diff' siempre encendida cuando se ejecutan los comandos' git-show' y 'git-log' (y posiblemente otros). El comando diff externo se aplica a los archivos .po cuando se usa 'git-diff', pero raramente uso ese comando, para otros necesito agregar la opción' --ext-diff'. –

+0

Yo diría: 'git alias' podría ayudarte allí. al definir alias, puede agregar la opción relevante a esos comandos. – VonC

19

El enfoque gitattributes/textconv es el camino correcto a seguir. Me gustaría ofrecer una mejor solución con respecto a las herramientas para hacer el preprocesamiento.

En .gitattributes:

*.po diff=po 

En .gitconfig:

[diff "po"] 
    textconv=msgcat --no-location --no-wrap --sort-output 

msgcat desde el paquete gettext es una herramienta útil allí. Tiene una cantidad de opciones con las que puedes jugar. La opción --no-location es especialmente lo que desea filtrar las diferencias de número de línea. Las otras opciones pueden ser útiles si xgettext y/o msgmerge y/o su editor continúan formateando las cadenas de formas molestas. (En ese caso, también sería bueno pasar esas mismas opciones a esas herramientas, y reconfigurar su editor.)

+2

Tenga en cuenta que, a diferencia de '.gitattributes' y' .gitignore', '.gitconfig' * en su árbol de fuentes * no será analizado por Git. Tienes que usar '~/.gitconfig' o' .git/config'. – ulidtko

Cuestiones relacionadas