0

我创建了一个QComboBox列出 Qt 应用程序支持的各种语言的列表。为了填充组合框中的项目,我在所有.qm文件中搜索可用的语言代码。

QDir dir(TRANSLATION_PATH);
QStringList file_names = dir.entryList(QStringList("MyApp_*.qm"));
QStringList language_codes;

for (const QString& file_name : file_names) {
    QString code = file_name;             // "MyApp_de.qm"
    code.truncate(code.lastIndexOf('.')); // "MyApp_de"
    code.remove(0, code.indexOf('_') + 1);// "de"
    language_codes.push_back(code);
}

然后我通过QLocale从语言代码构造 a 来获取语言名称。

for (const QString& language_code : language_codes) {
    QString lang = QLocale::languageToString(QLocale(language_code).language());
    _ui->cboLanguage->addItem(lang, language_code);
}

问题是我有同名的语言zh_CNzh_TW显示为中文,en_USen_UK显示为英文。

我的问题是:是否有一种简单、不易碎的方法来获得这些语言的“长”名称?例如,如果存在,我想要类似以下的内容:

QString ui_text = QLocale(language_code).longLanguageName();

// language_code   ->   ui_text
// =============        =======
// "zh_CN"              "Chinese (Simplified)"
// "zh_TW"              "Chinese (Traditional)"
// "en_US"              "English (U.S.)"
// "en_UK"              "English (U.K.)"
4

1 回答 1

0

您可以检查语言代码是否包含“分隔符”符号,-或者_取决于您使用的格式,如果是,则通过QLocale::languageToString()and组成长字符串QLocale::countryToString()。否则你只需要语言。

当然,该解决方案会给您带来Chinese (Taiwan)而不是Chinese (Traditional)English (United Kingdom)而不是English (U.K.).

或者,您可以简单地使用地图并使用支持的语言的自定义和地缘政治正确的条目手动填充它。

尽管更常见的做法似乎是将每种语言名称都用母语书写。

另请注意,英国英语代码实际上是en_GB,并且en_UK会给你美国,至少在 Qt 中。我猜是挥之不去的帝国主义;)

于 2019-01-05T00:57:46.213 回答