Как я могу получить "длинное" название языка из QLocale? - PullRequest
0 голосов
/ 05 января 2019

Я создал 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 Ответ

0 голосов
/ 05 января 2019

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

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

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

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

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

...