2017-08-30 185 views
1

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

+2

这对于Qt来说是不可能的,我建议创建一个包含该信息并从那里读取的文件。 – eyllanesc

回答

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"; 
    } 
} 
+0

感谢您的想法@cbuchart。 –

+0

很高兴为您服务! – cbuchart

相关问题