Как я могу получить "длинное" название языка из QLocale?

Я создал 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 из кодов языков.

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

Проблема в том, что у меня есть языки с тем же именем zh_CNа также zh_TW показать как китайский, и en_US а также en_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.)"

1 ответ

Вы можете проверить, содержит ли код языка символ "разделитель", либо - или же _ в зависимости от формата, который вы используете, и, если это так, составьте длинную строку с помощью QLocale::languageToString() а также QLocale::countryToString(), Иначе вам нужен только язык.

Конечно, это решение даст вам Chinese (Taiwan) скорее, чем Chinese (Traditional) а также English (United Kingdom) скорее, чем English (U.K.),

Или вы можете просто использовать карту и вручную заполнить ее пользовательскими и геополитически правильными записями для поддерживаемых языков.

Хотя более распространенной практикой представляется, что каждое название языка пишется на родном языке.

Также обратите внимание, что английский код Великобритании на самом деле en_GB, а также en_UK даст вам США, хотя бы в Qt. Длительный империализм, я думаю;)

Другие вопросы по тегам