0

コンパイラからのエラーメッセージをローカライズする必要があります。現状では、すべてのエラーメッセージは英語の文字列リテラルとしてソースコード全体に拡散しています。これらのエラーメッセージをドイツ語に翻訳したいと思います。これに取り組むための最良の方法は何でしょうか?文字列リテラルをそのままにして、char *をエラー報告ルーチン内の別の言語にマップするか、英語のリテラルを説明的なマクロに置き換えます。ERR_UNDEFINED_LABEL_NAMEコンパイル時にこのマップを正しい文字列にマップしますか?

同様のプロジェクトでそのようなことはどのようにアプローチされますか?

4

5 に答える 5

5

Windowsでは、通常、これは文字列を整数定数に置き換え、LoadStringDLLまたはEXEのリソースからそれらを取得するためにまたは同様の方法で実行されます。次に、複数の言語のDLLと単一のEXEを使用できます。

Unixyシステムでは、最も一般的なアプローチはgettextだと思います。最終結果は似ていますが、整数定数を定義する代わりに、英語の文字列リテラルをマクロでラップし、それをローカライズされた文字列に変換するための魔法を適用します。

于 2009-11-08T05:36:26.913 に答える
4

最も柔軟な方法は、コンパイラがメッセージカタログから翻訳されたメッセージを読み取り、ロケールに応じて言語を選択することです。これには、 gettextなどのツールを使用するようにコンパイラを変更する必要があります 。

于 2009-11-08T05:38:13.337 に答える
1

ちょっと考えて...

エラー報告ルーチンをオーバーロードできますか?使用しているとしましょう

printf("MESSAGE")

入力である方法でオーバーロードし"MESSAGE"、ドイツ語の対応するメッセージにハッシュすることができます。

これはうまくいくでしょうか?

于 2009-11-08T05:38:19.530 に答える
1

LoadString() API の周りにCMsg() および CFMsg()ラッパーを使用できます。リソースから引き出された文字列を読み込んでフォーマットするのが簡単になります。

そしてもちろん、appTranslatorはリソースを翻訳するための親友です ;-)

免責事項: 私は appTranslator の作成者です。

于 2009-11-11T12:36:08.963 に答える
0

Windows では、リソース コンパイラと WinAPI ロード関数を使用して、文字列やその他のリソースをローカライズできます。FindResource () とLoadString () のような特殊な派生物は、ユーザーの現在のロケールに従って言語固有のリソースを自動的にロードします。FindResourceEx () を使用すると、取得するリソースの言語バージョンを手動で指定することもできます。

プログラムでこれを有効にするには、最初にプログラムを変更してリソース ファイル (.rc) 内の文字列をコンパイルし、リテラル文字列を使用する代わりに LoadString() を使用して実行時に文字列をフェッチする必要があります。次に、リソース ファイル内で、 LANGUAGE修飾子を使用して、使用するSTRINGTABLEの複数の言語バージョンをセットアップします。多言語リソースは、MSDNの複数言語リソースで説明されている検索順序に基づいて読み込まれます。

注: 単一の実行可能ファイルが必要な理由がない場合、またはアプリ内でユーザーが選択した言語を使用するようなことをしている場合は、各言語を個別の dll でコンパイルし、それらを動的にロードするよりも制御しやすく、混乱を少なくすることができます。大きな単一のリソース ファイルがあり、ロケールを動的に切り替えようとしています。

以下は、複数言語の StringTable リソース ファイル (つまり、strings.rc) の例です。

#define IDS_HELLOSTR     361

STRINGTABLE
  LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
  BEGIN
     IDS_HELLO, "Hello!"
  END

STRINGTABLE
   LANG_FRENCH, SUBLANG_NEUTRAL
   BEGIN
      IDS_HELLO, "Bonjour!"
   END
于 2011-12-21T19:36:37.757 に答える