如何使用我的系统区域设置语言获取语言/国家/地区名称

时间:2017-08-30 18:37:46

标签: c++ qt

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

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();

此源代码打印以下文本:

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的翻译实用程序翻译每个语言名称,我能得到我想要的吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

初始列表可以在预编译步骤中生成,该步骤遍历所有语言环境(例如,如this answer所示)并使用此类信息打印(在此示例中将输出重定向到C ++文件)。将文件添加到项目中并更新翻译文件。

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() << "\");\n";
  }
}