2

単一の実行可能ファイルにリソースのすべての翻訳があります。効果的に:

STRINGTABLE
  LANGUAGE LANG_ENGLISH, LANG_ENGLISH_US
BEGIN
  IDSTR_HELLO "Hello"
END

STRINGTABLE
  LANGUAGE LANG_SPANISH, LANG_SPANISH_PANAMA
BEGIN
  IDSTR_HELLO "Hola"
END

// ... more languages ...

LANGIDを指定して FindResourceExを使用して、(最も) 適切なものを見つけようとしています。LANGID は、言語とサブ言語の両方で構成されます。たとえば、パナマで話されているLANGUAGE_SPANISH, SUBLANG_SPANISH_PANAMAスペイン語 ( ) とメキシコで話されているスペイン語( ) のリソースがあるとしLANGUAGE_SPANISH, SUBLANG_SPANISH_MEXICANます。目的の langid とリソースの 1 つが完全に一致する場合は、すべて問題ありません。

FindResourceEx を使用してスペイン語の 3 番目のフレーバー (たとえば ( LANG_SPANISH, SUBLANG_SPANISH_COSTA_RICA)) のリソースを検索しようとすると、コスタリカ専用のリソースがないため、検索は失敗します。そのような場合、私は第一言語の任意のフレーバーに「フォールバック」したいと思います。

サブ言語を に設定するSUBLANG_NEUTRALと、同じ主要言語のリソースと一致するように提案されたものを読みました。

HRSRC handle = FindResourceEx(NULL, RT_STRING, MAKEINTRESOURCE(IDSTR_HELLO), langid);
if (handle == NULL) {
  fallback_langid = MAKELANGID(PRIMARYLANGID(langid), SUBLANG_NEUTRAL);
  handle = FindResourceEx(NULL, RT_STRING, MAKEINTRESOURCE(IDSTR_HELLO), fallback_langid);
}

残念ながら、それはうまくいきません。サブ言語を に設定しても同様ですSUBLANG_DEFAULT。(ニュートラルおよびデフォルトのサブ言語は、プライマリ言語もニュートラルまたはデフォルトである場合にのみ意味があるようです。)

私のオプションは何ですか?リソースを列挙して、LANGID の主要言語を独自に比較する方法はありますか? 私は EnumResource のような関数の品揃えを見てきましたが、それらのほとんどは MUI の使用に固有のようです。すべての翻訳を 1 つのバイナリに含める必要があるなど、さまざまな理由から、意図的に MUI を使用していません。

4

1 に答える 1

1

MUI ファイルがないとEnumResourceLanguagesを使用できないとしたら、私は驚きます。もちろん、他のすべてが失敗した場合は、すべての主要言語のデフォルトのサブ言語を含むテーブルを作成できます。または、テーブルにすべてのプライマリ/サブ言語ペアのデフォルトを設定することもできます。このテーブルは、コードまたはカスタム リソースに格納できます。

于 2015-03-05T01:08:10.780 に答える