65.9K
CodeProject 正在变化。 阅读更多。
Home

检测活动语言

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2017年9月21日

CPOL

3分钟阅读

viewsIcon

21362

downloadIcon

314

如何检测当前使用的语言,无论活动应用程序是什么

区域设置和语言

根据 Microsoft MSDN 的说法,“语言”一词表示用于口头和书面交流的属性集合。每种语言都有一个语言名称和一个语言标识符,用于指示用于表示操作系统上语言的特定代码页 (ANSI, DOS, Macintosh)。中性语言由一个名称表示,例如英语的 "en"。更具地理位置特异性的语言可以通过包含区域设置和国家/地区信息的名称来指示。例如,区域设置英语(美国)的语言名称为 "en-US"。希伯来语使用的是 "He-HE"。一些用户可以在日常工作中在两个或多个已安装的语言之间切换。例如,用阿拉伯语或希伯来语书写的用户肯定也需要使用拉丁字符,因此在这些情况下,按下左 SHIFT + ALT / 右 SHIFT + ALT 即可进行切换。

用户界面

在用户界面方面,由于我们的目标是检测当前活动屏幕中使用的语言,因此我们的小程序应该是被动的。 保持在后台,但显示在最前面(这样您就可以看到它提供的指示)。

因此,无论活动应用程序是什么,您都将能够查看当前状态(在本例中,是当前活动语言)。 在下面的示例中,活动窗口是记事本,当前使用的语言是希伯来语。

源代码

为了检测当前选择的语言,我们调用 GetLocaleInfoW()。 还有一个更新的版本 GetLocaleInfoEx(),如果您以 Windows Vista 及更高版本为目标,建议使用此版本。 在我的示例中,我使用了 GetLocaleInfoW()。 我的示例侧重于区域设置的一个方面:文本方向,可以是从左到右或从右到左。 使用相同的 API,您可以获得语言名称、默认的当前信息以及更多信息。

    auto layout = GetKeyboardLayout(GetWindowThreadProcessId(win->GetSafeHwnd(), NULL));
    auto lcid = MAKELCID(LOWORD(layout), SORT_DEFAULT);
    LOCALESIGNATURE localesig;
    if (GetLocaleInfoW(lcid, LOCALE_FONTSIGNATURE, 
       (LPWSTR)&localesig, sizeof(localesig) / sizeof(WCHAR)) != 0)
        ret = (localesig.lsUsb[3] & 0x08000000) != 0;

因此,如果默认文本方向为从右到左,则 "ret" 将保存 TRUE,否则保存 FALSE,即默认文本方向为从左到右。

语言标识符

列表中列出了可用和支持的语言列表。 每个语言标识符由一个表示语言的主要语言标识符和一个表示国家/地区的子语言标识符组成。 语言标识符对应于特定的区域设置,例如英语(美国),表示为 "en-US"。 语言标识符用作区域设置标识符的一部分。

为什么选择 MFC

我使用 MFC 进行界面设计,但是所有 API 调用都是纯 Win32。 使用 MFC 允许快速创建应用程序,尤其是在需要用户界面时。 在我的例子中,我通过调用

    SetTimer(TIMER_EVENT_SHOWLANG, 1000,NULL);

来创建一个 Timer,然后,我可以将我的代码放在

void CDisplayLocaleDlg::OnTimer(UINT_PTR nIDEvent)

知道它将每秒被调用。

当您编译并运行代码时,您可以使用任何其他软件或转到任何其他窗口,仍然可以看到窗口的标题和在我们的程序的用户界面上显示的当前选择的语言方向。 这可以扩展为显示

历史

  • 2017年9月21日:初始版本
© . All rights reserved.