2009-07-10 7 views
2

Complete C++ i18n gettext() “hello world” exampleには、単純な固定文字列で動作するC++コードがあります。私は現在、複数形で動作するサンプルプログラムを探しています。このコード例は6行を表示します。英語で正しいのは1つだけです。複数形は正しく扱えません。複数のC++のhello world

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() for plural forms言語は、たとえば複数形を扱うさまざまな方法について説明します。

  • 韓国語 - ノーpluals
  • 英語 - 1のみ
  • フランス語のための単数使用される二つの形式、 - 二つの形式、単数形を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. 
+0

Quoting JS: "Downvoters:コメントをください。 - Jon Skeet May 8 at 9:25" –

答えて

3

私はあなたが何を望んでいるのか分かりません。それはあなたの希望の出力を与えるあなたの例の若干の変更がある場合は、単に

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

によってprintfのラインを交換するが、それはアンワインドの答えの些細な変更があるとしてgettextのドキュメントは非常によく似た例があり、

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

本当にあなたが望むものかどうか疑問です。より多くのC++構文でgettextを使いたい場合は、Boost :: Formatのようなライブラリを探す必要があります。

+0

これは、ポーランド語のような3つ以上の形式を持つ言語をどのようにサポートしますか? –

+0

カタログには言語ルールが含まれています。あなたがカタログを持っていない場合、ngettextによって適用されるデフォルトのルールは英語です(それであなたはフランス語やポーランド語のテキストでそれを使用しようとすると、出力が間違ってしまいます)。 – AProgrammer

+0

gettext()だけを使用した場合、カタログを取り込むための番号は渡されません。ngettext()を使用すると、カタログルールとメッセージで使用できる数値が渡されます。渡された複数の英語メッセージは、英語がうまく動作するカタログが使用されていない場合にのみ使用されます。 ありがとうございます。 これをすべてカバーするための答えを広げてください。 –

0

実際に、複数の異なる形式の.poファイルを作成しましたか? description of the gettext workflow on Wikipediaを参照してください。また、gettxt documentation about plural formsすべて、特に複数の形式を含む.poファイルの例を読んでください。

+0

質問の最初のリンクは、メッセージカタログを作成するためのシーケンスです。ここで私はC + +コードの例を探しています。 –

2

まず、gettext()は魔法ではありません。それは何とかすべての言語のすべての単語のグローバル辞書を含んでいません。

この例では、アプリケーションのメッセージデータベースでメッセージの翻訳を検索しています。この例では、このようなファイルがあると想定しています(gettext()がありますが、ややこしいことがあります)。

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

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

これはgettextのは、countパラメータに基づいて、使用することを形成するかを決めることができます:

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

+0

質問にメッセージカタログのメモを追加しました。問題のコードは、具体的な出発点となるように意図されています。関数のgettext()グループで見つかったドキュメントには、複数形の明確な例が不足しています –

+1

これは文脈から単語を取り出して翻訳し、特に複数形の場合にはお勧めできません。他のフォームは "月の数"に依存するかもしれないので、あなたは穴の宣言を取るべきです – Artyom