2009-07-05 5 views
5

msgfmt “invalid multibyte sequence” error on a Polish text viene corretto modificando manualmente il set di caratteri Content-Type MIME nel file di modello. Esiste un comando o un'opzione per la sequenza xgettext, msginit, msgfmt per l'impostazione del tipo MIME?Comando o opzione per la sequenza xgettext, msginit, msgfmt per l'impostazione del tipo MIME?

cat >plt.cxx <<EOF 
// plt.cxx 
#include <libintl.h> 
#include <locale.h> 
#include <iostream> 
int main(){ 
    setlocale(LC_ALL, ""); 
    bindtextdomain("plt", "."); 
    textdomain("plt"); 
    std::cout << gettext("Invalid input. Enter a string at least 20 characters long.") << std::endl; 
} 
EOF 
g++ -o plt plt.cxx 
xgettext --package-name plt --package-version 1.2 --default-domain plt --output plt.pot plt.cxx 
sed --in-place plt.pot --expression='s/CHARSET/UTF-8/' 
msginit --no-translator --locale pl_PL --output-file plt_polish.po --input plt.pot 
sed --in-place plt_polish.po --expression='/#: /,$ s/""/"Nieprawidłowo wprowadzone dane. Wprowadź ciąg przynajmniej 20 znaków."/' 
mkdir --parents ./pl_PL.utf8/LC_MESSAGES 
msgfmt --check --verbose --output-file ./pl_PL.utf8/LC_MESSAGES/plt.mo plt_polish.po 
LANGUAGE=pl_PL.utf8 ./plt 

risposta

6

Non v'è alcun argomento per impostare il carattere di uscita codifica direttamente, ma questo dovrebbe In pratica non essere un problema, come editor di PO utilizzerà automaticamente una codifica carattere appropriato quando si salva il file PO (uno che supporta tutti i caratteri utilizzati nella traduzione) e sostituisce CHARSET nel file con il nome della codifica. In caso contrario, presenta un bug.

L'unico problema sarebbe se il file POT contiene caratteri non ASCII, ma xgettextfa hanno un argomento --from-code per questo, che specifica la codifica dei filedi input. Se l'input contiene caratteri non ASCII e --from-code è impostato sulla codifica corretta, il file POT di uscita avrà la codifica dei caratteri impostata su UTF-8 (questo non deve essere uguale alla codifica dei caratteri di input). Tuttavia, se i file di input contengono solo caratteri ASCII, --from-code=UTF-8 purtroppo non avrà alcun effetto.

msginit infatti imposta automaticamente la codifica dei caratteri su qualcosa di "appropriato" per le impostazioni locali di destinazione scelte. Tuttavia, l'elenco delle coppie di impostazioni internazionali per la codifica dei caratteri sembra obsoleto; UTF-8 è ora la scelta migliore per tutte le lingue.

Un'alternativa sarebbe utilizzare pot2po anziché msginit. Utilizza sempre UTF-8 automaticamente, AFAICS. Tuttavia, a differenza di msginit, non riempie automaticamente le forme plurali del file PO, il che può o non può essere un problema (alcuni pensano che sia compito dell'Editore PO farlo).

9

Basta dare piena nome del locale e msginit imposterà charset correttamente

msginit --no-translator --input=xx.pot --locale=ru_RU.UTF-8 

risultati in

"Language: ru\n" 
"Content-Type: text/plain; charset=UTF-8\n" 
+1

Non ha funzionato per me. – Fabio

+0

+1, utilizzando pt_BR.UTF-8 ha funzionato qui splendidamente – MestreLion