关于C ++:如何在我的系统区域设置语言中获取语言/国家/地区名称

How to get the language/country name in my system locale language

我正在使用Qt编写一个必须将某些语言的名称显示为文本的应用程序。 我已将系统语言环境设置为es_ES。 这样,我想用西班牙语获得几种语言和国家名称。 但是,我只能使用母语或英语:

1
2
3
4
QLocale lsystem = QLocale::system();
QLocale lswiss("de_CH");
qDebug()<<"system"<<lsystem.name() << lsystem.languageToString(lsystem.language()) << lsystem.nativeLanguageName();
qDebug()<<"swiss"<<lswiss.name() << lsystem.languageToString(lswiss.language()) << lswiss.nativeLanguageName();

此源代码显示以下文本:

1
2
20:17:09.229 [DEBUG]: system "es_ES""Spanish""espa?ol de Espa?a"
20:17:09.229 [DEBUG]: swiss "de_CH""German""Schweizer Hochdeutsch"

我期望的是QLocale::languageToString()方法可以使用我的系统语言环境语言返回名称,但事实并非如此。 我想用西班牙语(espa?ol,alemán)来取名字,但我不知道该怎么做。

如果不使用Qt的翻译工具来翻译每种语言名称,我能否得到想要的东西? 先感谢您。


您可以使用Qt的翻译系统来进行此操作,此外,它已经为多语言应用程序做好了准备,不仅是西班牙语。 缺点是您必须创建列表并将其翻译(您可以用Google搜索一些几种语言的预建表格)。

1
2
3
QString languageNameInCurrentLocale(const QLocale& loc) {
  return qApp->translate("locale_name", loc.name().toStdString().c_str());
}

由于您的代码中没有字符串文字,因此必须手动将它们添加到翻译系统中。 您可以使用QT_TRANSLATE_NOOP来完成。

初始列表可以在预编译步骤中生成,该步骤在所有语言环境中进行迭代(例如,如此答案所示),并打印出此类信息(在此示例中,将输出重定向到C ++文件)。 将文件添加到您的项目并更新翻译文件。

1
2
3
4
5
6
7
8
9
10
void printLocaleList() {
  const auto allLocales = QLocale::matchingLocales(QLocale::AnyLanguage,
    QLocale::AnyScript, QLocale::AnyCountry);

  for (auto loc : allLocales) {
    std::cout <<"QT_TRANSLATE_NOOP("locale_name", "" <<
                 loc.name().toStdString() <<"
");
"
;
  }
}