【发布时间】:2013-04-20 09:03:48
【问题描述】:
假设您有一个基于对话框的 MFC 应用程序,它通过调用 dlg.DoModal() 来显示来自 MyWinApp::InitInstance() 函数的主对话框。
此外,此应用程序包含本地化资源(全部在项目中,此测试用例没有附属 DLL),即IDD_TEST_DIALOG 资源存在两次,一次是英文,一次是德文。
我现在要做的是在此对话框中添加一个按钮,用于在资源中的可用语言之间切换显示对话框的语言。这可能吗? (记住:对话框当前通过DoModal()函数显示。)
当您想更改 MFC 使用的资源语言时,您可以调用 SetThreadUILanguage(适用于 WIn7 和 XP)或者如果仅针对 Win7 (Vista+),也可以调用 SetThreadPreferredUILanguages。真的,如果您能够重新打开对话框,那么更改语言非常容易。我的问题是是否有可能以某种方式重新加载具有不同资源的显示窗口。
请注意,可以确保重新加载所有字符串,即somehow 遍历应用程序中的所有控件并调用SetWindowText 来更改窗口的文本。
然而,这与本地化对话框(资源)应该提供的内容背道而驰,即不仅翻译的字符串,而且对话框布局的必要更改:不同的语言字符串可能是长度不同,因此控件的间距必须不同。 (我也可以想象,当支持从右到左的语言或亚洲文字时,必须相应地采用布局。)
【问题讨论】:
-
这是一个无意义的演示功能。只要他还活着,您的用户就一直在说同一种语言。当他看着你的对话时,他不会改变它。如果您需要测试本地化,只需使用控制面板更改系统区域设置。
-
@HansPassant:不,这不是一个毫无意义的功能。当然,这是一个简化的测试用例,但是能够在应用程序运行时切换 UI 语言可能是必要的(即使(如果)这只是一个“政治”要求,它仍然需要销售软件)。 (我确实同意 可能 不一定需要在模态对话框中实时更改语言,但我想我会在 some 点开始询问并这似乎相当不错,因为在我看来它是更复杂的用例之一。)
-
本地化是功能列表中的一个项目。是的,我们这样做。你可以提醒销售人员他们可以向 50 亿用户而不是 5000 万用户销售产品,从而让他们感到高兴。如果他们要求无意义的花里胡哨,他们将不得不等待更长时间进行销售。那只是失去了销售,使一个没有人真正使用过相当昂贵的奢侈品的功能。他们不明白这一点,你必须说出来。
-
@HansPassant:本地化不是项目符号。我们已经以三种不同的语言提供了我们的应用程序,并且它是特定用户群所需要的。我同意即时切换 UI 语言可能是一个项目符号。
标签: winapi visual-c++ mfc localization internationalization