【问题标题】:FormatMessage to a different language将消息格式化为不同的语言
【发布时间】:2017-03-09 19:34:28
【问题描述】:

是否可以将system error codes 翻译成特定语言?

我只能将MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 传递给FormatMessage。否则,函数调用失败并返回 15100 (资源加载器未能找到 MUI 文件)

系统错误消息存储在哪里?为什么我不能在与系统不同的语言环境中加载消息?

【问题讨论】:

  • 如果这是为了测试,那么您可以在自己的计算机上安装特定语言。否则就使用MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) 还是你有一个复杂的目标?
  • 其实我想统一错误通知机制,即将系统错误代码翻译成我的应用程序当前选择的语言。
  • 我遇到了同样的问题,FormatMessage 以英文返回消息很好,但是当我更改语言时,它无法找到 MUI 文件。我下载了语言包,但似乎无法弄清楚它为什么不起作用。知道你是如何让它工作的吗?

标签: c++ windows winapi locale formatmessage


【解决方案1】:

基本上,MUI 代表多语言用户界面。这些是语言包。在 Windows 中,默认情况下不会获得它们。相反,他们必须安装

以下链接可帮助您了解采购。

https://support.microsoft.com/en-us/help/14236/language-packs

默认情况下,以上页面显示为 windows 10 。有一个下拉选项可供选择其他版本的 windows。

如果您对上述链接有疑问,请在 Google 中搜索适用于 Windows 10 或任何其他版本的 MUI 语言包。

【讨论】:

    【解决方案2】:

    语言 ID 使用零,而不是 MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)。然后FormatMessage 将根据线程的语言 id 选择资源,或者使用GetUserDefaultLangID

    FormatMessage 文档:

    DWORD WINAPI FormatMessage(
      _In_     DWORD   dwFlags,
      _In_opt_ LPCVOID lpSource,
      _In_     DWORD   dwMessageId,
      _In_     DWORD   dwLanguageId,
      _Out_    LPTSTR  lpBuffer,
      _In_     DWORD   nSize,
      _In_opt_ va_list *Arguments
    );
    

    dwLanguageId

    如果您在此参数中传递特定的 LANGID,FormatMessage 将 仅返回该 LANGID 的消息。如果函数找不到 该 LANGID 的消息,它将 Last-Error 设置为 ERROR_RESOURCE_LANG_NOT_FOUND如果你传入零FormatMessage 在以下内容中查找 LANGID 消息 顺序:

    1. 语言中立
    2. 线程 LANGID,基于线程的语言环境值
    3. 用户默认 LANGID,基于用户的默认区域设置值
    4. 系统默认 LANGID,基于系统默认区域设置值
    5. 美国英语

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-09
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      相关资源
      最近更新 更多