FindResourceEx和后备语言

时间:2015-03-04 23:35:59

标签: c++ winapi mui

我将资源的所有翻译都放在一个可执行文件中。有效:

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与其中一个资源完全匹配时,一切都很好。

如果我使用FindResourceEx尝试查找第三种西班牙语的资源,比如说(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。由于各种原因,我故意不使用MUI,包括要求将所有翻译都放在一个二进制文件中。

1 个答案:

答案 0 :(得分:1)

如果你不能在没有MUI文件的情况下使用EnumResourceLanguages,我会感到很惊讶。当然,如果所有其他方法都失败了,也许您可​​以为每种主要语言创建一个包含默认子语言的表。或者您的表可能具有每个主要/子语言对的默认值。您可以将此表存储在代码中或自定义资源中。