MFC:使用CString的LoadString

时间:2018-05-08 23:49:38

标签: winapi visual-c++ mfc

我正在使用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,因为这是一个简单的基于对话框的应用程序。

1 个答案:

答案 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可以为您完成工作。

相关问题