Browse Source

Plumbing for selecting language at run-time

pull/112/head
Duke Leto 2 years ago
parent
commit
2bbab2b675
  1. 115
      src/mainwindow.cpp
  2. 19
      src/mainwindow.h
  3. 24
      src/settings.ui

115
src/mainwindow.cpp

@ -185,6 +185,70 @@ void MainWindow::doClose() {
closeEvent(nullptr);
}
// Called every time, when a menu entry of the language menu is called
void MainWindow::slotLanguageChanged(QAction* action)
{
qDebug() << __func__ << ": action=" << action->data().toString();
if(0 != action) {
// load the language dependant on the action content
loadLanguage(action->data().toString());
setWindowIcon(action->icon());
}
}
void switchTranslator(QTranslator& translator, const QString& filename) {
qDebug() << __func__ << ": filename=" << filename;
// remove the old translator
qApp->removeTranslator(&translator);
// load the new translator
QString path = QApplication::applicationDirPath();
path.append("/res/");
qDebug() << __func__ << ": attempting to load " << path + filename;
if(translator.load(path + filename)) {
qApp->installTranslator(&translator);
}
}
void MainWindow::loadLanguage(const QString& rLanguage) {
qDebug() << "loadLanguage " << rLanguage;
if(m_currLang != rLanguage) {
m_currLang = rLanguage;
QLocale locale = QLocale(m_currLang);
QLocale::setDefault(locale);
QString languageName = QLocale::languageToString(locale.language());
switchTranslator(m_translator, QString("silentdragon_%1.qm").arg(rLanguage));
switchTranslator(m_translatorQt, QString("qt_%1.qm").arg(rLanguage));
ui->statusBar->showMessage(tr("Current Language changed to %1").arg(languageName));
}
}
void MainWindow::changeEvent(QEvent* event) {
if(0 != event) {
switch(event->type()) {
// this event is sent if a translator is loaded
case QEvent::LanguageChange:
qDebug() << "QEvent::LanguageChange changeEvent";
ui->retranslateUi(this);
break;
// this event is sent, if the system, language changes
case QEvent::LocaleChange:
{
QString locale = QLocale::system().name();
locale.truncate(locale.lastIndexOf('_'));
qDebug() << "QEvent::LocaleChange changeEvent locale=" << locale;
loadLanguage(locale);
}
break;
default:
qDebug() << __func__ << ": " << event->type();
}
}
QMainWindow::changeEvent(event);
}
void MainWindow::closeEvent(QCloseEvent* event) {
QSettings s;
@ -346,6 +410,8 @@ void MainWindow::setupSettingsModal() {
bool isUsingConsolidation = false;
int size = 0;
qDebug() << __func__ << ": hushDir=" << rpc->getConnection()->config->hushDir;
QDir hushdir(rpc->getConnection()->config->hushDir);
QFile WalletSize(hushdir.filePath("wallet.dat"));
if (WalletSize.open(QIODevice::ReadOnly)){
@ -418,6 +484,55 @@ void MainWindow::setupSettingsModal() {
settings.testnetTxExplorerUrl->setText(explorer.testnetTxExplorerUrl);
settings.testnetAddressExplorerUrl->setText(explorer.testnetAddressExplorerUrl);
/// create language drop down dynamically
QActionGroup* langGroup = new QActionGroup(settings.menuLanguage);
langGroup->setExclusive(true);
qDebug() << __func__ << ": connecting langGroup to slotLanguageChanged";
connect(langGroup, SIGNAL (triggered(QAction *)), this, SLOT (slotLanguageChanged(QAction *)));
// format systems language
QString defaultLocale = QLocale::system().name(); // e.g. "de_DE"
defaultLocale.truncate(defaultLocale.lastIndexOf('_')); // e.g. "de"
m_langPath = QApplication::applicationDirPath();
m_langPath.append("/res");
qDebug() << __func__ <<": defaultLocale=" << defaultLocale << " m_langPath=" << m_langPath;;
QDir dir(m_langPath);
QStringList fileNames = dir.entryList(QStringList("silentdragon_*.qm"));
qDebug() << __func__ <<": found " << fileNames.size() << " translations";
for (int i = 0; i < fileNames.size(); ++i) {
// get locale extracted by filename
QString locale;
locale = fileNames[i]; // "silentdragon_de.qm"
locale.truncate(locale.lastIndexOf('.')); // "silentdragon_de"
locale.remove(0, locale.lastIndexOf('_') + 1); // "de"
QString lang = QLocale::languageToString(QLocale(locale).language());
//QIcon ico(QString("%1/%2.png").arg(m_langPath).arg(locale));
QIcon ico;
QAction *action = new QAction(ico, lang, this); // ico, lang, this);
action->setCheckable(true);
action->setData(locale);
settings.menuLanguage->addAction(action);
langGroup->addAction(action);
qDebug() << __func__ << ": added language=" << locale;
// set default translators and language checked
if (defaultLocale == locale) {
action->setChecked(true);
}
}
///
// Connection tab by default
settings.tabWidget->setCurrentIndex(0);

19
src/mainwindow.h

@ -72,10 +72,21 @@ public:
Logger* logger;
void doClose();
protected:
// this event is called, when a new translator is loaded or the system language is changed
void changeEvent(QEvent* event);
//void slotLanguageChanged(QAction* action);
protected slots:
// this slot is called by the language menu actions
void slotLanguageChanged(QAction *action);
private:
void closeEvent(QCloseEvent* event);
// loads a language by the given language shortcode (e.g. de, en)
void loadLanguage(const QString& rLanguage);
void setupSendTab();
void setupPeersTab();
void setupTransactionsTab();
@ -87,6 +98,7 @@ private:
void slot_change_theme(const QString& themeName);
void slot_change_currency(const QString& currencyName);
void setupTurnstileDialog();
void setupSettingsModal();
void setupStatusBar();
@ -144,6 +156,13 @@ private:
QRegExpValidator* feesValidator = nullptr;
QMovie* loadingMovie;
// creates the language menu dynamically from the content of m_langPath
void createLanguageMenu(void);
QTranslator m_translator; // contains the translations for this application
QTranslator m_translatorQt; // contains the translations for qt
QString m_currLang; // contains the currently loaded language
QString m_langPath; // Path of language files
};
#endif // MAINWINDOW_H

24
src/settings.ui

@ -177,6 +177,29 @@
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="langlabel">
<property name="text">
<string>Language</string>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="17" column="1">
<widget class="QMenu" name="menuLanguage">
</widget>
</item>
<item row="16" column="1">
<widget class="QComboBox" name="comboBoxCurrency">
<property name="sizePolicy">
@ -402,6 +425,7 @@
</item>
</widget>
</item>
<item row="15" column="1">
<widget class="QComboBox" name="comboBoxTheme">
<property name="sizePolicy">

Loading…
Cancel
Save