【问题标题】:How to correctly get system language in Windows 7 or later如何在 Windows 7 或更高版本中正确获取系统语言
【发布时间】:2019-04-23 12:03:07
【问题描述】:

我需要提取用户的 Windows 语言,我正在使用下面的函数。但是我在我当前的机器上进行了测试(它是英语),但函数返回是“葡萄牙语(巴西)”。

其实我的机器原来是用这种语言的,但是在我安装了一个新的语言包之后,它现在是英语,而不是葡萄牙语;所以我假设下面的功能不能正常工作。还有其他选择吗?

谢谢

function GetWindowsLanguage: string;
var
  WinLanguage: array [0..50] of char;
begin
  VerLanguageName(GetSystemDefaultLangID, WinLanguage, 50);
  Result := StrPas(WinLanguage);
end;

【问题讨论】:

    标签: delphi delphi-2007


    【解决方案1】:

    为了获得当前用户正在使用哪种语言的 Windows UI 信息,您应该使用 GetUserDefaultUILanguage 函数而不是 GetSystemDefaultLangID

    如果当前用户未设置任何语言,则返回系统默认 UI 语言。

    对于 Delphi 2007,您需要声明该函数,因为在该版本发布时它还不存在。请注意,如此处所示的静态操作将意味着您的应用将不再在 Windows 2000 之前的 Windows 版本上运行。

    function GetUserDefaultUILanguage: LANGID; stdcall; external 'kernel32';
    
    function GetUsersWindowsLanguage: string;
    var
      WinLanguage: array [0..50] of char;
    begin
      VerLanguageName(GetUserDefaultUILanguage, WinLanguage, 50);
      Result := WinLanguage;
    end;
    

    【讨论】:

    • 我不在开发机器上,所以目前无法为您编写代码示例。但我相信您可以通过简单地将您当前使用的方法与我建议的方法交换来更改您的代码,因为两者都返回语言 ID
    • 谢谢,但这样做我得到“[DCC 错误] E2003 未声明的标识符:'GetUserDefaultUILanguage'”
    • @delphirules:那是因为 Delphi 2007 早在该功能出现之前就问世了。您需要编写自己的声明。像其他人一样声明它,文档会告诉你它在哪个系统 DLL (kernel32)。
    • @delphirules:查看我对这个答案所做的编辑。我在 Windows 7 上的 Delphi 2007 中编译并测试了它(连同此答案中的其余代码)。
    • @delphirules:文档说它在 Windows 2000 及更高版本上受支持。
    【解决方案2】:

    你想要GetUserDefaultLangID。如果您的机器在安装 Windows 时设置为葡萄牙语,那将是您系统的默认语言。用户当前选择的语言是登录用户选择的语言。 (请参阅链接页面上的备注。)

    function GetUsersWindowsLanguage: string;
    var
      WinLanguage: array [0..50] of char;
    begin
      VerLanguageName(GetUserDefaultLangID, WinLanguage, 50);
      Result := StrPas(WinLanguage);
    end;
    

    【讨论】:

    • 试过了,但它仍然返回“葡萄牙语(巴西)”:/
    • edit您的问题并解释您做了什么(除了安装英语语言包)以使英语成为您当前的Windows语言。
    • 其实我只安装了一个新的语言包,就这个。
    • 使用GetUserDefaultLanguageID 仅返回区域设置中所选语言的ID。这不是与 Windows UI 语言相同的语言所必需的。但是,如果您想获取用于 Windows UI 的语言的语言 ID,则需要使用 GetuserDefaultUILanguage
    • FWIW,不是答案,但您可以完全省略 StrPas()。直接赋值就行了。这也是StrPas() 在内部所做的。看看源代码就行了。
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多