Как я могу получить "длинное" название языка из 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. Длительный империализм, я думаю;)