2010-01-05 7 views
35

Attualmente si utilizza Gettext su un progetto ei file .po sono mantenuti in modo corretto sotto il controllo della versione .File Gettext .po sotto controllo di versione

file PO naturalmente contengono traduzioni, ma in aggiunta a quello che contengono anche alcuni metadati - informazioni sui file esatte e numeri di riga in cui si trovano le stringhe traducibili.

Il problema è che ogni volta che si aggiornano i file PO i metadati cambiano molto più delle traduzioni effettive. Questo lo rende davvero difficile vedere in seguito dal controllo di versione diff quello che era in realtà cambiato - si vedono solo una miriade di modifiche ai nomi di file e ai numeri di linea . Come quella:

- #: 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" 

Naturalmente, una semplice correzione potrebbe essere quella di disabilitare solo la generazione di filename/commenti LineNumber in uscita xgettext. Ma in realtà trovo che i nomi dei file siano utili quando si traducono.

Sicuramente non posso essere l'unico a cui non piacciono le differenze tra i file PO. Suggerimenti?

+0

Puoi anche provare a suddividere quella modifica in 2 modifiche: una che aggiorna i metadati e quella che aggiorna la modifica traduzioni. Quindi potresti ignorare le modifiche ai metadati. –

risposta

25

Una soluzione semplice consiste nell'applicare un filtro grep per rimuovere i metadati del commento dalla differenza visualizzata. È possibile fare questo per il uscita dell'utilità versione di controllo diff:

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

o si può essere in grado di istruire l'utilità di controllo di versione diff di ignorare questi prima si fa il paragone, che probabilmente porterà a un'uscita più affidabile e più bella:

non so quale sistema di controllo di versione si utilizza, ma git (per esempio) ti consente di pre-elaborazione l'ingresso diff e rimuovere le righe di commento per determinati tipi di file (grazie VonC), vedere man gitattributes e cercare Esecuzione di diff di testo di file binari. Ecco il corpo di uno script di esempio per salvare come /usr/local/bin/strippocomments che lo farà:

grep -v '^#:' $1 

Si può quindi dire a git a utilizzare questo script per pre-elaborare file PO, aggiungendo quanto segue al file .git/info/attributes nel repository:

*.po diff=podiff 

e al file .git/config nel repository:

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

Utilizzando git diff dovrebbe poi non includere qualsiasi riga che inizia con #:.

Si noti che i diffs generati da git diff utilizzando questo approccio non devono essere utilizzati per l'applicazione delle patch, ma lo standard git format-patch utilizzerà comunque il diff predefinito, quindi le patch generate per l'invio tramite e-mail continueranno a essere valide.

+0

Sembra che il mio git non supporti l'opzione --ignore-matching-lines. Usando la versione 1.6.5.2 –

+0

Ma il filtrare il diff con grep produce davvero un output molto più pulito. Come mai non ci ho pensato da solo? Naturalmente questo non aiuta quando vedo la diff attraverso qualcosa di diverso dall'interfaccia della console, ma risolve la maggior parte del problema. –

+0

ok, ho preso una pugnalata che avrebbe funzionato sulla base del fatto che molte cose che speravo avrebbero funzionato in passato lo facevano davvero! Tuttavia, git diff è molto flessibile e può probabilmente essere fatto per farlo. –

7

Il pacchetto gettext GNU ha numerose utilità utili per eseguire varie attività con i file PO. C'è msgcmp per confrontare due file PO, msgcomm per selezionare i messaggi comuni/unici, msgattrib per selezionare/filtrare/trasformare i file PO esistenti. Dipende da ciò che è effettivamente necessario da diff di file PO, penso che sia necessario utilizzare msgattrib o msgcomm.

Se è necessario confrontare solo due file PO senza commenti su file/linea, quindi semplice script per grep e salvare in temp dir, i vecchi e nuovi file PO sarebbero sufficienti.

7

si poteva guardare le diverse opzioni offerte da un custom diff a .gitattribute file, come specificare un diff speciale per file po

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

con mypodiff uno script di chiamare qualsiasi diff strumento in grado di filtrare la linea che si wa Wnt

+0

Grazie, è riuscito a farlo funzionare. Una parte un po 'complicata è stata ottenere l'ordine degli argomenti corretto per il comando diff esterno. –

+0

BTW, c'è un modo per avere l'opzione '--ext-diff' sempre attiva quando si eseguono i comandi' git-show' e 'git-log' (ed eventualmente altri). Il comando diff esterno viene applicato ai file .po quando si usa 'git-diff', ma raramente uso quel comando, per altri ho bisogno di aggiungere l'opzione' --ext-diff'. –

+0

Direi: 'git alias' potrebbe aiutarti. definendo gli alias, è possibile aggiungere l'opzione pertinente a tali comandi. – VonC

19

L'approccio gitattributes/textconv è la soluzione giusta. Mi piacerebbe offrire una soluzione migliore per quanto riguarda gli strumenti per eseguire la pre-elaborazione.

In .gitattributes:

*.po diff=po 

In .gitconfig:

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

msgcat dal pacchetto gettext è uno strumento utile lì. Ha un numero di opzioni con cui puoi giocare. L'opzione --no-location è in particolare ciò che si desidera filtrare le differenze del numero di riga. Le altre opzioni potrebbero essere utili se xgettext e/o msgmerge e/o il tuo editor continua a riformattare le stringhe in modi fastidiosi. (In tal caso, sarebbe anche meglio passare le stesse opzioni a quegli strumenti e riconfigurare il tuo editor.)

+2

Attenzione, diversamente da '.gitattributes' e' .gitignore', '.gitconfig' * nell'albero dei sorgenti * non verrà analizzato da Git. Devi usare '~/.gitconfig' o' .git/config'. – ulidtko