【问题标题】:Detect OS languages检测操作系统语言
【发布时间】:2017-04-10 02:38:29
【问题描述】:

我想检测我的操作系统上安装的语言。 为此,我跑步:

qDebug() << QLocale::system();
// result = QLocale(English, Latin, UnitedStates)

但我想将它保存在 QString 中,但不能这样做:

QString langs = QLocale::system().toString();

如何将此结果保存在字符串中? 还是有更好的方法来检测操作系统语言? 另一件事,是否可以检测键盘语言设置(如果可能,使用 Qt)?

【问题讨论】:

  • “检测安装在我的操作系统上的语言”到底是什么意思?能详细点吗?
  • 我想知道运行我的应用程序的计算机上安装的语言包列表
  • 什么是“语言包”?在哪个操作系统下?
  • 我正在使用 Ubuntu,并且安装了 ENG 和 PT 语言,我想获取以下信息:“安装/使用的语言 - ENG、PT”...如果我的应用程序正在运行一台具有 FR、IT 和 ENG 的计算机,我想获得:“安装/使用的语言 - FR、IT、ENG”。我需要它在 Linux 和 Windows 上工作,这就是我想使用 Qt 的原因。
  • 但是为什么系统语言包应该反映在你的应用程序中呢?您确定不想让您的应用程序安装其他翻译、找到它们并将它们列出给用户吗?

标签: c++ qt operating-system


【解决方案1】:

documentation for QLocale 表示:

QLocale 支持默认语言环境的概念,它是由确定的 从应用程序启动时的系统区域设置

因此,要获得系统默认语言的不同表示,QLocale 上的以下一种或多种方法可能会对您有所帮助:

qDebug() << QLocale::system().name();
qDebug() << QLocale::system().nativeCountryName();
qDebug() << QLocale::system().nativeLanguageName();

示例输出:

"en_GB"
"United Kingdom"
"British English"

在 GUI 应用程序中,您可以获得类似的输入法详细信息,如下所示:

qDebug() << QGuiApplication::inputMethod()->locale().name();

【讨论】:

  • QLocale::system() 显示了 3 种语言,但我只安装了 2 种。是否可以使用 Qt 做我想做的事情,显示已安装的语言包?
  • @vitor13almeida 你怎么知道你“安装”了哪些语言?您使用的确切操作系统和发行版是什么?
  • 带有 ENG 和 PT 语言包的 Ubuntu。 ENG 中的菜单、窗口、应用程序和这些东西,键盘是 PT 或 ENG。我需要在 windows 和 linux 上保存操作系统、操作系统版本、语言、eyboard 布局/语言....
  • @vitor13almeida 我认为不可能通过内置的 Qt 函数获取系统上安装的语言包列表,因为本地化的方式因环境而异。在 Ubuntu 中可能有一些有用的命令,例如,如果您使用 KDE,您可以通过 apt-cache search kde-l10n 搜索已安装的语言包。对于键盘映射也是如此:ls /usr/share/X11/xkb/symbols/。在我的系统上,这些文件夹的内容有点不一致,但是许多条目使用两个字母的语言代码,然后您可以使用 QLocale 将其转换为人类可读的名称。
【解决方案2】:

是否可以用 Qt 做我想做的事,显示已安装的语言包?

没有。在 Qt 中没有这样做的功能。您需要针对您所定位的每个平台采用特定于平台的方法。

还要注意“语言包”的概念是不可移植的。例如。大多数 Unix 应用程序(包括 OS X 上的应用程序)都支持它们可以支持的所有语言,您可以立即切换语言而无需安装任何东西。

【讨论】:

  • 好的。任何建议如何为 linux 操作系统做这件事?检查文件,使用一些 c++ 类,...?
  • @vitor13almeida 在大多数情况下,您无事可做。任何应用程序都将以当前选择的语言环境显示,如果它有这样的翻译。如何检查它是否有翻译?您必须检查源包或二进制文件中的某种翻译文件,或它们的 cookie 碎屑等。确实没有简单的包罗万象的方法可以做到这一点。也没有可移植的方式来查询应用程序支持的语言。我希望您确实意识到,大多数 X 桌面环境默认包含所有翻译。
  • @vitor13almeida 您必须回答基本问题:为什么您认为您需要这些信息?究竟适用于哪些应用?您可能知道不同的应用程序会在不同程度上支持多种语言——对于 OSS 而言,这取决于志愿者是否有时间从事翻译工作。你可能有例如一个有 15 个完整翻译的 KDE 控制中心,但一个只有 10 个的窗口管理器。这是为了说明问题而编造的数字。
  • 我不想检查操作系统语言来更改我的应用程序语言设置。我需要它,以便我可以比较应用程序/用户位置(国家/地区)VS 用户/操作系统语言...例如,我的应用程序可以在英国使用,但用户可以使用 ENG、FR 或 IT,...在Windows 可以获取我需要的信息,例如使用 GetKeyboardLayoutList()。在 Linux 操作系统中呢?是否有一些跨平台库?
  • 您将无法在 Unix 系统上记录“已安装的语言”,因为这些系统通常会安装 所有“语言”,如果它们没有'不是那么这是已安装的软件包集的问题。例如。在 CentOS/RHEL 上,您可能会记录 rpm -qa|sort 的输出。至于键盘布局,您需要从 X 服务器或使用平台特定 API 从 OS X 或 Windows 获取该信息。请修正您的问题,具体说明您需要哪些信息,以及您关心的具体平台。
【解决方案3】:

您可以使用QLocale::system().uiLanguages() 获取按用户偏好顺序排列的语言列表(例如,在系统偏好设置中定义的 macOS 上)。

对于区域设置的用户可呈现名称,您可以使用类似

QString("%1 (%2)").arg(QLocale::languageToString(locale.language()),
                       QLocale::countryToString(locale.country()));

【讨论】:

  • QLocale::system().uiLanguages() 只显示一个。 Qt可以做我想做的事吗?