Я создал 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.)"