diff --git a/.gitignore b/.gitignore
index 182d36f..b9fe459 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,3 +27,4 @@ workspace.code-workspace
*.mak
*.plist
zcashd
+res/*.qm
\ No newline at end of file
diff --git a/application.qrc b/application.qrc
index 7bb111d..5ccc0f8 100644
--- a/application.qrc
+++ b/application.qrc
@@ -11,4 +11,9 @@
res/zcashdlogo.gif
res/logobig.gif
+
+ res/zec_qt_wallet_es.qm
+ res/zec_qt_wallet_fr.qm
+ res/zec_qt_wallet_de.qm
+
diff --git a/res/zec_qt_wallet_de.ts b/res/zec_qt_wallet_de.ts
new file mode 100644
index 0000000..8e191aa
--- /dev/null
+++ b/res/zec_qt_wallet_de.ts
@@ -0,0 +1,1089 @@
+
+
+
+
+ BalancesTableModel
+
+
+
+
+
+
+
+
+
+
+
+
+ ConnectionDialog
+
+
+
+
+
+
+
+
+
+
+
+
+ MainWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MemoDialog
+
+
+
+
+
+
+
+
+ PrivKey
+
+
+
+
+
+
+
+ QObject
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Turnstile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TurnstileProgress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ about
+
+
+
+
+
+
+
+ addressBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ confirm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ zboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/zec_qt_wallet_es.ts b/res/zec_qt_wallet_es.ts
new file mode 100644
index 0000000..08bd3c0
--- /dev/null
+++ b/res/zec_qt_wallet_es.ts
@@ -0,0 +1,1089 @@
+
+
+
+
+ BalancesTableModel
+
+
+
+
+
+
+
+
+
+
+
+
+ ConnectionDialog
+
+
+
+
+
+
+
+
+
+
+
+
+ MainWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MemoDialog
+
+
+
+
+
+
+
+
+ PrivKey
+
+
+
+
+
+
+
+ QObject
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Turnstile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TurnstileProgress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ about
+
+
+
+
+
+
+
+ addressBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ confirm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ zboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/zec_qt_wallet_fr.ts b/res/zec_qt_wallet_fr.ts
new file mode 100644
index 0000000..8f4bb65
--- /dev/null
+++ b/res/zec_qt_wallet_fr.ts
@@ -0,0 +1,1089 @@
+
+
+
+
+ BalancesTableModel
+
+
+
+
+
+
+
+
+
+
+
+
+ ConnectionDialog
+
+
+
+
+
+
+
+
+
+
+
+
+ MainWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MemoDialog
+
+
+
+
+
+
+
+
+ PrivKey
+
+
+
+
+
+
+
+ QObject
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Turnstile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TurnstileProgress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ about
+
+
+
+
+
+
+
+ addressBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ confirm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ zboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/connection.cpp b/src/connection.cpp
index a36cab6..7215527 100644
--- a/src/connection.cpp
+++ b/src/connection.cpp
@@ -38,7 +38,7 @@ void ConnectionLoader::doAutoConnect(bool tryEzcashdStart) {
// Priority 2: Try to connect to detect zcash.conf and connect to it.
auto config = autoDetectZcashConf();
- main->logger->write("Attempting autoconnect");
+ main->logger->write(QObject::tr("Attempting autoconnect"));
if (config.get() != nullptr) {
auto connection = makeConnection(config);
@@ -47,7 +47,7 @@ void ConnectionLoader::doAutoConnect(bool tryEzcashdStart) {
// Refused connection. So try and start embedded zcashd
if (Settings::getInstance()->useEmbedded()) {
if (tryEzcashdStart) {
- this->showInformation("Starting embedded zcashd");
+ this->showInformation(QObject::tr("Starting embedded zcashd"));
if (this->startEmbeddedZcashd()) {
// Embedded zcashd started up. Wait a second and then refresh the connection
main->logger->write("Embedded zcashd started up, trying autoconnect in 1 sec");
@@ -57,7 +57,7 @@ void ConnectionLoader::doAutoConnect(bool tryEzcashdStart) {
// zcashd is configured to run as a daemon, so we must wait for a few seconds
// to let it start up.
main->logger->write("zcashd is daemon=1. Waiting for it to start up");
- this->showInformation("zcashd is set to run as daemon", "Waiting for zcashd");
+ this->showInformation(QObject::tr("zcashd is set to run as daemon"), QObject::tr("Waiting for zcashd"));
QTimer::singleShot(5000, [=]() { doAutoConnect(/* don't attempt to start ezcashd */ false); });
} else {
// Something is wrong.
@@ -72,15 +72,15 @@ void ConnectionLoader::doAutoConnect(bool tryEzcashdStart) {
main->logger->write("Couldn't start embedded zcashd for unknown reason");
QString explanation;
if (config->zcashDaemon) {
- explanation = QString() % "You have zcashd set to start as a daemon, which can cause problems "
+ explanation = QString() % QObject::tr("You have zcashd set to start as a daemon, which can cause problems "
"with zec-qt-wallet\n\n."
"Please remove the following line from your zcash.conf and restart zec-qt-wallet\n"
- "daemon=1";
+ "daemon=1");
} else {
- explanation = QString() % "Couldn't start the embedded zcashd.\n\n" %
- "Please try restarting.\n\nIf you previously started zcashd with custom arguments, you might need to reset zcash.conf.\n\n" %
- "If all else fails, please run zcashd manually." %
- (ezcashd ? "The process returned:\n\n" % ezcashd->errorString() : QString(""));
+ explanation = QString() % QObject::tr("Couldn't start the embedded zcashd.\n\n"
+ "Please try restarting.\n\nIf you previously started zcashd with custom arguments, you might need to reset zcash.conf.\n\n"
+ "If all else fails, please run zcashd manually.") %
+ (ezcashd ? QObject::tr("The process returned") + ":\n\n" % ezcashd->errorString() : QString(""));
}
this->showError(explanation);
@@ -88,8 +88,8 @@ void ConnectionLoader::doAutoConnect(bool tryEzcashdStart) {
} else {
// zcash.conf exists, there's no connection, and the user asked us not to start zcashd. Error!
main->logger->write("Not using embedded and couldn't connect to zcashd");
- QString explanation = QString() % "Couldn't connect to zcashd configured in zcash.conf.\n\n" %
- "Not starting embedded zcashd because --no-embedded was passed";
+ QString explanation = QString() % QObject::tr("Couldn't connect to zcashd configured in zcash.conf.\n\n"
+ "Not starting embedded zcashd because --no-embedded was passed");
this->showError(explanation);
}
});
@@ -180,7 +180,7 @@ void ConnectionLoader::doNextDownload(std::function cb) {
client->deleteLater();
main->logger->write("All Downloads done");
- this->showInformation("All Downloads Finished Successfully!");
+ this->showInformation(QObject::tr("All Downloads Finished Successfully!"));
cb();
return;
}
@@ -203,7 +203,7 @@ void ConnectionLoader::doNextDownload(std::function cb) {
if (!currentOutput->open(QIODevice::WriteOnly)) {
main->logger->write("Couldn't open " + currentOutput->fileName() + " for writing");
- this->showError("Couldn't download params. Please check the help site for more info.");
+ this->showError(QObject::tr("Couldn't download params. Please check the help site for more info."));
}
main->logger->write("Downloading to " + filename);
qDebug() << "Downloading " << url << " to " << filename;
@@ -229,8 +229,8 @@ void ConnectionLoader::doNextDownload(std::function cb) {
}
this->showInformation(
- "Downloading " % filename % (filesRemaining > 1 ? " ( +" % QString::number(filesRemaining) % " more remaining )" : QString("")),
- QString::number(done/1024/1024, 'f', 0) % "MB of " % QString::number(total/1024/1024, 'f', 0) + "MB at " % QString::number(speed, 'f', 2) % unit);
+ QObject::tr("Downloading ") % filename % (filesRemaining > 1 ? " ( +" % QString::number(filesRemaining) % QObject::tr(" more remaining )") : QString("")),
+ QString::number(done/1024/1024, 'f', 0) % QObject::tr("MB of ") % QString::number(total/1024/1024, 'f', 0) + QObject::tr("MB at ") % QString::number(speed, 'f', 2) % unit);
});
// Download Finished
@@ -245,7 +245,7 @@ void ConnectionLoader::doNextDownload(std::function cb) {
if (currentDownload->error()) {
main->logger->write("Downloading " + filename + " failed");
- this->showError("Downloading " + filename + " failed. Please check the help site for more info");
+ this->showError(QObject::tr("Downloading ") + filename + QObject::tr(" failed. Please check the help site for more info"));
} else {
doNextDownload(cb);
}
@@ -269,7 +269,7 @@ bool ConnectionLoader::startEmbeddedZcashd() {
if (ezcashd != nullptr) {
if (ezcashd->state() == QProcess::NotRunning) {
if (!processStdErrOutput.isEmpty()) {
- QMessageBox::critical(main, "zcashd error", "zcashd said: " + processStdErrOutput,
+ QMessageBox::critical(main, QObject::tr("zcashd error"), "zcashd said: " + processStdErrOutput,
QMessageBox::Ok);
}
return false;
@@ -336,8 +336,8 @@ void ConnectionLoader::doManualConnect() {
if (!config) {
// Nothing configured, show an error
QString explanation = QString()
- % "A manual connection was requested, but the settings are not configured.\n\n"
- % "Please set the host/port and user/password in the Edit->Settings menu.";
+ % QObject::tr("A manual connection was requested, but the settings are not configured.\n\n"
+ "Please set the host/port and user/password in the Edit->Settings menu.");
showError(explanation);
doRPCSetConnection(nullptr);
@@ -348,8 +348,8 @@ void ConnectionLoader::doManualConnect() {
auto connection = makeConnection(config);
refreshZcashdState(connection, [=] () {
QString explanation = QString()
- % "Could not connect to zcashd configured in settings.\n\n"
- % "Please set the host/port and user/password in the Edit->Settings menu.";
+ % QObject::tr("Could not connect to zcashd configured in settings.\n\n"
+ "Please set the host/port and user/password in the Edit->Settings menu.");
showError(explanation);
doRPCSetConnection(nullptr);
@@ -407,9 +407,9 @@ void ConnectionLoader::refreshZcashdState(Connection* connection, std::function<
refused();
} else if (err == QNetworkReply::NetworkError::AuthenticationRequiredError) {
main->logger->write("Authentication failed");
- QString explanation = QString()
- % "Authentication failed. The username / password you specified was "
- % "not accepted by zcashd. Try changing it in the Edit->Settings menu";
+ QString explanation = QString() %
+ QObject::tr("Authentication failed. The username / password you specified was "
+ "not accepted by zcashd. Try changing it in the Edit->Settings menu");
this->showError(explanation);
} else if (err == QNetworkReply::NetworkError::InternalServerError &&
@@ -423,7 +423,7 @@ void ConnectionLoader::refreshZcashdState(Connection* connection, std::function<
if (dots > 3)
dots = 0;
}
- this->showInformation("Your zcashd is starting up. Please wait.", status);
+ this->showInformation(QObject::tr("Your zcashd is starting up. Please wait."), status);
main->logger->write("Waiting for zcashd to come online.");
// Refresh after one second
QTimer::singleShot(1000, [=]() { this->refreshZcashdState(connection, refused); });
@@ -444,7 +444,7 @@ void ConnectionLoader::showError(QString explanation) {
rpc->setEZcashd(nullptr);
rpc->noConnection();
- QMessageBox::critical(main, "Connection Error", explanation, QMessageBox::Ok);
+ QMessageBox::critical(main, QObject::tr("Connection Error"), explanation, QMessageBox::Ok);
d->close();
}
@@ -663,7 +663,7 @@ void Connection::showTxError(const QString& error) {
return;
shown = true;
- QMessageBox::critical(main, "Transaction Error", "There was an error sending the transaction. The error was: \n\n"
+ QMessageBox::critical(main, QObject::tr("Transaction Error"), QObject::tr("There was an error sending the transaction. The error was:") + "\n\n"
+ error, QMessageBox::StandardButton::Ok);
shown = false;
}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index ed46021..48cea1e 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -627,7 +627,7 @@ void MainWindow::importPrivKey() {
pui.buttonBox->button(QDialogButtonBox::Save)->setVisible(false);
pui.helpLbl->setText(QString() %
- "Please paste your private keys (z-Addr or t-Addr) here, one per line.\n" %
+ tr("Please paste your private keys (z-Addr or t-Addr) here, one per line") % ".\n" %
tr("The keys will be imported into your connected zcashd node"));
if (d.exec() == QDialog::Accepted && !pui.privKeyTxt->toPlainText().trimmed().isEmpty()) {
@@ -667,17 +667,17 @@ void MainWindow::backupWalletDat() {
QFile wallet(zcashdir.filePath("wallet.dat"));
if (!wallet.exists()) {
- QMessageBox::critical(this, "No wallet.dat", tr("Couldn't find the wallet.dat on this computer.\n") +
+ QMessageBox::critical(this, tr("No wallet.dat"), tr("Couldn't find the wallet.dat on this computer") + "\n" +
tr("You need to back it up from the machine zcashd is running on"), QMessageBox::Ok);
return;
}
- QUrl backupName = QFileDialog::getSaveFileUrl(this, "Backup wallet.dat", backupDefaultName, "Data file (*.dat)");
+ QUrl backupName = QFileDialog::getSaveFileUrl(this, tr("Backup wallet.dat"), backupDefaultName, "Data file (*.dat)");
if (backupName.isEmpty())
return;
if (!wallet.copy(backupName.toLocalFile())) {
- QMessageBox::critical(this, "Couldn't backup", tr("Couldn't backup the wallet.dat file.") +
+ QMessageBox::critical(this, tr("Couldn't backup"), tr("Couldn't backup the wallet.dat file.") +
tr("You need to back it up manually."), QMessageBox::Ok);
}
}
diff --git a/src/scripts/dotranslations.sh b/src/scripts/dotranslations.sh
new file mode 100755
index 0000000..fb7acd2
--- /dev/null
+++ b/src/scripts/dotranslations.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+if [ -z $QT_STATIC ]; then
+ echo "QT_STATIC is not set. Please set it to the base directory of a statically compiled Qt";
+ exit 1;
+fi
+
+rm -f res/*.qm
+$QT_STATIC/bin/lrelease zec-qt-wallet.pro
+
+# Then update the qt base translations. First, get all languages
+ls res/*.qm | awk -F '[_.]' '{print $4}' | while read -r language ; do
+ $QT_STATIC/bin/lconvert -o res/zec_$language.qm $QT_STATIC/translations/qtbase_$language.qm res/zec_qt_wallet_$language.qm
+ mv res/zec_$language.qm res/zec_qt_wallet_$language.qm
+done
diff --git a/src/scripts/mkmacdmg.sh b/src/scripts/mkmacdmg.sh
index 355d9e4..4ffa69d 100755
--- a/src/scripts/mkmacdmg.sh
+++ b/src/scripts/mkmacdmg.sh
@@ -34,9 +34,14 @@ rm -f artifacts/macOS-zec-qt-wallet-v$APP_VERSION.dmg
echo "[OK]"
-echo -n "Building..............."
+echo -n "Configuring............"
# Build
$QT_PATH/bin/qmake zec-qt-wallet.pro CONFIG+=release >/dev/null
+QT_STATIC=$QT_STATIC src/scripts/dotranslations.sh >/dev/null
+echo "[OK]"
+
+
+echo -n "Building..............."
make -j4 >/dev/null
echo "[OK]"
diff --git a/src/scripts/mkrelease.sh b/src/scripts/mkrelease.sh
index 86c2f97..c8f46c7 100755
--- a/src/scripts/mkrelease.sh
+++ b/src/scripts/mkrelease.sh
@@ -61,6 +61,7 @@ echo "[Building on" `lsb_release -r`"]"
echo -n "Configuring............"
$QT_STATIC/bin/qmake zec-qt-wallet.pro -spec linux-clang CONFIG+=release > /dev/null
#Mingw seems to have trouble with precompiled headers, so strip that option from the .pro file
+QT_STATIC=$QT_STATIC src/scripts/dotranslations.sh >/dev/null
echo "[OK]"
diff --git a/src/sendtab.cpp b/src/sendtab.cpp
index 309e3a5..38fd1dc 100644
--- a/src/sendtab.cpp
+++ b/src/sendtab.cpp
@@ -145,7 +145,7 @@ void MainWindow::addAddressSection() {
int itemNumber = ui->sendToWidgets->children().size() - 1;
auto verticalGroupBox = new QGroupBox(ui->sendToWidgets);
- verticalGroupBox->setTitle(QString("Recipient ") % QString::number(itemNumber));
+ verticalGroupBox->setTitle(QString(tr("Recipient ")) % QString::number(itemNumber));
verticalGroupBox->setObjectName(QString("AddressGroupBox") % QString::number(itemNumber));
auto sendAddressLayout = new QVBoxLayout(verticalGroupBox);
sendAddressLayout->setSpacing(6);
@@ -154,12 +154,12 @@ void MainWindow::addAddressSection() {
auto horizontalLayout_12 = new QHBoxLayout();
horizontalLayout_12->setSpacing(6);
auto label_4 = new QLabel(verticalGroupBox);
- label_4->setText("Address");
+ label_4->setText(tr("Address"));
horizontalLayout_12->addWidget(label_4);
auto Address1 = new QLineEdit(verticalGroupBox);
Address1->setObjectName(QString("Address") % QString::number(itemNumber));
- Address1->setPlaceholderText("Address");
+ Address1->setPlaceholderText(tr("Address"));
QObject::connect(Address1, &QLineEdit::textChanged, [=] (auto text) {
this->addressChanged(itemNumber, text);
});
@@ -169,7 +169,7 @@ void MainWindow::addAddressSection() {
auto addressBook1 = new QPushButton(verticalGroupBox);
addressBook1->setObjectName(QStringLiteral("AddressBook") % QString::number(itemNumber));
- addressBook1->setText("Address Book");
+ addressBook1->setText(tr("Address Book"));
QObject::connect(addressBook1, &QPushButton::clicked, [=] () {
AddressBook::open(this, Address1);
});
@@ -182,11 +182,11 @@ void MainWindow::addAddressSection() {
horizontalLayout_13->setSpacing(6);
auto label_6 = new QLabel(verticalGroupBox);
- label_6->setText("Amount");
+ label_6->setText(tr("Amount"));
horizontalLayout_13->addWidget(label_6);
auto Amount1 = new QLineEdit(verticalGroupBox);
- Amount1->setPlaceholderText("Amount");
+ Amount1->setPlaceholderText(tr("Amount"));
Amount1->setObjectName(QString("Amount") % QString::number(itemNumber));
Amount1->setBaseSize(QSize(200, 0));
// Create the validator for send to/amount fields
@@ -207,7 +207,7 @@ void MainWindow::addAddressSection() {
auto MemoBtn1 = new QPushButton(verticalGroupBox);
MemoBtn1->setObjectName(QString("MemoBtn") % QString::number(itemNumber));
- MemoBtn1->setText("Memo");
+ MemoBtn1->setText(tr("Memo"));
// Connect Memo Clicked button
QObject::connect(MemoBtn1, &QPushButton::clicked, [=] () {
this->memoButtonClicked(itemNumber);
@@ -251,7 +251,7 @@ void MainWindow::setMemoEnabled(int number, bool enabled) {
memoBtn->setToolTip("");
} else {
memoBtn->setEnabled(false);
- memoBtn->setToolTip("Only z-addresses can have memos");
+ memoBtn->setToolTip(tr("Only z-addresses can have memos"));
}
}
@@ -259,8 +259,8 @@ void MainWindow::memoButtonClicked(int number) {
// Memos can only be used with zAddrs. So check that first
auto addr = ui->sendToWidgets->findChild(QString("Address") + QString::number(number));
if (!AddressBook::addressFromAddressLabel(addr->text()).startsWith("z")) {
- QMessageBox msg(QMessageBox::Critical, "Memos can only be used with z-addresses",
- "The memo field can only be used with a z-address.\n" + addr->text() + "\ndoesn't look like a z-address",
+ QMessageBox msg(QMessageBox::Critical, tr("Memos can only be used with z-addresses"),
+ tr("The memo field can only be used with a z-address.\n") + addr->text() + tr("\ndoesn't look like a z-address"),
QMessageBox::Ok, this);
msg.exec();
@@ -414,7 +414,7 @@ Tx MainWindow::createTxFromSendPage() {
double change = rpc->getAllBalances()->value(tx.fromAddr) - totalAmt - tx.fee;
if (Settings::getDecimalString(change) != "0") {
- QString changeMemo = "Change from " + tx.fromAddr;
+ QString changeMemo = tr("Change from ") + tx.fromAddr;
tx.toAddrs.push_back(ToFields{ *saplingAddr, change, changeMemo, changeMemo.toUtf8().toHex() });
}
}
@@ -517,7 +517,7 @@ bool MainWindow::confirmTx(Tx tx) {
auto labelMinerFee = new QLabel(confirm.sendToAddrs);
labelMinerFee->setObjectName(QStringLiteral("labelMinerFee"));
confirm.gridLayout->addWidget(labelMinerFee, row, 0, 1, 1);
- labelMinerFee->setText("Miner Fee");
+ labelMinerFee->setText(tr("Miner Fee"));
auto minerFee = new QLabel(confirm.sendToAddrs);
QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
@@ -566,7 +566,7 @@ void MainWindow::sendButton() {
QString error = doSendTxValidations(tx);
if (!error.isEmpty()) {
// Something went wrong, so show an error and exit
- QMessageBox msg(QMessageBox::Critical, "Transaction Error", error,
+ QMessageBox msg(QMessageBox::Critical, tr("Transaction Error"), error,
QMessageBox::Ok, this);
msg.exec();
@@ -593,12 +593,12 @@ void MainWindow::sendButton() {
}
QString MainWindow::doSendTxValidations(Tx tx) {
- if (!Settings::isValidAddress(tx.fromAddr)) return QString("From Address is Invalid");
+ if (!Settings::isValidAddress(tx.fromAddr)) return QString(tr("From Address is Invalid"));
for (auto toAddr : tx.toAddrs) {
if (!Settings::isValidAddress(toAddr.addr)) {
QString addr = (toAddr.addr.length() > 100 ? toAddr.addr.left(100) + "..." : toAddr.addr);
- return QString("Recipient Address ") % addr % " is Invalid";
+ return QString(tr("Recipient Address ")) % addr % tr(" is Invalid");
}
}
diff --git a/zec-qt-wallet.pro b/zec-qt-wallet.pro
index dde32bf..deadd17 100644
--- a/zec-qt-wallet.pro
+++ b/zec-qt-wallet.pro
@@ -86,9 +86,15 @@ FORMS += \
src/zboard.ui \
src/addressbook.ui
+
+TRANSLATIONS = res/zec_qt_wallet_es.ts \
+ res/zec_qt_wallet_fr.ts \
+ res/zec_qt_wallet_de.ts
+
win32: RC_ICONS = res/icon.ico
ICON = res/logo.icns
+
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin