Italiano - English

Howto upgrade gettext translation repositories

Translation for this document is not available or is not complete,
if you are intrested to receive information please write to

Here is a procedure to upgrading automatically gettext translation repositories (.PO files) when you modify your source code.

Gettxet dispone di numerosi strumenti che facilitano la vita del programmatore e in particolare

  • xgettex (dxgettext per delphi/kylix) estrae tutte le stringe dal codice sorgente creando un file di stringhe, ad esempio default.po
  • msgcat: unisce due file ad esempio file3 = file1.po + file2.po
  • msgmerge: fa l’intersezione di due file, prende la stringa da un file e la sua traduzione da un altro ...ad esempio file3 = file1.po U file2.po
  • msgremove: elimina le stringhe di contenute in un file da un secondo file. Ad esempio file3.po = file2.po - file1.po
Per maggiori informazioni http://www.gnu.org/software/gettext/manual/ per la versione delphi  http://dxgettext.po.dk/


L’estrazione di tutte le stringhe dal codice sorgente comprende anche molto testo che non è di interesse per la traduzione, come ad esempio i nomi dei font, numeri indicati come testo ecc.. Si dovrebbe evitare di includere tali stringhe nei file di traduzione e si vorrebbe che tale impostazione rimanga valida anche quando questi file vengono aggiornati. Qui è descritta una procedura che risolve questo problema automaticamente.


Gettext dispone del comando msgmkignore in grado di identificare automaticamente la maggior parte delle stringhe di servizio creandone un file, ad esempio ignore.po. Successivamente con il comando msgremove si eliminano queste stringhe dal file complessivo

Spesso c’e’ anche l’esigenza di non tradurre determinate stringhe presenti nel programma, ad esempio nomi propri, comandi ecc... Benchè tali stringhe potrebbero essere ignorate in fase di traduzione, è desiderabile che siano escluse a priori dai file di traduzione.
E’ possibile aggiungere manualmente queste stringhe al file generato con msgmkignore risolvendo il problema.

Tale soluzione funziona fino a quando non si vuole generare un aggiornamento delle stringhe e quindi degli ignore. Infatti al prossimo comando msgmkignore le stringhe aggiunte manualmente vengono perse perche’ il file viene sovrascritto.

Una soluzione migliore è creare un proprio file di stringhe da ignorare ad esempio MyIgnore.po, da unire con msgcat al file generato da msgmkignore e successivamente utilizzare msgremove

A questo punto non resta che fare il merge della nuova versione del file di stringhe con le traduzioni già disponibili.

Questa sequenza di passaggi deve essere fatta ogni volta che si modifica il codice sorgente del software che si sta sviluppando. Allo scopo segue un semplice file batch che automatizza tutta la procedura. La procedura utilizza la versione per delphi dxgettext ma è valida anche per il piu' generico xgettext

Copia il codice e salvalo in file .bat ...il file deve essere nella stessa cartella dei codici sorgente.


REM ------------------------------------------------------------------------
REM This batch file update PO files from source code removing unwanted string
REM automatically.
REM Author  (C) Copyright 2009 PkLab.net
REM
REM - extract all string from source code => .\default.po
REM - extract all NON string from source code => .\ignore.po
REM - merge automatically non string detected, with your own ignore list define
REM   in MyIgnore.po => FullIgnore.po
REM - Remove FlullIgnore.po from default.po => output.po
REM - foreach language defined in .\locale\* update (merge) default.po with
REM   newone output.po => .\locale\<lang>\LC_MESSAGES\default.po
REM - compile to default.mo each .\locale\<lang>\LC_MESSAGES\default.po
REM ------------------------------------------------------------------------
cls
@echo off
echo .
echo ------------------------------------------------------------------------
echo Extract strings from source code (out=default.po)
dxgettext -b .\ --delphi
IF NOT exist default.po GOTO ERROR
echo OK!
 
echo .
echo ------------------------------------------------------------------------
echo Tries to guess, which msgids should not be translated,
msgmkignore default.po -o ignore.po
IF NOT exist ignore.po GOTO ERROR
echo OK!
 
echo .
echo ------------------------------------------------------------------------
echo Concatenates and merges the specified PO files.
msgcat ignore.po MyIgnore.po -o FullIgnore.po
IF NOT exist FullIgnore.po GOTO ERROR
echo OK!
 
echo .
echo ------------------------------------------------------------------------
echo remove all messages from a PO file that are contained in a second PO
msgremove default.po -i FullIgnore.po -o output.po
IF NOT exist output.po GOTO ERROR
echo OK!

REM cycle on all language are defined in locale directory
for /d %%X in (.\locale\*) do (
  echo .
  echo ------------------------------------------------------------------------
  echo Update Translation %%X
  REM merge two PO files, it takes the msgids from 2nd file and the translations from 1th file.
  msgmerge -U %%X\LC_MESSAGES\default.po .\output.po
 
  echo Compiles to MO file.
  msgfmt  %%X\LC_MESSAGES\default.po -o .\locale\en\LC_MESSAGES\default.mo
)
 
GOTO NOERROR
 
:ERROR
  echo .
  echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  echo THERE WAS AN ! ERROR SEE ABOVE
  echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  goto END
 
:NOERROR
  echo ------------------------------------------------------------------------
  echo COMPLETED CORRECTLY.
  echo ------------------------------------------------------------------------
:END
  del output.po
  del ignore.po
  del FullIgnore.po
  del default.po
 
pause
 
Vote this page:

0 Comments:

Leave your comment:

Note:
  • Your email email will not be visible or used in any way, and is not required
  • Please keep comments relevant
  • Any content deemed inappropriate or offensive may be edited and/or deleted
  • HTML code is not allowed. Please use BBCode to format your text
    [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
The coding examples presented here are for illustration purposes only. The author takes no responsibility for end-user use
This work is property of Pk Lab. You can use it for free but you must retain author's copyright.