I18n C++ hello world (複数形)
-
12-09-2019 - |
質問
完全な 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 つの場合にのみ使用されます
- フランス語 - 2 つの形式、単数形は 0 と 1 に使用されます
- ポーランド語 - 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.
解決
私はあなたが何をしたいかわかりません。それはあなたの希望の出力を与えるあなたの例の若干の変更がある場合は、ちょうどによって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を使用したい場合は、ブースト::フォーマットのようなライブラリを検索する必要があります。
他のヒント
まず、gettext()
は魔法ではありません。それはどういうわけか、すべての言語のすべての単語のグローバルな辞書が含まれていません。
それがないのはあなたのアプリケーションのメッセージデータベース内のメッセージの翻訳を調べているので、この例では、このようなファイルが(gettext()
がそれを見つけることができ、これはややトリッキーなことができる)があると仮定します。
次に、あなたはそれが間違って使っています。あなたがにリンクされたページでは、数に応じて変化する翻訳を取得するために使用する必要があるとしているものですngettext()
機能について説明します。
あなたの呼び出しは次のようになります
printf("%s", ngettext("moon", "moons", ii));
これは、gettextのは、countパラメータに基づいて、使用することを形成するかを決めることができます。
さて、あなたは実際には別の複数形のための.poファイルを作成したのですか?ウィキペディアの上のgettextワークフローの説明を参照してください。また、読んでのすべてのの gettxtの複数形についてのドキュメントは特に、複数形を含む.poファイルの例をを。