从资源DLL加载控件的标题

时间:2009-04-15 10:36:48

标签: visual-c++ mfc internationalization

我是MFC的新手,我需要构建一个能够在运行时更改语言的多语言应用程序。

AFAIK使用MFC进行国际化的常用方法是创建仅限资源的DLL。但似乎没有简单的方法(这意味着,加载DLL,调用某些函数,MFC自动更新所有东西或类似的东西)来在运行时切换资源DLL,对吗?

所以我必须手动更新所有控件等。我已经设法从DLL的字符串表中加载字符串,但由于按钮等控件的标题存储在相应的对话框中(如果我相信我的资源黑客:))我认为必须有一种方法来加载它们并避免手动在字符串表中存储附加字符串。

或者还有另一种我不知道的方式吗?

如果它有任何区别......我必须使用MS embedded visual c ++ 4

2 个答案:

答案 0 :(得分:1)

我在一个大型的本地化MFC项目上工作。这是我们的策略:

  1. 密钥字典 - >本地化字符串,特定于每种语言。有几种方法可以实现这一点,稍后再做。

  2. 对话框资源中的控件ID或标题设置为用于查找翻译的键

  3. 在初始调用::EnumChildWindows创建一个基本CDialog,CFormView等。在回调中,查找翻译并将控件的标题替换为翻译。

  4. 对于你的字典,你可以采取一些方法。

    • 如果您想依赖内置的本地化资源选择和字符串表,则必须以某种方式将控件与字符串ID匹配。您可以仔细确保控件ID与字符串ID匹配,或者您可以对标题中的ID进行ASCII编码,然后使用atoi来解析int值。

    • 您可以放弃内置的本地化字符串表格并维护自己的字符串 - >每种语言的字典。这允许您将标题设置为资源中的非本地化字符串,这使得布局更容易(尽管您仍需要使用所有语言进行测试。)它将要求您执行自己的“依赖注入”以确保加载正确的字典。您希望能够在不重建核心二进制文件的情况下发布更新/附加语言。

答案 1 :(得分:1)

如果您不想要重新启动应用程序(通过最简单的解决方案,以及您应该使用IMO的解决方案),您可以使用资源dll并重新创建主窗口用户切换语言。这样MFC将以新语言重新创建菜单等。从您切换资源句柄的那一刻起,新对话框将以新语言显示。

我不确定这与嵌入式世界有什么关系,我的经验来自桌面MFC。