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 ...
我正在尝试使用给定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,我会感到惊讶。当然,如果所有其他方法都失败了,也许您可以为每种主要语言创建一个具有默认子语言的表。或者,您的表可以为每个主/子语言对设置一个默认值。您可以将此表存储在代码中或自定义资源中。
- 如何在 constexpr 函数中实现回退运行时
- C++通过回退到 C 进行类型双关语
- SFINAE - 如果更复杂的功能失败,则回退到默认功能
- 如何编写模板重载函数,并在模板参数不允许实例化某个类时触发回退
- 调用成员函数(如果存在),回退到自由函数,反之亦然
- 当函数不存在时,SFINAE 回退
- 回退到复制构造函数不起作用
- FindResourceEx和回退语言
- 最后手段/包罗万象/回退模板过载
- 具有最近路径前缀回退的查找树
- 运算符<<() 失败时回退到 to_string()
- 如果未实现除法运算符,则SFINAE回退
- 在c++中,如何用回退包装默认标头
- 为什么成员检测器回退必须是int
- 如果可能,尝试对字符串执行静态断言,或者在不是时回退到运行时检查
- 如果 OpenCV 的 Cuda 扩展不可用,请使用 CPU 回退
- 回退可变构造函数-为什么这样做
- CMake如何确定目标依赖项的回退生成配置
- 隐式声明的移动操作不会回退到复制
- 当模板化函数实例化失败时,回退到备用函数