From 8d71edb748e2dbe9d15bfd4735bc7211272fdf8c Mon Sep 17 00:00:00 2001 From: Patrick von Reth Date: Thu, 26 Mar 2015 15:56:05 +0100 Subject: [PATCH] add support for translations --- CMakeLists.txt | 14 +- lang/CMakeLists.txt | 15 ++ lang/de.ts | 145 ++++++++++++++++++ lang/en.ts | 145 ++++++++++++++++++ src/libsnore/CMakeLists.txt | 2 +- src/libsnore/settingsdialog.ui | 4 +- src/libsnore/snore.cpp | 17 +- src/libsnore/snore.h | 2 +- src/libsnore/snore_p.cpp | 32 ++++ src/libsnore/snore_p.h | 2 + src/plugins/backends/growl/growlsettings.cpp | 4 +- src/plugins/backends/growl/growlsettings.h | 1 + src/plugins/backends/snarl/snarlsettings.cpp | 2 +- src/plugins/backends/snarl/snarlsettings.h | 1 + .../backends/snore/snorenotifiersettings.cpp | 10 +- .../backends/snore/snorenotifiersettings.h | 1 - .../sound/soundsettings.cpp | 6 +- .../toasty/toastysettings.cpp | 2 +- .../toasty/toastysettings.h | 1 - 19 files changed, 376 insertions(+), 30 deletions(-) create mode 100644 lang/CMakeLists.txt create mode 100644 lang/de.ts create mode 100644 lang/en.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index 71e7293..28e4d40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,12 +15,12 @@ include(KDEInstallDirs) include(KDECompilerSettings) include(KDECMakeSettings) -include(ECMAddAppIcon) -include(ECMInstallIcons) -include(ECMSetupVersion) -include(ECMPackageConfigHelpers) include(GenerateExportHeader) +include(ECMAddAppIcon) +include(ECMInstallIcons) +include(ECMPackageConfigHelpers) +include(ECMSetupVersion) ####################################################################### option(WITH_FRONTENDS "Build frontends currently only useful if WITH_SNORE_DAEMON=ON" OFF) @@ -36,9 +36,10 @@ set(SNORE_CamelCase_SUFFIX "Qt5") find_package(Qt5Core REQUIRED) -find_package(Qt5Widgets REQUIRED) +find_package(Qt5LinguistTools REQUIRED) find_package(Qt5Network REQUIRED) find_package(Qt5Quick REQUIRED) +find_package(Qt5Widgets REQUIRED) find_package(Doxygen QUIET) @@ -66,8 +67,9 @@ message(STATUS "Installing plugins to ${LIBSNORE_PLUGIN_PATH}") add_subdirectory(data) -add_subdirectory(share) +add_subdirectory(lang) add_subdirectory(src) +add_subdirectory(share) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES) diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt new file mode 100644 index 0000000..e88ff54 --- /dev/null +++ b/lang/CMakeLists.txt @@ -0,0 +1,15 @@ +set(LIBSNORE_LANGS de en) + +set(TS_FILES ) +set( snore_i18n_content "\n\n" ) +foreach( lang ${LIBSNORE_LANGS} ) + list(APPEND TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${lang}.ts) + set( snore_i18n_content "${snore_i18n_content}${lang}.qm\n" ) +endforeach() +set( snore_i18n_content "${snore_i18n_content}\n\n" ) + +file( WRITE ${CMAKE_BINARY_DIR}/lang/snore_i18n.qrc "${snore_i18n_content}" ) + +qt5_add_translation(libsnore_lang ${TS_FILES}) + +add_custom_target(libsnore_lang_translation ALL DEPENDS ${libsnore_lang}) diff --git a/lang/de.ts b/lang/de.ts new file mode 100644 index 0000000..24bb6f2 --- /dev/null +++ b/lang/de.ts @@ -0,0 +1,145 @@ + + + + + GrowlSettings + + + Host: + + + + + Password: + Passwort: + + + + SettingsDialog + + + Settings + Einstellungen + + + + General + Allgemein + + + + Primary Backend: + + + + + Timeout: + + + + + s + + + + + Primary Backends + + + + + Secondary Bckends + + + + + Frontends + + + + + Plugins + + + + + Display Test Notification + Zeige test Mitteilung an + + + + SettingsWindow + + + Snore Settings + Snore Einstellungen + + + + Application + Anwendungen + + + + SnarlSettings + + + Password: + Passwort: + + + + SnoreNotifierSettings + + + TopLeftCorner + ObereLinkeEcke + + + + TopRightCorner + ObereRechteEcke + + + + BottomLeftCorner + UntereLinkeEcke + + + + BottomRightCorner + UntereRechteEcke + + + + Position: + + + + + SoundSettings + + + Sound File: + + + + + Select a sound File + + + + + All Audio files + Alle Audio Dateien + + + + ToastySettings + + + Device ID: + Geräte ID: + + + diff --git a/lang/en.ts b/lang/en.ts new file mode 100644 index 0000000..3bbdf8f --- /dev/null +++ b/lang/en.ts @@ -0,0 +1,145 @@ + + + + + GrowlSettings + + + Host: + + + + + Password: + + + + + SettingsDialog + + + Settings + + + + + General + + + + + Primary Backend: + + + + + Timeout: + + + + + s + + + + + Primary Backends + + + + + Secondary Bckends + + + + + Frontends + + + + + Plugins + + + + + Display Test Notification + + + + + SettingsWindow + + + Snore Settings + + + + + Application + + + + + SnarlSettings + + + Password: + + + + + SnoreNotifierSettings + + + TopLeftCorner + + + + + TopRightCorner + + + + + BottomLeftCorner + + + + + BottomRightCorner + + + + + Position: + + + + + SoundSettings + + + Sound File: + + + + + Select a sound File + + + + + All Audio files + + + + + ToastySettings + + + Device ID: + + + + diff --git a/src/libsnore/CMakeLists.txt b/src/libsnore/CMakeLists.txt index 69ced47..9a6b0fe 100644 --- a/src/libsnore/CMakeLists.txt +++ b/src/libsnore/CMakeLists.txt @@ -10,7 +10,7 @@ set(LIBSNORE_INCLUDE_DIR ${KDE_INSTALL_INCLUDEDIR}/libsnore) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/version.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/version.cpp") -QT5_ADD_RESOURCES(SNORENOTIFY_RCS ${SNORE_RCS}) +QT5_ADD_RESOURCES(SNORENOTIFY_RCS ${SNORE_RCS} ${CMAKE_BINARY_DIR}/lang/snore_i18n.qrc) add_subdirectory(notification) add_subdirectory(plugins) diff --git a/src/libsnore/settingsdialog.ui b/src/libsnore/settingsdialog.ui index d4ef8b7..628e342 100644 --- a/src/libsnore/settingsdialog.ui +++ b/src/libsnore/settingsdialog.ui @@ -42,7 +42,7 @@ - Primary Backend + Primary Backend: @@ -52,7 +52,7 @@ - Timeout + Timeout: diff --git a/src/libsnore/snore.cpp b/src/libsnore/snore.cpp index 801f2b9..5f0d2b0 100644 --- a/src/libsnore/snore.cpp +++ b/src/libsnore/snore.cpp @@ -33,12 +33,12 @@ using namespace Snore; -SnoreCore::SnoreCore() +SnoreCore::SnoreCore(QObject *parent): + QObject(parent) { - if (QThread::currentThread() != qApp->thread() ) { - moveToThread(qApp->thread()); + if (QThread::currentThread() != parent->thread() ) { + moveToThread(parent->thread()); } - SnoreCorePrivate::registerMetaTypes(); d_ptr = new SnoreCorePrivate(); Q_D(SnoreCore); d->q_ptr = this; @@ -47,8 +47,13 @@ SnoreCore::SnoreCore() SnoreCore &SnoreCore::instance() { - static SnoreCore instance; - return instance; + static SnoreCore *instance = nullptr; + if(!instance) { + SnoreCorePrivate::loadTranslator(); + SnoreCorePrivate::registerMetaTypes(); + instance = new SnoreCore(qApp); + } + return *instance; } SnoreCore::~SnoreCore() diff --git a/src/libsnore/snore.h b/src/libsnore/snore.h index 274b51b..80ba012 100644 --- a/src/libsnore/snore.h +++ b/src/libsnore/snore.h @@ -177,7 +177,7 @@ signals: void notificationClosed(Snore::Notification); private: - SnoreCore(); + SnoreCore(QObject *parent); SnoreCorePrivate *d_ptr; }; diff --git a/src/libsnore/snore_p.cpp b/src/libsnore/snore_p.cpp index 973f8d5..4d7fe40 100644 --- a/src/libsnore/snore_p.cpp +++ b/src/libsnore/snore_p.cpp @@ -27,6 +27,7 @@ #include #include +#include using namespace Snore; @@ -218,6 +219,7 @@ void SnoreCorePrivate::slotNotificationClosed(Notification n) Q_Q(SnoreCore); emit q->notificationClosed(n); if (n.data()->source()) { + //TODO: drop source and use signal aswell n.data()->source()->notificationClosed(n); } } @@ -232,3 +234,33 @@ void SnoreCorePrivate::slotAboutToQuit() } } +void SnoreCorePrivate::loadTranslator(){ + auto installTranslator = [](const QString &locale) + { + snoreDebug(SNORE_DEBUG) << locale; + if(locale != "C") { + QTranslator* translator = new QTranslator( qApp->instance() ); + if ( translator->load(locale, ":/lang/libsnore/") ) + { + snoreDebug(SNORE_INFO) << "Using system locale:" << locale; + snoreDebug(SNORE_INFO) << qApp->installTranslator( translator ); + } + else + { + translator->deleteLater(); + QString fileName = QString(":/lang/libsnore/%1.qm").arg(locale); + snoreDebug(SNORE_WARNING)<< "Failed to load translations for:" << locale << fileName << QFile::exists(fileName) ; + return false; + } + } + return true; + }; + + installTranslator("en"); + QLocale locale = QLocale::system(); + if (locale.name() != "en") { + if (!installTranslator(locale.name())) { + installTranslator(locale.bcp47Name()); + } + } +} diff --git a/src/libsnore/snore_p.h b/src/libsnore/snore_p.h index e2063f2..57e1364 100644 --- a/src/libsnore/snore_p.h +++ b/src/libsnore/snore_p.h @@ -48,6 +48,8 @@ public: */ static QString tempPath(); + static void loadTranslator(); + public: static SnoreCorePrivate *instance(); ~SnoreCorePrivate(); diff --git a/src/plugins/backends/growl/growlsettings.cpp b/src/plugins/backends/growl/growlsettings.cpp index 658e6f3..04b369a 100644 --- a/src/plugins/backends/growl/growlsettings.cpp +++ b/src/plugins/backends/growl/growlsettings.cpp @@ -27,8 +27,8 @@ GrowlSettings::GrowlSettings(SnorePlugin *plugin, QWidget *parent): m_password(new QLineEdit) { m_password->setEchoMode(QLineEdit::Password); - addRow("Host:", m_host); - addRow("Password:", m_password); + addRow(tr("Host:"), m_host); + addRow(tr("Password:"), m_password); } GrowlSettings::~GrowlSettings() diff --git a/src/plugins/backends/growl/growlsettings.h b/src/plugins/backends/growl/growlsettings.h index 265573d..d3b369c 100644 --- a/src/plugins/backends/growl/growlsettings.h +++ b/src/plugins/backends/growl/growlsettings.h @@ -24,6 +24,7 @@ class QLineEdit; class GrowlSettings : public Snore::PluginSettingsWidget { + Q_OBJECT public: explicit GrowlSettings(Snore::SnorePlugin *plugin, QWidget *parent = 0); ~GrowlSettings(); diff --git a/src/plugins/backends/snarl/snarlsettings.cpp b/src/plugins/backends/snarl/snarlsettings.cpp index 4ee9756..d6e50da 100644 --- a/src/plugins/backends/snarl/snarlsettings.cpp +++ b/src/plugins/backends/snarl/snarlsettings.cpp @@ -26,7 +26,7 @@ SnarlSettings::SnarlSettings(SnorePlugin *plugin, QWidget *parent): m_password(new QLineEdit) { m_password->setEchoMode(QLineEdit::Password); - addRow("Password:", m_password); + addRow(tr("Password:"), m_password); } SnarlSettings::~SnarlSettings() diff --git a/src/plugins/backends/snarl/snarlsettings.h b/src/plugins/backends/snarl/snarlsettings.h index a261439..24dbb5d 100644 --- a/src/plugins/backends/snarl/snarlsettings.h +++ b/src/plugins/backends/snarl/snarlsettings.h @@ -24,6 +24,7 @@ class QLineEdit; class SnarlSettings : public Snore::PluginSettingsWidget { + Q_OBJECT public: explicit SnarlSettings(Snore::SnorePlugin *plugin, QWidget *parent = 0); ~SnarlSettings(); diff --git a/src/plugins/backends/snore/snorenotifiersettings.cpp b/src/plugins/backends/snore/snorenotifiersettings.cpp index b2a47d2..ebbe98e 100644 --- a/src/plugins/backends/snore/snorenotifiersettings.cpp +++ b/src/plugins/backends/snore/snorenotifiersettings.cpp @@ -27,11 +27,11 @@ SnoreNotifierSettings::SnoreNotifierSettings(SnorePlugin *snore, QWidget *parent m_comboBox(new QComboBox) { - m_comboBox->addItem("TopLeftCorner", Qt::TopLeftCorner); - m_comboBox->addItem("TopRightCorner", Qt::TopRightCorner); - m_comboBox->addItem("BottomLeftCorner", Qt::BottomLeftCorner); - m_comboBox->addItem("BottomRightCorner", Qt::BottomRightCorner); - addRow("Position:", m_comboBox); + m_comboBox->addItem(tr("TopLeftCorner"), Qt::TopLeftCorner); + m_comboBox->addItem(tr("TopRightCorner"), Qt::TopRightCorner); + m_comboBox->addItem(tr("BottomLeftCorner"), Qt::BottomLeftCorner); + m_comboBox->addItem(tr("BottomRightCorner"), Qt::BottomRightCorner); + addRow(tr("Position:"), m_comboBox); } SnoreNotifierSettings::~SnoreNotifierSettings() diff --git a/src/plugins/backends/snore/snorenotifiersettings.h b/src/plugins/backends/snore/snorenotifiersettings.h index 29ae6b0..31f5696 100644 --- a/src/plugins/backends/snore/snorenotifiersettings.h +++ b/src/plugins/backends/snore/snorenotifiersettings.h @@ -29,7 +29,6 @@ class QComboBox; class SnoreNotifierSettings : public Snore::PluginSettingsWidget { Q_OBJECT - public: explicit SnoreNotifierSettings(Snore::SnorePlugin *snore, QWidget *parent = nullptr); ~SnoreNotifierSettings(); diff --git a/src/plugins/secondary_backends/sound/soundsettings.cpp b/src/plugins/secondary_backends/sound/soundsettings.cpp index 6206608..ef45486 100644 --- a/src/plugins/secondary_backends/sound/soundsettings.cpp +++ b/src/plugins/secondary_backends/sound/soundsettings.cpp @@ -28,11 +28,11 @@ SoundSettings::SoundSettings(SnorePlugin *snorePlugin, QWidget *parent) : PluginSettingsWidget(snorePlugin, parent), m_lineEdit(new QLineEdit) { - addRow("Sound File:", m_lineEdit); - QPushButton *button = new QPushButton("Select a sound File"); + addRow(tr("Sound File:"), m_lineEdit); + QPushButton *button = new QPushButton(tr("Select a sound File")); connect(button, &QPushButton::clicked, [this]() { QFileDialog dialog; - dialog.setNameFilter("All Audio files (*.mp3 *.wav *.ogg)"); + dialog.setNameFilter(tr("All Audio files").append("(*.mp3 *.wav *.ogg)")); dialog.setFileMode(QFileDialog::ExistingFile); dialog.setDirectory(m_lineEdit->text()); if (dialog.exec()) { diff --git a/src/plugins/secondary_backends/toasty/toastysettings.cpp b/src/plugins/secondary_backends/toasty/toastysettings.cpp index 1bf9800..6661de3 100644 --- a/src/plugins/secondary_backends/toasty/toastysettings.cpp +++ b/src/plugins/secondary_backends/toasty/toastysettings.cpp @@ -25,7 +25,7 @@ ToastySettings::ToastySettings(Snore::SnorePlugin *plugin, QWidget *parent) : Snore::PluginSettingsWidget(plugin, parent), m_lineEdit(new QLineEdit) { - addRow("Device ID:", m_lineEdit); + addRow(tr("Device ID:"), m_lineEdit); } ToastySettings::~ToastySettings() diff --git a/src/plugins/secondary_backends/toasty/toastysettings.h b/src/plugins/secondary_backends/toasty/toastysettings.h index ce6c376..2bc63a0 100644 --- a/src/plugins/secondary_backends/toasty/toastysettings.h +++ b/src/plugins/secondary_backends/toasty/toastysettings.h @@ -25,7 +25,6 @@ class QLineEdit; class ToastySettings : public Snore::PluginSettingsWidget { Q_OBJECT - public: explicit ToastySettings(Snore::SnorePlugin *plugin, QWidget *parent = 0); ~ToastySettings();