【问题标题】:Can you access standard Windows strings like 'Cancel'?您可以访问标准的 Windows 字符串,如“取消”吗?
【发布时间】:2011-03-28 04:16:25
【问题描述】:

我正在构建一个具有标准“确定”和“取消”按钮的 Windows 对话框。鉴于 Windows 在其自己的对话框中使用相同的按钮文本,我有办法获取正确的字符串以在按钮上使用吗?

这样,无论使用哪种语言,我的应用程序都将拥有正确的字符串,而无需我自己将其本地化为许多不同的语言。我正在使用 C#,但如果需要,我可以愉快地使用平台调用来访问操作系统方法。

注意:是的,我可以轻松地本地化资源,但我不想找到并且必须输入无数不同的语言字符串,因为它必须已经存在于 Windows 中。请不要回答说本地化应用程序!

【问题讨论】:

  • 您使用的是 WinForms、WPF、SilverLight 吗?

标签: c# windows localization dialog


【解决方案1】:

在 Visual Studio 中:文件 + 打开 + 文件,键入 c:\windows\system32\user32.dll。打开字符串表节点并双击字符串表。向下滚动到 800。

Microsoft 对依赖这些资源 ID 采取了非常严肃的立场。考虑到已经完成您正在考虑的事情的程序员的数量,但是他们不太可能改变这些数字。您需要 P/Invoke LoadLibrary() 和 LoadString()。

但是,您对这个计划的最终失败是带有 MUI 语言包的 Vista/Win7 Ultimate。这允许用户在语言之间切换 更新 DLL 中的资源字符串。这样的版本总是有英文字符串。

【讨论】:

  • 我写了一个如何像这样加载Windows资源的例子,它似乎在多语言环境下也能很好地工作:martinstoeckli.ch/csharp/csharp.html#windows_text_resources
  • 启用 MUI 语言包后,LoadString 会加载正确的本地化资源,因此您应该没问题。唯一的问题是要查找这些资源的 ID,您必须浏览 C:\Windows\System32\<locale>\user32.dll.mui 文件(您可以将 .mui 重命名为 .dll,然后在 VS 中打开它们)。
  • 您还可以使用 ResourceHacker 分析 DLL 或 MUI 文件中的所有资源(不仅是字符串)。
【解决方案2】:

请参阅MB_GetString,它声称正是这样做的:

https://msdn.microsoft.com/en-us/library/windows/desktop/dn910915(v=vs.85).aspx

但是,它似乎需要运行时链接:

http://undoc.airesoft.co.uk/user32.dll/MB_GetString.php

【讨论】:

    【解决方案3】:

    好吧,如果您使用标准的MessageBox.Show() 函数并为其传递适当的参数,它将自动为您定位yes/no/okay/cancel 按钮。

    更有趣的是如何本地化消息文本。

    【讨论】:

      【解决方案4】:

      不,没有标准的、受支持的方式来执行此操作。是的,Windows 确实存储了这些字符串,并且(通过一些努力)可以获得它们,但不能保证它们会保持在相同的位置并在不同版本的相同标识符下。

      虽然您可能不希望这是答案,但答案确实是本地化您的应用程序。如果您正在本地化其他所有内容(正如您必须做的那样,除非您只是想要将 OKCancel 本地化),我不确定为什么要付出很大的努力包括 OKCancel 的本地化值。

      【讨论】:

      • 问题清楚地表明:“请不要通过说本地化应用程序来回答!”
      • @Eduardo:这是唯一有效的答案。我不只是说“本地化应用程序”来回答;我回答说“不,不可能做你想做的事。获得本地化字符串的唯一方法是自己本地化应用程序。”这是一个完全有效且正确的答案。
      • 不同意,抱歉。还有其他两个答案是正确的并解决了这个问题。啊,我不是反对者。
      • 但是,如果您正在本地化您的应用程序并且您希望能够按名称引用按钮,那么有一种直接的方式以编程方式要求 Windows 告诉您当前按钮是什么肯定会很好文字是。遗憾的是,不能严格保证您的应用中显示的 UI 区域设置与系统当前使用的区域设置相同。
      • 对于像 Windows 一样大的 API 来说,说没有受支持的方式总是很危险的......现在 Mordachai 已经发布了一个指向正确(标准、受支持的)API 函数的链接,而你却被否决了。
      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2013-07-27
      • 2010-09-25
      • 2021-10-11
      • 2018-08-27
      • 1970-01-01
      • 2022-01-08
      • 2023-03-28
      相关资源
      最近更新 更多