2009-07-05 3 views
5

msgfmt “invalid multibyte sequence” error on a Polish text исправлен путем ручной редактирования кодировки MIME Content-Type в файле шаблона. Есть ли какая-либо команда или опция для последовательности xgettext, msginit, msgfmt для установки типа MIME?Команда или параметр для последовательности xgettext, msginit, msgfmt для установки типа 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 

ответ

6

Там нет аргументов для установки выходного кодировку символов непосредственно, но это должно в pratice не является проблемой, так как ваш редактор ПО автоматически будет использовать соответствующую кодировку при сохранении файла PO (который поддерживает все символы, используемые в переводе), и замените CHARSET в файле с именем кодировки. Если это не так, укажите ошибку.

Единственная проблема будет, если файл POT содержал не-ASCII символы, но xgettextделает есть --from-code аргумента для этого, который определяет кодировку входных файлов. Если на входе содержатся символы, отличные от ASCII, а --from-code установлен на правильную кодировку, выходной файл POT будет иметь кодировку символов, установленную в UTF-8 (это не должно быть равно входной кодировке символов). Однако, если входные файлы содержат только символы ASCII, --from-code=UTF-8, к сожалению, не будет иметь никакого эффекта.

msginit действительно автоматически устанавливает кодировку символов в «подходящую» для выбранной целевой локали. Тем не менее, список локалей для пар символов кодирования выглядит устаревшим; UTF-8 теперь действительно лучший выбор для всех языков.

Альтернативой является использование pot2po вместо msginit. Это всегда использует UTF-8 автоматически, AFAICS. Однако, в отличие от msginit, он автоматически не заполняет множественные формы файла PO, что может быть или не быть проблемой (некоторые считают, что это задание редактора PO для этого).

9

Просто дайте полное имя локали и msginit правильно

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

результатов установить кодировку в

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

Он не работал для меня. – Fabio

+0

+1, используя pt_BR.UTF-8, работал здесь красиво – MestreLion