diff --git a/TranslationManager.cpp b/TranslationManager.cpp new file mode 100644 index 00000000..69448ce2 --- /dev/null +++ b/TranslationManager.cpp @@ -0,0 +1,63 @@ +#include "TranslationManager.h" + +#include +#include +#include +#include +#include + + +TranslationManager * TranslationManager::m_instance = nullptr; + + +TranslationManager::TranslationManager(QObject *parent) : QObject(parent) +{ + m_translator = new QTranslator(this); +} + +bool TranslationManager::setLanguage(const QString &language) +{ + qDebug() << __FUNCTION__ << " " << language; + // if language is "en", remove translator + if (language.toLower() == "en") { + qApp->removeTranslator(m_translator); + emit languageChanged(); + return true; + } + + // we expecting to have translation files in "i18n" directory + QString dir = qApp->applicationDirPath() + QDir::separator() + "i18n"; + + QString filename = "monero-core_" + language; + + qDebug("%s: loading translation file '%s' from '%s", + __FUNCTION__, qPrintable(filename), qPrintable(dir)); + + + if (m_translator->load(filename, dir)) { + qDebug("%s: translation for language '%s' loaded successfully", + __FUNCTION__, qPrintable(language)); + // TODO: apply locale? + qApp->installTranslator(m_translator); + emit languageChanged(); + return true; + } else { + qCritical("%s: error loading translation for language '%s'", + __FUNCTION__, qPrintable(language)); + return false; + } +} + +TranslationManager *TranslationManager::instance() +{ + if (!m_instance) { + m_instance = new TranslationManager(); + } + return m_instance; +} + +QString TranslationManager::emptyString() +{ + return ""; +} + diff --git a/TranslationManager.h b/TranslationManager.h new file mode 100644 index 00000000..94d0e50e --- /dev/null +++ b/TranslationManager.h @@ -0,0 +1,29 @@ +#ifndef TRANSLATIONMANAGER_H +#define TRANSLATIONMANAGER_H + +#include + +class QTranslator; +class TranslationManager : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString emptyString READ emptyString NOTIFY languageChanged) +public: + Q_INVOKABLE bool setLanguage(const QString &language); + static TranslationManager *instance(); + + QString emptyString(); + +signals: + void languageChanged(); + +private: + explicit TranslationManager(QObject *parent = 0); + +private: + static TranslationManager * m_instance; + QTranslator * m_translator; + +}; + +#endif // TRANSLATIONMANAGER_H diff --git a/get_libwallet_api.sh b/get_libwallet_api.sh index 9e69235e..53ae9268 100755 --- a/get_libwallet_api.sh +++ b/get_libwallet_api.sh @@ -2,7 +2,7 @@ BITMONERO_URL=https://github.com/mbg033/bitmonero.git -BITMONERO_BRANCH=devel +BITMONERO_BRANCH=master # thanks to SO: http://stackoverflow.com/a/20283965/4118915 CPU_CORE_COUNT=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu) pushd $(pwd) diff --git a/lang/languages.xml b/lang/languages.xml index 8f5120a7..cc47eaa1 100644 --- a/lang/languages.xml +++ b/lang/languages.xml @@ -1,14 +1,25 @@ - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/main.cpp b/main.cpp index 43ef8186..030a21c3 100644 --- a/main.cpp +++ b/main.cpp @@ -37,6 +37,7 @@ #include "WalletManager.h" #include "Wallet.h" #include "PendingTransaction.h" +#include "TranslationManager.h" @@ -53,10 +54,18 @@ int main(int argc, char *argv[]) app.installEventFilter(eventFilter); qmlRegisterType("moneroComponents", 1, 0, "Clipboard"); + qmlRegisterUncreatableType("Bitmonero.Wallet", 1, 0, "Wallet", "Wallet can't be instantiated directly"); + qmlRegisterUncreatableType("Bitmonero.PendingTransaction", 1, 0, "PendingTransaction", "PendingTransaction can't be instantiated directly"); + qmlRegisterUncreatableType("Bitmonero.WalletManager", 1, 0, "WalletManager", + "WalletManager can't be instantiated directly"); + + qmlRegisterUncreatableType("moneroComponents", 1, 0, "TranslationManager", + "TranslationManager can't be instantiated directly"); + qRegisterMetaType(); @@ -69,6 +78,8 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("walletManager", WalletManager::instance()); + engine.rootContext()->setContextProperty("translationManager", TranslationManager::instance()); + // export to QML monero accounts root directory // wizard is talking about where // to save the wallet file (.keys, .bin), they have to be user-accessible for diff --git a/monero-core.pro b/monero-core.pro index 845e0501..a5b170e5 100644 --- a/monero-core.pro +++ b/monero-core.pro @@ -19,7 +19,8 @@ HEADERS += \ src/libwalletqt/PendingTransaction.h \ src/libwalletqt/TransactionHistory.h \ src/libwalletqt/TransactionInfo.h \ - oshelper.h + oshelper.h \ + TranslationManager.h SOURCES += main.cpp \ @@ -31,7 +32,8 @@ SOURCES += main.cpp \ src/libwalletqt/PendingTransaction.cpp \ src/libwalletqt/TransactionHistory.cpp \ src/libwalletqt/TransactionInfo.cpp \ - oshelper.cpp + oshelper.cpp \ + TranslationManager.cpp lupdate_only { SOURCES = *.qml \ @@ -101,11 +103,11 @@ macx { # translations files; TRANSLATIONS = $$PWD/translations/monero-core_en.ts \ # English (could be untranslated) - $$PWD/translations/monero-core_de.ts \ # Deutsch - $$PWD/translations/monero-core_zh.ts \ # Chineese - $$PWD/translations/monero-core_ru.ts \ # Russian - $$PWD/translations/monero-core_it.ts \ # Italian - $$PWD/translations/monero-core_pl.ts \ # Polish + $$PWD/translations/monero-core_de.ts \ # Deutsch + $$PWD/translations/monero-core_zh.ts \ # Chineese + $$PWD/translations/monero-core_ru.ts \ # Russian + $$PWD/translations/monero-core_it.ts \ # Italian + $$PWD/translations/monero-core_pl.ts \ # Polish @@ -117,7 +119,7 @@ trans_update.depends = $$_PRO_FILE_ trans_release.commands = lrelease $$_PRO_FILE_ trans_release.depends = trans_update $$TRANSLATIONS -translate.commands = $(COPY) $$PWD/*.qm ${DESTDIR} +translate.commands = $(MKDIR) ${DESTDIR}/i18n && $(COPY) $$PWD/translations/*.qm ${DESTDIR}/i18n translate.depends = trans_release QMAKE_EXTRA_TARGETS += trans_update trans_release translate diff --git a/translations/monero-core_de.ts b/translations/monero-core_de.ts index 09e96e70..53c8bef3 100644 --- a/translations/monero-core_de.ts +++ b/translations/monero-core_de.ts @@ -666,12 +666,13 @@ WizardWelcome - + + Welcome - + Please choose a language and regional format. diff --git a/translations/monero-core_en.ts b/translations/monero-core_en.ts index 307233ba..957bfdd0 100644 --- a/translations/monero-core_en.ts +++ b/translations/monero-core_en.ts @@ -666,12 +666,13 @@ WizardWelcome - + + Welcome - + Please choose a language and regional format. diff --git a/translations/monero-core_it.ts b/translations/monero-core_it.ts index e59d65eb..a24a0501 100644 --- a/translations/monero-core_it.ts +++ b/translations/monero-core_it.ts @@ -666,12 +666,13 @@ WizardWelcome - + + Welcome - + Please choose a language and regional format. diff --git a/translations/monero-core_pl.ts b/translations/monero-core_pl.ts index 237bf62b..67e8a0aa 100644 --- a/translations/monero-core_pl.ts +++ b/translations/monero-core_pl.ts @@ -666,12 +666,13 @@ WizardWelcome - + + Welcome - + Please choose a language and regional format. diff --git a/translations/monero-core_ru.ts b/translations/monero-core_ru.ts index a5c61585..ab0d509c 100644 --- a/translations/monero-core_ru.ts +++ b/translations/monero-core_ru.ts @@ -6,7 +6,7 @@ Add new entry - + Новая запись @@ -666,14 +666,15 @@ WizardWelcome - + + Welcome - + Добро пожаловать - + Please choose a language and regional format. - + Пожалуйста выберите язык и региональный формат. diff --git a/translations/monero-core_zh.ts b/translations/monero-core_zh.ts index 5dc6440a..d47f1c24 100644 --- a/translations/monero-core_zh.ts +++ b/translations/monero-core_zh.ts @@ -666,12 +666,13 @@ WizardWelcome - + + Welcome - + Please choose a language and regional format. diff --git a/wizard/WizardWelcome.qml b/wizard/WizardWelcome.qml index 31bdbcb7..72bf27cc 100644 --- a/wizard/WizardWelcome.qml +++ b/wizard/WizardWelcome.qml @@ -39,11 +39,25 @@ Item { function onPageClosed(settingsObject) { var lang = languagesModel.get(gridView.currentIndex); settingsObject['language'] = lang.display_name; - settingsObject['wallet_language'] = lang.wallet_name; + settingsObject['wallet_language'] = lang.wallet_language; settingsObject['locale'] = lang.locale; return true } + +// function retranslateUi() { +// welcomeText.text = qsTr("Welcome") +// } + + +// Connections { +// target: translationManager +// onEmptyStringChanged: { +// console.log("languageChanged") +// retranslateUi() +// } +// } + Column { id: headerColumn anchors.left: parent.left @@ -55,6 +69,7 @@ Item { spacing: 24 Text { + id: welcomeText anchors.left: parent.left anchors.right: parent.right font.family: "Arial" @@ -62,10 +77,14 @@ Item { //renderType: Text.NativeRendering color: "#3F3F3F" wrapMode: Text.Wrap - text: qsTr("Welcome") + // hack to implement dynamic translation + // https://wiki.qt.io/How_to_do_dynamic_translation_in_QML + text: qsTr("Welcome") + + translationManager.emptyString } Text { + id: selectLanguageText anchors.left: parent.left anchors.right: parent.right font.family: "Arial" @@ -74,6 +93,7 @@ Item { color: "#4A4646" wrapMode: Text.Wrap text: qsTr("Please choose a language and regional format.") + + translationManager.emptyString } } @@ -84,11 +104,13 @@ Item { XmlRole { name: "display_name"; query: "@display_name/string()" } XmlRole { name: "locale"; query: "@locale/string()" } - XmlRole { name: "wallet_name"; query: "@wallet_name/string()" } + XmlRole { name: "wallet_language"; query: "@wallet_language/string()" } XmlRole { name: "flag"; query: "@flag/string()" } // TODO: XmlListModel is read only, we should store current language somewhere else // and set current language accordingly XmlRole { name: "isCurrent"; query: "@enabled/string()" } + + } GridView { @@ -111,6 +133,8 @@ Item { height: gridView.cellHeight + + Rectangle { id: flagRect width: 60; height: 60 @@ -139,8 +163,15 @@ Item { anchors.fill: parent onClicked: { gridView.currentIndex = index + var data = languagesModel.get(gridView.currentIndex); + if (data !== null || data !== undefined) { + var locale = data.locale + translationManager.setLanguage(locale.split("_")[0]); + } } } - } + } // delegate + + } }