2009-07-05 14 views
5

msgfmt “invalid multibyte sequence” error on a Polish text jest korygowana przez ręczną edycję zestawu znaków MIME Content-Type w pliku szablonu. Czy jest jakieś polecenie lub opcja dla sekwencji xgettext, msginit, msgfmt dla ustawienia typu MIME?Polecenie lub opcja dla sekwencji xgettext, msginit, msgfmt do ustawienia typu 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 

Odpowiedz

6

Nie ma argumentów do ustawiania charakter wyjściowy kodujący bezpośrednio, ale to powinno w Practice nie być problemem, jako edytor PO automatycznie użyje odpowiedniego kodowania znaków podczas zapisywania pliku PO (który obsługuje wszystkie znaki używane w tłumaczeniu) i zastępuje w pliku nazwę CHARSET z nazwą kodowania. Jeśli nie, zgłoś błąd.

Jedynym problemem byłoby, gdyby plik POT zawierał znaków spoza ASCII, ale robixgettextmają --from-code argument za tym, który określa kodowanie wejściowych plików. Jeśli dane wejściowe zawierają znaki spoza ASCII, a --from-code jest ustawione na prawidłowe kodowanie, wyjściowy plik POT będzie miał kodowanie znaków ustawione na UTF-8 (nie musi to być równe kodowaniu znaków wejściowych). Jeśli jednak pliki wejściowe zawierają tylko znaki ASCII, nie będzie to miało wpływu na --from-code=UTF-8.

msginit w rzeczywistości automatycznie ustawia kodowanie znaków na coś "właściwego" dla wybranego docelowego ustawienia narodowego. Jednak lista par kodowanych locale do znaków wydaje się przestarzała; UTF-8 jest teraz najlepszym wyborem dla wszystkich języków.

Alternatywą byłoby użycie pot2po zamiast msginit. To zawsze automatycznie używa UTF-8, AFAICS. Jednak w przeciwieństwie do msginit, nie wypełnia automatycznie formularzy liczby mnogiej pliku PO, co może, ale nie musi być problemem (niektórzy uważają, że jest to zadanie edytora PO).

9

Wystarczy podać pełną nazwę lokalizacji i msginit ustawi charset poprawnie

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

wyników w

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

To nie pracował dla mnie. – Fabio

+0

+1, używając pt_BR.UTF-8 pracował tutaj pięknie – MestreLion