8

ポーランド語テキストの msgfmt「無効なマルチバイト シーケンス」エラーは、テンプレート ファイルの MIME Con​​tent-Type 文字セットを手動で編集することで修正されます。MIME タイプを設定するための xgettext、msginit、msgfmt シーケンスのコマンドまたはオプションはありますか?

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
4

2 に答える 2

10

完全なロケール名を指定するだけで、msginit は文字セットを正しく設定します

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

結果は

"Language: ru\n"
"Content-Type: text/plain; charset=UTF-8\n"
于 2010-09-25T00:19:57.507 に答える
8

出力文字エンコーディングを直接設定するための引数はありませんが、 POエディタは PO ファイルを保存するときに適切な文字エンコーディング (翻訳で使用されるすべての文字をサポートするもの) を自動的に使用するため、実際には問題にはなりません。 、CHARSETファイル内をエンコーディングの名前に置き換えます。そうでない場合は、バグを報告してください。

唯一の問題は、POT ファイルに非 ASCII 文字が含まれxgettext ていて、入力ファイル--from-codeのエンコーディングを指定する引数がある場合です。入力に非 ASCII 文字が含まれ、正しいエンコーディングに設定されている場合、出力 POT ファイルの文字エンコーディングは UTF-8 に設定されます (これは入力文字エンコーディングと同じである必要はありません)。ただし、入力ファイルに ASCII 文字しか含まれていない場合は、残念ながら効果がありません。--from-code--from-code=UTF-8

msginit実際には、文字エンコーディングを、選択したターゲット ロケールに「適切な」ものに自動的に設定します。ただし、ロケールと文字エンコーディングのペアのリストは古くなっているようです。UTF-8 は現在、すべての言語にとって本当に最良の選択です。

pot2po代わりにを使用することもできますmsginit。これは常に自動的に UTF-8、AFAICS を使用します。ただし、 とは異なりmsginit、PO ファイルの複数形は自動的に入力されないため、問題になる場合とそうでない場合があります (これを行うのは PO エディターの仕事だと考える人もいます)。

于 2009-07-23T15:28:49.483 に答える