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