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

如果我使用 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,包括要求将所有翻译都放在一个二进制文件中。

4

1 回答 1

1

如果没有 MUI 文件就不能使用EnumResourceLanguages ,我会感到惊讶。当然,如果一切都失败了,也许您可​​以为每种主要语言创建一个带有默认子语言的表。或者,您的表可以为每个主要/子语言对设置一个默认值。您可以将此表存储在您的代码或自定义资源中。

于 2015-03-05T01:08:10.780 回答