FindResourceEx 和后备语言
FindResourceEx and fallback languages
我将一个资源的所有翻译都放在一个可执行文件中。有效:
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 ...
我正在尝试使用 FindResourceEx 给定 LANGID 找到(最)合适的。 LANGID 由语言和子语言组成。例如,我可能拥有巴拿马西班牙语 (LANGUAGE_SPANISH, SUBLANG_SPANISH_PANAMA
) 和墨西哥西班牙语 (LANGUAGE_SPANISH, SUBLANG_SPANISH_MEXICAN
) 的资源。当所需的 langid 与其中一种资源完全匹配时,一切都很好。
如果我使用 FindResourceEx 尝试查找第三种西班牙语的资源,比如 (LANG_SPANISH, SUBLANG_SPANISH_COSTA_RICA
),查找将失败,因为我没有专门针对哥斯达黎加的资源。在这种情况下,我想 "fall back" 到 任何 主要语言的风格。
我读到一些建议将子语言设置为 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,我会感到很惊讶。当然,如果一切都失败了,也许你可以创建一个 table,每个主要语言都有一个默认的子语言。或者您的 table 可以为每个 primary/sub 语言对设置一个默认值。您可以将此 table 存储在您的代码或自定义资源中。
我将一个资源的所有翻译都放在一个可执行文件中。有效:
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 ...
我正在尝试使用 FindResourceEx 给定 LANGID 找到(最)合适的。 LANGID 由语言和子语言组成。例如,我可能拥有巴拿马西班牙语 (LANGUAGE_SPANISH, SUBLANG_SPANISH_PANAMA
) 和墨西哥西班牙语 (LANGUAGE_SPANISH, SUBLANG_SPANISH_MEXICAN
) 的资源。当所需的 langid 与其中一种资源完全匹配时,一切都很好。
如果我使用 FindResourceEx 尝试查找第三种西班牙语的资源,比如 (LANG_SPANISH, SUBLANG_SPANISH_COSTA_RICA
),查找将失败,因为我没有专门针对哥斯达黎加的资源。在这种情况下,我想 "fall back" 到 任何 主要语言的风格。
我读到一些建议将子语言设置为 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,我会感到很惊讶。当然,如果一切都失败了,也许你可以创建一个 table,每个主要语言都有一个默认的子语言。或者您的 table 可以为每个 primary/sub 语言对设置一个默认值。您可以将此 table 存储在您的代码或自定义资源中。