FindResourceEx和回退语言

FindResourceEx and fallback languages

本文关键字:语言 回退 FindResourceEx      更新时间:2023-10-16

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

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

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