我正在使用Visual Studio 6在VC ++中编写基于对话框的应用程序。这是一个文本很少的简单应用程序,但现在需要支持多种语言。由于文本不多,计划是将所有不同的语言添加到一个具有唯一标识符的字符串表中。所以现在示例字符串表看起来像这样,
STRINGTABLE
BEGIN
IDS_STRING_OK_BUTTON_ENG "OK" //English text
IDS_STRING_EXIT_BUTTON_ENG "Exit" //English text
IDS_STRING_OK_BUTTON_FRA "D'accord" //French text
IDS_STRING_EXIT_BUTTON_FRA "Sortie" //French text
END
现在我有一个函数将根据操作系统语言设置返回一个字符串。
CString strLang = "";
//Retrieves the system default locale identifier
LCID lcid = GetSystemDefaultLCID();
//Determine the language identifier from the locale identifier
LANGID langid = LANGIDFROMLCID(lcid);
//Does many processing here........
//.................................
//.................................
// So if English is the OS language then this function will return "_ENG".
现在在代码的另一部分中,这个唯一的语言ID与另一个字符串连接,以查找特定于语言的文本。
CString okButton = "IDS_STRING_OK_BUTTON" + m_strLanguageIndex; //Here m_strLanguageIndex for example will be "_ENG"
所以这样,我只能有一个包含所有不同语言的字符串表,然后使用上面的方法创建一个唯一的资源ID。
但现在的挑战是,resource.h文件中的资源ID是整数。所以上面的CString没有用找到相应的文本。
所以我不确定这是否会起作用。我只是把它扔掉,看看是否有人有更好的想法或有任何建议使上述方法有效。
我不想为每种语言创建多个DLL,因为这是一个简单的基于对话框的应用程序。
答案 0 :(得分:2)
Win32资源存储在层次结构中; type\name\language
并且资源函数将查找与线程语言匹配的资源(如果存在)。这将允许您在代码中使用IDS_STRING_OK_BUTTON之类的ID,并且您的资源将包含两个不同的字符串表,每种语言对应一个。
在.RC文件中,您可以使用LANGUAGE statement创建不同资源的翻译副本:
定义直到下一个LANGUAGE语句或文件末尾的所有资源的语言。
当LANGUAGE语句出现在ACCELERATORS,DIALOGEX,MENU,RCDATA或STRINGTABLE资源定义的正文开头之前时,指定的语言仅适用于该资源。
提供翻译支持的另一种常用方法是为每种语言创建资源.DLL,并在加载资源时加载所需的.DLL并使用其HMODULE句柄。如果您创建MUI resources,Windows可以为您完成工作。