2011-02-03 6 views
8

Ho un progetto Qt che utilizza file XML. Questi file XML contengono testo leggibile dall'uomo e questo testo dovrebbe essere tradotto utilizzando gli strumenti Qt (lupdate, lrelease, QtLinguist).Qt converte stringhe da file non di origine

La domanda è se è possibile generare voci nel file .ts tramite lupdate senza duplicare le stringhe dai file XML in un file di codice sorgente utilizzando la macro QT_TR_NOOP() e gli amici? O in generale, come si traducono le stringhe in file non di origine per i progetti Qt?

+0

Sarebbe bello se lupdate accetterebbe coppie stringa/contesto invece di solo file; quindi si potrebbe semplicemente includere tali cose nel sistema di compilazione. – Joey

+0

Ho trovato un modo più semplice per farlo. Controlla la mia risposta a: http://stackoverflow.com/questions/28166081/can-i-use-tr-and-lupdate-on-xml-files/28168782#28168782 –

risposta

5

Abbiamo avuto lo stesso problema: file XML contenenti stringhe leggibili dall'uomo.

La nostra soluzione era assicurarsi che le stringhe leggibili dall'uomo nei file XML fossero facili da estrarre (le abbiamo inserite in un attributo LABEL) e abbiamo sviluppato un piccolo strumento che analizzerebbe i file XML, estrarrà le stringhe, genererà un contesto (estraendo i dati dal file XML) e quindi generando un file di intestazione CPP contenente un elenco di QT_TR_NOOP().

Questo file è stato aggiunto al nostro file di progetto (.pro) utilizzato da lupdate.

Questa soluzione andava bene per noi, ma abbiamo dovuto essere molto attenti a due cose:

  • eseguire questo strumento ogni volta che il contenuto di un file XML modificato.
  • assicurarsi che i file XML siano codificati in UTF-8.
+0

Sembra una soluzione universale, applicabile anche ai file non XML. Prenderò in considerazione qualcosa del genere, grazie! – Sascha

+0

Sarebbe bello se tu pubblicassi lo strumento su github, che renderebbe questa risposta più utile per gli altri. – sashoalm

3

È possibile tradurre tutto ciò che si desidera in fase di esecuzione utilizzando tr(), a condizione che il file .qm abbia una traduzione/contesto corrispondenti. Non dovrebbe fare alcuna differenza se il lupdate l'ha estratto o meno.

Non so come rendere lupdate per estrarre stringhe da XML arbitrario, ma ciò non significa che non sia possibile utilizzare linguisti.

  1. . I file di file sono anche XML; dovrebbe essere facile creare un XSLT che trasformi il tuo XML in un file .ts. Se si desidera utilizzare come target uno standard anziché Qt, lupdate (e linguista) possono elaborare anche i file XLIFF.
  2. è possibile avere più file .ts (basta chiamare QTranslator :: carico più di una volta, quando la sua creazione)

Se si vuole veramente avere tutto in un unico file per il traduttore, avere la vostra copia XSLT il file generato da lupdate nel suo output.

Finché si utilizza un nome di contesto che non duplica qualcosa utilizzato nel codice sorgente, questo non dovrebbe essere diverso (dal punto di vista di Qt) dal modo in cui molte app caricano un .qm per ogni DLL quello ha GUI.

+0

L'idea XSLT è carina, grazie! Tuttavia, il mio progetto è in realtà più complesso e gli utenti possono integrare plug-in che possono contenere file XML con diversi schemi definiti dall'utente. Come potrebbe un XSLT trasformare ora ciò che è leggibile dall'uomo e cosa no? (Non sono sicuro se posso/dovrei chiedere agli utenti di fornire il proprio XSLT con ogni file XML ...) – Sascha

+0

Se non si conosce nulla sullo schema, come sperava che il lupdate sapesse cosa afferrare?È possibile estrarre tutto il contenuto del testo non di spazi bianchi, o anche tutti i contenuti degli attributi e i nodi di testo, ma sembra che ci sia un sacco di spazzatura perché i traduttori possano passare al setaccio. Forse l'utente aggiunge un attributo speciale su elementi che specificano il contesto per questo testo ed estrae solo il testo di tali elementi? qualcosa come // * [@ tr: context]/text() selezionerebbe tali nodi. – puetzk

+0

Sì, stavo pensando di usare una specie di convenzione. I tuoi suggerimenti hanno un senso. – Sascha