Re 1:以前の GetSystemDefuaultLangID の提案は良いものです。
Re 2:インストールの最初のステップとして尋ねることができます。または、言語ごとに異なるインストーラーをパッケージ化することもできます。
Re 3:
理論的には上記の DLL メソッドは素晴らしいように思えますが、実際には、個人的にはまったくうまくいきませんでした。
より良い方法は、プログラム内のすべての文字列を Localize または NoLocalize で囲むことです。
MessageBox(Localize("Hello"), Localize("Title"), MB_OK);
RegOpenKey(NoLocalize("\\SOFTWARE\\RegKey"), ...);
ローカライズは、英語のテキストを選択した言語に変換する機能です。NoLocalize は何もしません。
ただし、選択したスクリプト言語でいくつかの便利なスクリプトを作成できるため、文字列をこれらの値で囲む必要があります。
1) すべての Localize(" プレフィックスを検索し、english=otherlangauge の名前と値のペアを含む .ini ファイルを出力するスクリプト。出力された .ini ファイルに既にマッピングが含まれている場合は、再度追加する必要はありません。再作成することはありません。 ini ファイルを完全に削除すると、スクリプトを実行するたびに不足しているファイルが追加されます。
2) すべての文字列を検索し、それらが Localize(" または NoLocalize(") で囲まれていることを確認するスクリプト。そうでない場合は、どの文字列をローカライズする必要があるかがわかります。
#2 が重要な理由は、すべての文字列が実際にローカライズが必要かどうかを意識的にマークされていることを確認する必要があるためです。そうしないと、適切なローカリゼーションを確実に行うことは絶対に不可能です。
DLL からロードする代わりに #1 を使用する理由は、このソリューションを維持する作業が不要であり、その場で変換する必要がある新しい文字列を追加できるためです。
プログラムとともに出力される ini ファイルを出荷します。また、これらの ini ファイルを翻訳者に渡して、english=otherlanguage のペアを変換できるようにします。返送されてきたら、チェックインした .ini ファイルを翻訳者から提供されたものに置き換えるだけです。#1 で説明したようにスクリプトを実行すると、翻訳者が翻訳中に不足している翻訳があった場合、翻訳が再度追加されます。