1

すでに作成したプログラムをローカライズしたい..それはかなり大きく(ほぼ5万行)、理想的には、私(プログラマー)が可能な限り最小限の作業を実行できるシステムが必要であり、プログラムに大きな変更を加える必要はありません。まったく不可能です。

gettext()を見てとても気に入りましたが、次のような文字列をどのように変換するかはわかりません。

const char *Colors[] = {
 { "Red" },
 { "Blue" },
 { "Yellow" },
 ....
};

これは私のプログラムでは非常に一般的です。ここで「Red」をgettext( "Red")に置き換えると、明らかに機能しません。

そこで、OutputFunction(gettext(Colors [Id]))のようなことをすると思いましたが、ローカライズする文字列のリストを取得するにはどうすればよいですか?ローカライズするリストのプログラムから「赤」、「青」、「黄色」を静的に取得できるほどスマートなプログラムはないと思います。

基本的にはサーバーなので、再コンパイルせずに言語を変更する必要はありません(サポートされているすべての言語で大きな問題や煩わしさなしにコンパイルできます)。C++ 0xのconstexprについて考えました。これは完璧です!配列などで機能し、コンパイル時にローカライズする文字列のリストを簡単に取得できます。コンパイラがまだ実装していないのは残念です。

すべての文字列をIDに変更することは、私の側で膨大な量の作業を必要とし、特に新しい文字列ごとに新しいIDを作成することは地獄のように煩わしいため、オプションではありません。上記のようなすべての配列を別の配列に変換する場合も同様です。

それで、何かアイデアはありますか?:/

4

2 に答える 2

2

あなたの特定の例では、次のようなことを試すかもしれません:

// presumably globals
const char *Colors_en[] = {
 { "Red" },
 { "Blue" },
 { "Yellow" },
 ....
};
const char *Colors[] = {0};

// in main()
gettextarray(Colors_en, Colors, sizeof(Colors_en) / sizeof(char*));

gettextarray は、各入力で gettext を呼び出し、出力を書き込みます。std::transform を呼び出すだけで実装できると思います。また、少しテンプレートを巧妙に使って size パラメータを回避することもできます。

もう 1 つのオプションは、カラー文字列のいずれかが使用されようとしている (表示されるか、表示のために文字列に追加される) ポイントで gettext を呼び出すことです。これは、より多くのコードを変更することを意味しますが、 main() がプログラム内の文字列のすべてのセットを変換してから、それらを使用する可能性があることを行う必要はありません。

メインで作業を行いたくない場合は、次のような文字列を使用するコードで行うことができます。

if (Colors[0] == 0)
  gettextarray(Colors_en, Colors, sizeof(Colors_en) / sizeof(char*));

または、アプリがマルチスレッド化されているpthread_once場合は、使用するスレッド API で同等のものを検討してください。

于 2009-09-14T01:56:13.307 に答える
1

gettext() と xgettext でたくさん遊んだ後、私は自分で方法を見つけたと思います (1 つずつ申し訳ありませんが、私はあなたのアプローチが好きではありませんでした..そのような配列は何百もあるに違いなく、それらすべてをmain()、それは多くのexternと多くの余分な作業です:/)。

とにかく、これは理論的にはできると思う方法です(実際に翻訳することはまだ試していませんが、なぜうまくいかないのかわかりません)

2 つの #define:

#define _ gettext
#define __(x) x

次に、_ を使用して実際に翻訳し、__ を使用して単に文字列を「翻訳対象」としてマークします。

const char *Colors[] = {
 { __("Red") },
 { __("Blue") },
 { __("Yellow") },
 ....
};

void PrintColor(int id) {
    cout << _("The color is: ") << _(Colors[id]);
}

次に、次を実行します。

xgettext -k_ -k__ *.cpp

そして、次の .po ファイルを取得します。

#: test.cpp:2
msgid "Red"
msgstr ""

#: test.cpp:3
msgid "Blue"
msgstr ""

#: test.cpp:4
msgid "Yellow"
msgstr ""

#: test.cpp:9
msgid "The color is: "
msgstr ""

したがって、__ (またはその他の名前は重要ではありません) を「ダミー関数」として使用して、文字列を変換する必要があることをxgettextに知らせ、実際に gettext() を呼び出すために _ を使用します。

文字列で _ を呼び出すと、文字列も翻訳対象としてマークされます。変数、配列などで呼び出すと、xgettext によって単純に無視されるように見えます。

すごい!今、私がしなければならないことは、5 兆個のファイルを調べて、サルのようにアンダースコアを追加することだけです :/

于 2009-09-14T03:06:00.303 に答える