2011-02-03 8 views
8

Tengo un proyecto Qt que usa archivos XML. Esos archivos XML contienen texto legible por humanos y este texto debe traducirse utilizando las herramientas Qt (lupdate, lrelease, QtLinguist).Qt traducir cadenas de archivos que no son de origen

La pregunta es si es posible generar entradas en el archivo .ts a través de lupdate sin duplicar las cadenas de los archivos XML en un archivo de código fuente utilizando la macro QT_TR_NOOP() y amigos. O, en general, ¿cómo se traducen cadenas en archivos no fuente para proyectos Qt?

+0

Sería bueno si lupdate aceptara pares de cadena/contexto en lugar de solo archivos; entonces uno podría simplemente incluir tales cosas en el sistema de compilación. – Joey

+0

Encontré una forma más fácil de hacerlo. Verifique mi respuesta en: http://stackoverflow.com/questions/28166081/can-i-use-tr-and-lupdate-on-xml-files/28168782#28168782 –

Respuesta

5

Tuvimos el mismo problema: archivos XML que contienen cadenas legibles por humanos.

Nuestra solución fue asegurarnos de que las cadenas legibles en humanos en los archivos XML fueran fáciles de extraer (las pusimos en un atributo LABEL) y desarrollamos una pequeña herramienta que analizaba los archivos XML, extraía las cadenas, generaba un contexto (extrayendo datos del archivo XML) y generando un archivo de encabezado CPP que contiene una lista de QT_TR_NOOP().

Este archivo se ha agregado a nuestro archivo de proyecto (.pro) que fue utilizado por lupdate.

Esta solución estaba bien para nosotros, pero teníamos que tener mucho cuidado con dos cosas:

  • ejecutar esta herramienta cada vez que el contenido de un archivo XML cambió.
  • asegúrese de que los archivos XML tengan codificación UTF-8.
+0

Eso suena como una solución universal, también aplicable a archivos que no sean XML. Consideraré algo así, ¡gracias! – Sascha

+0

Sería bueno que publicaras la herramienta en github, que haría esta respuesta más útil para otros. – sashoalm

3

Puede traducir todo lo que desee en tiempo de ejecución utilizando tr(), siempre que el archivo .qm tenga una traducción/contexto correspondiente. No debería haber ninguna diferencia si lupdate lo extrajo o no.

No sé cómo hacer lupdate para extraer cadenas de XML arbitrario, pero eso no significa que no puedas usar lingüista.

  1. .ts Los archivos también son XML; debería ser fácil hacer un XSLT que transforme su XML en un archivo .ts. Si desea apuntar a algo estándar en lugar de solo Qt, lupdate (y el lingüista) también pueden procesar archivos XLIFF.
  2. puede tener varios archivos .ts (sólo llame QTranslator :: carga más de una vez cuando su puesta en marcha)

Si realmente quiere tener todo en un solo archivo para el traductor, tiene su copia XSLT el archivo generado por lupdate en su salida.

Siempre que use un nombre de contexto que no duplique algo usado en el código fuente, esto no debería ser diferente (desde el punto de vista de Qt) de la forma en que muchas aplicaciones cargan un .qm para cada DLL eso tiene GUI.

+0

La idea de XSLT es agradable, ¡gracias! Sin embargo, mi proyecto es realmente más complejo y los usuarios pueden integrar complementos que pueden contener archivos XML con diferentes esquemas definidos por el usuario. ¿Cómo transformaría un XSLT ahora lo que es legible por los humanos y lo que no? (No estoy seguro de si puedo/debo pedirles a los usuarios que suministren su propio XSLT con cada archivo XML ...) – Sascha

+0

Si no sabe nada sobre el esquema, ¿cómo esperaba que lupdate supiera qué agarrar?Puede extraer todo el contenido de texto que no sea de espacio en blanco, o incluso todo el contenido de atributo y los nodos de texto, pero parece que será una gran cantidad de basura para los traductores. ¿Tal vez el usuario puede agregar un atributo especial en los elementos que especifican el contexto de este texto y extraer solo el texto de dichos elementos? algo como // * [@ tr: context]/text() seleccionaría tales nodos. – puetzk

+0

Sí, estaba pensando en utilizar algún tipo de convención. Tus sugerencias tienen sentido. – Sascha

Cuestiones relacionadas