是否可以动态更改模态对话框的语言?

Posted

技术标签:

【中文标题】是否可以动态更改模态对话框的语言?【英文标题】:Is it possible to dynamically change the language of a modal dialog? 【发布时间】: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 语言可能是一个项目符号。 【参考方案1】:

最简单的事情可能不是使用另一个对话框模板,而是通过使用将对话框的每个控件 id 映射到字符串资源的表以编程方式逐个更改对话框控件的文本。

对您来说更好的解决方案是解析其他语言的对话框模板,并将显示对话框中每个控件的文本替换为模板中的文本,并根据控件中的大小和位置调整控件的大小和位置。模板对话框。

不幸的是,Windows 中没有用于解析对话框模板的 API,但是有一个漂亮的 good blog entry by Raymond Chen 可以处理对话框模板。

伪代码:

foreach (control in the other language's dialog template)

  string = control.GetText() ;            // Get text from dialog template's control
  CRect rect = control.GetRect() ;        // Get rectangle from dialog template's control

  CWnd *pCtrl = GetDlgItem(control.id) ;  // Get pointer to control in dialog
  pCtrl->SetWindowText(control) ;         // Set new text of control
  pCtrl->MoveWindow(rect) ;               // resize and reposition control      

【讨论】:

我将编辑问题以解释为什么我认为这是次优的。 您实际上还可以更改对话框中控件的大小和位置,而不仅仅是文本。所有这些信息都可以从对话模板中检索到。我会根据这个编辑我的答案。

以上是关于是否可以动态更改模态对话框的语言?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 dojo 的对话框/模态对话框中显示拆分容器?

Bootstrap模态对话框怎么隐藏?

是否可以使用 Bootstrap 的模态对话框、jQuery、AJAX 和 PHP 将图像上传到服务器?如果是怎么办?如果不是,那是啥原因?

VS2017 MFC应用中添加模态对话框时为其添加类弹出如下错误

selenium 怎么处理模态对话框,网上查了资料,说要重写方法,但看了还是无法解决,希望有高手能指点下,谢

android中有没有类似ShowMessage那种模态对话框