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/README.md b/README.md
index dfdaffe..dff28d9 100644
--- a/README.md
+++ b/README.md
@@ -1,81 +1,88 @@
-zec-qt-wallet is a z-Addr first, Sapling compatible wallet and full node for zcashd that runs on Linux, Windows and macOS.
-
-![Screenshot](docs/screenshot-main.png?raw=true)
-![Screenshots](docs/screenshot-sub.png?raw=true)
-# Installation
-
-Head over to the releases page and grab the latest binary. https://github.com/adityapk00/zec-qt-wallet/releases
-
-### Linux
-Extract and run the binary.
-```
-tar -xvf zec-qt-wallet-v0.4.3.tar.gz
-./zec-qt-wallet-v0.4.3/zec-qt-wallet
-```
-
-### Windows
-Unzip the release binary and double click on zec-qt-wallet to start.
-
-### macOS
-Double-click on the .dmg file to open it, and drag zec-qt-wallet on to the Applications link to install.
-
-## zcashd
-zec-qt-wallet needs a Zcash node running zcashd. If you already have a zcashd node running, zec-qt-wallet will connect to it.
-
-If you don't have one, zec-qt-wallet will start its embedded zcashd node.
-
-Additionally, if this is the first time you're running zec-qt-wallet or a zcashd daemon, zec-qt-wallet will download the zcash params (~1.7 GB) and configure `zcash.conf` for you.
-
-Pass `--no-embedded` to disable the embedded zcashd and force zec-qt-wallet to connect to an external node.
-
-## Compiling from source
-zec-qt-wallet is written in C++ 14, and can be compiled with g++/clang++/visual c++. It also depends on Qt5, which you can get from [here](https://www.qt.io/download)
-
-See detailed build instructions [on the wiki](https://github.com/ZcashFoundation/zec-qt-wallet/wiki/Compiling-from-source-code)
-
-### Building on Linux
-
-```
-git clone https://github.com/adityapk00/zec-qt-wallet.git
-cd zec-qt-wallet
-/path/to/qt5/bin/qmake zec-qt-wallet.pro CONFIG+=debug
-make -j$(nproc)
-
-./zec-qt-wallet
-```
-
-### Building on Windows
-You need Visual Studio 2017 (The free C++ Community Edition works just fine).
-
-From the VS Tools command prompt
-```
-git clone https://github.com/adityapk00/zec-qt-wallet.git
-cd zec-qt-wallet
-c:\Qt5\bin\qmake.exe zec-qt-wallet.pro -spec win32-msvc CONFIG+=debug
-nmake
-
-debug\zec-qt-wallet.exe
-```
-
-To create the Visual Studio project files so you can compile and run from Visual Studio:
-```
-c:\Qt5\bin\qmake.exe zec-qt-wallet.pro -tp vc CONFIG+=debug
-```
-
-### Building on macOS
-You need to install the Xcode app or the Xcode command line tools first, and then install Qt.
-
-```
-git clone https://github.com/adityapk00/zec-qt-wallet.git
-cd zec-qt-wallet
-/path/to/qt5/bin/qmake zec-qt-wallet.pro CONFIG+=debug
-make
-
-./zec-qt-wallet.app/Contents/MacOS/zec-qt-wallet
-```
-
-### [Troubleshooting Guide & FAQ](https://github.com/ZcashFoundation/zec-qt-wallet/wiki/Troubleshooting-&-FAQ)
-Please read the [troubleshooting guide](https://github.com/ZcashFoundation/zec-qt-wallet/wiki/Troubleshooting-&-FAQ) for common problems and solutions.
-For support or other questions, tweet at [@zecqtwallet](https://twitter.com/zecqtwallet) or [file an issue](https://github.com/ZcashFoundation/zec-qt-wallet/issues).
-
-_PS: zec-qt-wallet is NOT an official wallet, and is not affiliated with the Zerocoin Electric Coin Company in any way._
+zec-qt-wallet is a z-Addr first, Sapling compatible wallet and full node for zcashd that runs on Linux, Windows and macOS.
+
+![Screenshot](docs/screenshot-main.png?raw=true)
+![Screenshots](docs/screenshot-sub.png?raw=true)
+# Installation
+
+Head over to the releases page and grab the latest installers or binary. https://github.com/adityapk00/zec-qt-wallet/releases
+
+### Linux
+
+If you are on Debian/Ubuntu, please download the `.deb` package and install it.
+```
+sudo dpkg -i linux-deb-zec-qt-wallet-v0.5.0.deb
+sudo apt install -f
+```
+
+Or you can download and run the binaries directly.
+```
+tar -xvf zec-qt-wallet-v0.5.0.tar.gz
+./zec-qt-wallet-v0.5.0/zec-qt-wallet
+```
+
+### Windows
+Download and run the .msi installer and follow the prompts. Alternately, you can download the release binary, unzip it and double click on zec-qt-wallet to start.
+
+### macOS
+Double-click on the .dmg file to open it, and drag zec-qt-wallet on to the Applications link to install.
+
+## zcashd
+zec-qt-wallet needs a Zcash node running zcashd. If you already have a zcashd node running, zec-qt-wallet will connect to it.
+
+If you don't have one, zec-qt-wallet will start its embedded zcashd node.
+
+Additionally, if this is the first time you're running zec-qt-wallet or a zcashd daemon, zec-qt-wallet will download the zcash params (~1.7 GB) and configure `zcash.conf` for you.
+
+Pass `--no-embedded` to disable the embedded zcashd and force zec-qt-wallet to connect to an external node.
+
+## Compiling from source
+zec-qt-wallet is written in C++ 14, and can be compiled with g++/clang++/visual c++. It also depends on Qt5, which you can get from [here](https://www.qt.io/download). Note that if you are compiling from source, you won't get the embedded zcashd by default. You can either run an external zcashd, or compile zcashd as well.
+
+See detailed build instructions [on the wiki](https://github.com/ZcashFoundation/zec-qt-wallet/wiki/Compiling-from-source-code)
+
+### Building on Linux
+
+```
+git clone https://github.com/adityapk00/zec-qt-wallet.git
+cd zec-qt-wallet
+/path/to/qt5/bin/qmake zec-qt-wallet.pro CONFIG+=debug
+make -j$(nproc)
+
+./zec-qt-wallet
+```
+
+### Building on Windows
+You need Visual Studio 2017 (The free C++ Community Edition works just fine).
+
+From the VS Tools command prompt
+```
+git clone https://github.com/adityapk00/zec-qt-wallet.git
+cd zec-qt-wallet
+c:\Qt5\bin\qmake.exe zec-qt-wallet.pro -spec win32-msvc CONFIG+=debug
+nmake
+
+debug\zec-qt-wallet.exe
+```
+
+To create the Visual Studio project files so you can compile and run from Visual Studio:
+```
+c:\Qt5\bin\qmake.exe zec-qt-wallet.pro -tp vc CONFIG+=debug
+```
+
+### Building on macOS
+You need to install the Xcode app or the Xcode command line tools first, and then install Qt.
+
+```
+git clone https://github.com/adityapk00/zec-qt-wallet.git
+cd zec-qt-wallet
+/path/to/qt5/bin/qmake zec-qt-wallet.pro CONFIG+=debug
+make
+
+./zec-qt-wallet.app/Contents/MacOS/zec-qt-wallet
+```
+
+### [Troubleshooting Guide & FAQ](https://github.com/ZcashFoundation/zec-qt-wallet/wiki/Troubleshooting-&-FAQ)
+Please read the [troubleshooting guide](https://github.com/ZcashFoundation/zec-qt-wallet/wiki/Troubleshooting-&-FAQ) for common problems and solutions.
+For support or other questions, tweet at [@zecqtwallet](https://twitter.com/zecqtwallet) or [file an issue](https://github.com/ZcashFoundation/zec-qt-wallet/issues).
+
+_PS: zec-qt-wallet is NOT an official wallet, and is not affiliated with the Zerocoin Electric Coin Company in any way._
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/docs/linguist-screenshot.png b/docs/linguist-screenshot.png
new file mode 100644
index 0000000..2f51c62
Binary files /dev/null and b/docs/linguist-screenshot.png differ
diff --git a/docs/screenshot-main.png b/docs/screenshot-main.png
index fcfebfa..acf82a5 100644
Binary files a/docs/screenshot-main.png and b/docs/screenshot-main.png differ
diff --git a/docs/screenshot-sub.png b/docs/screenshot-sub.png
index 02f0c48..e0b6881 100644
Binary files a/docs/screenshot-sub.png and b/docs/screenshot-sub.png differ
diff --git a/res/zec_qt_wallet_de.ts b/res/zec_qt_wallet_de.ts
new file mode 100644
index 0000000..051902b
--- /dev/null
+++ b/res/zec_qt_wallet_de.ts
@@ -0,0 +1,1111 @@
+
+
+
+
+ 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..e8117ed
--- /dev/null
+++ b/res/zec_qt_wallet_es.ts
@@ -0,0 +1,1111 @@
+
+
+
+
+ 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..535df76
--- /dev/null
+++ b/res/zec_qt_wallet_fr.ts
@@ -0,0 +1,1111 @@
+
+
+
+
+ BalancesTableModel
+
+
+
+
+
+
+
+
+
+
+
+
+ ConnectionDialog
+
+
+
+
+
+
+
+
+
+
+
+
+ MainWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MemoDialog
+
+
+
+
+
+
+
+
+ PrivKey
+
+
+
+
+
+
+
+ QObject
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Turnstile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TurnstileProgress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ about
+
+
+
+
+
+
+
+ addressBook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ confirm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ zboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/about.ui b/src/about.ui
index dc06b3a..743933d 100644
--- a/src/about.ui
+++ b/src/about.ui
@@ -11,19 +11,19 @@
- Dialog
+ About
-
- zec-qt-wallet
+ zec-qt-wallet
-
- Version
+ Version
@@ -40,15 +40,15 @@
0
0
- 470
- 389
+ 463
+ 517
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.1pt; font-weight:400; font-style:normal;">
diff --git a/src/addressbook.cpp b/src/addressbook.cpp
index 85f9e56..f778ed5 100644
--- a/src/addressbook.cpp
+++ b/src/addressbook.cpp
@@ -124,7 +124,7 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
if (!addr.isEmpty() && !ab.label->text().isEmpty()) {
// Test if address is valid.
if (!Settings::isValidAddress(addr)) {
- QMessageBox::critical(parent, "Address Format Error", addr + " doesn't seem to be a valid Zcash address.", QMessageBox::Ok);
+ QMessageBox::critical(parent, QObject::tr("Address Format Error"), addr + QObject::tr(" doesn't seem to be a valid Zcash address."), QMessageBox::Ok);
} else {
model.addNewLabel(ab.label->text(), ab.addr->text());
}
@@ -168,12 +168,12 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
});
}
- menu.addAction("Copy address", [&] () {
+ menu.addAction(QObject::tr("Copy address"), [&] () {
QGuiApplication::clipboard()->setText(addr);
- parent->ui->statusBar->showMessage("Copied to clipboard", 3 * 1000);
+ parent->ui->statusBar->showMessage(QObject::tr("Copied to clipboard"), 3 * 1000);
});
- menu.addAction("Delete label", [&] () {
+ menu.addAction(QObject::tr("Delete label"), [&] () {
model.removeItemAt(index.row());
});
diff --git a/src/confirm.ui b/src/confirm.ui
index 77c4d26..fe9bf27 100644
--- a/src/confirm.ui
+++ b/src/confirm.ui
@@ -48,7 +48,7 @@
- TextLabel
+ TextLabel
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -58,7 +58,7 @@
-
- TextLabel
+ TextLabel
true
@@ -68,7 +68,7 @@
-
- TextLabel
+ TextLabel
true
@@ -84,7 +84,7 @@
- TextLabel
+ TextLabel
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -94,7 +94,7 @@
-
- Miner Textlabel
+ Miner Textlabel
@@ -107,7 +107,7 @@
- TextLabel
+ TextLabel
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -123,7 +123,7 @@
- Miner Amount
+ Miner Amount
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
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/connection.ui b/src/connection.ui
index 9a33ed6..6111597 100644
--- a/src/connection.ui
+++ b/src/connection.ui
@@ -40,6 +40,9 @@
0
+
+
+
-
diff --git a/src/main.cpp b/src/main.cpp
index 86fb6d8..a11c5ab 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -4,14 +4,20 @@
#include "version.h"
-#include "precompiled.h"
-
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication a(argc, argv);
+
+ QString locale = QLocale::system().name();
+ qDebug() << "Loading locale " << locale;
+
+ QTranslator translator;
+ translator.load(QString(":/translations/res/zec_qt_wallet_") + locale);
+ a.installTranslator(&translator);
+
QIcon icon(":/icons/res/icon.ico");
QApplication::setWindowIcon(icon);
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/memodialog.ui b/src/memodialog.ui
index f34dc6a..82fccbb 100644
--- a/src/memodialog.ui
+++ b/src/memodialog.ui
@@ -24,7 +24,7 @@
-
- 0 / 512
+ 0 / 512
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
diff --git a/src/precompiled.h b/src/precompiled.h
index db0c100..59cdc9d 100644
--- a/src/precompiled.h
+++ b/src/precompiled.h
@@ -15,6 +15,7 @@
#include
#include
+#include
#include
#include
#include
diff --git a/src/privkey.ui b/src/privkey.ui
index e2e5395..9fe3760 100644
--- a/src/privkey.ui
+++ b/src/privkey.ui
@@ -34,7 +34,7 @@
-
- TextLabel
+ TextLabel
diff --git a/src/rpc.cpp b/src/rpc.cpp
index 3ff3eb0..022b225 100644
--- a/src/rpc.cpp
+++ b/src/rpc.cpp
@@ -347,7 +347,7 @@ void RPC::noConnection() {
main->statusIcon->setToolTip("");
main->statusLabel->setText(QObject::tr("No Connection"));
main->statusLabel->setToolTip("");
- main->ui->statusBar->showMessage("No Connection", 1000);
+ main->ui->statusBar->showMessage(QObject::tr("No Connection"), 1000);
// Clear balances table.
QMap emptyBalances;
@@ -572,25 +572,25 @@ void RPC::getInfoThenRefresh(bool force) {
}
txt = txt % " ( " % QString::number(progress * 100, 'f', 0) % "% )";
ui->blockheight->setText(txt);
- ui->heightLabel->setText("Downloading blocks");
+ ui->heightLabel->setText(QObject::tr("Downloading blocks"));
} else {
ui->blockheight->setText(QString::number(blockNumber));
- ui->heightLabel->setText("Block height");
+ ui->heightLabel->setText(QObject::tr("Block height"));
}
}
// Update the status bar
QString statusText = QString() %
- (isSyncing ? "Syncing" : "Connected") %
+ (isSyncing ? QObject::tr("Syncing") : QObject::tr("Connected")) %
" (" %
- (Settings::getInstance()->isTestnet() ? "testnet:" : "") %
+ (Settings::getInstance()->isTestnet() ? QObject::tr("testnet:") : "") %
QString::number(blockNumber) %
(isSyncing ? ("/" % QString::number(progress*100, 'f', 0) % "%") : QString()) %
")";
main->statusLabel->setText(statusText);
auto zecPrice = Settings::getUSDFormat(1);
- QString tooltip = "Connected to zcashd";;
+ QString tooltip = QObject::tr("Connected to zcashd");
if (!zecPrice.isEmpty()) {
tooltip = "1 ZEC = " % zecPrice % "\n" % tooltip;
}
@@ -606,7 +606,7 @@ void RPC::getInfoThenRefresh(bool force) {
static bool shown = false;
if (!shown && prevCallSucceeded) { // show error only first time
shown = true;
- QMessageBox::critical(main, "Connection Error", "There was an error connecting to zcashd. The error was: \n\n"
+ QMessageBox::critical(main, QObject::tr("Connection Error"), QObject::tr("There was an error connecting to zcashd. The error was") + ": \n\n"
+ reply->errorString(), QMessageBox::StandardButton::Ok);
shown = false;
}
@@ -844,15 +844,15 @@ void RPC::watchTxStatus() {
auto errorMsg = QString::fromStdString(it["error"]["message"]);
QMessageBox msg(
QMessageBox::Critical,
- "Transaction Error",
- "The transaction with id " % id % " failed. The error was:\n\n" % errorMsg,
+ QObject::tr("Transaction Error"),
+ QObject::tr("The transaction with id ") % id % QObject::tr(" failed. The error was") + ":\n\n" + errorMsg,
QMessageBox::Ok,
main
);
watchingOps.remove(id);
- main->ui->statusBar->showMessage(" Tx " % id % " failed", 15 * 1000);
+ main->ui->statusBar->showMessage(QObject::tr(" Tx ") % id % QObject::tr(" failed"), 15 * 1000);
main->loadingLabel->setVisible(false);
msg.exec();
@@ -871,7 +871,7 @@ void RPC::watchTxStatus() {
main->loadingLabel->setVisible(false);
} else {
main->loadingLabel->setVisible(true);
- main->loadingLabel->setToolTip(QString::number(watchingOps.size()) + " tx computing. This can take several minutes.");
+ main->loadingLabel->setToolTip(QString::number(watchingOps.size()) + QObject::tr(" tx computing. This can take several minutes."));
}
});
}
@@ -950,8 +950,8 @@ void RPC::shutdownZcashd() {
Ui_ConnectionDialog connD;
connD.setupUi(&d);
connD.topIcon->setBasePixmap(QIcon(":/icons/res/icon.ico").pixmap(256, 256));
- connD.status->setText("Please wait for zec-qt-wallet to exit");
- connD.statusDetail->setText("Waiting for zcashd to exit");
+ connD.status->setText(QObject::tr("Please wait for zec-qt-wallet to exit"));
+ connD.statusDetail->setText(QObject::tr("Waiting for zcashd to exit"));
QTimer waiter(main);
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..5fe19ed 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_STATIC=$QT_PATH src/scripts/dotranslations.sh >/dev/null
$QT_PATH/bin/qmake zec-qt-wallet.pro CONFIG+=release >/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 07bb145..b87fd19 100755
--- a/src/scripts/mkrelease.sh
+++ b/src/scripts/mkrelease.sh
@@ -59,8 +59,8 @@ echo ""
echo "[Building on" `lsb_release -r`"]"
echo -n "Configuring............"
+QT_STATIC=$QT_STATIC src/scripts/dotranslations.sh >/dev/null
$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
echo "[OK]"
@@ -89,7 +89,7 @@ cp $ZCASH_DIR/artifacts/zcash-cli bin/zec-qt-wallet-v$APP_VERSION > /dev/null
cp README.md bin/zec-qt-wallet-v$APP_VERSION > /dev/null
cp LICENSE bin/zec-qt-wallet-v$APP_VERSION > /dev/null
-cd bin && tar cvf linux-zec-qt-wallet-v$APP_VERSION.tar.gz zec-qt-wallet-v$APP_VERSION/ > /dev/null
+cd bin && tar czf linux-zec-qt-wallet-v$APP_VERSION.tar.gz zec-qt-wallet-v$APP_VERSION/ > /dev/null
cd ..
mkdir artifacts >/dev/null 2>&1
diff --git a/src/sendtab.cpp b/src/sendtab.cpp
index 309e3a5..1950f52 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();
@@ -584,7 +584,7 @@ void MainWindow::sendButton() {
// And send the Tx
rpc->sendZTransaction(params, [=](const json& reply) {
QString opid = QString::fromStdString(reply.get());
- ui->statusBar->showMessage("Computing Tx: " % opid);
+ ui->statusBar->showMessage(tr("Computing Tx: ") % opid);
// And then start monitoring the transaction
rpc->addNewTxToWatch(tx, opid);
@@ -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/src/settings.cpp b/src/settings.cpp
index fb77c6c..b9e443e 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -166,7 +166,7 @@ QString Settings::getZECUSDDisplayFormat(double bal) {
return getZECDisplayFormat(bal);
}
-const QString Settings::txidStatusMessage = QString("Tx submitted (right click to copy) txid:");
+const QString Settings::txidStatusMessage = QString(QObject::tr("Tx submitted (right click to copy) txid:"));
QString Settings::getTokenName() {
if (Settings::getInstance()->isTestnet()) {
diff --git a/src/settings.ui b/src/settings.ui
index d3d633e..a01fc4e 100644
--- a/src/settings.ui
+++ b/src/settings.ui
@@ -6,10 +6,16 @@
0
0
- 455
- 391
+ 460
+ 464
+
+
+ 460
+ 464
+
+
Settings
@@ -20,7 +26,7 @@
-
- 1
+ 0
@@ -30,7 +36,7 @@
-
- <html><head/><body><p><br/></p></body></html>
+ <html><head/><body><p><br/></p></body></html>
Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
diff --git a/src/turnstile.cpp b/src/turnstile.cpp
index 95b1bbe..a2e1c2c 100644
--- a/src/turnstile.cpp
+++ b/src/turnstile.cpp
@@ -116,8 +116,8 @@ void Turnstile::planMigration(QString zaddr, QString destAddr, int numsplits, in
if (migItems.empty()) {
// Show error and abort
QMessageBox::warning(mainwindow,
- "Locked funds",
- "Could not initiate migration.\nYou either have unconfirmed funds or the balance is too low for an automatic migration.");
+ QObject::tr("Locked funds"),
+ QObject::tr("Could not initiate migration.\nYou either have unconfirmed funds or the balance is too low for an automatic migration."));
return;
}
@@ -357,7 +357,7 @@ void Turnstile::doSendTx(Tx tx, std::function cb) {
rpc->sendZTransaction(params, [=] (const json& reply) {
QString opid = QString::fromStdString(reply.get());
//qDebug() << opid;
- mainwindow->ui->statusBar->showMessage("Computing Tx: " % opid);
+ mainwindow->ui->statusBar->showMessage(QObject::tr("Computing Tx: ") % opid);
// And then start monitoring the transaction
rpc->addNewTxToWatch(tx, opid);
diff --git a/src/turnstile.ui b/src/turnstile.ui
index e39a1f7..378bfa9 100644
--- a/src/turnstile.ui
+++ b/src/turnstile.ui
@@ -159,7 +159,7 @@
- 0.0004 ZEC $0.04
+ 0.0004 ZEC $0.04
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
diff --git a/src/turnstileprogress.ui b/src/turnstileprogress.ui
index 692630b..d52b72e 100644
--- a/src/turnstileprogress.ui
+++ b/src/turnstileprogress.ui
@@ -31,14 +31,14 @@
-
- From Address
+ From Address
-
- 4 / 12
+ 4 / 12
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -111,7 +111,7 @@
- TextLabel
+ TextLabel
Qt::AlignCenter
@@ -141,7 +141,7 @@
-
- To Address
+ To Address
diff --git a/src/txtablemodel.cpp b/src/txtablemodel.cpp
index 7f9ecd3..d610b47 100644
--- a/src/txtablemodel.cpp
+++ b/src/txtablemodel.cpp
@@ -4,7 +4,7 @@
TxTableModel::TxTableModel(QObject *parent)
: QAbstractTableModel(parent) {
- headers << "Type" << "Address" << "Date/Time" << "Amount";
+ headers << QObject::tr("Type") << QObject::tr("Address") << QObject::tr("Date/Time") << QObject::tr("Amount");
}
TxTableModel::~TxTableModel() {
diff --git a/src/version.h b/src/version.h
index 87d67c8..5d78b32 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "0.4.3"
+#define APP_VERSION "0.5.0"
diff --git a/src/zboard.ui b/src/zboard.ui
index 8a16047..b21db5e 100644
--- a/src/zboard.ui
+++ b/src/zboard.ui
@@ -24,7 +24,7 @@
-
- feeamount
+ feeamount
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -34,7 +34,7 @@
-
- 0 / 512
+ 0 / 512
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -104,7 +104,7 @@
color:red;
- TextLabel
+ Warning
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