2

完全な C++ i18n gettext() の「hello world」の例には、単純な固定文字列に対して機能する C++ コードがあります。現在、複数形で動作するサンプル プログラムを探しています。このコード例は 6 行を表示します。英語で正解は1つだけです。複数形を正しく処理しません。

cat >helloplurals.cxx <<EOF
// hellopurals.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
#include <stdio.h>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("helloplurals", ".");
    textdomain( "helloplurals");
    for (int ii=0; ii<5; ii++)
        printf (gettext("Hello world with %d moon.\n"), ii);
}
EOF
g++ -o helloplurals helloplurals.cxx
./helloplurals

複数形の GNU gettext() は、言語が複数形を処理するさまざまな方法を説明しています。たとえば、次のようになります。

  • 韓国語 - プラス記号なし
  • 英語 - 2 つの形式、1 つだけに使用される単数形
  • フランス語 - 0 と 1 に使用される単数形の 2 つの形式
  • ポーランド語 - 3 つの形式、1 と 2、3、または 4 で終わるいくつかの数字の特殊なケース

私の期待は、上記のすべてのケースと、ここにリストされていないいくつかのバリエーションに対して、コードが (メッセージ カタログが与えられた場合に) 機能することです。英語で実行した場合の正しい出力は次のようになります。

Hello world with 0 moons.
Hello world with 1 moon.
Hello world with 2 moons.
Hello world with 3 moons.
Hello world with 4 moons.
4

3 に答える 3

3

私はあなたが何を望んでいるのか分かりません。必要な出力が得られるのが例のわずかな変更である場合は、printf行を次のように置き換えてください。

printf(ngettext("Hello world with %d moon\n", "Hello world with %d moons\n", ii), ii);

しかし、それは巻き戻しの答えの簡単な変更であり、gettext ドキュメントには非常によく似た例があるため、

printf (ngettext ("%d file removed", "%d files removed", n), n);

それが本当にあなたの望みだったのだろうか。もっと C++ 構文で gettext を使用したい場合は、Boost::Format のようなライブラリを探す必要があります。

于 2009-07-10T11:27:12.580 に答える
2

まず、gettext()魔法ではありません。どういうわけか、すべての言語のすべての単語のグローバル ディクショナリが含まれているわけではありません。

アプリケーションのメッセージ データベースでメッセージの翻訳を検索するだけなので、この例では、そのようなファイルがあることを前提としています (どこでgettext()見つけられるか、これはややこしいかもしれません)。

次に、使い方が間違っています。リンク先のページにはngettext()関数が説明されています。これは、カウントによって異なる翻訳を取得するために使用する必要があるものです。

呼び出しは次のようになります。

printf("%s", ngettext("moon", "moons", ii));

これにより、 gettext は count パラメータに基づいて、使用するフォームを決定できます。

于 2009-07-10T07:42:26.480 に答える
0

実際に、さまざまな複数形の .po ファイルを作成しましたか? Wikipedia の gettext ワークフローの説明を参照してください。また、複数形に関するすべてgettxt ドキュメント、特に複数形を含む .po ファイルの例を読んでください。

于 2009-07-10T07:39:41.213 に答える