【问题标题】:MFC: LoadString using CStringMFC:使用 CString 加载字符串
【发布时间】:2018-10-18 23:59:36
【问题描述】:

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

【问题讨论】:

  • 为什么不直接使用已有的语言支持资源呢?那么字符串的id是一样的,你只是有多个表。
  • @Anders - 你能详细说明一下吗?如果按照我的理解,一个项目只能有一个字符串表。

标签: winapi visual-c++ mfc


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多