获取 Qt5 中的语言列表

elc*_*uco 4 c++ qt locale qt5

我想从QLocale. 我可以使用此代码获取语言/国家/地区的所有组合。

QList<QLocale> allLocales = QLocale::matchingLocales(
        QLocale::AnyLanguage,
        QLocale::AnyScript,
        QLocale::AnyCountry);
Run Code Online (Sandbox Code Playgroud)

这正是我所需要的。我假设我可以手动过滤掉列表,但是否存在更好的替代方案?

dom*_*om0 6

您可以这样做,也可以做一些不太好的事情(请参阅本文末尾)并手动从列表中过滤重复的语言,例如,如果您想要 ISO 639 语言名称:

QList<QLocale> allLocales = QLocale::matchingLocales(
            QLocale::AnyLanguage,
            QLocale::AnyScript,
            QLocale::AnyCountry);
QSet<QString> iso639Languages;

for(const QLocale &locale : allLocales) {
    iso639Languages.insert(QLocale::languageToString(locale.language()));
}

qDebug() << iso639Languages;
Run Code Online (Sandbox Code Playgroud)

iso639Languages然后包含由 ISO 639 分类并由 Qt 已知的所有语言的名称。请注意,它确实包含语言名称(例如德语)而不是ISO 639 代码(例如 de)。

如果您需要 ISO 639 代码,请执行以下操作:

QList<QLocale> allLocales = QLocale::matchingLocales(
            QLocale::AnyLanguage,
            QLocale::AnyScript,
            QLocale::AnyCountry);
QSet<QString> iso639LanguageCodes;

for(const QLocale &locale : allLocales) {
    iso639LanguageCodes.insert(locale.name().split('_').first());
}

qDebug() << iso639LanguageCodes;
Run Code Online (Sandbox Code Playgroud)

也可以QLocale通过手动迭代QLocale::Language枚举然后解析结果来构造对象,我强烈建议不要这样做,因为这个枚举可能会改变(例如 Qt 5.3),然后您的应用程序将无法捕获新的语言,直到您手动更新迭代范围。