From 88dd9e4b6a2fa46d5efdc7d41deec2270389e679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Wed, 6 Feb 2013 18:49:20 +0100 Subject: [PATCH] Initial multi language support --- Qt/PPSSPP.pro | 3 ++ Qt/mainwindow.cpp | 89 +++++++++++++++++++++++++++++++++++++++++++++++ Qt/mainwindow.h | 12 +++++++ Qt/mainwindow.ui | 8 ++++- 4 files changed, 111 insertions(+), 1 deletion(-) diff --git a/Qt/PPSSPP.pro b/Qt/PPSSPP.pro index 76ab64cefa..266cd5fafe 100755 --- a/Qt/PPSSPP.pro +++ b/Qt/PPSSPP.pro @@ -27,6 +27,9 @@ linux { } } +TRANSLATIONS = languages/PPSSPP_en.ts \ + languages/PPSSPP_pl.ts + # Main SOURCES += ../native/base/QtMain.cpp HEADERS += ../native/base/QtMain.h diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 36e828bce8..117df1bace 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -778,3 +778,92 @@ void MainWindow::on_action_OptionsGamePadControls_triggered() QMessageBox::information(this,"Gamepad","You need to compile with SDL to have Gamepad support.", QMessageBox::Ok); #endif } + +void MainWindow::on_language_changed(QAction *action) +{ + if (0 != action) + { + loadLanguage(action->data().toString()); + } +} + +void switchTranslator(QTranslator &translator, const QString &filename) +{ + qApp->removeTranslator(&translator); + + if (translator.load(filename)) + qApp->installTranslator(&translator); +} + +void MainWindow::loadLanguage(const QString& language) +{ + if (currentLanguage != language) + { + currentLanguage = language; + QLocale locale = QLocale(currentLanguage); + QLocale::setDefault(locale); + QString languageName = QLocale::languageToString(locale.language()); + switchTranslator(translator, QString("PPSSPP_%l.qm").arg(language)); + switchTranslator(qtTranslator, QString("qt_%l.qm").arg(language)); + ui->statusbar->showMessage(tr("Current language changed to %l").arg(languageName)); + } +} + +void MainWindow::createLanguageMenu() +{ + QActionGroup *langGroup = new QActionGroup(ui->menuLanguage); + langGroup->setExclusive(true); + + connect(langGroup, SIGNAL(triggered(QAction *)), this, SLOT(on_language_changed(QAction *))); + + QString defaultLocale = QLocale::system().name(); + defaultLocale.truncate(defaultLocale.lastIndexOf('_')); + languagePath = QApplication::applicationDirPath(); + languagePath.append("/languages"); + QDir langDir(languagePath); + QStringList fileNames = langDir.entryList(QStringList("PPSSPP_*.qm")); + + for (int i = 0; i < fileNames.size(); ++i) + { + QString locale = fileNames[i]; + locale.truncate(locale.lastIndexOf(',')); + locale.remove(0, locale.indexOf('_') + 1); + + QString language = QLocale::languageToString(QLocale(locale).language()); + QAction *action = new QAction(language, this); + action->setCheckable(true); + action->setData(locale); + + ui->menuLanguage->addAction(action); + langGroup->addAction(action); + + if (defaultLocale == locale) + { + action->setChecked(true); + } + } +} + +void MainWindow::changeEvent(QEvent *event) +{ + if (0 != event) + { + switch (event->type()) + { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + case QEvent::LocaleChange: + { + QString locale = QLocale::system().name(); + locale.truncate(locale.lastIndexOf('_')); + loadLanguage(locale); + } + break; + default: + break; + } + } + + QMainWindow::changeEvent(event); +} diff --git a/Qt/mainwindow.h b/Qt/mainwindow.h index d8a41a0e99..dbb27e3323 100644 --- a/Qt/mainwindow.h +++ b/Qt/mainwindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include +#include #include "Core/Core.h" #include "input/input_state.h" @@ -135,7 +136,18 @@ private slots: void on_action_OptionsGamePadControls_triggered(); + void on_language_changed(QAction *action); + private: + void loadLanguage(const QString &language); + void createLanguageMenu(); + void changeEvent(QEvent *); + + QTranslator translator; + QTranslator qtTranslator; + QString currentLanguage; + QString languagePath; + Ui::MainWindow *ui; QtEmuGL* w; diff --git a/Qt/mainwindow.ui b/Qt/mainwindow.ui index 1a563fe407..acf08f6a94 100644 --- a/Qt/mainwindow.ui +++ b/Qt/mainwindow.ui @@ -44,7 +44,7 @@ 0 0 800 - 23 + 21 @@ -135,6 +135,11 @@ + + + Language + + @@ -155,6 +160,7 @@ +