我在单个可执行文件中拥有资源的所有翻译。有效地:
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,包括要求将所有翻译都放在一个二进制文件中。