2

GNU gettext のウィキペディアのエントリは、ロケールが単なる言語「fr」である例を示しています。一方、i18n gettext() の「hello world」の例には、言語と国の両方を含むロケール値 " es_MX" があります。es_MX" " の例を "es" だけを使用するように変更しましたが、予想されるスペイン語ではなく英語のテキストが生成されます。

cat >hellogt.cxx <<EOF
// hellogt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("hellogt", ".");
    textdomain( "hellogt");
    std::cout << gettext("hello, world!") << std::endl;
}
EOF
g++ -o hellogt hellogt.cxx
xgettext --package-name hellogt --package-version 1.2 --default-domain hellogt --output hellogt.pot hellogt.cxx
msginit --no-translator --locale es --output-file hellogt_spanish.po --input hellogt.pot
sed --in-place hellogt_spanish.po --expression='/"hello, world!"/,/#: / s/""/"hola mundo"/'
mkdir --parents ./es.utf8/LC_MESSAGES
msgfmt --check --verbose --output-file ./es.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po
LANG=es.utf8 ./hellogt

Controlling your locale with environment variablesによると:

GNU gettext だけが使用する環境変数 LANGUAGE ... 定義されている場合、LANGUAGE は LC_ALL、LC_MESSAGES、および LANG よりも優先されます。

LANGUAGE=es.utf8 ./hellogt

英語ではなく、予想されるスペイン語のテキストを生成します。

しかし、これは「LANG=es」が機能しない理由を説明していません。

4

1 に答える 1

3

うーん...プラットフォームの問題のようですね。Mac OSX でもまったく同じことを行い、期待どおりの結果が得られました。お使いの Linux のバージョンではLANG=es.utf8. または後者がサポートされているsetlocale(3)かどうかなど、ローカルシステムのドキュメントを確認してください。xlocale(3)

IIRC では、ISO-639 言語コードであるプライマリ識別子のみを含むロケール識別子に、主要言語を話す国の ISO-3166 国コードが追加されていました。次に、結果のロケール ルックアップが を参照して実行されました/usr/share/locale。MacBook のロケール ディレクトリを調べたところeses_ES. 単純なシステム構成の問題である可能性があります。

商用アプリケーションを開発している場合は、標準ライブラリが提供する gettext やロケールの代わりにICUを使用することを強くお勧めします。Gettext は単純なメッセージ検索には機能しますが、完全に国際化されたアプリケーションを実際に実行するために必要なものはほとんど提供されません。

于 2009-07-03T14:55:06.743 に答える