LocaleDialog::LocaleDialog(QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) { QString title = parent ? parent->window()->windowTitle() : QString(); setWindowTitle(!title.isEmpty() ? title : QCoreApplication::applicationName()); QLabel* text = new QLabel(tr("Select application language:"), this); m_translations = new QComboBox(this); m_translations->addItem(tr("<System Language>"), ""); QString translation; QStringList translations = findTranslations(); foreach (translation, translations) { if (translation.startsWith("qt")) { continue; } translation.remove(m_appname); m_translations->addItem(languageName(translation), translation); } int index = qMax(0, m_translations->findData(m_current)); m_translations->setCurrentIndex(index); QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); QVBoxLayout* layout = new QVBoxLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); layout->addWidget(text); layout->addWidget(m_translations); layout->addWidget(buttons); }
void LocaleDialog::loadTranslator(const QString& name, const QStringList& datadirs) { m_appname = name; // Find translator path QStringList paths = datadirs; if (paths.isEmpty()) { QString appdir = QCoreApplication::applicationDirPath(); paths.append(appdir); paths.append(appdir + "/../share/" + QCoreApplication::applicationName().toLower()); paths.append(appdir + "/../Resources"); } foreach (const QString& path, paths) { if (QFile::exists(path + "/translations/")) { m_path = path + "/translations/"; break; } } // Find current locale m_current = QSettings().value("Locale/Language").toString(); QString current = !m_current.isEmpty() ? m_current : QLocale::system().name(); QStringList translations = findTranslations(); if (!translations.contains(m_appname + current)) { current = current.left(2); if (!translations.contains(m_appname + current)) { current.clear(); } } if (!current.isEmpty()) { QLocale::setDefault(current); } else { current = "en"; } // Load translators static QTranslator qt_translator; if (translations.contains("qt_" + current) || translations.contains("qt_" + current.left(2))) { qt_translator.load("qt_" + current, m_path); } else { qt_translator.load("qt_" + current, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); } QCoreApplication::installTranslator(&qt_translator); static QTranslator translator; translator.load(m_appname + current, m_path); QCoreApplication::installTranslator(&translator); // Work around bug in Qt 5 where text direction is not loaded QApplication::setLayoutDirection(QLocale(current).textDirection()); }
bool LanguageSelection::findTranslations() { return findTranslations( PathList{QCoreApplication::applicationDirPath()} ); }