diff options
179 files changed, 12158 insertions, 3096 deletions
diff --git a/.travis.yml b/.travis.yml index d2fbfee6f2..e2d43d6330 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ # - A travis bug causes caches to trample eachother when using the same # compiler key (which we don't use anyway). This is worked around for now by # replacing the "compilers" with a build name prefixed by the no-op ":" -# command. See: https://github.com/travis-ci/casher/issues/6 +# command. See: https://github.com/travis-ci/travis-ci/issues/4393 os: linux language: cpp @@ -48,7 +48,7 @@ lots of money. ### Automated Testing -Developers are strongly encouraged to write unit tests for new code, and to +Developers are strongly encouraged to write [unit tests](/doc/unit-tests.md) for new code, and to submit new unit tests for old code. Unit tests can be compiled and run (assuming they weren't disabled in configure) with: `make check` diff --git a/configure.ac b/configure.ac index 63a745393e..9161e2b2c0 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 0) -define(_CLIENT_VERSION_MINOR, 11) +define(_CLIENT_VERSION_MINOR, 12) define(_CLIENT_VERSION_REVISION, 99) define(_CLIENT_VERSION_BUILD, 0) define(_CLIENT_VERSION_IS_RELEASE, false) diff --git a/contrib/devtools/README.md b/contrib/devtools/README.md index 2e70c5adcc..a58b8733a6 100644 --- a/contrib/devtools/README.md +++ b/contrib/devtools/README.md @@ -7,6 +7,37 @@ clang-format.py A script to format cpp source code according to [.clang-format](../../src/.clang-format). This should only be applied to new files or files which are currently not actively developed on. Also, git subtrees are not subject to formatting. +fix-copyright-headers.py +======================== + +Every year newly updated files need to have its copyright headers updated to reflect the current year. +If you run this script from src/ it will automatically update the year on the copyright header for all +.cpp and .h files if these have a git commit from the current year. + +For example a file changed in 2014 (with 2014 being the current year): + +```// Copyright (c) 2009-2013 The Bitcoin Core developers``` + +would be changed to: + +```// Copyright (c) 2009-2014 The Bitcoin Core developers``` + +git-subtree-check.sh +==================== + +Run this script from the root of the repository to verify that a subtree matches the contents of +the commit it claims to have been updated to. + +To use, make sure that you have fetched the upstream repository branch in which the subtree is +maintained: +* for `src/secp256k1`: https://github.com/bitcoin/secp256k1.git (branch master) +* for `src/leveldb`: https://github.com/bitcoin/leveldb.git (branch bitcoin-fork) +* for `src/univalue`: https://github.com/bitcoin/univalue.git (branch master) + +Usage: `git-subtree-check.sh DIR COMMIT` + +`COMMIT` may be omitted, in which case `HEAD` is used. + github-merge.sh =============== @@ -41,21 +72,6 @@ Configuring the github-merge tool for the bitcoin repository is done in the foll git config githubmerge.testcmd "make -j4 check" (adapt to whatever you want to use for testing) git config --global user.signingkey mykeyid (if you want to GPG sign) -fix-copyright-headers.py -======================== - -Every year newly updated files need to have its copyright headers updated to reflect the current year. -If you run this script from src/ it will automatically update the year on the copyright header for all -.cpp and .h files if these have a git commit from the current year. - -For example a file changed in 2014 (with 2014 being the current year): - -```// Copyright (c) 2009-2013 The Bitcoin Core developers``` - -would be changed to: - -```// Copyright (c) 2009-2014 The Bitcoin Core developers``` - optimize-pngs.py ================ @@ -98,18 +114,3 @@ It will do the following automatically: - add missing translations to the build system (TODO) See doc/translation-process.md for more information. - -git-subtree-check.sh -==================== - -Run this script from the root of the repository to verify that a subtree matches the contents of -the commit it claims to have been updated to. - -To use, make sure that you have fetched the upstream repository branch in which the subtree is -maintained: -* for src/secp256k1: https://github.com/bitcoin/secp256k1.git (branch master) -* for sec/leveldb: https://github.com/bitcoin/leveldb.git (branch bitcoin-fork) - -Usage: git-subtree-check.sh DIR COMMIT - -COMMIT may be omitted, in which case HEAD is used. diff --git a/contrib/devtools/update-translations.py b/contrib/devtools/update-translations.py index f955e4a1f2..ea209eec7e 100755 --- a/contrib/devtools/update-translations.py +++ b/contrib/devtools/update-translations.py @@ -29,6 +29,8 @@ TX = 'tx' SOURCE_LANG = 'bitcoin_en.ts' # Directory with locale files LOCALE_DIR = 'src/qt/locale' +# Minimum number of messages for translation to be considered at all +MIN_NUM_MESSAGES = 10 def check_at_repository_root(): if not os.path.exists('.git'): @@ -37,7 +39,7 @@ def check_at_repository_root(): exit(1) def fetch_all_translations(): - if subprocess.call([TX, 'pull', '-f']): + if subprocess.call([TX, 'pull', '-f', '-a']): print('Error while fetching translations', file=sys.stderr) exit(1) @@ -166,6 +168,15 @@ def postprocess_translations(reduce_diff_hacks=False): if translation_node.get('type') == 'unfinished': context.remove(message) + # check if document is (virtually) empty, and remove it if so + num_messages = 0 + for context in root.findall('context'): + for message in context.findall('message'): + num_messages += 1 + if num_messages < MIN_NUM_MESSAGES: + print('Removing %s, as it contains only %i messages' % (filepath, num_messages)) + continue + # write fixed-up tree # if diff reduction requested, replace some XML to 'sanitize' to qt formatting if reduce_diff_hacks: diff --git a/contrib/gitian-descriptors/README.md b/contrib/gitian-descriptors/README.md index 07c2ba98b1..6149706596 100644 --- a/contrib/gitian-descriptors/README.md +++ b/contrib/gitian-descriptors/README.md @@ -1,8 +1,7 @@ -### Gavin's notes on getting gitian builds up and running using KVM:### +### Gavin's notes on getting gitian builds up and running using KVM -These instructions distilled from: -[ https://help.ubuntu.com/community/KVM/Installation]( https://help.ubuntu.com/community/KVM/Installation) -... see there for complete details. +These instructions distilled from +[https://help.ubuntu.com/community/KVM/Installation](https://help.ubuntu.com/community/KVM/Installation). You need the right hardware: you need a 64-bit-capable CPU with hardware virtualization support (Intel VT-x or AMD-V). Not all modern CPUs support hardware virtualization. @@ -33,14 +32,14 @@ Once you've got the right hardware and software: # Get inputs (see doc/release-process.md for exact inputs needed and where to get them) ... - # For further build instructions see doc/release-notes.md + # For further build instructions see doc/release-process.md ... --------------------- `gitian-builder` now also supports building using LXC. See -[ https://help.ubuntu.com/12.04/serverguide/lxc.html]( https://help.ubuntu.com/12.04/serverguide/lxc.html) -... for how to get LXC up and running under Ubuntu. +[help.ubuntu.com](https://help.ubuntu.com/14.04/serverguide/lxc.html) +for how to get LXC up and running under Ubuntu. If your main machine is a 64-bit Mac or PC with a few gigabytes of memory and at least 10 gigabytes of free disk space, you can `gitian-build` using diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 0c3c439dd9..52b898b675 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-linux-0.12" +name: "bitcoin-linux-0.13" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 9ac774c8a0..cdb266d75d 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-osx-0.12" +name: "bitcoin-osx-0.13" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index 6bb482d45f..51240b2ce0 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-win-0.12" +name: "bitcoin-win-0.13" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-downloader/linux-download-config b/contrib/gitian-downloader/linux-download-config deleted file mode 100644 index c0048d336e..0000000000 --- a/contrib/gitian-downloader/linux-download-config +++ /dev/null @@ -1,45 +0,0 @@ ---- -name: bitcoin -urls: -- http://bitcoin.org/bitcoin-latest-linux-gitian.zip -rss: -- url: - xpath: //item/link/text() - pattern: bitcoin-\d+.\d+.\d+-linux-gitian.zip -signers: - 0A82509767C7D4A5D14DA2301AE1D35043E08E54: - name: BlueMatt - key: bluematt - BF6273FAEF7CC0BA1F562E50989F6B3048A116B5: - name: Devrandom - key: devrandom - E463A93F5F3117EEDE6C7316BD02942421F4889F: - name: Luke-Jr - key: luke-jr - D762373D24904A3E42F33B08B9A408E71DAAC974: - name: "Pieter Wuille" - key: sipa - 77E72E69DA7EE0A148C06B21B34821D4944DE5F7: - name: tcatm - key: tcatm - 01CDF4627A3B88AAE4A571C87588242FBE38D3A8: - name: "Gavin Andresen" - key: gavinandresen - 71A3B16735405025D447E8F274810B012346C9A6: - name: "Wladimir J. van der Laan" - key: laanwj - AEC1884398647C47413C1C3FB1179EB7347DC10D: - name: "Warren Togami" - key: wtogami - 9692B91BBF0E8D34DFD33B1882C5C009628ECF0C: - name: michagogo - key: michagogo - E944AE667CF960B1004BC32FCA662BE18B877A60: - name: "Andreas Schildbach" - key: aschildbach - C060A6635913D98A3587D7DB1C2491FFEB0EF770: - name: "Cory Fields" - key: "cfields" - 37EC7D7B0A217CDB4B4E007E7FAB114267E4FA04: - name: "Peter Todd" - key: "petertodd" diff --git a/contrib/gitian-downloader/win32-download-config b/contrib/gitian-downloader/win32-download-config deleted file mode 100644 index 0ad3bdd4f3..0000000000 --- a/contrib/gitian-downloader/win32-download-config +++ /dev/null @@ -1,45 +0,0 @@ ---- -name: bitcoin -urls: -- http://bitcoin.org/bitcoin-latest-win32-gitian.zip -rss: -- url: - xpath: //item/link/text() - pattern: bitcoin-\d+.\d+.\d+-win32-gitian.zip -signers: - 0A82509767C7D4A5D14DA2301AE1D35043E08E54: - name: BlueMatt - key: bluematt - BF6273FAEF7CC0BA1F562E50989F6B3048A116B5: - name: Devrandom - key: devrandom - E463A93F5F3117EEDE6C7316BD02942421F4889F: - name: Luke-Jr - key: luke-jr - D762373D24904A3E42F33B08B9A408E71DAAC974: - name: "Pieter Wuille" - key: sipa - 77E72E69DA7EE0A148C06B21B34821D4944DE5F7: - name: tcatm - key: tcatm - 01CDF4627A3B88AAE4A571C87588242FBE38D3A8: - name: "Gavin Andresen" - key: gavinandresen - 71A3B16735405025D447E8F274810B012346C9A6: - name: "Wladimir J. van der Laan" - key: laanwj - AEC1884398647C47413C1C3FB1179EB7347DC10D: - name: "Warren Togami" - key: wtogami - 9692B91BBF0E8D34DFD33B1882C5C009628ECF0C: - name: michagogo - key: michagogo - E944AE667CF960B1004BC32FCA662BE18B877A60: - name: "Andreas Schildbach" - key: aschildbach - C060A6635913D98A3587D7DB1C2491FFEB0EF770: - name: "Cory Fields" - key: "cfields" - 37EC7D7B0A217CDB4B4E007E7FAB114267E4FA04: - name: "Peter Todd" - key: "petertodd" diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py index 167c219c6e..a3d0352187 100755 --- a/contrib/seeds/generate-seeds.py +++ b/contrib/seeds/generate-seeds.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright (c) 2014 Wladmir J. van der Laan +# Copyright (c) 2014 Wladimir J. van der Laan # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. ''' diff --git a/doc/Doxyfile b/doc/Doxyfile index 925a33ee89..428fba98e1 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -34,7 +34,7 @@ PROJECT_NAME = Bitcoin # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 0.11.99 +PROJECT_NUMBER = 0.12.99 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer diff --git a/doc/README.md b/doc/README.md index f6df28a89b..c0f9ee5220 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,4 +1,4 @@ -Bitcoin Core 0.11.99 +Bitcoin Core 0.12.99 ===================== Setup diff --git a/doc/README_windows.txt b/doc/README_windows.txt index e4fd9bdf90..2d1c4503c9 100644 --- a/doc/README_windows.txt +++ b/doc/README_windows.txt @@ -1,4 +1,4 @@ -Bitcoin Core 0.11.99
+Bitcoin Core 0.12.99
=====================
Intro
diff --git a/doc/build-osx.md b/doc/build-osx.md index 02498e5c4b..c3cb1b7891 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -5,7 +5,7 @@ This guide will show you how to build bitcoind (headless client) for OS X. Notes ----- -* Tested on OS X 10.7 through 10.10 on 64-bit Intel processors only. +* Tested on OS X 10.7 through 10.11 on 64-bit Intel processors only. * All of the commands should be executed in a Terminal application. The built-in one is located in `/Applications/Utilities`. @@ -24,7 +24,7 @@ be re-done or updated every time Xcode is updated. You will also need to install [Homebrew](http://brew.sh) in order to install library dependencies. -The installation of the actual dependencies is covered in the Instructions +The installation of the actual dependencies is covered in the instructions sections below. Instructions: Homebrew @@ -36,17 +36,19 @@ Instructions: Homebrew NOTE: Building with Qt4 is still supported, however, could result in a broken UI. As such, building with Qt5 is recommended. -### Building `bitcoind` +### Building `bitcoin` 1. Clone the GitHub tree to get the source code and go into the directory. git clone https://github.com/bitcoin/bitcoin.git cd bitcoin -2. Build bitcoind: +2. Build bitcoin-core: + This will configure and build the headless bitcoin binaries as well as the gui (if Qt is found). + You can disable the gui build by passing `--without-gui` to configure. ./autogen.sh - ./configure --with-gui=qt5 + ./configure make 3. It is also a good idea to build and run the unit tests: @@ -60,10 +62,10 @@ NOTE: Building with Qt4 is still supported, however, could result in a broken UI Use Qt Creator as IDE ------------------------ You can use Qt Creator as IDE, for debugging and for manipulating forms, etc. -Download Qt Creator from http://www.qt.io/download/. Download the "community edition" and only install Qt Creator (uncheck the rest during the installation process). +Download Qt Creator from https://www.qt.io/download/. Download the "community edition" and only install Qt Creator (uncheck the rest during the installation process). 1. Make sure you installed everything through Homebrew mentioned above -2. Do a proper ./configure --with-gui=qt5 --enable-debug +2. Do a proper ./configure --enable-debug 3. In Qt Creator do "New Project" -> Import Project -> Import Existing Project 4. Enter "bitcoin-qt" as project name, enter src/qt as location 5. Leave the file selection as it is @@ -79,7 +81,7 @@ You can ignore this section if you are building `bitcoind` for your own use. bitcoind/bitcoin-cli binaries are not included in the Bitcoin-Qt.app bundle. -If you are building `bitcoind` or `Bitcoin-Qt` for others, your build machine should be set up +If you are building `bitcoind` or `Bitcoin Core` for others, your build machine should be set up as follows for maximum compatibility: All dependencies should be compiled with these flags: @@ -88,7 +90,7 @@ All dependencies should be compiled with these flags: -arch x86_64 -isysroot $(xcode-select --print-path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk -Once dependencies are compiled, see [doc/release-process.md](release-process.md) for how the Bitcoin-Qt.app +Once dependencies are compiled, see [doc/release-process.md](release-process.md) for how the Bitcoin Core bundle is packaged and signed to create the .dmg disk image that is distributed. Running diff --git a/doc/developer-notes.md b/doc/developer-notes.md index 01eea931ad..358792251b 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -218,7 +218,7 @@ General Bitcoin Core - *Rationale*: RPC allows for better automatic testing. The test suite for the GUI is very limited -- Make sure pulls pass Travis CI before merging +- Make sure pull requests pass Travis CI before merging - *Rationale*: Makes sure that they pass thorough testing, and that the tester will keep passing on the master branch. Otherwise all new pull requests will start failing the tests, resulting in @@ -230,9 +230,9 @@ General Bitcoin Core Wallet ------- -- Make sure that that no crashes happen with run-time option `-disablewallet`. +- Make sure that no crashes happen with run-time option `-disablewallet`. - - *Rationale*: In RPC code that conditionally use the wallet (such as + - *Rationale*: In RPC code that conditionally uses the wallet (such as `validateaddress`) it is easy to forget that global pointer `pwalletMain` can be NULL. See `qa/rpc-tests/disablewallet.py` for functional tests exercising the API with `-disablewallet` @@ -250,9 +250,9 @@ General C++ with assertions disabled, having side-effects in assertions is unexpected and makes the code harder to understand -- If you use the .h, you must link the .cpp +- If you use the `.h`, you must link the `.cpp` - - *Rationale*: Include files are the interface for the implementation file. Including one but + - *Rationale*: Include files define the interface for the code in implementation files. Including one but not linking the other is confusing. Please avoid that. Moving functions from the `.h` to the `.cpp` should not result in build errors @@ -264,11 +264,11 @@ General C++ C++ data structures -------------------- -- Never use the std::map [] syntax when reading from a map, but instead use .find() +- Never use the `std::map []` syntax when reading from a map, but instead use `.find()` - - *Rationale*: [] does an insert (of the default element) if the item doesn't + - *Rationale*: `[]` does an insert (of the default element) if the item doesn't exist in the map yet. This has resulted in memory leaks in the past, as well as - race conditions (expecting read-read behavior). Using [] is fine for *writing* to a map + race conditions (expecting read-read behavior). Using `[]` is fine for *writing* to a map - Do not compare an iterator from one data structure with an iterator of another data structure (even if of the same type) @@ -304,18 +304,18 @@ C++ data structures Strings and formatting ------------------------ -- Be careful of LogPrint versus LogPrintf. LogPrint takes a 'category' argument, LogPrintf does not. +- Be careful of `LogPrint` versus `LogPrintf`. `LogPrint` takes a `category` argument, `LogPrintf` does not. - *Rationale*: Confusion of these can result in runtime exceptions due to formatting mismatch, and it is easy to get wrong because of subtly similar naming -- Use std::string, avoid C string manipulation functions +- Use `std::string`, avoid C string manipulation functions - *Rationale*: C++ string handling is marginally safer, less scope for - buffer overflows and surprises with \0 characters. Also some C string manipulations + buffer overflows and surprises with `\0` characters. Also some C string manipulations tend to act differently depending on platform, or even the user locale -- Use ParseInt32, ParseInt64, ParseDouble from `utilstrencodings.h` for number parsing +- Use `ParseInt32`, `ParseInt64`, `ParseDouble` from `utilstrencodings.h` for number parsing - *Rationale*: These functions do overflow checking, and avoid pesky locale issues diff --git a/doc/release-notes.md b/doc/release-notes.md index f7958381b6..8bb842ddb8 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -4,218 +4,11 @@ release-notes at release time) Notable changes =============== -SSL support for RPC dropped ----------------------------- +Example item +---------------- -SSL support for RPC, previously enabled by the option `rpcssl` has been dropped -from both the client and the server. This was done in preparation for removing -the dependency on OpenSSL for the daemon completely. -Trying to use `rpcssl` will result in an error: - - Error: SSL mode for RPC (-rpcssl) is no longer supported. - -If you are one of the few people that relies on this feature, a flexible -migration path is to use `stunnel`. This is an utility that can tunnel -arbitrary TCP connections inside SSL. On e.g. Ubuntu it can be installed with: - - sudo apt-get install stunnel4 - -Then, to tunnel a SSL connection on 28332 to a RPC server bound on localhost on port 18332 do: - - stunnel -d 28332 -r 127.0.0.1:18332 -p stunnel.pem -P '' - -It can also be set up system-wide in inetd style. - -Another way to re-attain SSL would be to setup a httpd reverse proxy. This solution -would allow the use of different authentication, loadbalancing, on-the-fly compression and -caching. A sample config for apache2 could look like: - - Listen 443 - - NameVirtualHost *:443 - <VirtualHost *:443> - - SSLEngine On - SSLCertificateFile /etc/apache2/ssl/server.crt - SSLCertificateKeyFile /etc/apache2/ssl/server.key - - <Location /bitcoinrpc> - ProxyPass http://127.0.0.1:8332/ - ProxyPassReverse http://127.0.0.1:8332/ - # optional enable digest auth - # AuthType Digest - # ... - - # optional bypass bitcoind rpc basic auth - # RequestHeader set Authorization "Basic <hash>" - # get the <hash> from the shell with: base64 <<< bitcoinrpc:<password> - </Location> - - # Or, balance the load: - # ProxyPass / balancer://balancer_cluster_name - - </VirtualHost> - -Random-cookie RPC authentication ---------------------------------- - -When no `-rpcpassword` is specified, the daemon now uses a special 'cookie' -file for authentication. This file is generated with random content when the -daemon starts, and deleted when it exits. Its contents are used as -authentication token. Read access to this file controls who can access through -RPC. By default it is stored in the data directory but its location can be -overridden with the option `-rpccookiefile`. - -This is similar to Tor's CookieAuthentication: see -https://www.torproject.org/docs/tor-manual.html.en - -This allows running bitcoind without having to do any manual configuration. - -Low-level RPC API changes --------------------------- - -- Monetary amounts can be provided as strings. This means that for example the - argument to sendtoaddress can be "0.0001" instead of 0.0001. This can be an - advantage if a JSON library insists on using a lossy floating point type for - numbers, which would be dangerous for monetary amounts. - -Option parsing behavior ------------------------ - -Command line options are now parsed strictly in the order in which they are -specified. It used to be the case that `-X -noX` ends up, unintuitively, with X -set, as `-X` had precedence over `-noX`. This is no longer the case. Like for -other software, the last specified value for an option will hold. - -`NODE_BLOOM` service bit ------------------------- - -Support for the `NODE_BLOOM` service bit, as described in [BIP -111](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki), has been -added to the P2P protocol code. - -BIP 111 defines a service bit to allow peers to advertise that they support -bloom filters (such as used by SPV clients) explicitly. It also bumps the protocol -version to allow peers to identify old nodes which allow bloom filtering of the -connection despite lacking the new service bit. - -In this version, it is only enforced for peers that send protocol versions -`>=70011`. For the next major version it is planned that this restriction will be -removed. It is recommended to update SPV clients to check for the `NODE_BLOOM` -service bit for nodes that report versions newer than 70011. - -Any sequence of pushdatas in OP_RETURN outputs now allowed ----------------------------------------------------------- - -Previously OP_RETURN outputs with a payload were only relayed and mined if they -had a single pushdata. This restriction has been lifted to allow any -combination of data pushes and numeric constant opcodes (OP_1 to OP_16). The -limit on OP_RETURN output size is now applied to the entire serialized -scriptPubKey, 83 bytes by default. (the previous 80 byte default plus three -bytes overhead) - -Merkle branches removed from wallet ------------------------------------ - -Previously, every wallet transaction stored a Merkle branch to prove its -presence in blocks. This wasn't being used for more than an expensive -sanity check. Since 0.12, these are no longer stored. When loading a -0.12 wallet into an older version, it will automatically rescan to avoid -failed checks. - -BIP65 - CHECKLOCKTIMEVERIFY ---------------------------- - -Previously it was impossible to create a transaction output that was guaranteed -to be unspendable until a specific date in the future. CHECKLOCKTIMEVERIFY is a -new opcode that allows a script to check if a specific block height or time has -been reached, failing the script otherwise. This enables a wide variety of new -functionality such as time-locked escrows, secure payment channels, etc. - -BIP65 implements CHECKLOCKTIMEVERIFY by introducing block version 4, which adds -additional restrictions to the NOP2 opcode. The same miner-voting mechanism as -in BIP34 and BIP66 is used: when 751 out of a sequence of 1001 blocks have -version number 4 or higher, the new consensus rule becomes active for those -blocks. When 951 out of a sequence of 1001 blocks have version number 4 or -higher, it becomes mandatory for all blocks and blocks with versions less than -4 are rejected. - -Bitcoin Core's block templates are now for version 4 blocks only, and any -mining software relying on its `getblocktemplate` must be updated in parallel -to use either libblkmaker version 0.4.3 or any version from 0.5.2 onward. If -you are solo mining, this will affect you the moment you upgrade Bitcoin Core, -which must be done prior to BIP65 achieving its 951/1001 status. If you are -mining with the stratum mining protocol: this does not affect you. If you are -mining with the getblocktemplate protocol to a pool: this will affect you at -the pool operator's discretion, which must be no later than BIP65 achieving its -951/1001 status. - -Automatically use Tor hidden services -------------------------------------- - -Starting with Tor version 0.2.7.1 it is possible, through Tor's control socket -API, to create and destroy 'ephemeral' hidden services programmatically. -Bitcoin Core has been updated to make use of this. - -This means that if Tor is running (and proper authorization is available), -Bitcoin Core automatically creates a hidden service to listen on, without -manual configuration. Bitcoin Core will also use Tor automatically to connect -to other .onion nodes if the control socket can be successfully opened. This -will positively affect the number of available .onion nodes and their usage. - -This new feature is enabled by default if Bitcoin Core is listening, and -a connection to Tor can be made. It can be configured with the `-listenonion`, -`-torcontrol` and `-torpassword` settings. To show verbose debugging -information, pass `-debug=tor`. - -Reduce upload traffic ---------------------- - -A major part of the outbound traffic is caused by serving historic blocks to -other nodes in initial block download state. - -It is now possible to reduce the total upload traffic via the `-maxuploadtarget` -parameter. This is *not* a hard limit but a threshold to minimize the outbound -traffic. When the limit is about to be reached, the uploaded data is cut by not -serving historic blocks (blocks older than one week). -Moreover, any SPV peer is disconnected when they request a filtered block. - -This option can be specified in MiB per day and is turned off by default -(`-maxuploadtarget=0`). -The recommended minimum is 144 * MAX_BLOCK_SIZE (currently 144MB) per day. - -Whitelisted peers will never be disconnected, although their traffic counts for -calculating the target. - -A more detailed documentation about keeping traffic low can be found in -[/doc/reducetraffic.md](/doc/reducetraffic.md). - -Signature validation using libsecp256k1 ---------------------------------------- - -ECDSA signatures inside Bitcoin transactions now use validation using -[https://github.com/bitcoin/secp256k1](libsecp256k1) instead of OpenSSL. - -Depending on the platform, this means a significant speedup for raw signature -validation speed. The advantage is largest on x86_64, where validation is over -five times faster. In practice, this translates to a raw reindexing and new -block validation times that are less than half of what it was before. - -Libsecp256k1 has undergone very extensive testing and validation. - -A side effect of this change is that libconsensus no longer depends on OpenSSL. - -Direct headers announcement (BIP 130) -------------------------------------- - -Between compatible peers, BIP 130 direct headers announcement is used. This -means that blocks are advertized by announcing their headers directly, instead -of just announcing the hash. In a reorganization, all new headers are sent, -instead of just the new tip. This can often prevent an extra roundtrip before -the actual block is downloaded. - -0.12.0 Change log +0.13.0 Change log ================= Detailed release notes follow. This overview includes changes that affect @@ -225,33 +18,6 @@ git merge commit are mentioned. ### RPC and REST -Asm representations of scriptSig signatures now contain SIGHASH type decodes ----------------------------------------------------------------------------- - -The `asm` property of each scriptSig now contains the decoded signature hash -type for each signature that provides a valid defined hash type. - -The following items contain assembly representations of scriptSig signatures -and are affected by this change: - -- RPC `getrawtransaction` -- RPC `decoderawtransaction` -- REST `/rest/tx/` (JSON format) -- REST `/rest/block/` (JSON format when including extended tx details) -- `bitcoin-tx -json` - -For example, the `scriptSig.asm` property of a transaction input that -previously showed an assembly representation of: - - 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c509001 - -now shows as: - - 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090[ALL] - -Note that the output of the RPC `decodescript` did not change because it is -configured specifically to process scriptPubKey and not scriptSig scripts. - ### Configuration and command-line options ### Block and transaction handling @@ -270,13 +36,3 @@ configured specifically to process scriptPubKey and not scriptSig scripts. ### Miscellaneous -- Removed bitrpc.py from contrib - -Addition of ZMQ-based Notifications -================================== - -Bitcoind can now (optionally) asynchronously notify clients through a -ZMQ-based PUB socket of the arrival of new transactions and blocks. -This feature requires installation of the ZMQ C API library 4.x and -configuring its use through the command line or configuration file. -Please see docs/zmq.md for details of operation. diff --git a/doc/release-notes/release-notes-0.6.3.md b/doc/release-notes/release-notes-0.6.3.md index 28bb20e104..c27f607b5c 100644 --- a/doc/release-notes/release-notes-0.6.3.md +++ b/doc/release-notes/release-notes-0.6.3.md @@ -23,7 +23,7 @@ hundreds of blocks long. Bitcoin-Qt no longer automatically selects the first address in the address book (Issue #1384). -Fixed minimize-to-dock behavior of Bitcon-Qt on the Mac. +Fixed minimize-to-dock behavior of Bitcoin-Qt on the Mac. Added a block checkpoint at block 185,333 to speed up initial blockchain download. diff --git a/doc/translation_process.md b/doc/translation_process.md index 6389c5aced..310d560b36 100644 --- a/doc/translation_process.md +++ b/doc/translation_process.md @@ -74,10 +74,10 @@ The Transifex Bitcoin project config file is included as part of the repo. It ca To assist in updating translations, we have created a script to help. 1. `python contrib/devtools/update-translations.py` -2. Update `src/qt/bitcoin.qrc` manually or via +2. Update `src/qt/bitcoin_locale.qrc` manually or via `ls src/qt/locale/*ts|xargs -n1 basename|sed 's/\(bitcoin_\(.*\)\).ts/<file alias="\2">locale\/\1.qm<\/file>/'` -3. Update `src/qt/Makefile.am` manually or via - `ls src/qt/locale/*ts|xargs -n1 basename|sed 's/\(bitcoin_\(.*\)\).ts/ locale\/\1.ts \\/'` +3. Update `src/Makefile.qt.include` manually or via + `ls src/qt/locale/*ts|xargs -n1 basename|sed 's/\(bitcoin_\(.*\)\).ts/ qt\/locale\/\1.ts \\/'` 4. `git add` new translations from `src/qt/locale/` **Do not directly download translations** one by one from the Transifex website, as we do a few post-processing steps before committing the translations. diff --git a/doc/unit-tests.md b/doc/unit-tests.md index 72613054b9..afaece829c 100644 --- a/doc/unit-tests.md +++ b/doc/unit-tests.md @@ -1,18 +1,18 @@ Compiling/running unit tests ------------------------------------ -Unit tests will be automatically compiled if dependencies were met in configure +Unit tests will be automatically compiled if dependencies were met in `./configure` and tests weren't explicitly disabled. -After configuring, they can be run with 'make check'. +After configuring, they can be run with `make check`. -To run the bitcoind tests manually, launch src/test/test_bitcoin . +To run the bitcoind tests manually, launch `src/test/test_bitcoin`. To add more bitcoind tests, add `BOOST_AUTO_TEST_CASE` functions to the existing -.cpp files in the test/ directory or add new .cpp files that +.cpp files in the `test/` directory or add new .cpp files that implement new BOOST_AUTO_TEST_SUITE sections. -To run the bitcoin-qt tests manually, launch src/qt/test/test_bitcoin-qt +To run the bitcoin-qt tests manually, launch `src/qt/test/test_bitcoin-qt` To add more bitcoin-qt tests, add them to the `src/qt/test/` directory and the `src/qt/test/test_main.cpp` file. diff --git a/qa/pull-tester/rpc-tests.py b/qa/pull-tester/rpc-tests.py index 5004b09c18..df71e44b60 100755 --- a/qa/pull-tester/rpc-tests.py +++ b/qa/pull-tester/rpc-tests.py @@ -22,6 +22,7 @@ For a description of arguments recognized by test scripts, see """ import os +import time import shutil import sys import subprocess @@ -47,6 +48,10 @@ opts = set() passOn = "" p = re.compile("^--") +bold = ("","") +if (os.name == 'posix'): + bold = ('\033[0m', '\033[1m') + for arg in sys.argv[1:]: if arg == '--coverage': ENABLE_COVERAGE = 1 @@ -77,8 +82,9 @@ testScripts = [ 'rawtransactions.py', 'rest.py', 'mempool_spendcoinbase.py', - 'mempool_coinbase_spends.py', + 'mempool_reorg.py', 'httpbasics.py', + 'multi_rpc.py', 'zapwallettxes.py', 'proxy_test.py', 'merkle_blocks.py', @@ -92,6 +98,8 @@ testScripts = [ 'blockchain.py', 'disablewallet.py', 'sendheaders.py', + 'keypool.py', + 'prioritise_transaction.py', ] testScriptsExt = [ 'bip65-cltv.py', @@ -105,7 +113,6 @@ testScriptsExt = [ 'pruning.py', 'forknotify.py', 'invalidateblock.py', - 'keypool.py', # 'rpcbind_test.py', #temporary, bug in libevent, see #6655 'smartfees.py', 'maxblocksinflight.py', @@ -126,7 +133,7 @@ def runtests(): if ENABLE_COVERAGE: coverage = RPCCoverage() - print("Initializing coverage directory at %s" % coverage.dir) + print("Initializing coverage directory at %s\n" % coverage.dir) if(ENABLE_WALLET == 1 and ENABLE_UTILS == 1 and ENABLE_BITCOIND == 1): rpcTestDir = buildDir + '/qa/rpc-tests/' @@ -141,10 +148,12 @@ def runtests(): or run_extended or testScripts[i] in opts or re.sub(".py$", "", testScripts[i]) in opts ): - print("Running testscript " + testScripts[i] + "...") + print("Running testscript %s%s%s ..." % (bold[1], testScripts[i], bold[0])) + time0 = time.time() subprocess.check_call( rpcTestDir + testScripts[i] + flags, shell=True) + print("Duration: %s s\n" % (int(time.time() - time0))) # exit if help is called so we print just one set of # instructions @@ -156,12 +165,14 @@ def runtests(): for i in range(len(testScriptsExt)): if (run_extended or testScriptsExt[i] in opts or re.sub(".py$", "", testScriptsExt[i]) in opts): + print( "Running 2nd level testscript " - + testScriptsExt[i] + "...") - + + "%s%s%s ..." % (bold[1], testScriptsExt[i], bold[0])) + time0 = time.time() subprocess.check_call( rpcTestDir + testScriptsExt[i] + flags, shell=True) + print("Duration: %s s\n" % (int(time.time() - time0))) if coverage: coverage.report_rpc_coverage() diff --git a/qa/replace-by-fee/.gitignore b/qa/replace-by-fee/.gitignore deleted file mode 100644 index b2c4f4657a..0000000000 --- a/qa/replace-by-fee/.gitignore +++ /dev/null @@ -1 +0,0 @@ -python-bitcoinlib diff --git a/qa/replace-by-fee/README.md b/qa/replace-by-fee/README.md deleted file mode 100644 index baad86de9a..0000000000 --- a/qa/replace-by-fee/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Replace-by-fee regression tests -=============================== - -First get version v0.5.0 of the python-bitcoinlib library. In this directory -run: - - git clone -n https://github.com/petertodd/python-bitcoinlib - (cd python-bitcoinlib && git checkout 8270bfd9c6ac37907d75db3d8b9152d61c7255cd) - -Then run the tests themselves with a bitcoind available running in regtest -mode: - - ./rbf-tests.py diff --git a/qa/replace-by-fee/rbf-tests.py b/qa/replace-by-fee/rbf-tests.py deleted file mode 100755 index 1ee6c83875..0000000000 --- a/qa/replace-by-fee/rbf-tests.py +++ /dev/null @@ -1,360 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2015 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# -# Test replace-by-fee -# - -import os -import sys - -# Add python-bitcoinlib to module search path, prior to any system-wide -# python-bitcoinlib. -sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "python-bitcoinlib")) - -import unittest - -import bitcoin -bitcoin.SelectParams('regtest') - -import bitcoin.rpc - -from bitcoin.core import * -from bitcoin.core.script import * -from bitcoin.wallet import * - -MAX_REPLACEMENT_LIMIT = 100 - -class Test_ReplaceByFee(unittest.TestCase): - proxy = None - - @classmethod - def setUpClass(cls): - if cls.proxy is None: - cls.proxy = bitcoin.rpc.Proxy() - - @classmethod - def mine_mempool(cls): - """Mine until mempool is empty""" - mempool_size = 1 - while mempool_size: - cls.proxy.call('generate', 1) - new_mempool_size = len(cls.proxy.getrawmempool()) - - # It's possible to get stuck in a loop here if the mempool has - # transactions that can't be mined. - assert(new_mempool_size != mempool_size) - mempool_size = new_mempool_size - - @classmethod - def tearDownClass(cls): - # Make sure mining works - cls.mine_mempool() - - def make_txout(self, amount, confirmed=True, scriptPubKey=CScript([1])): - """Create a txout with a given amount and scriptPubKey - - Mines coins as needed. - - confirmed - txouts created will be confirmed in the blockchain; - unconfirmed otherwise. - """ - fee = 1*COIN - while self.proxy.getbalance() < amount + fee: - self.proxy.call('generate', 100) - - addr = P2SHBitcoinAddress.from_redeemScript(CScript([])) - txid = self.proxy.sendtoaddress(addr, amount + fee) - - tx1 = self.proxy.getrawtransaction(txid) - - i = None - for i, txout in enumerate(tx1.vout): - if txout.scriptPubKey == addr.to_scriptPubKey(): - break - assert i is not None - - tx2 = CTransaction([CTxIn(COutPoint(txid, i), CScript([1, CScript([])]), nSequence=0)], - [CTxOut(amount, scriptPubKey)]) - - tx2_txid = self.proxy.sendrawtransaction(tx2, True) - - # If requested, ensure txouts are confirmed. - if confirmed: - self.mine_mempool() - - return COutPoint(tx2_txid, 0) - - def test_simple_doublespend(self): - """Simple doublespend""" - tx0_outpoint = self.make_txout(1.1*COIN) - - tx1a = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(1*COIN, CScript([b'a']))]) - tx1a_txid = self.proxy.sendrawtransaction(tx1a, True) - - # Should fail because we haven't changed the fee - tx1b = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(1*COIN, CScript([b'b']))]) - - try: - tx1b_txid = self.proxy.sendrawtransaction(tx1b, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) # insufficient fee - else: - self.fail() - - # Extra 0.1 BTC fee - tx1b = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(0.9*COIN, CScript([b'b']))]) - tx1b_txid = self.proxy.sendrawtransaction(tx1b, True) - - # tx1a is in fact replaced - with self.assertRaises(IndexError): - self.proxy.getrawtransaction(tx1a_txid) - - self.assertEqual(tx1b, self.proxy.getrawtransaction(tx1b_txid)) - - def test_doublespend_chain(self): - """Doublespend of a long chain""" - - initial_nValue = 50*COIN - tx0_outpoint = self.make_txout(initial_nValue) - - prevout = tx0_outpoint - remaining_value = initial_nValue - chain_txids = [] - while remaining_value > 10*COIN: - remaining_value -= 1*COIN - tx = CTransaction([CTxIn(prevout, nSequence=0)], - [CTxOut(remaining_value, CScript([1]))]) - txid = self.proxy.sendrawtransaction(tx, True) - chain_txids.append(txid) - prevout = COutPoint(txid, 0) - - # Whether the double-spend is allowed is evaluated by including all - # child fees - 40 BTC - so this attempt is rejected. - dbl_tx = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(initial_nValue - 30*COIN, CScript([1]))]) - - try: - self.proxy.sendrawtransaction(dbl_tx, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) # insufficient fee - else: - self.fail() - - # Accepted with sufficient fee - dbl_tx = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(1*COIN, CScript([1]))]) - self.proxy.sendrawtransaction(dbl_tx, True) - - for doublespent_txid in chain_txids: - with self.assertRaises(IndexError): - self.proxy.getrawtransaction(doublespent_txid) - - def test_doublespend_tree(self): - """Doublespend of a big tree of transactions""" - - initial_nValue = 50*COIN - tx0_outpoint = self.make_txout(initial_nValue) - - def branch(prevout, initial_value, max_txs, *, tree_width=5, fee=0.0001*COIN, _total_txs=None): - if _total_txs is None: - _total_txs = [0] - if _total_txs[0] >= max_txs: - return - - txout_value = (initial_value - fee) // tree_width - if txout_value < fee: - return - - vout = [CTxOut(txout_value, CScript([i+1])) - for i in range(tree_width)] - tx = CTransaction([CTxIn(prevout, nSequence=0)], - vout) - - self.assertTrue(len(tx.serialize()) < 100000) - txid = self.proxy.sendrawtransaction(tx, True) - yield tx - _total_txs[0] += 1 - - for i, txout in enumerate(tx.vout): - yield from branch(COutPoint(txid, i), txout_value, - max_txs, - tree_width=tree_width, fee=fee, - _total_txs=_total_txs) - - fee = 0.0001*COIN - n = MAX_REPLACEMENT_LIMIT - tree_txs = list(branch(tx0_outpoint, initial_nValue, n, fee=fee)) - self.assertEqual(len(tree_txs), n) - - # Attempt double-spend, will fail because too little fee paid - dbl_tx = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(initial_nValue - fee*n, CScript([1]))]) - try: - self.proxy.sendrawtransaction(dbl_tx, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) # insufficient fee - else: - self.fail() - - # 1 BTC fee is enough - dbl_tx = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(initial_nValue - fee*n - 1*COIN, CScript([1]))]) - self.proxy.sendrawtransaction(dbl_tx, True) - - for tx in tree_txs: - with self.assertRaises(IndexError): - self.proxy.getrawtransaction(tx.GetHash()) - - # Try again, but with more total transactions than the "max txs - # double-spent at once" anti-DoS limit. - for n in (MAX_REPLACEMENT_LIMIT, MAX_REPLACEMENT_LIMIT*2): - fee = 0.0001*COIN - tx0_outpoint = self.make_txout(initial_nValue) - tree_txs = list(branch(tx0_outpoint, initial_nValue, n, fee=fee)) - self.assertEqual(len(tree_txs), n) - - dbl_tx = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(initial_nValue - fee*n, CScript([1]))]) - try: - self.proxy.sendrawtransaction(dbl_tx, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) - else: - self.fail() - - for tx in tree_txs: - self.proxy.getrawtransaction(tx.GetHash()) - - def test_replacement_feeperkb(self): - """Replacement requires fee-per-KB to be higher""" - tx0_outpoint = self.make_txout(1.1*COIN) - - tx1a = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(1*COIN, CScript([b'a']))]) - tx1a_txid = self.proxy.sendrawtransaction(tx1a, True) - - # Higher fee, but the fee per KB is much lower, so the replacement is - # rejected. - tx1b = CTransaction([CTxIn(tx0_outpoint, nSequence=0)], - [CTxOut(0.001*COIN, - CScript([b'a'*999000]))]) - - try: - tx1b_txid = self.proxy.sendrawtransaction(tx1b, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) # insufficient fee - else: - self.fail() - - def test_spends_of_conflicting_outputs(self): - """Replacements that spend conflicting tx outputs are rejected""" - utxo1 = self.make_txout(1.2*COIN) - utxo2 = self.make_txout(3.0*COIN) - - tx1a = CTransaction([CTxIn(utxo1, nSequence=0)], - [CTxOut(1.1*COIN, CScript([b'a']))]) - tx1a_txid = self.proxy.sendrawtransaction(tx1a, True) - - # Direct spend an output of the transaction we're replacing. - tx2 = CTransaction([CTxIn(utxo1, nSequence=0), CTxIn(utxo2, nSequence=0), - CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)], - tx1a.vout) - - try: - tx2_txid = self.proxy.sendrawtransaction(tx2, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) - else: - self.fail() - - # Spend tx1a's output to test the indirect case. - tx1b = CTransaction([CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)], - [CTxOut(1.0*COIN, CScript([b'a']))]) - tx1b_txid = self.proxy.sendrawtransaction(tx1b, True) - - tx2 = CTransaction([CTxIn(utxo1, nSequence=0), CTxIn(utxo2, nSequence=0), - CTxIn(COutPoint(tx1b_txid, 0))], - tx1a.vout) - - try: - tx2_txid = self.proxy.sendrawtransaction(tx2, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) - else: - self.fail() - - def test_new_unconfirmed_inputs(self): - """Replacements that add new unconfirmed inputs are rejected""" - confirmed_utxo = self.make_txout(1.1*COIN) - unconfirmed_utxo = self.make_txout(0.1*COIN, False) - - tx1 = CTransaction([CTxIn(confirmed_utxo)], - [CTxOut(1.0*COIN, CScript([b'a']))]) - tx1_txid = self.proxy.sendrawtransaction(tx1, True) - - tx2 = CTransaction([CTxIn(confirmed_utxo), CTxIn(unconfirmed_utxo)], - tx1.vout) - - try: - tx2_txid = self.proxy.sendrawtransaction(tx2, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) - else: - self.fail() - - def test_too_many_replacements(self): - """Replacements that evict too many transactions are rejected""" - # Try directly replacing more than MAX_REPLACEMENT_LIMIT - # transactions - - # Start by creating a single transaction with many outputs - initial_nValue = 10*COIN - utxo = self.make_txout(initial_nValue) - fee = 0.0001*COIN - split_value = int((initial_nValue-fee)/(MAX_REPLACEMENT_LIMIT+1)) - actual_fee = initial_nValue - split_value*(MAX_REPLACEMENT_LIMIT+1) - - outputs = [] - for i in range(MAX_REPLACEMENT_LIMIT+1): - outputs.append(CTxOut(split_value, CScript([1]))) - - splitting_tx = CTransaction([CTxIn(utxo, nSequence=0)], outputs) - txid = self.proxy.sendrawtransaction(splitting_tx, True) - - # Now spend each of those outputs individually - for i in range(MAX_REPLACEMENT_LIMIT+1): - tx_i = CTransaction([CTxIn(COutPoint(txid, i), nSequence=0)], - [CTxOut(split_value-fee, CScript([b'a']))]) - self.proxy.sendrawtransaction(tx_i, True) - - # Now create doublespend of the whole lot, should fail - # Need a big enough fee to cover all spending transactions and have - # a higher fee rate - double_spend_value = (split_value-100*fee)*(MAX_REPLACEMENT_LIMIT+1) - inputs = [] - for i in range(MAX_REPLACEMENT_LIMIT+1): - inputs.append(CTxIn(COutPoint(txid, i), nSequence=0)) - double_tx = CTransaction(inputs, [CTxOut(double_spend_value, CScript([b'a']))]) - - try: - self.proxy.sendrawtransaction(double_tx, True) - except bitcoin.rpc.JSONRPCException as exp: - self.assertEqual(exp.error['code'], -26) - self.assertEqual("too many potential replacements" in exp.error['message'], True) - else: - self.fail() - - # If we remove an input, it should pass - double_tx = CTransaction(inputs[0:-1], - [CTxOut(double_spend_value, CScript([b'a']))]) - - self.proxy.sendrawtransaction(double_tx, True) - -if __name__ == '__main__': - unittest.main() diff --git a/qa/rpc-tests/mempool_packages.py b/qa/rpc-tests/mempool_packages.py index 746c26ff5e..34b316a6a3 100755 --- a/qa/rpc-tests/mempool_packages.py +++ b/qa/rpc-tests/mempool_packages.py @@ -8,9 +8,6 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.util import * -def satoshi_round(amount): - return Decimal(amount).quantize(Decimal('0.00000001'), rounding=ROUND_DOWN) - MAX_ANCESTORS = 25 MAX_DESCENDANTS = 25 diff --git a/qa/rpc-tests/mempool_coinbase_spends.py b/qa/rpc-tests/mempool_reorg.py index c64a15b9f5..fdbaf689ad 100755 --- a/qa/rpc-tests/mempool_coinbase_spends.py +++ b/qa/rpc-tests/mempool_reorg.py @@ -52,16 +52,25 @@ class MempoolCoinbaseTest(BitcoinTestFramework): # 3. Indirect (coinbase and child both in chain) : spend_103 and spend_103_1 # Use invalidatblock to make all of the above coinbase spends invalid (immature coinbase), # and make sure the mempool code behaves correctly. - b = [ self.nodes[0].getblockhash(n) for n in range(102, 105) ] + b = [ self.nodes[0].getblockhash(n) for n in range(101, 105) ] coinbase_txids = [ self.nodes[0].getblock(h)['tx'][0] for h in b ] - spend_101_raw = self.create_tx(coinbase_txids[0], node1_address, 50) - spend_102_raw = self.create_tx(coinbase_txids[1], node0_address, 50) - spend_103_raw = self.create_tx(coinbase_txids[2], node0_address, 50) + spend_101_raw = self.create_tx(coinbase_txids[1], node1_address, 50) + spend_102_raw = self.create_tx(coinbase_txids[2], node0_address, 50) + spend_103_raw = self.create_tx(coinbase_txids[3], node0_address, 50) + + # Create a block-height-locked transaction which will be invalid after reorg + timelock_tx = self.nodes[0].createrawtransaction([{"txid": coinbase_txids[0], "vout": 0}], {node0_address: 50}) + # Set the time lock + timelock_tx = timelock_tx.replace("ffffffff", "11111111", 1) + timelock_tx = timelock_tx[:-8] + hex(self.nodes[0].getblockcount() + 2)[2:] + "000000" + timelock_tx = self.nodes[0].signrawtransaction(timelock_tx)["hex"] + assert_raises(JSONRPCException, self.nodes[0].sendrawtransaction, timelock_tx) # Broadcast and mine spend_102 and 103: spend_102_id = self.nodes[0].sendrawtransaction(spend_102_raw) spend_103_id = self.nodes[0].sendrawtransaction(spend_103_raw) self.nodes[0].generate(1) + assert_raises(JSONRPCException, self.nodes[0].sendrawtransaction, timelock_tx) # Create 102_1 and 103_1: spend_102_1_raw = self.create_tx(spend_102_id, node1_address, 50) @@ -69,7 +78,8 @@ class MempoolCoinbaseTest(BitcoinTestFramework): # Broadcast and mine 103_1: spend_103_1_id = self.nodes[0].sendrawtransaction(spend_103_1_raw) - self.nodes[0].generate(1) + last_block = self.nodes[0].generate(1) + timelock_tx_id = self.nodes[0].sendrawtransaction(timelock_tx) # ... now put spend_101 and spend_102_1 in memory pools: spend_101_id = self.nodes[0].sendrawtransaction(spend_101_raw) @@ -77,7 +87,11 @@ class MempoolCoinbaseTest(BitcoinTestFramework): self.sync_all() - assert_equal(set(self.nodes[0].getrawmempool()), set([ spend_101_id, spend_102_1_id ])) + assert_equal(set(self.nodes[0].getrawmempool()), set([ spend_101_id, spend_102_1_id, timelock_tx_id ])) + + for node in self.nodes: + node.invalidateblock(last_block[0]) + assert_equal(set(self.nodes[0].getrawmempool()), set([ spend_101_id, spend_102_1_id, spend_103_1_id ])) # Use invalidateblock to re-org back and make all those coinbase spends # immature/invalid: diff --git a/qa/rpc-tests/multi_rpc.py b/qa/rpc-tests/multi_rpc.py new file mode 100755 index 0000000000..62071d426e --- /dev/null +++ b/qa/rpc-tests/multi_rpc.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python2 +# Copyright (c) 2015 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Test mulitple rpc user config option rpcauth +# + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * +import base64 + +try: + import http.client as httplib +except ImportError: + import httplib +try: + import urllib.parse as urlparse +except ImportError: + import urlparse + +class HTTPBasicsTest (BitcoinTestFramework): + def setup_nodes(self): + return start_nodes(4, self.options.tmpdir) + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain(self.options.tmpdir) + #Append rpcauth to bitcoin.conf before initialization + rpcauth = "rpcauth=rt:93648e835a54c573682c2eb19f882535$7681e9c5b74bdd85e78166031d2058e1069b3ed7ed967c93fc63abba06f31144" + rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e" + with open(os.path.join(self.options.tmpdir+"/node0", "bitcoin.conf"), 'a') as f: + f.write(rpcauth+"\n") + f.write(rpcauth2+"\n") + + def run_test(self): + + ################################################## + # Check correctness of the rpcauth config option # + ################################################## + url = urlparse.urlparse(self.nodes[0].url) + + #Old authpair + authpair = url.username + ':' + url.password + + #New authpair generated via contrib/rpcuser tool + rpcauth = "rpcauth=rt:93648e835a54c573682c2eb19f882535$7681e9c5b74bdd85e78166031d2058e1069b3ed7ed967c93fc63abba06f31144" + password = "cA773lm788buwYe4g4WT+05pKyNruVKjQ25x3n0DQcM=" + + #Second authpair with different username + rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e" + password2 = "8/F3uMDw4KSEbw96U3CA1C4X05dkHDN2BPFjTgZW4KI=" + authpairnew = "rt:"+password + + headers = {"Authorization": "Basic " + base64.b64encode(authpair)} + + conn = httplib.HTTPConnection(url.hostname, url.port) + conn.connect() + conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) + resp = conn.getresponse() + assert_equal(resp.status==401, False) + conn.close() + + #Use new authpair to confirm both work + headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} + + conn = httplib.HTTPConnection(url.hostname, url.port) + conn.connect() + conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) + resp = conn.getresponse() + assert_equal(resp.status==401, False) + conn.close() + + #Wrong login name with rt's password + authpairnew = "rtwrong:"+password + headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} + + conn = httplib.HTTPConnection(url.hostname, url.port) + conn.connect() + conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) + resp = conn.getresponse() + assert_equal(resp.status==401, True) + conn.close() + + #Wrong password for rt + authpairnew = "rt:"+password+"wrong" + headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} + + conn = httplib.HTTPConnection(url.hostname, url.port) + conn.connect() + conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) + resp = conn.getresponse() + assert_equal(resp.status==401, True) + conn.close() + + #Correct for rt2 + authpairnew = "rt2:"+password2 + headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} + + conn = httplib.HTTPConnection(url.hostname, url.port) + conn.connect() + conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) + resp = conn.getresponse() + assert_equal(resp.status==401, False) + conn.close() + + #Wrong password for rt2 + authpairnew = "rt2:"+password2+"wrong" + headers = {"Authorization": "Basic " + base64.b64encode(authpairnew)} + + conn = httplib.HTTPConnection(url.hostname, url.port) + conn.connect() + conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) + resp = conn.getresponse() + assert_equal(resp.status==401, True) + conn.close() + + + +if __name__ == '__main__': + HTTPBasicsTest ().main () diff --git a/qa/rpc-tests/prioritise_transaction.py b/qa/rpc-tests/prioritise_transaction.py new file mode 100755 index 0000000000..f376ceee5e --- /dev/null +++ b/qa/rpc-tests/prioritise_transaction.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python2 +# Copyright (c) 2015 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Test PrioritiseTransaction code +# + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * + +COIN = 100000000 + +class PrioritiseTransactionTest(BitcoinTestFramework): + + def __init__(self): + # Some pre-processing to create a bunch of OP_RETURN txouts to insert into transactions we create + # So we have big transactions (and therefore can't fit very many into each block) + # create one script_pubkey + script_pubkey = "6a4d0200" #OP_RETURN OP_PUSH2 512 bytes + for i in xrange (512): + script_pubkey = script_pubkey + "01" + # concatenate 128 txouts of above script_pubkey which we'll insert before the txout for change + self.txouts = "81" + for k in xrange(128): + # add txout value + self.txouts = self.txouts + "0000000000000000" + # add length of script_pubkey + self.txouts = self.txouts + "fd0402" + # add script_pubkey + self.txouts = self.txouts + script_pubkey + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 1) + + def setup_network(self): + self.nodes = [] + self.is_network_split = False + + self.nodes.append(start_node(0, self.options.tmpdir, ["-debug", "-printpriority=1"])) + self.relayfee = self.nodes[0].getnetworkinfo()['relayfee'] + + def create_confirmed_utxos(self, count): + self.nodes[0].generate(int(0.5*count)+101) + utxos = self.nodes[0].listunspent() + iterations = count - len(utxos) + addr1 = self.nodes[0].getnewaddress() + addr2 = self.nodes[0].getnewaddress() + if iterations <= 0: + return utxos + for i in xrange(iterations): + t = utxos.pop() + fee = self.relayfee + inputs = [] + inputs.append({ "txid" : t["txid"], "vout" : t["vout"]}) + outputs = {} + send_value = t['amount'] - fee + outputs[addr1] = satoshi_round(send_value/2) + outputs[addr2] = satoshi_round(send_value/2) + raw_tx = self.nodes[0].createrawtransaction(inputs, outputs) + signed_tx = self.nodes[0].signrawtransaction(raw_tx)["hex"] + txid = self.nodes[0].sendrawtransaction(signed_tx) + + while (self.nodes[0].getmempoolinfo()['size'] > 0): + self.nodes[0].generate(1) + + utxos = self.nodes[0].listunspent() + assert(len(utxos) >= count) + return utxos + + def create_lots_of_big_transactions(self, utxos, fee): + addr = self.nodes[0].getnewaddress() + txids = [] + for i in xrange(len(utxos)): + t = utxos.pop() + inputs = [] + inputs.append({ "txid" : t["txid"], "vout" : t["vout"]}) + outputs = {} + send_value = t['amount'] - fee + outputs[addr] = satoshi_round(send_value) + rawtx = self.nodes[0].createrawtransaction(inputs, outputs) + newtx = rawtx[0:92] + newtx = newtx + self.txouts + newtx = newtx + rawtx[94:] + signresult = self.nodes[0].signrawtransaction(newtx, None, None, "NONE") + txid = self.nodes[0].sendrawtransaction(signresult["hex"], True) + txids.append(txid) + return txids + + def run_test(self): + utxos = self.create_confirmed_utxos(90) + base_fee = self.relayfee*100 # our transactions are smaller than 100kb + txids = [] + + # Create 3 batches of transactions at 3 different fee rate levels + for i in xrange(3): + txids.append([]) + txids[i] = self.create_lots_of_big_transactions(utxos[30*i:30*i+30], (i+1)*base_fee) + + # add a fee delta to something in the cheapest bucket and make sure it gets mined + # also check that a different entry in the cheapest bucket is NOT mined (lower + # the priority to ensure its not mined due to priority) + self.nodes[0].prioritisetransaction(txids[0][0], 0, int(3*base_fee*COIN)) + self.nodes[0].prioritisetransaction(txids[0][1], -1e15, 0) + + self.nodes[0].generate(1) + + mempool = self.nodes[0].getrawmempool() + print "Assert that prioritised transasction was mined" + assert(txids[0][0] not in mempool) + assert(txids[0][1] in mempool) + + high_fee_tx = None + for x in txids[2]: + if x not in mempool: + high_fee_tx = x + + # Something high-fee should have been mined! + assert(high_fee_tx != None) + + # Add a prioritisation before a tx is in the mempool (de-prioritising a + # high-fee transaction). + self.nodes[0].prioritisetransaction(high_fee_tx, -1e15, -int(2*base_fee*COIN)) + + # Add everything back to mempool + self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) + + # Check to make sure our high fee rate tx is back in the mempool + mempool = self.nodes[0].getrawmempool() + assert(high_fee_tx in mempool) + + # Now verify the high feerate transaction isn't mined. + self.nodes[0].generate(5) + + # High fee transaction should not have been mined, but other high fee rate + # transactions should have been. + mempool = self.nodes[0].getrawmempool() + print "Assert that de-prioritised transaction is still in mempool" + assert(high_fee_tx in mempool) + for x in txids[2]: + if (x != high_fee_tx): + assert(x not in mempool) + +if __name__ == '__main__': + PrioritiseTransactionTest().main() diff --git a/qa/rpc-tests/replace-by-fee.py b/qa/rpc-tests/replace-by-fee.py index 537a1ed8d9..6e9e0b304c 100755 --- a/qa/rpc-tests/replace-by-fee.py +++ b/qa/rpc-tests/replace-by-fee.py @@ -73,7 +73,12 @@ class ReplaceByFeeTest(BitcoinTestFramework): def setup_network(self): self.nodes = [] self.nodes.append(start_node(0, self.options.tmpdir, ["-maxorphantx=1000", - "-relaypriority=0", "-whitelist=127.0.0.1"])) + "-relaypriority=0", "-whitelist=127.0.0.1", + "-limitancestorcount=50", + "-limitancestorsize=101", + "-limitdescendantcount=200", + "-limitdescendantsize=101" + ])) self.is_network_split = False def run_test(self): diff --git a/qa/rpc-tests/smartfees.py b/qa/rpc-tests/smartfees.py index ecfffc1b45..b209ae0c16 100755 --- a/qa/rpc-tests/smartfees.py +++ b/qa/rpc-tests/smartfees.py @@ -19,9 +19,6 @@ P2SH_2 = "2NBdpwq8Aoo1EEKEXPNrKvr5xQr3M9UfcZA" # P2SH of "OP_2 OP_DROP" # 4 bytes of OP_TRUE and push 2-byte redeem script of "OP_1 OP_DROP" or "OP_2 OP_DROP" SCRIPT_SIG = ["0451025175", "0451025275"] -def satoshi_round(amount): - return Decimal(amount).quantize(Decimal('0.00000001'), rounding=ROUND_DOWN) - def small_txpuzzle_randfee(from_node, conflist, unconflist, amount, min_fee, fee_increment): ''' Create and send a transaction with a random fee. diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index d9d5129f21..b7e90a8a8b 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -217,7 +217,8 @@ def start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary= datadir = os.path.join(dirname, "node"+str(i)) if binary is None: binary = os.getenv("BITCOIND", "bitcoind") - args = [ binary, "-datadir="+datadir, "-keypool=1", "-discover=0", "-rest" ] + # RPC tests still depend on free transactions + args = [ binary, "-datadir="+datadir, "-keypool=1", "-discover=0", "-rest", "-blockprioritysize=50000" ] if extra_args is not None: args.extend(extra_args) bitcoind_processes[i] = subprocess.Popen(args) devnull = open(os.devnull, "w") @@ -404,3 +405,6 @@ def assert_raises(exc, fun, *args, **kwds): raise AssertionError("Unexpected exception raised: "+type(e).__name__) else: raise AssertionError("No exception raised") + +def satoshi_round(amount): + return Decimal(amount).quantize(Decimal('0.00000001'), rounding=ROUND_DOWN) diff --git a/qa/rpc-tests/txn_clone.py b/qa/rpc-tests/txn_clone.py index e8ced0e5bb..b1f603a192 100755 --- a/qa/rpc-tests/txn_clone.py +++ b/qa/rpc-tests/txn_clone.py @@ -136,7 +136,7 @@ class TxnMallTest(BitcoinTestFramework): tx2 = self.nodes[0].gettransaction(txid2) # Verify expected confirmations - assert_equal(tx1["confirmations"], -1) + assert_equal(tx1["confirmations"], -2) assert_equal(tx1_clone["confirmations"], 2) assert_equal(tx2["confirmations"], 1) diff --git a/qa/rpc-tests/txn_doublespend.py b/qa/rpc-tests/txn_doublespend.py index 36081127b4..d4665b3d42 100755 --- a/qa/rpc-tests/txn_doublespend.py +++ b/qa/rpc-tests/txn_doublespend.py @@ -99,7 +99,7 @@ class TxnMallTest(BitcoinTestFramework): # Now give doublespend and its parents to miner: self.nodes[2].sendrawtransaction(fund_foo_tx["hex"]) self.nodes[2].sendrawtransaction(fund_bar_tx["hex"]) - self.nodes[2].sendrawtransaction(doublespend["hex"]) + doublespend_txid = self.nodes[2].sendrawtransaction(doublespend["hex"]) # ... mine a block... self.nodes[2].generate(1) @@ -107,14 +107,15 @@ class TxnMallTest(BitcoinTestFramework): connect_nodes(self.nodes[1], 2) self.nodes[2].generate(1) # Mine another block to make sure we sync sync_blocks(self.nodes) + assert_equal(self.nodes[0].gettransaction(doublespend_txid)["confirmations"], 2) # Re-fetch transaction info: tx1 = self.nodes[0].gettransaction(txid1) tx2 = self.nodes[0].gettransaction(txid2) - + # Both transactions should be conflicted - assert_equal(tx1["confirmations"], -1) - assert_equal(tx2["confirmations"], -1) + assert_equal(tx1["confirmations"], -2) + assert_equal(tx2["confirmations"], -2) # Node0's total balance should be starting balance, plus 100BTC for # two more matured blocks, minus 1240 for the double-spend, plus fees (which are diff --git a/share/rpcuser/README.md b/share/rpcuser/README.md new file mode 100644 index 0000000000..7c2c909a42 --- /dev/null +++ b/share/rpcuser/README.md @@ -0,0 +1,11 @@ +RPC Tools +--------------------- + +### [RPCUser](/share/rpcuser) ### + +Create an RPC user login credential. + +Usage: + +./rpcuser.py <username> + diff --git a/share/rpcuser/rpcuser.py b/share/rpcuser/rpcuser.py new file mode 100755 index 0000000000..9fd176908b --- /dev/null +++ b/share/rpcuser/rpcuser.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python2 +# Copyright (c) 2015 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import hashlib +import sys +import os +from random import SystemRandom +import base64 +import hmac + +if len(sys.argv) < 2: + sys.stderr.write('Please include username as an argument.\n') + sys.exit(0) + +username = sys.argv[1] + +#This uses os.urandom() underneath +cryptogen = SystemRandom() + +#Create 16 byte hex salt +salt_sequence = [cryptogen.randrange(256) for i in range(16)] +hexseq = list(map(hex, salt_sequence)) +salt = "".join([x[2:] for x in hexseq]) + +#Create 32 byte b64 password +password = base64.urlsafe_b64encode(os.urandom(32)) + +digestmod = hashlib.sha256 + +if sys.version_info.major >= 3: + password = password.decode('utf-8') + digestmod = 'SHA256' + +m = hmac.new(bytearray(salt, 'utf-8'), bytearray(password, 'utf-8'), digestmod) +result = m.hexdigest() + +print("String to be appended to bitcoin.conf:") +print("rpcauth="+username+":"+salt+"$"+result) +print("Your password:\n"+password) diff --git a/src/Makefile.am b/src/Makefile.am index b1dea69c99..5da1a873de 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -123,6 +123,7 @@ BITCOIN_CORE_H = \ policy/fees.h \ policy/policy.h \ pow.h \ + prevector.h \ primitives/block.h \ primitives/transaction.h \ protocol.h \ diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index e62003a513..a390d96a9f 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -3,37 +3,41 @@ EXTRA_LIBRARIES += qt/libbitcoinqt.a # bitcoin qt core # QT_TS = \ - qt/locale/bitcoin_ach.ts \ qt/locale/bitcoin_af_ZA.ts \ qt/locale/bitcoin_ar.ts \ qt/locale/bitcoin_be_BY.ts \ + qt/locale/bitcoin_bg_BG.ts \ qt/locale/bitcoin_bg.ts \ qt/locale/bitcoin_bs.ts \ qt/locale/bitcoin_ca_ES.ts \ qt/locale/bitcoin_ca.ts \ qt/locale/bitcoin_ca@valencia.ts \ - qt/locale/bitcoin_cmn.ts \ + qt/locale/bitcoin_cs_CZ.ts \ qt/locale/bitcoin_cs.ts \ qt/locale/bitcoin_cy.ts \ qt/locale/bitcoin_da.ts \ qt/locale/bitcoin_de.ts \ qt/locale/bitcoin_el_GR.ts \ + qt/locale/bitcoin_el.ts \ + qt/locale/bitcoin_en_GB.ts \ qt/locale/bitcoin_en.ts \ qt/locale/bitcoin_eo.ts \ qt/locale/bitcoin_es_CL.ts \ qt/locale/bitcoin_es_DO.ts \ + qt/locale/bitcoin_es_ES.ts \ qt/locale/bitcoin_es_MX.ts \ qt/locale/bitcoin_es.ts \ qt/locale/bitcoin_es_UY.ts \ + qt/locale/bitcoin_es_VE.ts \ qt/locale/bitcoin_et.ts \ qt/locale/bitcoin_eu_ES.ts \ qt/locale/bitcoin_fa_IR.ts \ qt/locale/bitcoin_fa.ts \ qt/locale/bitcoin_fi.ts \ qt/locale/bitcoin_fr_CA.ts \ + qt/locale/bitcoin_fr_FR.ts \ qt/locale/bitcoin_fr.ts \ qt/locale/bitcoin_gl.ts \ - qt/locale/bitcoin_gu_IN.ts \ qt/locale/bitcoin_he.ts \ qt/locale/bitcoin_hi_IN.ts \ qt/locale/bitcoin_hr.ts \ @@ -48,6 +52,7 @@ QT_TS = \ qt/locale/bitcoin_la.ts \ qt/locale/bitcoin_lt.ts \ qt/locale/bitcoin_lv_LV.ts \ + qt/locale/bitcoin_mk_MK.ts \ qt/locale/bitcoin_mn.ts \ qt/locale/bitcoin_ms_MY.ts \ qt/locale/bitcoin_nb.ts \ @@ -57,14 +62,15 @@ QT_TS = \ qt/locale/bitcoin_pt_BR.ts \ qt/locale/bitcoin_pt_PT.ts \ qt/locale/bitcoin_ro_RO.ts \ + qt/locale/bitcoin_ru_RU.ts \ qt/locale/bitcoin_ru.ts \ - qt/locale/bitcoin_sah.ts \ qt/locale/bitcoin_sk.ts \ qt/locale/bitcoin_sl_SI.ts \ qt/locale/bitcoin_sq.ts \ qt/locale/bitcoin_sr.ts \ qt/locale/bitcoin_sv.ts \ qt/locale/bitcoin_th_TH.ts \ + qt/locale/bitcoin_tr_TR.ts \ qt/locale/bitcoin_tr.ts \ qt/locale/bitcoin_uk.ts \ qt/locale/bitcoin_ur_PK.ts \ @@ -72,7 +78,7 @@ QT_TS = \ qt/locale/bitcoin_vi.ts \ qt/locale/bitcoin_vi_VN.ts \ qt/locale/bitcoin_zh_CN.ts \ - qt/locale/bitcoin_zh_HK.ts \ + qt/locale/bitcoin_zh.ts \ qt/locale/bitcoin_zh_TW.ts QT_FORMS_UI = \ diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 0f9cdd7fd8..d89132f806 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -64,6 +64,7 @@ BITCOIN_TESTS =\ test/pmt_tests.cpp \ test/policyestimator_tests.cpp \ test/pow_tests.cpp \ + test/prevector_tests.cpp \ test/reverselock_tests.cpp \ test/rpc_tests.cpp \ test/sanity_tests.cpp \ diff --git a/src/amount.h b/src/amount.h index a4c7764cda..a2e4a59d1f 100644 --- a/src/amount.h +++ b/src/amount.h @@ -30,7 +30,7 @@ extern const std::string CURRENCY_UNIT; static const CAmount MAX_MONEY = 21000000 * COIN; inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); } -/** Type-safe wrapper class to for fee rates +/** Type-safe wrapper class for fee rates * (how much to pay based on transaction size) */ class CFeeRate diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index 58ced1ade9..2fa91e4e77 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -34,7 +34,7 @@ std::string HelpMessageCli() strUsage += HelpMessageOpt("-datadir=<dir>", _("Specify data directory")); AppendParamsHelpMessages(strUsage); strUsage += HelpMessageOpt("-rpcconnect=<ip>", strprintf(_("Send commands to node running on <ip> (default: %s)"), DEFAULT_RPCCONNECT)); - strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Connect to JSON-RPC on <port> (default: %u or testnet: %u)"), 8332, 18332)); + strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Connect to JSON-RPC on <port> (default: %u or testnet: %u)"), BaseParams(CBaseChainParams::MAIN).RPCPort(), BaseParams(CBaseChainParams::TESTNET).RPCPort())); strUsage += HelpMessageOpt("-rpcwait", _("Wait for RPC server to start")); strUsage += HelpMessageOpt("-rpcuser=<user>", _("Username for JSON-RPC connections")); strUsage += HelpMessageOpt("-rpcpassword=<pw>", _("Password for JSON-RPC connections")); diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index db2dc751f5..bc64cdc5d9 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -65,19 +65,6 @@ public: }; static CBaseRegTestParams regTestParams; -/* - * Unit test - */ -class CBaseUnitTestParams : public CBaseMainParams -{ -public: - CBaseUnitTestParams() - { - strDataDir = "unittest"; - } -}; -static CBaseUnitTestParams unitTestParams; - static CBaseChainParams* pCurrentBaseParams = 0; const CBaseChainParams& BaseParams() @@ -86,18 +73,23 @@ const CBaseChainParams& BaseParams() return *pCurrentBaseParams; } -void SelectBaseParams(const std::string& chain) +CBaseChainParams& BaseParams(const std::string& chain) { if (chain == CBaseChainParams::MAIN) - pCurrentBaseParams = &mainParams; + return mainParams; else if (chain == CBaseChainParams::TESTNET) - pCurrentBaseParams = &testNetParams; + return testNetParams; else if (chain == CBaseChainParams::REGTEST) - pCurrentBaseParams = ®TestParams; + return regTestParams; else throw std::runtime_error(strprintf("%s: Unknown chain %s.", __func__, chain)); } +void SelectBaseParams(const std::string& chain) +{ + pCurrentBaseParams = &BaseParams(chain); +} + std::string ChainNameFromCommandLine() { bool fRegTest = GetBoolArg("-regtest", false); diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h index 095c4cbdcb..9c3e9a0ebf 100644 --- a/src/chainparamsbase.h +++ b/src/chainparamsbase.h @@ -42,6 +42,8 @@ void AppendParamsHelpMessages(std::string& strUsage, bool debugHelp=true); */ const CBaseChainParams& BaseParams(); +CBaseChainParams& BaseParams(const std::string& chain); + /** Sets the params returned by Params() to those for the given network. */ void SelectBaseParams(const std::string& chain); diff --git a/src/clientversion.h b/src/clientversion.h index 5a06b310a3..cd947a9761 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -15,7 +15,7 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 0 -#define CLIENT_VERSION_MINOR 11 +#define CLIENT_VERSION_MINOR 12 #define CLIENT_VERSION_REVISION 99 #define CLIENT_VERSION_BUILD 0 diff --git a/src/coincontrol.h b/src/coincontrol.h index bc965f9e19..3945644ce8 100644 --- a/src/coincontrol.h +++ b/src/coincontrol.h @@ -16,6 +16,8 @@ public: bool fAllowOtherInputs; //! Includes watch only addresses which match the ISMINE_WATCH_SOLVABLE criteria bool fAllowWatchOnly; + //! Minimum absolute fee (not per kilobyte) + CAmount nMinimumTotalFee; CCoinControl() { @@ -28,6 +30,7 @@ public: fAllowOtherInputs = false; fAllowWatchOnly = false; setSelected.clear(); + nMinimumTotalFee = 0; } bool HasSelected() const diff --git a/src/coins.cpp b/src/coins.cpp index f0ea5c0459..122bf4e48d 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -144,6 +144,11 @@ bool CCoinsViewCache::HaveCoins(const uint256 &txid) const { return (it != cacheCoins.end() && !it->second.coins.vout.empty()); } +bool CCoinsViewCache::HaveCoinsInCache(const uint256 &txid) const { + CCoinsMap::const_iterator it = cacheCoins.find(txid); + return it != cacheCoins.end(); +} + uint256 CCoinsViewCache::GetBestBlock() const { if (hashBlock.IsNull()) hashBlock = base->GetBestBlock(); @@ -206,6 +211,15 @@ bool CCoinsViewCache::Flush() { return fOk; } +void CCoinsViewCache::Uncache(const uint256& hash) +{ + CCoinsMap::iterator it = cacheCoins.find(hash); + if (it != cacheCoins.end() && it->second.flags == 0) { + cachedCoinsUsage -= it->second.coins.DynamicMemoryUsage(); + cacheCoins.erase(it); + } +} + unsigned int CCoinsViewCache::GetCacheSize() const { return cacheCoins.size(); } @@ -243,8 +257,9 @@ bool CCoinsViewCache::HaveInputs(const CTransaction& tx) const return true; } -double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const +double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight, CAmount &inChainInputValue) const { + inChainInputValue = 0; if (tx.IsCoinBase()) return 0.0; double dResult = 0.0; @@ -253,8 +268,9 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const const CCoins* coins = AccessCoins(txin.prevout.hash); assert(coins); if (!coins->IsAvailable(txin.prevout.n)) continue; - if (coins->nHeight < nHeight) { + if (coins->nHeight <= nHeight) { dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight); + inChainInputValue += coins->vout[txin.prevout.n].nValue; } } return tx.ComputePriority(dResult); diff --git a/src/coins.h b/src/coins.h index 99b25de45b..60c1ba8a78 100644 --- a/src/coins.h +++ b/src/coins.h @@ -406,6 +406,13 @@ public: bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock); /** + * Check if we have the given tx already loaded in this cache. + * The semantics are the same as HaveCoins(), but no calls to + * the backing CCoinsView are made. + */ + bool HaveCoinsInCache(const uint256 &txid) const; + + /** * Return a pointer to CCoins in the cache, or NULL if not found. This is * more efficient than GetCoins. Modifications to other cache entries are * allowed while accessing the returned pointer. @@ -437,6 +444,12 @@ public: */ bool Flush(); + /** + * Removes the transaction with the given hash from the cache, if it is + * not modified. + */ + void Uncache(const uint256 &txid); + //! Calculate the size of the cache (in number of transactions) unsigned int GetCacheSize() const; @@ -456,8 +469,12 @@ public: //! Check whether all prevouts of the transaction are present in the UTXO set represented by this view bool HaveInputs(const CTransaction& tx) const; - //! Return priority of tx at height nHeight - double GetPriority(const CTransaction &tx, int nHeight) const; + /** + * Return priority of tx at height nHeight. Also calculate the sum of the values of the inputs + * that are already in the chain. These are the inputs that will age and increase priority as + * new blocks are added to the chain. + */ + double GetPriority(const CTransaction &tx, int nHeight, CAmount &inChainInputValue) const; const CTxOut &GetOutputFor(const CTxIn& input) const; diff --git a/src/core_memusage.h b/src/core_memusage.h index a05f59ee0c..450537d059 100644 --- a/src/core_memusage.h +++ b/src/core_memusage.h @@ -10,7 +10,7 @@ #include "memusage.h" static inline size_t RecursiveDynamicUsage(const CScript& script) { - return memusage::DynamicUsage(*static_cast<const std::vector<unsigned char>*>(&script)); + return memusage::DynamicUsage(*static_cast<const CScriptBase*>(&script)); } static inline size_t RecursiveDynamicUsage(const COutPoint& out) { diff --git a/src/hash.h b/src/hash.h index 0771555623..daa92a0097 100644 --- a/src/hash.h +++ b/src/hash.h @@ -8,6 +8,7 @@ #include "crypto/ripemd160.h" #include "crypto/sha256.h" +#include "prevector.h" #include "serialize.h" #include "uint256.h" #include "version.h" @@ -118,6 +119,13 @@ inline uint160 Hash160(const std::vector<unsigned char>& vch) return Hash160(vch.begin(), vch.end()); } +/** Compute the 160-bit hash of a vector. */ +template<unsigned int N> +inline uint160 Hash160(const prevector<N, unsigned char>& vch) +{ + return Hash160(vch.begin(), vch.end()); +} + /** A writer stream (for serialization) that computes a 256-bit hash. */ class CHashWriter { diff --git a/src/httprpc.cpp b/src/httprpc.cpp index 98ac750bb1..2920aa26f7 100644 --- a/src/httprpc.cpp +++ b/src/httprpc.cpp @@ -10,8 +10,12 @@ #include "util.h" #include "utilstrencodings.h" #include "ui_interface.h" +#include "crypto/hmac_sha256.h" +#include <stdio.h> +#include "utilstrencodings.h" #include <boost/algorithm/string.hpp> // boost::trim +#include <boost/foreach.hpp> //BOOST_FOREACH /** Simple one-shot callback timer to be used by the RPC mechanism to e.g. * re-lock the wellet. @@ -72,6 +76,50 @@ static void JSONErrorReply(HTTPRequest* req, const UniValue& objError, const Uni req->WriteReply(nStatus, strReply); } +//This function checks username and password against -rpcauth +//entries from config file. +static bool multiUserAuthorized(std::string strUserPass) +{ + if (strUserPass.find(":") == std::string::npos) { + return false; + } + std::string strUser = strUserPass.substr(0, strUserPass.find(":")); + std::string strPass = strUserPass.substr(strUserPass.find(":") + 1); + + if (mapMultiArgs.count("-rpcauth") > 0) { + //Search for multi-user login/pass "rpcauth" from config + BOOST_FOREACH(std::string strRPCAuth, mapMultiArgs["-rpcauth"]) + { + std::vector<std::string> vFields; + boost::split(vFields, strRPCAuth, boost::is_any_of(":$")); + if (vFields.size() != 3) { + //Incorrect formatting in config file + continue; + } + + std::string strName = vFields[0]; + if (!TimingResistantEqual(strName, strUser)) { + continue; + } + + std::string strSalt = vFields[1]; + std::string strHash = vFields[2]; + + unsigned int KEY_SIZE = 32; + unsigned char *out = new unsigned char[KEY_SIZE]; + + CHMAC_SHA256(reinterpret_cast<const unsigned char*>(strSalt.c_str()), strSalt.size()).Write(reinterpret_cast<const unsigned char*>(strPass.c_str()), strPass.size()).Finalize(out); + std::vector<unsigned char> hexvec(out, out+KEY_SIZE); + std::string strHashFromPass = HexStr(hexvec); + + if (TimingResistantEqual(strHashFromPass, strHash)) { + return true; + } + } + } + return false; +} + static bool RPCAuthorized(const std::string& strAuth) { if (strRPCUserColonPass.empty()) // Belt-and-suspenders measure if InitRPCAuthentication was not called @@ -81,7 +129,12 @@ static bool RPCAuthorized(const std::string& strAuth) std::string strUserPass64 = strAuth.substr(6); boost::trim(strUserPass64); std::string strUserPass = DecodeBase64(strUserPass64); - return TimingResistantEqual(strUserPass, strRPCUserColonPass); + + //Check if authorized under single-user field + if (TimingResistantEqual(strUserPass, strRPCUserColonPass)) { + return true; + } + return multiUserAuthorized(strUserPass); } static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &) @@ -157,6 +210,7 @@ static bool InitRPCAuthentication() return false; } } else { + LogPrintf("Config options rpcuser and rpcpassword will soon be deprecated. Locally-run instances may remove rpcuser to use cookie-based auth, or may be replaced with rpcauth. Please see share/rpcuser for rpcauth auth generation."); strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; } return true; diff --git a/src/init.cpp b/src/init.cpp index 191c2ed8ae..645c8f94b1 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -393,8 +393,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageGroup(_("Wallet options:")); strUsage += HelpMessageOpt("-disablewallet", _("Do not load the wallet and disable wallet RPC calls")); strUsage += HelpMessageOpt("-keypool=<n>", strprintf(_("Set key pool size to <n> (default: %u)"), DEFAULT_KEYPOOL_SIZE)); - if (showDebug) - strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)", + strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf(_("Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)"), CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MINFEE))); strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in %s/kB) to add to transactions you send (default: %s)"), CURRENCY_UNIT, FormatMoney(payTxFee.GetFeePerK()))); @@ -441,7 +440,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-limitdescendantcount=<n>", strprintf("Do not accept transactions if any ancestor would have <n> or more in-mempool descendants (default: %u)", DEFAULT_DESCENDANT_LIMIT)); strUsage += HelpMessageOpt("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT)); } - string debugCategories = "addrman, alert, bench, coindb, db, lock, rand, rpc, selectcoins, mempool, mempoolrej, net, proxy, prune, http, libevent, zmq"; // Don't translate these and qt below + string debugCategories = "addrman, alert, bench, coindb, db, lock, rand, rpc, selectcoins, mempool, mempoolrej, net, proxy, prune, http, libevent, tor, zmq"; // Don't translate these and qt below if (mode == HMM_BITCOIN_QT) debugCategories += ", qt"; strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " + @@ -491,7 +490,8 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-rpcbind=<addr>", _("Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)")); strUsage += HelpMessageOpt("-rpcuser=<user>", _("Username for JSON-RPC connections")); strUsage += HelpMessageOpt("-rpcpassword=<pw>", _("Password for JSON-RPC connections")); - strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8332, 18332)); + strUsage += HelpMessageOpt("-rpcauth=<userpw>", _("Username and hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in share/rpcuser. This option can be specified multiple times")); + strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), BaseParams(CBaseChainParams::MAIN).RPCPort(), BaseParams(CBaseChainParams::TESTNET).RPCPort())); strUsage += HelpMessageOpt("-rpcallowip=<ip>", _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times")); strUsage += HelpMessageOpt("-rpcthreads=<n>", strprintf(_("Set the number of threads to service RPC calls (default: %d)"), DEFAULT_HTTP_THREADS)); if (showDebug) { @@ -515,11 +515,14 @@ std::string LicenseInfo() "\n"; } -static void BlockNotifyCallback(const uint256& hashNewTip) +static void BlockNotifyCallback(bool initialSync, const CBlockIndex *pBlockIndex) { + if (initialSync || !pBlockIndex) + return; + std::string strCmd = GetArg("-blocknotify", ""); - boost::replace_all(strCmd, "%s", hashNewTip.GetHex()); + boost::replace_all(strCmd, "%s", pBlockIndex->GetBlockHash().GetHex()); boost::thread t(runCommand, strCmd); // thread runs free } diff --git a/src/main.cpp b/src/main.cpp index 238e2276cc..e8392fbb06 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -134,9 +134,9 @@ namespace { set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexCandidates; /** Number of nodes with fSyncStarted. */ int nSyncStarted = 0; - /** All pairs A->B, where A (or one if its ancestors) misses transactions, but B has transactions. - * Pruned nodes may have entries where B is missing data. - */ + /** All pairs A->B, where A (or one of its ancestors) misses transactions, but B has transactions. + * Pruned nodes may have entries where B is missing data. + */ multimap<CBlockIndex*, CBlockIndex*> mapBlocksUnlinked; CCriticalSection cs_LastBlockFile; @@ -789,6 +789,17 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state) return true; } +void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) { + int expired = pool.Expire(GetTime() - age); + if (expired != 0) + LogPrint("mempool", "Expired %i transactions from the memory pool\n", expired); + + std::vector<uint256> vNoSpendsRemaining; + pool.TrimToSize(limit, &vNoSpendsRemaining); + BOOST_FOREACH(const uint256& removed, vNoSpendsRemaining) + pcoinsTip->Uncache(removed); +} + CAmount GetMinRelayFee(const CTransaction& tx, const CTxMemPool& pool, unsigned int nBytes, bool fAllowFree) { uint256 hash = tx.GetHash(); @@ -816,7 +827,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, const CTxMemPool& pool, unsigned } /** Convert CValidationState to a human-readable message for logging */ -static std::string FormatStateMessage(const CValidationState &state) +std::string FormatStateMessage(const CValidationState &state) { return strprintf("%s%s (code %i)", state.GetRejectReason(), @@ -824,8 +835,9 @@ static std::string FormatStateMessage(const CValidationState &state) state.GetRejectCode()); } -bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, - bool* pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee) +bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, + bool* pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee, + std::vector<uint256>& vHashTxnToUncache) { AssertLockHeld(cs_main); if (pfMissingInputs) @@ -906,13 +918,19 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa view.SetBackend(viewMemPool); // do we already have it? - if (view.HaveCoins(hash)) + bool fHadTxInCache = pcoinsTip->HaveCoinsInCache(hash); + if (view.HaveCoins(hash)) { + if (!fHadTxInCache) + vHashTxnToUncache.push_back(hash); return state.Invalid(false, REJECT_ALREADY_KNOWN, "txn-already-known"); + } // do all inputs exist? // Note that this does not check for the presence of actual outputs (see the next check for that), // and only helps with filling in pfMissingInputs (to determine missing vs spent). BOOST_FOREACH(const CTxIn txin, tx.vin) { + if (!pcoinsTip->HaveCoinsInCache(txin.prevout.hash)) + vHashTxnToUncache.push_back(txin.prevout.hash); if (!view.HaveCoins(txin.prevout.hash)) { if (pfMissingInputs) *pfMissingInputs = true; @@ -950,9 +968,21 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa CAmount nValueOut = tx.GetValueOut(); CAmount nFees = nValueIn-nValueOut; - double dPriority = view.GetPriority(tx, chainActive.Height()); + CAmount inChainInputValue; + double dPriority = view.GetPriority(tx, chainActive.Height(), inChainInputValue); + + // Keep track of transactions that spend a coinbase, which we re-scan + // during reorgs to ensure COINBASE_MATURITY is still met. + bool fSpendsCoinbase = false; + BOOST_FOREACH(const CTxIn &txin, tx.vin) { + const CCoins *coins = view.AccessCoins(txin.prevout.hash); + if (coins->IsCoinBase()) { + fSpendsCoinbase = true; + break; + } + } - CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), pool.HasNoInputsOf(tx)); + CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), pool.HasNoInputsOf(tx), inChainInputValue, fSpendsCoinbase, nSigOps); unsigned int nSize = entry.GetTxSize(); // Don't accept it if it can't get into a block @@ -964,7 +994,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa CAmount mempoolRejectFee = pool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFee(nSize); if (mempoolRejectFee > 0 && nFees < mempoolRejectFee) { return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "mempool min fee not met", false, strprintf("%d < %d", nFees, mempoolRejectFee)); - } else if (GetBoolArg("-relaypriority", DEFAULT_RELAYPRIORITY) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) { + } else if (GetBoolArg("-relaypriority", DEFAULT_RELAYPRIORITY) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(entry.GetPriority(chainActive.Height() + 1))) { // Require that free transactions have sufficient priority to be mined in the next block. return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "insufficient priority"); } @@ -1198,12 +1228,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // trim mempool and check if tx was trimmed if (!fOverrideMempoolLimit) { - int expired = pool.Expire(GetTime() - GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60); - if (expired != 0) - LogPrint("mempool", "Expired %i transactions from the memory pool\n", expired); - - pool.TrimToSize(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000); - if (!pool.exists(tx.GetHash())) + LimitMempoolSize(pool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60); + if (!pool.exists(hash)) return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "mempool full"); } } @@ -1213,6 +1239,18 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return true; } +bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, + bool* pfMissingInputs, bool fOverrideMempoolLimit, bool fRejectAbsurdFee) +{ + std::vector<uint256> vHashTxToUncache; + bool res = AcceptToMemoryPoolWorker(pool, state, tx, fLimitFree, pfMissingInputs, fOverrideMempoolLimit, fRejectAbsurdFee, vHashTxToUncache); + if (!res) { + BOOST_FOREACH(const uint256& hashTx, vHashTxToUncache) + pcoinsTip->Uncache(hashTx); + } + return res; +} + /** Return transaction in tx, and if it was found inside a block, its hash is placed in hashBlock */ bool GetTransaction(const uint256 &hash, CTransaction &txOut, const Consensus::Params& consensusParams, uint256 &hashBlock, bool fAllowSlow) { @@ -1907,8 +1945,8 @@ void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const // How likely is it to find that many by chance? double p = boost::math::pdf(poisson, nBlocks); - LogPrint("partitioncheck", "%s : Found %d blocks in the last %d hours\n", __func__, nBlocks, SPAN_HOURS); - LogPrint("partitioncheck", "%s : likelihood: %g\n", __func__, p); + LogPrint("partitioncheck", "%s: Found %d blocks in the last %d hours\n", __func__, nBlocks, SPAN_HOURS); + LogPrint("partitioncheck", "%s: likelihood: %g\n", __func__, p); // Aim for one false-positive about every fifty years of normal running: const int FIFTY_YEARS = 50*365*24*60*60; @@ -2309,12 +2347,11 @@ void static UpdateTip(CBlockIndex *pindexNew) { } } -/** Disconnect chainActive's tip. You want to manually re-limit mempool size after this */ +/** Disconnect chainActive's tip. You probably want to call mempool.removeForReorg and manually re-limit mempool size after this, with cs_main held. */ bool static DisconnectTip(CValidationState& state, const Consensus::Params& consensusParams) { CBlockIndex *pindexDelete = chainActive.Tip(); assert(pindexDelete); - mempool.check(pcoinsTip); // Read block from disk. CBlock block; if (!ReadBlockFromDisk(block, pindexDelete, consensusParams)) @@ -2349,8 +2386,6 @@ bool static DisconnectTip(CValidationState& state, const Consensus::Params& cons // UpdateTransactionsFromBlock finds descendants of any transactions in this // block that were added back and cleans up the mempool state. mempool.UpdateTransactionsFromBlock(vHashUpdate); - mempool.removeCoinbaseSpends(pcoinsTip, pindexDelete->nHeight); - mempool.check(pcoinsTip); // Update chainActive and related variables. UpdateTip(pindexDelete->pprev); // Let wallets know transactions went from 1-confirmed to @@ -2374,7 +2409,6 @@ static int64_t nTimePostConnect = 0; bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, CBlockIndex* pindexNew, const CBlock* pblock) { assert(pindexNew->pprev == chainActive.Tip()); - mempool.check(pcoinsTip); // Read block from disk. int64_t nTime1 = GetTimeMicros(); CBlock block; @@ -2411,7 +2445,6 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams, // Remove conflicting transactions from the mempool. list<CTransaction> txConflicted; mempool.removeForBlock(pblock->vtx, pindexNew->nHeight, txConflicted, !IsInitialBlockDownload()); - mempool.check(pcoinsTip); // Update chainActive & related variables. UpdateTip(pindexNew); // Tell wallet about transactions that went from mempool @@ -2524,46 +2557,49 @@ static bool ActivateBestChainStep(CValidationState& state, const CChainParams& c bool fContinue = true; int nHeight = pindexFork ? pindexFork->nHeight : -1; while (fContinue && nHeight != pindexMostWork->nHeight) { - // Don't iterate the entire list of potential improvements toward the best tip, as we likely only need - // a few blocks along the way. - int nTargetHeight = std::min(nHeight + 32, pindexMostWork->nHeight); - vpindexToConnect.clear(); - vpindexToConnect.reserve(nTargetHeight - nHeight); - CBlockIndex *pindexIter = pindexMostWork->GetAncestor(nTargetHeight); - while (pindexIter && pindexIter->nHeight != nHeight) { - vpindexToConnect.push_back(pindexIter); - pindexIter = pindexIter->pprev; - } - nHeight = nTargetHeight; - - // Connect new blocks. - BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) { - if (!ConnectTip(state, chainparams, pindexConnect, pindexConnect == pindexMostWork ? pblock : NULL)) { - if (state.IsInvalid()) { - // The block violates a consensus rule. - if (!state.CorruptionPossible()) - InvalidChainFound(vpindexToConnect.back()); - state = CValidationState(); - fInvalidFound = true; - fContinue = false; - break; + // Don't iterate the entire list of potential improvements toward the best tip, as we likely only need + // a few blocks along the way. + int nTargetHeight = std::min(nHeight + 32, pindexMostWork->nHeight); + vpindexToConnect.clear(); + vpindexToConnect.reserve(nTargetHeight - nHeight); + CBlockIndex *pindexIter = pindexMostWork->GetAncestor(nTargetHeight); + while (pindexIter && pindexIter->nHeight != nHeight) { + vpindexToConnect.push_back(pindexIter); + pindexIter = pindexIter->pprev; + } + nHeight = nTargetHeight; + + // Connect new blocks. + BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) { + if (!ConnectTip(state, chainparams, pindexConnect, pindexConnect == pindexMostWork ? pblock : NULL)) { + if (state.IsInvalid()) { + // The block violates a consensus rule. + if (!state.CorruptionPossible()) + InvalidChainFound(vpindexToConnect.back()); + state = CValidationState(); + fInvalidFound = true; + fContinue = false; + break; + } else { + // A system error occurred (disk space, database error, ...). + return false; + } } else { - // A system error occurred (disk space, database error, ...). - return false; - } - } else { - PruneBlockIndexCandidates(); - if (!pindexOldTip || chainActive.Tip()->nChainWork > pindexOldTip->nChainWork) { - // We're in a better position than we were. Return temporarily to release the lock. - fContinue = false; - break; + PruneBlockIndexCandidates(); + if (!pindexOldTip || chainActive.Tip()->nChainWork > pindexOldTip->nChainWork) { + // We're in a better position than we were. Return temporarily to release the lock. + fContinue = false; + break; + } } } } - } - if (fBlocksDisconnected) - mempool.TrimToSize(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000); + if (fBlocksDisconnected) { + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); + LimitMempoolSize(mempool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60); + } + mempool.check(pcoinsTip); // Callbacks/notifications for a new best chain. if (fInvalidFound) @@ -2606,37 +2642,41 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, // When we reach this point, we switched to a new tip (stored in pindexNewTip). // Notifications/callbacks that can run without cs_main - if (!fInitialDownload) { - // Find the hashes of all blocks that weren't previously in the best chain. - std::vector<uint256> vHashes; - CBlockIndex *pindexToAnnounce = pindexNewTip; - while (pindexToAnnounce != pindexFork) { - vHashes.push_back(pindexToAnnounce->GetBlockHash()); - pindexToAnnounce = pindexToAnnounce->pprev; - if (vHashes.size() == MAX_BLOCKS_TO_ANNOUNCE) { - // Limit announcements in case of a huge reorganization. - // Rely on the peer's synchronization mechanism in that case. - break; + // Always notify the UI if a new block tip was connected + if (pindexFork != pindexNewTip) { + uiInterface.NotifyBlockTip(fInitialDownload, pindexNewTip); + + if (!fInitialDownload) { + // Find the hashes of all blocks that weren't previously in the best chain. + std::vector<uint256> vHashes; + CBlockIndex *pindexToAnnounce = pindexNewTip; + while (pindexToAnnounce != pindexFork) { + vHashes.push_back(pindexToAnnounce->GetBlockHash()); + pindexToAnnounce = pindexToAnnounce->pprev; + if (vHashes.size() == MAX_BLOCKS_TO_ANNOUNCE) { + // Limit announcements in case of a huge reorganization. + // Rely on the peer's synchronization mechanism in that case. + break; + } } - } - // Relay inventory, but don't relay old inventory during initial block download. - int nBlockEstimate = 0; - if (fCheckpointsEnabled) - nBlockEstimate = Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints()); - { - LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) { - if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) { - BOOST_REVERSE_FOREACH(const uint256& hash, vHashes) { - pnode->PushBlockHash(hash); + // Relay inventory, but don't relay old inventory during initial block download. + int nBlockEstimate = 0; + if (fCheckpointsEnabled) + nBlockEstimate = Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints()); + { + LOCK(cs_vNodes); + BOOST_FOREACH(CNode* pnode, vNodes) { + if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) { + BOOST_REVERSE_FOREACH(const uint256& hash, vHashes) { + pnode->PushBlockHash(hash); + } } } } - } - // Notify external listeners about the new tip. - if (!vHashes.empty()) { - GetMainSignals().UpdatedBlockTip(pindexNewTip); - uiInterface.NotifyBlockTip(vHashes.front()); + // Notify external listeners about the new tip. + if (!vHashes.empty()) { + GetMainSignals().UpdatedBlockTip(pindexNewTip); + } } } } while(pindexMostWork != chainActive.Tip()); @@ -2667,11 +2707,12 @@ bool InvalidateBlock(CValidationState& state, const Consensus::Params& consensus // ActivateBestChain considers blocks already in chainActive // unconditionally valid already, so force disconnect away from it. if (!DisconnectTip(state, consensusParams)) { + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); return false; } } - mempool.TrimToSize(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000); + LimitMempoolSize(mempool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60); // The resulting new best tip may not be in setBlockIndexCandidates anymore, so // add it again. @@ -2684,6 +2725,7 @@ bool InvalidateBlock(CValidationState& state, const Consensus::Params& consensus } InvalidChainFound(pindex); + mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS); return true; } @@ -3005,7 +3047,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta // Reject block.nVersion=2 blocks when 95% (75% on testnet) of the network has upgraded: if (block.nVersion < 3 && IsSuperMajority(3, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams)) - return state.Invalid(error("%s : rejected nVersion=2 block", __func__), + return state.Invalid(error("%s: rejected nVersion=2 block", __func__), REJECT_OBSOLETE, "bad-version"); // Reject block.nVersion=3 blocks when 95% (75% on testnet) of the network has upgraded: @@ -3974,29 +4016,34 @@ std::string GetWarnings(const std::string& strFor) int nPriority = 0; string strStatusBar; string strRPC; + string strGUI; - if (!CLIENT_VERSION_IS_RELEASE) - strStatusBar = _("This is a pre-release test build - use at your own risk - do not use for mining or merchant applications"); + if (!CLIENT_VERSION_IS_RELEASE) { + strStatusBar = "This is a pre-release test build - use at your own risk - do not use for mining or merchant applications"; + strGUI = _("This is a pre-release test build - use at your own risk - do not use for mining or merchant applications"); + } if (GetBoolArg("-testsafemode", DEFAULT_TESTSAFEMODE)) - strStatusBar = strRPC = "testsafemode enabled"; + strStatusBar = strRPC = strGUI = "testsafemode enabled"; // Misc warnings like out of disk space and clock is wrong if (strMiscWarning != "") { nPriority = 1000; - strStatusBar = strMiscWarning; + strStatusBar = strGUI = strMiscWarning; } if (fLargeWorkForkFound) { nPriority = 2000; - strStatusBar = strRPC = _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); + strStatusBar = strRPC = "Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."; + strGUI = _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); } else if (fLargeWorkInvalidChainFound) { nPriority = 2000; - strStatusBar = strRPC = _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); + strStatusBar = strRPC = "Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."; + strGUI = _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); } // Alerts @@ -4008,12 +4055,14 @@ std::string GetWarnings(const std::string& strFor) if (alert.AppliesToMe() && alert.nPriority > nPriority) { nPriority = alert.nPriority; - strStatusBar = alert.strStatusBar; + strStatusBar = strGUI = alert.strStatusBar; } } } - if (strFor == "statusbar") + if (strFor == "gui") + return strGUI; + else if (strFor == "statusbar") return strStatusBar; else if (strFor == "rpc") return strRPC; @@ -4669,6 +4718,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, bool fMissingInputs = false; CValidationState state; + pfrom->setAskFor.erase(inv.hash); mapAlreadyAskedFor.erase(inv); if (!AlreadyHave(inv) && AcceptToMemoryPool(mempool, state, tx, true, &fMissingInputs)) @@ -4779,6 +4829,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (nDoS > 0) Misbehaving(pfrom->GetId(), nDoS); } + FlushStateToDisk(state, FLUSH_STATE_PERIODIC); } @@ -5615,6 +5666,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle) pto->PushMessage("getdata", vGetData); vGetData.clear(); } + } else { + //If we're not going to ask, don't expect a response. + pto->setAskFor.erase(inv.hash); } pto->mapAskFor.erase(pto->mapAskFor.begin()); } diff --git a/src/main.h b/src/main.h index bdbfa3826e..19623f4d96 100644 --- a/src/main.h +++ b/src/main.h @@ -206,7 +206,13 @@ void ThreadScriptCheck(); void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const CBlockIndex *const &bestHeader, int64_t nPowTargetSpacing); /** Check whether we are doing an initial block download (synchronizing from disk or network) */ bool IsInitialBlockDownload(); -/** Format a string that describes several potential problems detected by the core */ +/** Format a string that describes several potential problems detected by the core. + * strFor can have three values: + * - "rpc": get critical warnings, which should put the client in safe mode if non-empty + * - "statusbar": get all warnings + * - "gui": get all warnings, translated (where possible) for GUI + * This function only returns the highest priority warning of the set selected by strFor. + */ std::string GetWarnings(const std::string& strFor); /** Retrieve a transaction (from memory pool, or from disk, if possible) */ bool GetTransaction(const uint256 &hash, CTransaction &tx, const Consensus::Params& params, uint256 &hashBlock, bool fAllowSlow = false); @@ -251,6 +257,8 @@ void PruneAndFlush(); bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, bool* pfMissingInputs, bool fOverrideMempoolLimit=false, bool fRejectAbsurdFee=false); +/** Convert CValidationState to a human-readable message for logging */ +std::string FormatStateMessage(const CValidationState &state); struct CNodeStateStats { int nMisbehavior; @@ -467,7 +475,7 @@ bool InvalidateBlock(CValidationState& state, const Consensus::Params& consensus /** Remove invalidity status from a block and its descendants. */ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex); -/** The currently-connected chain of blocks. */ +/** The currently-connected chain of blocks (protected by cs_main). */ extern CChain chainActive; /** Global variable that points to the active CCoinsView (protected by cs_main) */ diff --git a/src/memusage.h b/src/memusage.h index e96c5bf038..49760e64c7 100644 --- a/src/memusage.h +++ b/src/memusage.h @@ -46,7 +46,9 @@ template<typename X> static inline size_t DynamicUsage(const X * const &v) { ret static inline size_t MallocUsage(size_t alloc) { // Measured on libc6 2.19 on Linux. - if (sizeof(void*) == 8) { + if (alloc == 0) { + return 0; + } else if (sizeof(void*) == 8) { return ((alloc + 31) >> 4) << 4; } else if (sizeof(void*) == 4) { return ((alloc + 15) >> 3) << 3; @@ -74,6 +76,12 @@ static inline size_t DynamicUsage(const std::vector<X>& v) return MallocUsage(v.capacity() * sizeof(X)); } +template<unsigned int N, typename X, typename S, typename D> +static inline size_t DynamicUsage(const prevector<N, X, S, D>& v) +{ + return MallocUsage(v.allocated_memory()); +} + template<typename X, typename Y> static inline size_t DynamicUsage(const std::set<X, Y>& s) { diff --git a/src/miner.cpp b/src/miner.cpp index 27a1fbcf80..2728c7e6a7 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -27,6 +27,7 @@ #include <boost/thread.hpp> #include <boost/tuple/tuple.hpp> +#include <queue> using namespace std; @@ -40,48 +41,18 @@ using namespace std; // transactions in the memory pool. When we select transactions from the // pool, we select by highest priority or fee rate, so we might consider // transactions that depend on transactions that aren't yet in the block. -// The COrphan class keeps track of these 'temporary orphans' while -// CreateBlock is figuring out which transactions to include. -// -class COrphan -{ -public: - const CTransaction* ptx; - set<uint256> setDependsOn; - CFeeRate feeRate; - double dPriority; - - COrphan(const CTransaction* ptxIn) : ptx(ptxIn), feeRate(0), dPriority(0) - { - } -}; uint64_t nLastBlockTx = 0; uint64_t nLastBlockSize = 0; -// We want to sort transactions by priority and fee rate, so: -typedef boost::tuple<double, CFeeRate, const CTransaction*> TxPriority; -class TxPriorityCompare +class ScoreCompare { - bool byFee; - public: - TxPriorityCompare(bool _byFee) : byFee(_byFee) { } + ScoreCompare() {} - bool operator()(const TxPriority& a, const TxPriority& b) + bool operator()(const CTxMemPool::txiter a, const CTxMemPool::txiter b) { - if (byFee) - { - if (a.get<1>() == b.get<1>()) - return a.get<0>() < b.get<0>(); - return a.get<1>() < b.get<1>(); - } - else - { - if (a.get<0>() == b.get<0>()) - return a.get<1>() < b.get<1>(); - return a.get<0>() < b.get<0>(); - } + return CompareTxMemPoolEntryByScore()(*b,*a); // Convert to less than } }; @@ -127,7 +98,7 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s // Largest block you're willing to create: unsigned int nBlockMaxSize = GetArg("-blockmaxsize", DEFAULT_BLOCK_MAX_SIZE); - // Limit to betweeen 1K and MAX_BLOCK_SIZE-1K for sanity: + // Limit to between 1K and MAX_BLOCK_SIZE-1K for sanity: nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SIZE-1000), nBlockMaxSize)); // How much of the block should be dedicated to high-priority transactions, @@ -141,6 +112,22 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s nBlockMinSize = std::min(nBlockMaxSize, nBlockMinSize); // Collect memory pool transactions into the block + CTxMemPool::setEntries inBlock; + CTxMemPool::setEntries waitSet; + + // This vector will be sorted into a priority queue: + vector<TxCoinAgePriority> vecPriority; + TxCoinAgePriorityCompare pricomparer; + std::map<CTxMemPool::txiter, double, CTxMemPool::CompareIteratorByHash> waitPriMap; + typedef std::map<CTxMemPool::txiter, double, CTxMemPool::CompareIteratorByHash>::iterator waitPriIter; + double actualPriority = -1; + + std::priority_queue<CTxMemPool::txiter, std::vector<CTxMemPool::txiter>, ScoreCompare> clearedTxs; + bool fPrintPriority = GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY); + uint64_t nBlockSize = 1000; + uint64_t nBlockTx = 0; + unsigned int nBlockSigOps = 100; + int lastFewTxs = 0; CAmount nFees = 0; { @@ -149,157 +136,102 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s const int nHeight = pindexPrev->nHeight + 1; pblock->nTime = GetAdjustedTime(); const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast(); - CCoinsViewCache view(pcoinsTip); - - // Priority order to process transactions - list<COrphan> vOrphan; // list memory doesn't move - map<uint256, vector<COrphan*> > mapDependers; - bool fPrintPriority = GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY); - - // This vector will be sorted into a priority queue: - vector<TxPriority> vecPriority; - vecPriority.reserve(mempool.mapTx.size()); - for (CTxMemPool::indexed_transaction_set::iterator mi = mempool.mapTx.begin(); - mi != mempool.mapTx.end(); ++mi) - { - const CTransaction& tx = mi->GetTx(); - - int64_t nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST) - ? nMedianTimePast - : pblock->GetBlockTime(); - - if (tx.IsCoinBase() || !IsFinalTx(tx, nHeight, nLockTimeCutoff)) - continue; - - COrphan* porphan = NULL; - double dPriority = 0; - CAmount nTotalIn = 0; - bool fMissingInputs = false; - BOOST_FOREACH(const CTxIn& txin, tx.vin) - { - // Read prev transaction - if (!view.HaveCoins(txin.prevout.hash)) - { - // This should never happen; all transactions in the memory - // pool should connect to either transactions in the chain - // or other transactions in the memory pool. - if (!mempool.mapTx.count(txin.prevout.hash)) - { - LogPrintf("ERROR: mempool transaction missing input\n"); - if (fDebug) assert("mempool transaction missing input" == 0); - fMissingInputs = true; - if (porphan) - vOrphan.pop_back(); - break; - } - - // Has to wait for dependencies - if (!porphan) - { - // Use list for automatic deletion - vOrphan.push_back(COrphan(&tx)); - porphan = &vOrphan.back(); - } - mapDependers[txin.prevout.hash].push_back(porphan); - porphan->setDependsOn.insert(txin.prevout.hash); - nTotalIn += mempool.mapTx.find(txin.prevout.hash)->GetTx().vout[txin.prevout.n].nValue; - continue; - } - const CCoins* coins = view.AccessCoins(txin.prevout.hash); - assert(coins); - - CAmount nValueIn = coins->vout[txin.prevout.n].nValue; - nTotalIn += nValueIn; - - int nConf = nHeight - coins->nHeight; - - dPriority += (double)nValueIn * nConf; - } - if (fMissingInputs) continue; - - // Priority is sum(valuein * age) / modified_txsize - unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); - dPriority = tx.ComputePriority(dPriority, nTxSize); - - uint256 hash = tx.GetHash(); - mempool.ApplyDeltas(hash, dPriority, nTotalIn); - CFeeRate feeRate(nTotalIn-tx.GetValueOut(), nTxSize); + int64_t nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST) + ? nMedianTimePast + : pblock->GetBlockTime(); - if (porphan) + bool fPriorityBlock = nBlockPrioritySize > 0; + if (fPriorityBlock) { + vecPriority.reserve(mempool.mapTx.size()); + for (CTxMemPool::indexed_transaction_set::iterator mi = mempool.mapTx.begin(); + mi != mempool.mapTx.end(); ++mi) { - porphan->dPriority = dPriority; - porphan->feeRate = feeRate; + double dPriority = mi->GetPriority(nHeight); + CAmount dummy; + mempool.ApplyDeltas(mi->GetTx().GetHash(), dPriority, dummy); + vecPriority.push_back(TxCoinAgePriority(dPriority, mi)); } - else - vecPriority.push_back(TxPriority(dPriority, feeRate, &(mi->GetTx()))); + std::make_heap(vecPriority.begin(), vecPriority.end(), pricomparer); } - // Collect transactions into block - uint64_t nBlockSize = 1000; - uint64_t nBlockTx = 0; - int nBlockSigOps = 100; - bool fSortedByFee = (nBlockPrioritySize <= 0); + CTxMemPool::indexed_transaction_set::nth_index<3>::type::iterator mi = mempool.mapTx.get<3>().begin(); + CTxMemPool::txiter iter; - TxPriorityCompare comparer(fSortedByFee); - std::make_heap(vecPriority.begin(), vecPriority.end(), comparer); - - while (!vecPriority.empty()) + while (mi != mempool.mapTx.get<3>().end() || !clearedTxs.empty()) { - // Take highest priority transaction off the priority queue: - double dPriority = vecPriority.front().get<0>(); - CFeeRate feeRate = vecPriority.front().get<1>(); - const CTransaction& tx = *(vecPriority.front().get<2>()); - - std::pop_heap(vecPriority.begin(), vecPriority.end(), comparer); - vecPriority.pop_back(); - - // Size limits - unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); - if (nBlockSize + nTxSize >= nBlockMaxSize) - continue; + bool priorityTx = false; + if (fPriorityBlock && !vecPriority.empty()) { // add a tx from priority queue to fill the blockprioritysize + priorityTx = true; + iter = vecPriority.front().second; + actualPriority = vecPriority.front().first; + std::pop_heap(vecPriority.begin(), vecPriority.end(), pricomparer); + vecPriority.pop_back(); + } + else if (clearedTxs.empty()) { // add tx with next highest score + iter = mempool.mapTx.project<0>(mi); + mi++; + } + else { // try to add a previously postponed child tx + iter = clearedTxs.top(); + clearedTxs.pop(); + } - // Legacy limits on sigOps: - unsigned int nTxSigOps = GetLegacySigOpCount(tx); - if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) - continue; + if (inBlock.count(iter)) + continue; // could have been added to the priorityBlock - // Skip free transactions if we're past the minimum block size: - const uint256& hash = tx.GetHash(); - double dPriorityDelta = 0; - CAmount nFeeDelta = 0; - mempool.ApplyDeltas(hash, dPriorityDelta, nFeeDelta); - if (fSortedByFee && (dPriorityDelta <= 0) && (nFeeDelta <= 0) && (feeRate < ::minRelayTxFee) && (nBlockSize + nTxSize >= nBlockMinSize)) - continue; + const CTransaction& tx = iter->GetTx(); - // Prioritise by fee once past the priority size or we run out of high-priority - // transactions: - if (!fSortedByFee && - ((nBlockSize + nTxSize >= nBlockPrioritySize) || !AllowFree(dPriority))) + bool fOrphan = false; + BOOST_FOREACH(CTxMemPool::txiter parent, mempool.GetMemPoolParents(iter)) { - fSortedByFee = true; - comparer = TxPriorityCompare(fSortedByFee); - std::make_heap(vecPriority.begin(), vecPriority.end(), comparer); + if (!inBlock.count(parent)) { + fOrphan = true; + break; + } } - - if (!view.HaveInputs(tx)) + if (fOrphan) { + if (priorityTx) + waitPriMap.insert(std::make_pair(iter,actualPriority)); + else + waitSet.insert(iter); continue; + } - CAmount nTxFees = view.GetValueIn(tx)-tx.GetValueOut(); - - nTxSigOps += GetP2SHSigOpCount(tx, view); - if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) + unsigned int nTxSize = iter->GetTxSize(); + if (fPriorityBlock && + (nBlockSize + nTxSize >= nBlockPrioritySize || !AllowFree(actualPriority))) { + fPriorityBlock = false; + waitPriMap.clear(); + } + if (!priorityTx && + (iter->GetModifiedFee() < ::minRelayTxFee.GetFee(nTxSize) && nBlockSize >= nBlockMinSize)) { + break; + } + if (nBlockSize + nTxSize >= nBlockMaxSize) { + if (nBlockSize > nBlockMaxSize - 100 || lastFewTxs > 50) { + break; + } + // Once we're within 1000 bytes of a full block, only look at 50 more txs + // to try to fill the remaining space. + if (nBlockSize > nBlockMaxSize - 1000) { + lastFewTxs++; + } continue; + } - // Note that flags: we don't want to set mempool/IsStandard() - // policy here, but we still have to ensure that the block we - // create only contains transactions that are valid in new blocks. - CValidationState state; - if (!CheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true)) + if (!IsFinalTx(tx, nHeight, nLockTimeCutoff)) continue; - UpdateCoins(tx, state, view, nHeight); + unsigned int nTxSigOps = iter->GetSigOpCount(); + if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) { + if (nBlockSigOps > MAX_BLOCK_SIGOPS - 2) { + break; + } + continue; + } + CAmount nTxFees = iter->GetFee(); // Added pblock->vtx.push_back(tx); pblocktemplate->vTxFees.push_back(nTxFees); @@ -311,31 +243,37 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s if (fPrintPriority) { + double dPriority = iter->GetPriority(nHeight); + CAmount dummy; + mempool.ApplyDeltas(tx.GetHash(), dPriority, dummy); LogPrintf("priority %.1f fee %s txid %s\n", - dPriority, feeRate.ToString(), tx.GetHash().ToString()); + dPriority , CFeeRate(iter->GetModifiedFee(), nTxSize).ToString(), tx.GetHash().ToString()); } + inBlock.insert(iter); + // Add transactions that depend on this one to the priority queue - if (mapDependers.count(hash)) + BOOST_FOREACH(CTxMemPool::txiter child, mempool.GetMemPoolChildren(iter)) { - BOOST_FOREACH(COrphan* porphan, mapDependers[hash]) - { - if (!porphan->setDependsOn.empty()) - { - porphan->setDependsOn.erase(hash); - if (porphan->setDependsOn.empty()) - { - vecPriority.push_back(TxPriority(porphan->dPriority, porphan->feeRate, porphan->ptx)); - std::push_heap(vecPriority.begin(), vecPriority.end(), comparer); - } + if (fPriorityBlock) { + waitPriIter wpiter = waitPriMap.find(child); + if (wpiter != waitPriMap.end()) { + vecPriority.push_back(TxCoinAgePriority(wpiter->second,child)); + std::push_heap(vecPriority.begin(), vecPriority.end(), pricomparer); + waitPriMap.erase(wpiter); + } + } + else { + if (waitSet.count(child)) { + clearedTxs.push(child); + waitSet.erase(child); } } } } - nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; - LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); + LogPrintf("CreateNewBlock(): total size %u txs: %u fees: %ld sigops %d\n", nBlockSize, nBlockTx, nFees, nBlockSigOps); // Compute final coinbase transaction. txNew.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus()); @@ -351,8 +289,9 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]); CValidationState state; - if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) - throw std::runtime_error("CreateNewBlock(): TestBlockValidity failed"); + if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) { + throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, FormatStateMessage(state))); + } } return pblocktemplate.release(); diff --git a/src/net.cpp b/src/net.cpp index 59c0faac2c..a8aa97feec 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2408,8 +2408,12 @@ CNode::~CNode() void CNode::AskFor(const CInv& inv) { - if (mapAskFor.size() > MAPASKFOR_MAX_SZ) + if (mapAskFor.size() > MAPASKFOR_MAX_SZ || setAskFor.size() > SETASKFOR_MAX_SZ) return; + // a peer may not have multiple non-responded queue positions for a single inv item + if (!setAskFor.insert(inv.hash).second) + return; + // We're using mapAskFor as a priority queue, // the key is the earliest time the request can be sent int64_t nRequestTime; @@ -57,6 +57,8 @@ static const bool DEFAULT_UPNP = false; #endif /** The maximum number of entries in mapAskFor */ static const size_t MAPASKFOR_MAX_SZ = MAX_INV_SZ; +/** The maximum number of entries in setAskFor (larger due to getdata latency)*/ +static const size_t SETASKFOR_MAX_SZ = 2 * MAX_INV_SZ; /** The maximum number of peer connections to maintain. */ static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125; /** The default for -maxuploadtarget. 0 = Unlimited */ @@ -388,6 +390,7 @@ public: CRollingBloomFilter filterInventoryKnown; std::vector<CInv> vInventoryToSend; CCriticalSection cs_inventory; + std::set<uint256> setAskFor; std::multimap<int64_t, CInv> mapAskFor; // Used for headers announcements - unfiltered blocks to relay // Also protected by cs_inventory diff --git a/src/policy/policy.h b/src/policy/policy.h index c8d2c1a924..31655f2f3a 100644 --- a/src/policy/policy.h +++ b/src/policy/policy.h @@ -18,7 +18,7 @@ class CCoinsViewCache; static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000; static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0; /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/ -static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000; +static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 0; /** The maximum size for transactions we're willing to relay/mine */ static const unsigned int MAX_STANDARD_TX_SIZE = 100000; /** Maximum number of signature check operations in an IsStandard() P2SH script */ diff --git a/src/prevector.h b/src/prevector.h new file mode 100644 index 0000000000..8992e305b3 --- /dev/null +++ b/src/prevector.h @@ -0,0 +1,486 @@ +#ifndef _BITCOIN_PREVECTOR_H_ +#define _BITCOIN_PREVECTOR_H_ + +#include <stdlib.h> +#include <stdint.h> +#include <string.h> + +#include <iterator> + +#pragma pack(push, 1) +/** Implements a drop-in replacement for std::vector<T> which stores up to N + * elements directly (without heap allocation). The types Size and Diff are + * used to store element counts, and can be any unsigned + signed type. + * + * Storage layout is either: + * - Direct allocation: + * - Size _size: the number of used elements (between 0 and N) + * - T direct[N]: an array of N elements of type T + * (only the first _size are initialized). + * - Indirect allocation: + * - Size _size: the number of used elements plus N + 1 + * - Size capacity: the number of allocated elements + * - T* indirect: a pointer to an array of capacity elements of type T + * (only the first _size are initialized). + * + * The data type T must be movable by memmove/realloc(). Once we switch to C++, + * move constructors can be used instead. + */ +template<unsigned int N, typename T, typename Size = uint32_t, typename Diff = int32_t> +class prevector { +public: + typedef Size size_type; + typedef Diff difference_type; + typedef T value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* pointer; + typedef const value_type* const_pointer; + + class iterator { + T* ptr; + public: + typedef Diff difference_type; + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::random_access_iterator_tag iterator_category; + iterator(T* ptr_) : ptr(ptr_) {} + T& operator*() const { return *ptr; } + T* operator->() const { return ptr; } + T& operator[](size_type pos) { return ptr[pos]; } + const T& operator[](size_type pos) const { return ptr[pos]; } + iterator& operator++() { ptr++; return *this; } + iterator& operator--() { ptr--; return *this; } + iterator operator++(int) { iterator copy(*this); ++(*this); return copy; } + iterator operator--(int) { iterator copy(*this); --(*this); return copy; } + difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); } + iterator operator+(size_type n) { return iterator(ptr + n); } + iterator& operator+=(size_type n) { ptr += n; return *this; } + iterator operator-(size_type n) { return iterator(ptr - n); } + iterator& operator-=(size_type n) { ptr -= n; return *this; } + bool operator==(iterator x) const { return ptr == x.ptr; } + bool operator!=(iterator x) const { return ptr != x.ptr; } + bool operator>=(iterator x) const { return ptr >= x.ptr; } + bool operator<=(iterator x) const { return ptr <= x.ptr; } + bool operator>(iterator x) const { return ptr > x.ptr; } + bool operator<(iterator x) const { return ptr < x.ptr; } + }; + + class reverse_iterator { + T* ptr; + public: + typedef Diff difference_type; + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::bidirectional_iterator_tag iterator_category; + reverse_iterator(T* ptr_) : ptr(ptr_) {} + T& operator*() { return *ptr; } + const T& operator*() const { return *ptr; } + T* operator->() { return ptr; } + const T* operator->() const { return ptr; } + reverse_iterator& operator--() { ptr++; return *this; } + reverse_iterator& operator++() { ptr--; return *this; } + reverse_iterator operator++(int) { reverse_iterator copy(*this); ++(*this); return copy; } + reverse_iterator operator--(int) { reverse_iterator copy(*this); --(*this); return copy; } + bool operator==(reverse_iterator x) const { return ptr == x.ptr; } + bool operator!=(reverse_iterator x) const { return ptr != x.ptr; } + }; + + class const_iterator { + const T* ptr; + public: + typedef Diff difference_type; + typedef const T value_type; + typedef const T* pointer; + typedef const T& reference; + typedef std::random_access_iterator_tag iterator_category; + const_iterator(const T* ptr_) : ptr(ptr_) {} + const_iterator(iterator x) : ptr(&(*x)) {} + const T& operator*() const { return *ptr; } + const T* operator->() const { return ptr; } + const T& operator[](size_type pos) const { return ptr[pos]; } + const_iterator& operator++() { ptr++; return *this; } + const_iterator& operator--() { ptr--; return *this; } + const_iterator operator++(int) { const_iterator copy(*this); ++(*this); return copy; } + const_iterator operator--(int) { const_iterator copy(*this); --(*this); return copy; } + difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); } + const_iterator operator+(size_type n) { return const_iterator(ptr + n); } + const_iterator& operator+=(size_type n) { ptr += n; return *this; } + const_iterator operator-(size_type n) { return const_iterator(ptr - n); } + const_iterator& operator-=(size_type n) { ptr -= n; return *this; } + bool operator==(const_iterator x) const { return ptr == x.ptr; } + bool operator!=(const_iterator x) const { return ptr != x.ptr; } + bool operator>=(const_iterator x) const { return ptr >= x.ptr; } + bool operator<=(const_iterator x) const { return ptr <= x.ptr; } + bool operator>(const_iterator x) const { return ptr > x.ptr; } + bool operator<(const_iterator x) const { return ptr < x.ptr; } + }; + + class const_reverse_iterator { + const T* ptr; + public: + typedef Diff difference_type; + typedef const T value_type; + typedef const T* pointer; + typedef const T& reference; + typedef std::bidirectional_iterator_tag iterator_category; + const_reverse_iterator(T* ptr_) : ptr(ptr_) {} + const_reverse_iterator(reverse_iterator x) : ptr(&(*x)) {} + const T& operator*() const { return *ptr; } + const T* operator->() const { return ptr; } + const_reverse_iterator& operator--() { ptr++; return *this; } + const_reverse_iterator& operator++() { ptr--; return *this; } + const_reverse_iterator operator++(int) { const_reverse_iterator copy(*this); ++(*this); return copy; } + const_reverse_iterator operator--(int) { const_reverse_iterator copy(*this); --(*this); return copy; } + bool operator==(const_reverse_iterator x) const { return ptr == x.ptr; } + bool operator!=(const_reverse_iterator x) const { return ptr != x.ptr; } + }; + +private: + size_type _size; + union direct_or_indirect { + char direct[sizeof(T) * N]; + struct { + size_type capacity; + char* indirect; + }; + } _union; + + T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; } + const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; } + T* indirect_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.indirect) + pos; } + const T* indirect_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.indirect) + pos; } + bool is_direct() const { return _size <= N; } + + void change_capacity(size_type new_capacity) { + if (new_capacity <= N) { + if (!is_direct()) { + T* indirect = indirect_ptr(0); + T* src = indirect; + T* dst = direct_ptr(0); + memcpy(dst, src, size() * sizeof(T)); + free(indirect); + _size -= N + 1; + } + } else { + if (!is_direct()) { + _union.indirect = static_cast<char*>(realloc(_union.indirect, ((size_t)sizeof(T)) * new_capacity)); + _union.capacity = new_capacity; + } else { + char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity)); + T* src = direct_ptr(0); + T* dst = reinterpret_cast<T*>(new_indirect); + memcpy(dst, src, size() * sizeof(T)); + _union.indirect = new_indirect; + _union.capacity = new_capacity; + _size += N + 1; + } + } + } + + T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); } + const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); } + +public: + void assign(size_type n, const T& val) { + clear(); + if (capacity() < n) { + change_capacity(n); + } + while (size() < n) { + _size++; + new(static_cast<void*>(item_ptr(size() - 1))) T(val); + } + } + + template<typename InputIterator> + void assign(InputIterator first, InputIterator last) { + size_type n = last - first; + clear(); + if (capacity() < n) { + change_capacity(n); + } + while (first != last) { + _size++; + new(static_cast<void*>(item_ptr(size() - 1))) T(*first); + ++first; + } + } + + prevector() : _size(0) {} + + explicit prevector(size_type n) : _size(0) { + resize(n); + } + + explicit prevector(size_type n, const T& val = T()) : _size(0) { + change_capacity(n); + while (size() < n) { + _size++; + new(static_cast<void*>(item_ptr(size() - 1))) T(val); + } + } + + template<typename InputIterator> + prevector(InputIterator first, InputIterator last) : _size(0) { + size_type n = last - first; + change_capacity(n); + while (first != last) { + _size++; + new(static_cast<void*>(item_ptr(size() - 1))) T(*first); + ++first; + } + } + + prevector(const prevector<N, T, Size, Diff>& other) : _size(0) { + change_capacity(other.size()); + const_iterator it = other.begin(); + while (it != other.end()) { + _size++; + new(static_cast<void*>(item_ptr(size() - 1))) T(*it); + ++it; + } + } + + prevector& operator=(const prevector<N, T, Size, Diff>& other) { + if (&other == this) { + return *this; + } + resize(0); + change_capacity(other.size()); + const_iterator it = other.begin(); + while (it != other.end()) { + _size++; + new(static_cast<void*>(item_ptr(size() - 1))) T(*it); + ++it; + } + return *this; + } + + size_type size() const { + return is_direct() ? _size : _size - N - 1; + } + + bool empty() const { + return size() == 0; + } + + iterator begin() { return iterator(item_ptr(0)); } + const_iterator begin() const { return const_iterator(item_ptr(0)); } + iterator end() { return iterator(item_ptr(size())); } + const_iterator end() const { return const_iterator(item_ptr(size())); } + + reverse_iterator rbegin() { return reverse_iterator(item_ptr(size() - 1)); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(item_ptr(size() - 1)); } + reverse_iterator rend() { return reverse_iterator(item_ptr(-1)); } + const_reverse_iterator rend() const { return const_reverse_iterator(item_ptr(-1)); } + + size_t capacity() const { + if (is_direct()) { + return N; + } else { + return _union.capacity; + } + } + + T& operator[](size_type pos) { + return *item_ptr(pos); + } + + const T& operator[](size_type pos) const { + return *item_ptr(pos); + } + + void resize(size_type new_size) { + while (size() > new_size) { + item_ptr(size() - 1)->~T(); + _size--; + } + if (new_size > capacity()) { + change_capacity(new_size); + } + while (size() < new_size) { + _size++; + new(static_cast<void*>(item_ptr(size() - 1))) T(); + } + } + + void reserve(size_type new_capacity) { + if (new_capacity > capacity()) { + change_capacity(new_capacity); + } + } + + void shrink_to_fit() { + change_capacity(size()); + } + + void clear() { + resize(0); + } + + iterator insert(iterator pos, const T& value) { + size_type p = pos - begin(); + size_type new_size = size() + 1; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + memmove(item_ptr(p + 1), item_ptr(p), (size() - p) * sizeof(T)); + _size++; + new(static_cast<void*>(item_ptr(p))) T(value); + return iterator(item_ptr(p)); + } + + void insert(iterator pos, size_type count, const T& value) { + size_type p = pos - begin(); + size_type new_size = size() + count; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + memmove(item_ptr(p + count), item_ptr(p), (size() - p) * sizeof(T)); + _size += count; + for (size_type i = 0; i < count; i++) { + new(static_cast<void*>(item_ptr(p + i))) T(value); + } + } + + template<typename InputIterator> + void insert(iterator pos, InputIterator first, InputIterator last) { + size_type p = pos - begin(); + difference_type count = last - first; + size_type new_size = size() + count; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + memmove(item_ptr(p + count), item_ptr(p), (size() - p) * sizeof(T)); + _size += count; + while (first != last) { + new(static_cast<void*>(item_ptr(p))) T(*first); + ++p; + ++first; + } + } + + iterator erase(iterator pos) { + (*pos).~T(); + memmove(&(*pos), &(*pos) + 1, ((char*)&(*end())) - ((char*)(1 + &(*pos)))); + _size--; + return pos; + } + + iterator erase(iterator first, iterator last) { + iterator p = first; + char* endp = (char*)&(*end()); + while (p != last) { + (*p).~T(); + _size--; + ++p; + } + memmove(&(*first), &(*last), endp - ((char*)(&(*last)))); + return first; + } + + void push_back(const T& value) { + size_type new_size = size() + 1; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + new(item_ptr(size())) T(value); + _size++; + } + + void pop_back() { + _size--; + } + + T& front() { + return *item_ptr(0); + } + + const T& front() const { + return *item_ptr(0); + } + + T& back() { + return *item_ptr(size() - 1); + } + + const T& back() const { + return *item_ptr(size() - 1); + } + + void swap(prevector<N, T, Size, Diff>& other) { + if (_size & other._size & 1) { + std::swap(_union.capacity, other._union.capacity); + std::swap(_union.indirect, other._union.indirect); + } else { + std::swap(_union, other._union); + } + std::swap(_size, other._size); + } + + ~prevector() { + clear(); + if (!is_direct()) { + free(_union.indirect); + _union.indirect = NULL; + } + } + + bool operator==(const prevector<N, T, Size, Diff>& other) const { + if (other.size() != size()) { + return false; + } + const_iterator b1 = begin(); + const_iterator b2 = other.begin(); + const_iterator e1 = end(); + while (b1 != e1) { + if ((*b1) != (*b2)) { + return false; + } + ++b1; + ++b2; + } + return true; + } + + bool operator!=(const prevector<N, T, Size, Diff>& other) const { + return !(*this == other); + } + + bool operator<(const prevector<N, T, Size, Diff>& other) const { + if (size() < other.size()) { + return true; + } + if (size() > other.size()) { + return false; + } + const_iterator b1 = begin(); + const_iterator b2 = other.begin(); + const_iterator e1 = end(); + while (b1 != e1) { + if ((*b1) < (*b2)) { + return true; + } + if ((*b2) < (*b1)) { + return false; + } + ++b1; + ++b2; + } + return false; + } + + size_t allocated_memory() const { + if (is_direct()) { + return 0; + } else { + return ((size_t)(sizeof(T))) * _union.capacity; + } + } +}; +#pragma pack(pop) + +#endif diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 98882d315e..c5d8a64a6d 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -74,7 +74,7 @@ public: template <typename Stream, typename Operation> inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { READWRITE(prevout); - READWRITE(scriptSig); + READWRITE(*(CScriptBase*)(&scriptSig)); READWRITE(nSequence); } @@ -119,7 +119,7 @@ public: template <typename Stream, typename Operation> inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { READWRITE(nValue); - READWRITE(scriptPubKey); + READWRITE(*(CScriptBase*)(&scriptPubKey)); } void SetNull() diff --git a/src/qt/bitcoin_locale.qrc b/src/qt/bitcoin_locale.qrc index b70a107397..a8a0253b07 100644 --- a/src/qt/bitcoin_locale.qrc +++ b/src/qt/bitcoin_locale.qrc @@ -1,36 +1,40 @@ <!DOCTYPE RCC><RCC version="1.0"> <qresource prefix="/translations"> - <file alias="ach">locale/bitcoin_ach.qm</file> <file alias="af_ZA">locale/bitcoin_af_ZA.qm</file> <file alias="ar">locale/bitcoin_ar.qm</file> <file alias="be_BY">locale/bitcoin_be_BY.qm</file> + <file alias="bg_BG">locale/bitcoin_bg_BG.qm</file> <file alias="bg">locale/bitcoin_bg.qm</file> <file alias="bs">locale/bitcoin_bs.qm</file> <file alias="ca_ES">locale/bitcoin_ca_ES.qm</file> <file alias="ca">locale/bitcoin_ca.qm</file> <file alias="ca@valencia">locale/bitcoin_ca@valencia.qm</file> - <file alias="cmn">locale/bitcoin_cmn.qm</file> + <file alias="cs_CZ">locale/bitcoin_cs_CZ.qm</file> <file alias="cs">locale/bitcoin_cs.qm</file> <file alias="cy">locale/bitcoin_cy.qm</file> <file alias="da">locale/bitcoin_da.qm</file> <file alias="de">locale/bitcoin_de.qm</file> <file alias="el_GR">locale/bitcoin_el_GR.qm</file> + <file alias="el">locale/bitcoin_el.qm</file> + <file alias="en_GB">locale/bitcoin_en_GB.qm</file> <file alias="en">locale/bitcoin_en.qm</file> <file alias="eo">locale/bitcoin_eo.qm</file> <file alias="es_CL">locale/bitcoin_es_CL.qm</file> <file alias="es_DO">locale/bitcoin_es_DO.qm</file> + <file alias="es_ES">locale/bitcoin_es_ES.qm</file> <file alias="es_MX">locale/bitcoin_es_MX.qm</file> <file alias="es">locale/bitcoin_es.qm</file> <file alias="es_UY">locale/bitcoin_es_UY.qm</file> + <file alias="es_VE">locale/bitcoin_es_VE.qm</file> <file alias="et">locale/bitcoin_et.qm</file> <file alias="eu_ES">locale/bitcoin_eu_ES.qm</file> <file alias="fa_IR">locale/bitcoin_fa_IR.qm</file> <file alias="fa">locale/bitcoin_fa.qm</file> <file alias="fi">locale/bitcoin_fi.qm</file> <file alias="fr_CA">locale/bitcoin_fr_CA.qm</file> + <file alias="fr_FR">locale/bitcoin_fr_FR.qm</file> <file alias="fr">locale/bitcoin_fr.qm</file> <file alias="gl">locale/bitcoin_gl.qm</file> - <file alias="gu_IN">locale/bitcoin_gu_IN.qm</file> <file alias="he">locale/bitcoin_he.qm</file> <file alias="hi_IN">locale/bitcoin_hi_IN.qm</file> <file alias="hr">locale/bitcoin_hr.qm</file> @@ -45,6 +49,7 @@ <file alias="la">locale/bitcoin_la.qm</file> <file alias="lt">locale/bitcoin_lt.qm</file> <file alias="lv_LV">locale/bitcoin_lv_LV.qm</file> + <file alias="mk_MK">locale/bitcoin_mk_MK.qm</file> <file alias="mn">locale/bitcoin_mn.qm</file> <file alias="ms_MY">locale/bitcoin_ms_MY.qm</file> <file alias="nb">locale/bitcoin_nb.qm</file> @@ -54,14 +59,15 @@ <file alias="pt_BR">locale/bitcoin_pt_BR.qm</file> <file alias="pt_PT">locale/bitcoin_pt_PT.qm</file> <file alias="ro_RO">locale/bitcoin_ro_RO.qm</file> + <file alias="ru_RU">locale/bitcoin_ru_RU.qm</file> <file alias="ru">locale/bitcoin_ru.qm</file> - <file alias="sah">locale/bitcoin_sah.qm</file> <file alias="sk">locale/bitcoin_sk.qm</file> <file alias="sl_SI">locale/bitcoin_sl_SI.qm</file> <file alias="sq">locale/bitcoin_sq.qm</file> <file alias="sr">locale/bitcoin_sr.qm</file> <file alias="sv">locale/bitcoin_sv.qm</file> <file alias="th_TH">locale/bitcoin_th_TH.qm</file> + <file alias="tr_TR">locale/bitcoin_tr_TR.qm</file> <file alias="tr">locale/bitcoin_tr.qm</file> <file alias="uk">locale/bitcoin_uk.qm</file> <file alias="ur_PK">locale/bitcoin_ur_PK.qm</file> @@ -69,7 +75,7 @@ <file alias="vi">locale/bitcoin_vi.qm</file> <file alias="vi_VN">locale/bitcoin_vi_VN.qm</file> <file alias="zh_CN">locale/bitcoin_zh_CN.qm</file> - <file alias="zh_HK">locale/bitcoin_zh_HK.qm</file> + <file alias="zh">locale/bitcoin_zh.qm</file> <file alias="zh_TW">locale/bitcoin_zh_TW.qm</file> </qresource> </RCC> diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 853a29e661..b2bd167aea 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -453,8 +453,8 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel) setNumConnections(clientModel->getNumConnections()); connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); - setNumBlocks(clientModel->getNumBlocks(), clientModel->getLastBlockDate()); - connect(clientModel, SIGNAL(numBlocksChanged(int,QDateTime)), this, SLOT(setNumBlocks(int,QDateTime))); + setNumBlocks(clientModel->getNumBlocks(), clientModel->getLastBlockDate(), clientModel->getVerificationProgress(NULL)); + connect(clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double)), this, SLOT(setNumBlocks(int,QDateTime,double))); // Receive and report messages from client model connect(clientModel, SIGNAL(message(QString,QString,unsigned int)), this, SLOT(message(QString,QString,unsigned int))); @@ -682,7 +682,7 @@ void BitcoinGUI::setNumConnections(int count) labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count)); } -void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate) +void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress) { if(!clientModel) return; @@ -759,7 +759,7 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate) progressBarLabel->setVisible(true); progressBar->setFormat(tr("%1 behind").arg(timeBehindText)); progressBar->setMaximum(1000000000); - progressBar->setValue(clientModel->getVerificationProgress() * 1000000000.0 + 0.5); + progressBar->setValue(nVerificationProgress * 1000000000.0 + 0.5); progressBar->setVisible(true); tooltip = tr("Catching up...") + QString("<br>") + tooltip; diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 945adcd459..b121a443e7 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -150,7 +150,7 @@ public Q_SLOTS: /** Set number of connections shown in the UI */ void setNumConnections(int count); /** Set number of blocks and last block date shown in the UI */ - void setNumBlocks(int count, const QDateTime& blockDate); + void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress); /** Notify the user of an event from the core network or transaction handling code. @param[in] title the message box / notification title diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp index 2449046538..6b5f243668 100644 --- a/src/qt/bitcoinstrings.cpp +++ b/src/qt/bitcoinstrings.cpp @@ -67,6 +67,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Fees (in %s/kB) smaller than this are considered zero fee for relaying, " "mining and transaction creation (default: %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Fees (in %s/kB) smaller than this are considered zero fee for transaction " +"creation (default: %s)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "How thorough the block verification of -checkblocks is (0-4, default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" "If <category> is not supplied or if <category> = 1, output all debugging " @@ -121,6 +124,8 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Set the number of threads for coin generation if enabled (-1 = all cores, " "default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Support filtering of blocks and transaction with bloom filters (default: %u)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "The block database contains a block which appears to be from the future. " "This may be due to your computer's date and time being set incorrectly. Only " "rebuild the block database if you are sure that your computer's date and " @@ -152,6 +157,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: " "%s)"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Username and hashed password for JSON-RPC connections. The field <userpw> " +"comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is " +"included in share/rpcuser. This option can be specified multiple times"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "WARNING: abnormally high number of blocks generated, %d blocks received in " "the last %d hours (%d expected)"), QT_TRANSLATE_NOOP("bitcoin-core", "" @@ -178,7 +187,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "mode. This will redownload the entire blockchain"), QT_TRANSLATE_NOOP("bitcoin-core", "(default: %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "(default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "(default: 1)"), QT_TRANSLATE_NOOP("bitcoin-core", "-maxmempool must be at least %d MB"), QT_TRANSLATE_NOOP("bitcoin-core", "<category> can be:"), QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands"), @@ -197,7 +205,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -bind address: '%s'"), QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -externalip address: '%s'"), QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -whitebind address: '%s'"), QT_TRANSLATE_NOOP("bitcoin-core", "Cannot write default address"), -QT_TRANSLATE_NOOP("bitcoin-core", "Choose data directory on startup (default: 0)"), QT_TRANSLATE_NOOP("bitcoin-core", "Connect only to the specified node(s)"), QT_TRANSLATE_NOOP("bitcoin-core", "Connect through SOCKS5 proxy"), QT_TRANSLATE_NOOP("bitcoin-core", "Connect to a node to retrieve peer addresses, and disconnect"), @@ -274,15 +281,12 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Rescanning..."), QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands"), QT_TRANSLATE_NOOP("bitcoin-core", "Send trace/debug info to console instead of debug.log file"), QT_TRANSLATE_NOOP("bitcoin-core", "Send transactions as zero-fee transactions if possible (default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set SSL root certificates for payment request (default: -system-)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set database cache size in megabytes (%d to %d, default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to <n> (default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set language, for example \"de_DE\" (default: system locale)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set maximum block size in bytes (default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set minimum block size in bytes (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set the number of threads to service RPC calls (default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "Show all debugging options (usage: --help -help-debug)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Show splash screen on startup (default: 1)"), QT_TRANSLATE_NOOP("bitcoin-core", "Shrink debug.log file on client startup (default: 1 when no -debug)"), QT_TRANSLATE_NOOP("bitcoin-core", "Signing transaction failed"), QT_TRANSLATE_NOOP("bitcoin-core", "Specify configuration file (default: %s)"), @@ -292,7 +296,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Specify pid file (default: %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "Specify wallet file (within data directory)"), QT_TRANSLATE_NOOP("bitcoin-core", "Specify your own public address"), QT_TRANSLATE_NOOP("bitcoin-core", "Spend unconfirmed change when sending transactions (default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Start minimized"), QT_TRANSLATE_NOOP("bitcoin-core", "The transaction amount is too small to pay the fee"), QT_TRANSLATE_NOOP("bitcoin-core", "This help message"), QT_TRANSLATE_NOOP("bitcoin-core", "This is experimental software."), @@ -303,7 +306,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amount too small"), QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amounts must be positive"), QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large for fee policy"), QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large"), -QT_TRANSLATE_NOOP("bitcoin-core", "UI Options:"), QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer (bind returned error %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "Unable to start HTTP server. See debug log for details."), QT_TRANSLATE_NOOP("bitcoin-core", "Unknown network specified in -onlynet: '%s'"), diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 566e8fa62d..1271187420 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -22,17 +22,16 @@ #include <QDebug> #include <QTimer> +class CBlockIndex; + static const int64_t nClientStartupTime = GetTime(); +static int64_t nLastBlockTipUpdateNotification = 0; ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) : QObject(parent), optionsModel(optionsModel), peerTableModel(0), banTableModel(0), - cachedNumBlocks(0), - cachedBlockDate(QDateTime()), - cachedReindexing(0), - cachedImporting(0), pollTimer(0) { peerTableModel = new PeerTableModel(this); @@ -99,40 +98,21 @@ size_t ClientModel::getMempoolDynamicUsage() const return mempool.DynamicMemoryUsage(); } -double ClientModel::getVerificationProgress() const +double ClientModel::getVerificationProgress(const CBlockIndex *tipIn) const { - LOCK(cs_main); - return Checkpoints::GuessVerificationProgress(Params().Checkpoints(), chainActive.Tip()); + CBlockIndex *tip = const_cast<CBlockIndex *>(tipIn); + if (!tip) + { + LOCK(cs_main); + tip = chainActive.Tip(); + } + return Checkpoints::GuessVerificationProgress(Params().Checkpoints(), tip); } void ClientModel::updateTimer() { - // Get required lock upfront. This avoids the GUI from getting stuck on - // periodical polls if the core is holding the locks for a longer time - - // for example, during a wallet rescan. - TRY_LOCK(cs_main, lockMain); - if (!lockMain) - return; - - // Some quantities (such as number of blocks) change so fast that we don't want to be notified for each change. - // Periodically check and update with a timer. - int newNumBlocks = getNumBlocks(); - QDateTime newBlockDate = getLastBlockDate(); - - // check for changed number of blocks we have, number of blocks peers claim to have, reindexing state and importing state - if (cachedNumBlocks != newNumBlocks || - cachedBlockDate != newBlockDate || - cachedReindexing != fReindex || - cachedImporting != fImporting) - { - cachedNumBlocks = newNumBlocks; - cachedBlockDate = newBlockDate; - cachedReindexing = fReindex; - cachedImporting = fImporting; - - Q_EMIT numBlocksChanged(newNumBlocks, newBlockDate); - } - + // no locking required at this point + // the following calls will aquire the required lock Q_EMIT mempoolSizeChanged(getMempoolSize(), getMempoolDynamicUsage()); Q_EMIT bytesChanged(getTotalBytesRecv(), getTotalBytesSent()); } @@ -178,7 +158,7 @@ enum BlockSource ClientModel::getBlockSource() const QString ClientModel::getStatusBarWarnings() const { - return QString::fromStdString(GetWarnings("statusbar")); + return QString::fromStdString(GetWarnings("gui")); } OptionsModel *ClientModel::getOptionsModel() @@ -261,6 +241,26 @@ static void BannedListChanged(ClientModel *clientmodel) QMetaObject::invokeMethod(clientmodel, "updateBanlist", Qt::QueuedConnection); } +static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CBlockIndex *pIndex) +{ + // lock free async UI updates in case we have a new block tip + // during initial sync, only update the UI if the last update + // was > 250ms (MODEL_UPDATE_DELAY) ago + int64_t now = 0; + if (initialSync) + now = GetTimeMillis(); + + // if we are in-sync, update the UI regardless of last update time + if (!initialSync || now - nLastBlockTipUpdateNotification > MODEL_UPDATE_DELAY) { + //pass a async signal to the UI thread + QMetaObject::invokeMethod(clientmodel, "numBlocksChanged", Qt::QueuedConnection, + Q_ARG(int, pIndex->nHeight), + Q_ARG(QDateTime, QDateTime::fromTime_t(pIndex->GetBlockTime())), + Q_ARG(double, clientmodel->getVerificationProgress(pIndex))); + nLastBlockTipUpdateNotification = now; + } +} + void ClientModel::subscribeToCoreSignals() { // Connect signals to client @@ -268,6 +268,7 @@ void ClientModel::subscribeToCoreSignals() uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1)); uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this, _1, _2)); uiInterface.BannedListChanged.connect(boost::bind(BannedListChanged, this)); + uiInterface.NotifyBlockTip.connect(boost::bind(BlockTipChanged, this, _1, _2)); } void ClientModel::unsubscribeFromCoreSignals() @@ -277,4 +278,5 @@ void ClientModel::unsubscribeFromCoreSignals() uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1)); uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this, _1, _2)); uiInterface.BannedListChanged.disconnect(boost::bind(BannedListChanged, this)); + uiInterface.NotifyBlockTip.disconnect(boost::bind(BlockTipChanged, this, _1, _2)); } diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h index 493a759331..2d204fdb67 100644 --- a/src/qt/clientmodel.h +++ b/src/qt/clientmodel.h @@ -15,6 +15,7 @@ class PeerTableModel; class TransactionTableModel; class CWallet; +class CBlockIndex; QT_BEGIN_NAMESPACE class QTimer; @@ -59,7 +60,7 @@ public: quint64 getTotalBytesRecv() const; quint64 getTotalBytesSent() const; - double getVerificationProgress() const; + double getVerificationProgress(const CBlockIndex *tip) const; QDateTime getLastBlockDate() const; //! Return true if core is doing initial block download @@ -81,11 +82,6 @@ private: PeerTableModel *peerTableModel; BanTableModel *banTableModel; - int cachedNumBlocks; - QDateTime cachedBlockDate; - bool cachedReindexing; - bool cachedImporting; - QTimer *pollTimer; void subscribeToCoreSignals(); @@ -93,7 +89,7 @@ private: Q_SIGNALS: void numConnectionsChanged(int count); - void numBlocksChanged(int count, const QDateTime& blockDate); + void numBlocksChanged(int count, const QDateTime& blockDate, double nVerificationProgress); void mempoolSizeChanged(long count, size_t mempoolSizeInBytes); void alertsChanged(const QString &warnings); void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut); diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index cbc41f3416..0f42243047 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -549,6 +549,9 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) // Fee nPayFee = CWallet::GetMinimumFee(nBytes, nTxConfirmTarget, mempool); + if (nPayFee > 0 && coinControl->nMinimumTotalFee > nPayFee) + nPayFee = coinControl->nMinimumTotalFee; + // Allow free? (require at least hard-coded threshold and default to that if no estimate) double dPriorityNeeded = std::max(mempoolEstimatePriority, AllowFreeThreshold()); @@ -619,7 +622,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) l6->setText(sPriorityLabel); // Priority l7->setText(fDust ? tr("yes") : tr("no")); // Dust l8->setText(BitcoinUnits::formatWithUnit(nDisplayUnit, nChange)); // Change - if (nPayFee > 0 && !(payTxFee.GetFeePerK() > 0 && fPayAtLeastCustomFee && nBytes < 1000)) + if (nPayFee > 0 && (coinControl->nMinimumTotalFee < nPayFee)) { l3->setText(ASYMP_UTF8 + l3->text()); l4->setText(ASYMP_UTF8 + l4->text()); diff --git a/src/qt/locale/bitcoin_ach.ts b/src/qt/locale/bitcoin_ach.ts deleted file mode 100644 index 3365540853..0000000000 --- a/src/qt/locale/bitcoin_ach.ts +++ /dev/null @@ -1,113 +0,0 @@ -<TS language="ach" version="2.1"> -<context> - <name>AddressBookPage</name> - </context> -<context> - <name>AddressTableModel</name> - </context> -<context> - <name>AskPassphraseDialog</name> - </context> -<context> - <name>BanTableModel</name> - </context> -<context> - <name>BitcoinGUI</name> - </context> -<context> - <name>ClientModel</name> - </context> -<context> - <name>CoinControlDialog</name> - </context> -<context> - <name>EditAddressDialog</name> - </context> -<context> - <name>FreespaceChecker</name> - </context> -<context> - <name>HelpMessageDialog</name> - </context> -<context> - <name>Intro</name> - </context> -<context> - <name>OpenURIDialog</name> - </context> -<context> - <name>OptionsDialog</name> - </context> -<context> - <name>OverviewPage</name> - </context> -<context> - <name>PaymentServer</name> - </context> -<context> - <name>PeerTableModel</name> - </context> -<context> - <name>QObject</name> - </context> -<context> - <name>QRImageWidget</name> - </context> -<context> - <name>RPCConsole</name> - </context> -<context> - <name>ReceiveCoinsDialog</name> - </context> -<context> - <name>ReceiveRequestDialog</name> - </context> -<context> - <name>RecentRequestsTableModel</name> - </context> -<context> - <name>SendCoinsDialog</name> - </context> -<context> - <name>SendCoinsEntry</name> - </context> -<context> - <name>ShutdownWindow</name> - </context> -<context> - <name>SignVerifyMessageDialog</name> - </context> -<context> - <name>SplashScreen</name> - </context> -<context> - <name>TrafficGraphWidget</name> - </context> -<context> - <name>TransactionDesc</name> - </context> -<context> - <name>TransactionDescDialog</name> - </context> -<context> - <name>TransactionTableModel</name> - </context> -<context> - <name>TransactionView</name> - </context> -<context> - <name>UnitDisplayStatusBarControl</name> - </context> -<context> - <name>WalletFrame</name> - </context> -<context> - <name>WalletModel</name> - </context> -<context> - <name>WalletView</name> - </context> -<context> - <name>bitcoin-core</name> - </context> -</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_be_BY.ts b/src/qt/locale/bitcoin_be_BY.ts index c1efc822ec..3343781b76 100644 --- a/src/qt/locale/bitcoin_be_BY.ts +++ b/src/qt/locale/bitcoin_be_BY.ts @@ -1444,10 +1444,6 @@ <translation>Памылка подпісу транзакцыі</translation> </message> <message> - <source>Start minimized</source> - <translation>Стартаваць ммінімізаванай</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Гэта эксперыментальная праграма.</translation> </message> diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts index 8496a33481..be5aec371b 100644 --- a/src/qt/locale/bitcoin_bg.ts +++ b/src/qt/locale/bitcoin_bg.ts @@ -2362,10 +2362,6 @@ <translation>Сложете в бял списък пиъри,свързващи се от дадената интернет маска или айпи адрес.Може да бъде заложено неколкократно.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(по подразбиране 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> може да бъде:</translation> </message> @@ -2410,10 +2406,6 @@ <translation>Заложете броя на нишки за генерация на монети ако е включено(-1 = всички ядра, по подразбиране: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Изберете директория при стартиране на програмата.( настройка по подразбиране:0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Свързване чрез SOCKS5 прокси</translation> </message> @@ -2438,14 +2430,6 @@ <translation>Изпрати локализиращата или дебъг информацията към конзолата, вместо файлът debug.log</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Задаване на език,например "de_DE" (по подразбиране: system locale)</translation> - </message> - <message> - <source>Start minimized</source> - <translation>Стартирай минимизирано</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Това е експериментален софтуер.</translation> </message> diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_bg_BG.ts index a6444867c2..d1157a8e44 100644 --- a/src/qt/locale/bitcoin_cmn.ts +++ b/src/qt/locale/bitcoin_bg_BG.ts @@ -1,9 +1,25 @@ -<TS language="cmn" version="2.1"> +<TS language="bg_BG" version="2.1"> <context> <name>AddressBookPage</name> <message> + <source>Right-click to edit address or label</source> + <translation>Клик с десен бутон на мишката за промяна на адрес или етикет</translation> + </message> + <message> <source>Create a new address</source> - <translation>创建新地址</translation> + <translation>Създай нов адрес</translation> + </message> + <message> + <source>&New</source> + <translation>Нов</translation> + </message> + <message> + <source>&Copy</source> + <translation>Копирай</translation> + </message> + <message> + <source>C&lose</source> + <translation>Затвори</translation> </message> </context> <context> @@ -17,6 +33,14 @@ </context> <context> <name>BitcoinGUI</name> + <message> + <source>Bitcoin Core</source> + <translation>Биткойн ядро</translation> + </message> + <message> + <source>&About Bitcoin Core</source> + <translation>За Биткойн ядрото</translation> + </message> </context> <context> <name>ClientModel</name> @@ -32,9 +56,17 @@ </context> <context> <name>HelpMessageDialog</name> + <message> + <source>Bitcoin Core</source> + <translation>Биткойн ядро</translation> + </message> </context> <context> <name>Intro</name> + <message> + <source>Bitcoin Core</source> + <translation>Биткойн ядро</translation> + </message> </context> <context> <name>OpenURIDialog</name> @@ -83,6 +115,10 @@ </context> <context> <name>SplashScreen</name> + <message> + <source>Bitcoin Core</source> + <translation>Биткойн ядро</translation> + </message> </context> <context> <name>TrafficGraphWidget</name> diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts index dcbe4dc4cb..5a0e36de9e 100644 --- a/src/qt/locale/bitcoin_ca.ts +++ b/src/qt/locale/bitcoin_ca.ts @@ -2840,10 +2840,6 @@ <translation>Afegeix a la llista blanca els iguals que es connecten de la màscara de xarxa o adreça IP donada. Es pot especificar moltes vegades.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(per defecte: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> pot ser:</translation> </message> @@ -3060,10 +3056,6 @@ <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Connecta a través del proxy SOCKS5</translation> </message> @@ -3140,22 +3132,10 @@ <translation>Envia les transaccions com a transaccions de comissió zero sempre que sigui possible (per defecte: %u) </translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Defineix un idioma, per exemple «de_DE» (per defecte: preferències locals de sistema)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Redueix el fitxer debug.log durant l'inici del client (per defecte: 1 quan no -debug)</translation> </message> @@ -3164,10 +3144,6 @@ <translation>Ha fallat la signatura de la transacció</translation> </message> <message> - <source>Start minimized</source> - <translation>Inicia minimitzat</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>L'import de la transacció és massa petit per pagar-ne una comissió</translation> </message> @@ -3192,10 +3168,6 @@ <translation>La transacció és massa gran</translation> </message> <message> - <source>UI Options:</source> - <translation>Opcions d'interfície:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>No s'ha pogut vincular a %s en aquest ordinador (la vinculació ha retornat l'error %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_ca@valencia.ts b/src/qt/locale/bitcoin_ca@valencia.ts index e717f53d47..353e80ca18 100644 --- a/src/qt/locale/bitcoin_ca@valencia.ts +++ b/src/qt/locale/bitcoin_ca@valencia.ts @@ -2836,10 +2836,6 @@ <translation>Afig a la llista blanca els iguals que es connecten de la màscara de xarxa o adreça IP donada. Es pot especificar moltes vegades.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(per defecte: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> pot ser:</translation> </message> @@ -3056,10 +3052,6 @@ <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Connecta a través del proxy SOCKS5</translation> </message> @@ -3136,22 +3128,10 @@ <translation>Envia les transaccions com a transaccions de comissió zero sempre que siga possible (per defecte: %u) </translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Defineix un idioma, per exemple «de_DE» (per defecte: preferències locals de sistema)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Redueix el fitxer debug.log durant l'inici del client (per defecte: 1 quan no -debug)</translation> </message> @@ -3160,10 +3140,6 @@ <translation>Ha fallat la signatura de la transacció</translation> </message> <message> - <source>Start minimized</source> - <translation>Inicia minimitzat</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>L'import de la transacció és massa petit per pagar-ne una comissió</translation> </message> @@ -3188,10 +3164,6 @@ <translation>La transacció és massa gran</translation> </message> <message> - <source>UI Options:</source> - <translation>Opcions d'interfície:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>No s'ha pogut vincular a %s en este ordinador (la vinculació ha retornat l'error %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_ca_ES.ts b/src/qt/locale/bitcoin_ca_ES.ts index 331ad835f6..bf4be89a03 100644 --- a/src/qt/locale/bitcoin_ca_ES.ts +++ b/src/qt/locale/bitcoin_ca_ES.ts @@ -2840,10 +2840,6 @@ <translation>Afegeix a la llista blanca els iguals que es connecten de la màscara de xarxa o adreça IP donada. Es pot especificar moltes vegades.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(per defecte: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> pot ser:</translation> </message> @@ -3060,10 +3056,6 @@ <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Connecta a través del proxy SOCKS5</translation> </message> @@ -3140,22 +3132,10 @@ <translation>Envia les transaccions com a transaccions de comissió zero sempre que sigui possible (per defecte: %u) </translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Defineix un idioma, per exemple «de_DE» (per defecte: preferències locals de sistema)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Redueix el fitxer debug.log durant l'inici del client (per defecte: 1 quan no -debug)</translation> </message> @@ -3164,10 +3144,6 @@ <translation>Ha fallat la signatura de la transacció</translation> </message> <message> - <source>Start minimized</source> - <translation>Inicia minimitzat</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>L'import de la transacció és massa petit per pagar-ne una comissió</translation> </message> @@ -3192,10 +3168,6 @@ <translation>La transacció és massa gran</translation> </message> <message> - <source>UI Options:</source> - <translation>Opcions d'interfície:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>No s'ha pogut vincular a %s en aquest ordinador (la vinculació ha retornat l'error %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts index a2232dbe8e..d791d9d98d 100644 --- a/src/qt/locale/bitcoin_cs.ts +++ b/src/qt/locale/bitcoin_cs.ts @@ -2840,10 +2840,6 @@ <translation>Umístit na bílou listinu protějšky připojující se z dané podsítě či IP adresy. Lze zadat i vícekrát.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(výchozí: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> může být:</translation> </message> @@ -3060,10 +3056,6 @@ <translation>Nemohu přeložit -whitebind adresu: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Zvolit adresář pro data při startu (výchozí: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Připojit se přes SOCKS5 proxy</translation> </message> @@ -3140,22 +3132,10 @@ <translation>Posílat transakce pokud možno bez poplatků (výchozí: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Nastavit kořenové SSL certifikáty pro platební požadavky (výchozí: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Nastavit jazyk, například „de_DE“ (výchozí: systémové nastavení)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Zobrazit všechny možnosti ladění (užití: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Zobrazit startovací obrazovku (výchozí: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Při spuštění klienta zmenšit soubor debug.log (výchozí: 1, pokud není zadáno -debug)</translation> </message> @@ -3164,10 +3144,6 @@ <translation>Nepodařilo se podepsat transakci</translation> </message> <message> - <source>Start minimized</source> - <translation>Nastartovat minimalizovaně</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Částka v transakci je příliš malá na pokrytí poplatku</translation> </message> @@ -3192,10 +3168,6 @@ <translation>Transakce je příliš velká</translation> </message> <message> - <source>UI Options:</source> - <translation>Možnosti UI:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Nedaří se mi připojit na %s na tomhle počítači (operace bind vrátila chybu %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_cs_CZ.ts b/src/qt/locale/bitcoin_cs_CZ.ts new file mode 100644 index 0000000000..026247e7c6 --- /dev/null +++ b/src/qt/locale/bitcoin_cs_CZ.ts @@ -0,0 +1,609 @@ +<TS language="cs_CZ" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Create a new address</source> + <translation>Vytvořit novou adresu</translation> + </message> + <message> + <source>Copy the currently selected address to the system clipboard</source> + <translation>Kopírovat aktuálně vybrané adresy do schránky</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Odstranit</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Textový soubor oddělený středníkem (*.csv)</translation> + </message> + </context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Popis</translation> + </message> + <message> + <source>Address</source> + <translation>Adresa</translation> + </message> + <message> + <source>(no label)</source> + <translation>(bez popisu)</translation> + </message> +</context> +<context> + <name>AskPassphraseDialog</name> + <message> + <source>Enter passphrase</source> + <translation>Zadej heslo</translation> + </message> + <message> + <source>New passphrase</source> + <translation>Nové heslo</translation> + </message> + <message> + <source>Repeat new passphrase</source> + <translation>Zopakujte nové heslo</translation> + </message> + <message> + <source>Encrypt wallet</source> + <translation>Zašifrovat peněženku</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to unlock the wallet.</source> + <translation>Tato operace vyžaduje heslo k odemknutí peněženky.</translation> + </message> + <message> + <source>Unlock wallet</source> + <translation>Odemknout peněženku</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to decrypt the wallet.</source> + <translation>Tato operace vyžaduje heslo k dešifrování peněženky.</translation> + </message> + <message> + <source>Decrypt wallet</source> + <translation>Dešifrovat peněženku</translation> + </message> + <message> + <source>Change passphrase</source> + <translation>Změnit heslo</translation> + </message> + <message> + <source>Confirm wallet encryption</source> + <translation>Potvrďte zašifrování peněženky</translation> + </message> + <message> + <source>Wallet encrypted</source> + <translation>Peněženka zašifrována</translation> + </message> + <message> + <source>Wallet encryption failed</source> + <translation>Zašifrování peněženky selhalo</translation> + </message> + <message> + <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source> + <translation>Šifrování peněženky selhalo vinou vnitřní chyby. Vaše peněženka nebyla zašifrována.</translation> + </message> + <message> + <source>The supplied passphrases do not match.</source> + <translation>Zadaná hesla nejsou shodná.</translation> + </message> + <message> + <source>Wallet unlock failed</source> + <translation>Odemčení peněženky selhalo</translation> + </message> + <message> + <source>The passphrase entered for the wallet decryption was incorrect.</source> + <translation>Heslo zadané k dešifrování peněženky nebylo správné</translation> + </message> + <message> + <source>Wallet decryption failed</source> + <translation>Deěifrování peněženky selhalo</translation> + </message> + </context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Synchronizing with network...</source> + <translation>Synchronizuji se sítí...</translation> + </message> + <message> + <source>&Overview</source> + <translation>&Přehled</translation> + </message> + <message> + <source>Show general overview of wallet</source> + <translation>Zobrazit základní přehled o peněžence</translation> + </message> + <message> + <source>&Transactions</source> + <translation>&Transakce</translation> + </message> + <message> + <source>Browse transaction history</source> + <translation>Procházení historií transakcí</translation> + </message> + <message> + <source>Quit application</source> + <translation>Ukončit aplikaci</translation> + </message> + <message> + <source>&Options...</source> + <translation>&Možnosti...</translation> + </message> + <message> + <source>Change the passphrase used for wallet encryption</source> + <translation>Změnit heslo k šifrování peněženky</translation> + </message> + <message> + <source>Bitcoin</source> + <translation>Bitcoin</translation> + </message> + <message> + <source>&File</source> + <translation>&Soubor</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Nastavení</translation> + </message> + <message> + <source>&Help</source> + <translation>Nápo&věda</translation> + </message> + <message> + <source>Tabs toolbar</source> + <translation>Panely</translation> + </message> + <message> + <source>Up to date</source> + <translation>Aktuální</translation> + </message> + <message> + <source>Catching up...</source> + <translation>Zachytávám...</translation> + </message> + <message> + <source>Sent transaction</source> + <translation>Odeslané transakce</translation> + </message> + <message> + <source>Incoming transaction</source> + <translation>Příchozí transakce</translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>unlocked</b></source> + <translation>Peněženka je <b>zašifrována</b> a momentálně <b>odemčená</b></translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>locked</b></source> + <translation>Peněženka je <b>zašifrována</b> a momentálně <b>uzamčená</b></translation> + </message> +</context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Amount</source> + <translation>Množství</translation> + </message> + <message> + <source>Date</source> + <translation>Datum</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Potvrzeno</translation> + </message> + <message> + <source>Copy address</source> + <translation>Kopírovat sdresu</translation> + </message> + <message> + <source>Copy label</source> + <translation>Kopírovat popis</translation> + </message> + <message> + <source>(no label)</source> + <translation>(bez popisu)</translation> + </message> + </context> +<context> + <name>EditAddressDialog</name> + <message> + <source>Edit Address</source> + <translation>Upravit adresu</translation> + </message> + <message> + <source>&Label</source> + <translation>&Popisek</translation> + </message> + <message> + <source>&Address</source> + <translation>&Adresa</translation> + </message> + <message> + <source>New receiving address</source> + <translation>Nová adresa pro příjem</translation> + </message> + <message> + <source>New sending address</source> + <translation>Nová adresa k odeslání</translation> + </message> + <message> + <source>Edit receiving address</source> + <translation>Upravit adresu pro příjem</translation> + </message> + <message> + <source>Edit sending address</source> + <translation>Upravit adresu k odeslání</translation> + </message> + <message> + <source>The entered address "%1" is already in the address book.</source> + <translation>Zadaná adresa "%1" se již v seznamu adres nachází.</translation> + </message> + <message> + <source>Could not unlock wallet.</source> + <translation>Nemohu odemknout peněženku</translation> + </message> + <message> + <source>New key generation failed.</source> + <translation>Generování nového klíče selhalo.</translation> + </message> +</context> +<context> + <name>FreespaceChecker</name> + </context> +<context> + <name>HelpMessageDialog</name> + <message> + <source>Usage:</source> + <translation>Použití:</translation> + </message> + </context> +<context> + <name>Intro</name> + </context> +<context> + <name>OpenURIDialog</name> + </context> +<context> + <name>OptionsDialog</name> + <message> + <source>Options</source> + <translation>Možnosti</translation> + </message> + <message> + <source>Map port using &UPnP</source> + <translation>Mapovat port pomocí &UPnP</translation> + </message> + <message> + <source>&Minimize to the tray instead of the taskbar</source> + <translation>&Minimalizovat do systémové lišty (tray) namísto do hlavního panelu</translation> + </message> + <message> + <source>M&inimize on close</source> + <translation>M&inimalizovat při zavření</translation> + </message> + </context> +<context> + <name>OverviewPage</name> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + <message> + <source>Amount</source> + <translation>Množství</translation> + </message> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + <message> + <source>Name</source> + <translation>Jméno</translation> + </message> + </context> +<context> + <name>ReceiveCoinsDialog</name> + <message> + <source>Copy label</source> + <translation>Kopírovat popis</translation> + </message> + </context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>Address</source> + <translation>Adresa</translation> + </message> + <message> + <source>Amount</source> + <translation>Množství</translation> + </message> + <message> + <source>Label</source> + <translation>Popis</translation> + </message> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>Datum</translation> + </message> + <message> + <source>Label</source> + <translation>Popis</translation> + </message> + <message> + <source>Amount</source> + <translation>Množství</translation> + </message> + <message> + <source>(no label)</source> + <translation>(bez popisu)</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>Balance:</source> + <translation>Zůstatek:</translation> + </message> + <message> + <source>The amount to pay must be larger than 0.</source> + <translation>Částka k zaplacení musí být větší než 0.</translation> + </message> + <message> + <source>(no label)</source> + <translation>(bez popisu)</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + <message> + <source>Message:</source> + <translation>Zpráva:</translation> + </message> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + <message> + <source>[testnet]</source> + <translation>[testnet]</translation> + </message> +</context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + <message> + <source>%1/unconfirmed</source> + <translation>%1 potvrzeno</translation> + </message> + <message> + <source>%1 confirmations</source> + <translation>%1 potvrzení</translation> + </message> + <message> + <source>Status</source> + <translation>Stav</translation> + </message> + <message> + <source>Date</source> + <translation>Datum</translation> + </message> + <message> + <source>Amount</source> + <translation>Množství</translation> + </message> + </context> +<context> + <name>TransactionDescDialog</name> + <message> + <source>Transaction details</source> + <translation>Detaily transakce</translation> + </message> + <message> + <source>This pane shows a detailed description of the transaction</source> + <translation>Toto podokno zobrazuje detailní popis transakce</translation> + </message> +</context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>Datum</translation> + </message> + <message> + <source>Type</source> + <translation>Typ</translation> + </message> + <message> + <source>Confirmed (%1 confirmations)</source> + <translation>Potvrzeno (%1 potvrzení)</translation> + </message> + <message> + <source>This block was not received by any other nodes and will probably not be accepted!</source> + <translation>Tento blok nebyl přijat žádným dalším uzlem a pravděpodobně nebude akceptován!</translation> + </message> + <message> + <source>Label</source> + <translation>Popis</translation> + </message> + <message> + <source>Received with</source> + <translation>Přijato s</translation> + </message> + <message> + <source>Sent to</source> + <translation>Odesláno na</translation> + </message> + <message> + <source>Payment to yourself</source> + <translation>Platba sobě samému</translation> + </message> + <message> + <source>Mined</source> + <translation>Vytěženo</translation> + </message> + <message> + <source>Type of transaction.</source> + <translation>Typ transakce.</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>All</source> + <translation>Vše</translation> + </message> + <message> + <source>Today</source> + <translation>Dnes</translation> + </message> + <message> + <source>This week</source> + <translation>Tento týden</translation> + </message> + <message> + <source>This month</source> + <translation>Tento měsíc</translation> + </message> + <message> + <source>Last month</source> + <translation>Minulý měsíc</translation> + </message> + <message> + <source>This year</source> + <translation>Tento rok</translation> + </message> + <message> + <source>Range...</source> + <translation>Rozsah...</translation> + </message> + <message> + <source>Received with</source> + <translation>Přijato s</translation> + </message> + <message> + <source>Sent to</source> + <translation>Odesláno na</translation> + </message> + <message> + <source>To yourself</source> + <translation>Sobě samému</translation> + </message> + <message> + <source>Mined</source> + <translation>Vytěženo</translation> + </message> + <message> + <source>Other</source> + <translation>Ostatní</translation> + </message> + <message> + <source>Min amount</source> + <translation>Min. množství</translation> + </message> + <message> + <source>Copy address</source> + <translation>Kopírovat sdresu</translation> + </message> + <message> + <source>Copy label</source> + <translation>Kopírovat popis</translation> + </message> + <message> + <source>Edit label</source> + <translation>Upravit popis</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Textový soubor oddělený středníkem (*.csv)</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Potvrzeno</translation> + </message> + <message> + <source>Date</source> + <translation>Datum</translation> + </message> + <message> + <source>Type</source> + <translation>Typ</translation> + </message> + <message> + <source>Label</source> + <translation>Popis</translation> + </message> + <message> + <source>Address</source> + <translation>Adresa</translation> + </message> + <message> + <source>ID</source> + <translation>ID</translation> + </message> + <message> + <source>Range:</source> + <translation>Rozsah:</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + </context> +<context> + <name>bitcoin-core</name> + <message> + <source>Options:</source> + <translation>Možnosti:</translation> + </message> + <message> + <source>Loading addresses...</source> + <translation>Načítání adres...</translation> + </message> + <message> + <source>Loading wallet...</source> + <translation>Načítání peněženky...</translation> + </message> + <message> + <source>Done loading</source> + <translation>Načítání dokončeno</translation> + </message> + </context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts index 93594dcb05..edcd9b3b03 100644 --- a/src/qt/locale/bitcoin_da.ts +++ b/src/qt/locale/bitcoin_da.ts @@ -1097,7 +1097,7 @@ </message> <message> <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source> - <translation>Forbind til Bitcoin-netværket gennem en separat SOCKS5-proxy for skjulte tjenester via Tor.</translation> + <translation>Forbind til Bitcoin-netværket gennem en separat SOCKS5-proxy for skjulte Tor-tjenester.</translation> </message> <message> <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source> @@ -2733,6 +2733,10 @@ <translation>Kopiér transaktions-ID</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>Kopiér rå transaktion</translation> + </message> + <message> <source>Edit label</source> <translation>Redigér mærkat</translation> </message> @@ -2992,10 +2996,6 @@ <translation>Sæt andre knuder, der forbinder fra den angivne netmaske eller IP, på hvidliste. Kan angives flere gange.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(standard: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>-maxmempool skal være mindst %d MB</translation> </message> @@ -3252,16 +3252,20 @@ <translation>Aktiverer bedste kæde…</translation> </message> <message> + <source>Always relay transactions received from whitelisted peers (default: %d)</source> + <translation>Videresend altid transaktioner, der modtages fra hvidlistede knuder (standard: %d)</translation> + </message> + <message> <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> <translation>Forsøg at genskabe private nøgler fra en ødelagt wallet.dat under opstart</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>Kan ikke løse -whitebind adresse: "%s"</translation> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>Opret automatisk skjult Tor-tjeneste (standard: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Vælg datamappe ved opstart (standard: 0)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Kan ikke løse -whitebind adresse: "%s"</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3352,22 +3356,10 @@ <translation>Send transaktioner som nul-gebyr-transaktioner hvis muligt (standard: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Sæt SSL-rodcertifikater for betalingsanmodning (standard: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Angiv sprog, fx "da_DK" (standard: systemlokalitet)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Vis alle tilvalg for fejlsøgning (brug: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Vis opstartsbillede ved opstart (standard: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Formindsk debug.log filen ved klientopstart (standard: 1 hvis ikke -debug)</translation> </message> @@ -3376,10 +3368,6 @@ <translation>Underskrift af transaktion mislykkedes</translation> </message> <message> - <source>Start minimized</source> - <translation>Start minimeret</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Transaktionsbeløbet er for lille til at betale gebyret</translation> </message> @@ -3388,6 +3376,14 @@ <translation>Dette er eksperimentelt software.</translation> </message> <message> + <source>Tor control port password (default: empty)</source> + <translation>Adgangskode for Tor kontrolport (standard: tom)</translation> + </message> + <message> + <source>Tor control port to use if onion listening enabled (default: %s)</source> + <translation>Tor kontrolport, der skal bruges, hvis onion-lytning er slået til (standard: %s)</translation> + </message> + <message> <source>Transaction amount too small</source> <translation>Transaktionsbeløb er for lavt</translation> </message> @@ -3404,10 +3400,6 @@ <translation>Transaktionen er for stor</translation> </message> <message> - <source>UI Options:</source> - <translation>Indstillinger for brugerflade:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Ikke i stand til at tildele til %s på denne computer (bind returnerede fejl %s)</translation> </message> @@ -3428,6 +3420,10 @@ <translation>Advarsel</translation> </message> <message> + <source>Whether to operate in a blocks only mode (default: %u)</source> + <translation>Hvorvidt der skal arbejdes i kun-blokke-tilstand (standard: %u)</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>Zapper alle transaktioner fra tegnebog…</translation> </message> @@ -3513,7 +3509,7 @@ </message> <message> <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> - <translation>Brug separat SOCS5-proxy for at nå andre knuder via Tor skjulte tjenester (standard: %s)</translation> + <translation>Brug separat SOCS5-proxy for at nå knuder via skjulte Tor-tjenester (standard: %s)</translation> </message> <message> <source>(default: %s)</source> diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts index 42776f2c8b..04b4d23010 100644 --- a/src/qt/locale/bitcoin_de.ts +++ b/src/qt/locale/bitcoin_de.ts @@ -226,7 +226,11 @@ <source>IP/Netmask</source> <translation>IP/Netzmaske</translation> </message> - </context> + <message> + <source>Banned Until</source> + <translation>Gesperrt bis</translation> + </message> +</context> <context> <name>BitcoinGUI</name> <message> @@ -1088,6 +1092,10 @@ <translation>Tor</translation> </message> <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source> + <translation>Separaten SOCKS5-Proxy verwenden, um Gegenstellen über versteckte Tor-Dienste zu erreichen:</translation> + </message> + <message> <source>&Window</source> <translation>&Programmfenster</translation> </message> @@ -1474,6 +1482,10 @@ <translation>&Gegenstellen</translation> </message> <message> + <source>Banned peers</source> + <translation>Gesperrte Peers</translation> + </message> + <message> <source>Select a peer to view detailed information.</source> <translation>Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation> </message> @@ -2049,6 +2061,10 @@ <source>Payment request expired.</source> <translation>Zahlungsanforderung abgelaufen.</translation> </message> + <message> + <source>Pay only the required fee of %1</source> + <translation>Nur die notwendige Gebühr in Höhe von %1 zahlen</translation> + </message> <message numerus="yes"> <source>Estimated to begin confirmation within %n block(s).</source> <translation><numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Block.</numerusform><numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Blöcken.</numerusform></translation> @@ -2900,10 +2916,6 @@ <translation>Gegenstellen die sich von der angegebenen Netzmaske oder IP-Adresse aus verbinden immer zulassen. Kann mehrmals angegeben werden.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(Standard: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>-maxmempool muss mindestens %d MB betragen</translation> </message> @@ -3004,6 +3016,18 @@ <translation>Wallet-Datei angeben (innerhalb des Datenverzeichnisses)</translation> </message> <message> + <source>Unsupported argument -benchmark ignored, use -debug=bench.</source> + <translation>Nicht unterstütztes Argument -benchmark wurde ignoriert, bitte -debug=bench verwenden.</translation> + </message> + <message> + <source>Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>Nicht unterstütztes Argument -debugnet wurde ignoriert, bitte -debug=net verwenden.</translation> + </message> + <message> + <source>Unsupported argument -tor found, use -onion.</source> + <translation>Nicht unterstütztes Argument -tor gefunden, bitte -onion verwenden.</translation> + </message> + <message> <source>Use UPnP to map the listening port (default: %u)</source> <translation>UPnP verwenden, um eine Portweiterleitung einzurichten (Standard: %u)</translation> </message> @@ -3120,12 +3144,12 @@ <translation>Aktiviere beste Blockkette...</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>Kann Adresse in -whitebind nicht auflösen: '%s'</translation> + <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> + <translation>Versuchen, private Schlüssel beim Starten aus einer beschädigten wallet.dat wiederherzustellen</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Datenverzeichnis beim Starten auswählen (Standard: 0)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Kann Adresse in -whitebind nicht auflösen: '%s'</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3144,6 +3168,10 @@ <translation>Fehler beim lesen der Datenbank, Ausführung wird beendet.</translation> </message> <message> + <source>Imports blocks from external blk000??.dat file on startup</source> + <translation>Blöcke beim Starten aus externer Datei blk000??.dat importieren</translation> + </message> + <message> <source>Information</source> <translation>Hinweis</translation> </message> @@ -3196,6 +3224,10 @@ <translation>P2P-Netzwerk-Alarme empfangen und anzeigen (Standard: %u)</translation> </message> <message> + <source>Rescan the block chain for missing wallet transactions on startup</source> + <translation>Blockkette beim Starten erneut nach fehlenden Wallet-Transaktionen durchsuchen</translation> + </message> + <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Rückverfolgungs- und Debuginformationen an die Konsole senden, anstatt sie in debug.log zu schreiben</translation> </message> @@ -3204,22 +3236,10 @@ <translation>Transaktionen, wenn möglich, als gebührenfreie Transaktion senden (Standard: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>SSL-Wurzelzertifikate für Zahlungsanforderungen festlegen (Standard: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Sprache festlegen, z.B. "de_DE" (Standard: Systemstandard)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Zeige alle Debuggingoptionen (Benutzung: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Startbildschirm beim Starten anzeigen (Standard: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Protokolldatei debug.log beim Starten des Clients kürzen (Standard: 1, wenn kein -debug)</translation> </message> @@ -3228,10 +3248,6 @@ <translation>Signierung der Transaktion fehlgeschlagen</translation> </message> <message> - <source>Start minimized</source> - <translation>Minimiert starten</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Der Transaktionsbetrag ist zu niedrig, um die Gebühr zu bezahlen.</translation> </message> @@ -3256,14 +3272,14 @@ <translation>Transaktion zu groß</translation> </message> <message> - <source>UI Options:</source> - <translation>Benutzeroberflächenoptionen:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Kann auf diesem Computer nicht an %s binden (bind meldete Fehler %s)</translation> </message> <message> + <source>Upgrade wallet to latest format on startup</source> + <translation>Wallet beim Starten auf das neueste Format aktualisieren</translation> + </message> + <message> <source>Username for JSON-RPC connections</source> <translation>Benutzername für JSON-RPC-Verbindungen</translation> </message> @@ -3316,6 +3332,18 @@ <translation>(1 = TX-Metadaten wie z.B. Accountbesitzer und Zahlungsanforderungsinformationen behalten, 2 = TX-Metadaten verwerfen)</translation> </message> <message> + <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source> + <translation>-maxtxfee ist auf einen sehr hohen Wert festgelegt! Gebühren dieser Höhe könnten für eine einzelne Transaktion bezahlt werden.</translation> + </message> + <message> + <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> + <translation>-paytxfee ist auf einen sehr hohen Wert festgelegt! Dies ist die Gebühr die beim Senden einer Transaktion fällig wird.</translation> + </message> + <message> + <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source> + <translation>Lesen von wallet.dat fehlgeschlagen! Alle Schlüssel wurden korrekt gelesen, Transaktionsdaten bzw. Adressbucheinträge fehlen aber möglicherweise oder sind inkorrekt.</translation> + </message> + <message> <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> <translation>Legt fest, wie gründlich die Blockverifikation von -checkblocks ist (0-4, Standard: %u)</translation> </message> @@ -3332,6 +3360,10 @@ <translation>Debugginginformationen ausgeben (Standard: %u, <category> anzugeben ist optional)</translation> </message> <message> + <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source> + <translation>Nicht unterstütztes Argument -socks gefunden. Das Festlegen der SOCKS-Version ist nicht mehr möglich, nur noch SOCKS5-Proxies werden unterstützt.</translation> + </message> + <message> <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> <translation>Separaten SOCKS5-Proxy verwenden, um Gegenstellen über versteckte Tor-Dienste zu erreichen (Standard: %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_el.ts b/src/qt/locale/bitcoin_el.ts new file mode 100644 index 0000000000..f53a88082d --- /dev/null +++ b/src/qt/locale/bitcoin_el.ts @@ -0,0 +1,301 @@ +<TS language="el" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Create a new address</source> + <translation>Δημιουργία νέου λογαριασμού</translation> + </message> + </context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Ετικέτα</translation> + </message> + <message> + <source>Address</source> + <translation>Διεύθυνση</translation> + </message> + </context> +<context> + <name>AskPassphraseDialog</name> + <message> + <source>Enter passphrase</source> + <translation>Εισάγετε συνθηματικό</translation> + </message> + <message> + <source>New passphrase</source> + <translation>Νέο συνθηματικό</translation> + </message> + <message> + <source>Repeat new passphrase</source> + <translation>Επαναλάβετε νέο συνθηματικό</translation> + </message> + <message> + <source>Change passphrase</source> + <translation>Αλλαγή συνθηματικού</translation> + </message> + </context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Quit application</source> + <translation>Κλείσιμο εφαρμογής</translation> + </message> + <message> + <source>Wallet</source> + <translation>Πορτοφόλι</translation> + </message> + <message> + <source>Error</source> + <translation>Σφάλμα</translation> + </message> + </context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Date</source> + <translation>Ημερομηνία</translation> + </message> + <message> + <source>Copy address</source> + <translation>Αντιγραφή διεύθυνσης</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Αντιγραφή ποσού</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Αντιγραφή ποσότητας</translation> + </message> + <message> + <source>Copy change</source> + <translation>Αντιγραφή αλλαγής</translation> + </message> + </context> +<context> + <name>EditAddressDialog</name> + </context> +<context> + <name>FreespaceChecker</name> + </context> +<context> + <name>HelpMessageDialog</name> + <message> + <source>version</source> + <translation>έκδοση</translation> + </message> + </context> +<context> + <name>Intro</name> + <message> + <source>Welcome</source> + <translation>Καλώς Ήλθατε</translation> + </message> + <message> + <source>Error</source> + <translation>Σφάλμα</translation> + </message> + </context> +<context> + <name>OpenURIDialog</name> + </context> +<context> + <name>OptionsDialog</name> + </context> +<context> + <name>OverviewPage</name> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + <message> + <source>Services</source> + <translation>Υπηρεσίες</translation> + </message> + </context> +<context> + <name>ReceiveCoinsDialog</name> + <message> + <source>Remove</source> + <translation>Αφαίρεση</translation> + </message> + <message> + <source>Copy message</source> + <translation>Αντιγραφή μηνύματος</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Αντιγραφή ποσού</translation> + </message> +</context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>Address</source> + <translation>Διεύθυνση</translation> + </message> + <message> + <source>Label</source> + <translation>Ετικέτα</translation> + </message> + <message> + <source>Message</source> + <translation>Μήνυμα</translation> + </message> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>Ημερομηνία</translation> + </message> + <message> + <source>Label</source> + <translation>Ετικέτα</translation> + </message> + <message> + <source>Message</source> + <translation>Μήνυμα</translation> + </message> + <message> + <source>(no message)</source> + <translation>(κανένα μήνυμα)</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>Recommended:</source> + <translation>Συνίσταται:</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Αντιγραφή ποσότητας</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Αντιγραφή ποσού</translation> + </message> + <message> + <source>Copy change</source> + <translation>Αντιγραφή αλλαγής</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + </context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + <message> + <source>Date</source> + <translation>Ημερομηνία</translation> + </message> + <message> + <source>Message</source> + <translation>Μήνυμα</translation> + </message> + </context> +<context> + <name>TransactionDescDialog</name> + </context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>Ημερομηνία</translation> + </message> + <message> + <source>Label</source> + <translation>Ετικέτα</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>Copy address</source> + <translation>Αντιγραφή διεύθυνσης</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Αντιγραφή ποσού</translation> + </message> + <message> + <source>Date</source> + <translation>Ημερομηνία</translation> + </message> + <message> + <source>Label</source> + <translation>Ετικέτα</translation> + </message> + <message> + <source>Address</source> + <translation>Διεύθυνση</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + </context> +<context> + <name>bitcoin-core</name> + <message> + <source>Insufficient funds</source> + <translation>Κεφάλαια μη επαρκή</translation> + </message> + <message> + <source>Loading wallet...</source> + <translation>Φόρτωση πορτοφολιού...</translation> + </message> + <message> + <source>Rescanning...</source> + <translation>Επανάληψη σάρωσης</translation> + </message> + <message> + <source>Done loading</source> + <translation>Η φόρτωση ολοκληρώθηκε</translation> + </message> + <message> + <source>Error</source> + <translation>Σφάλμα</translation> + </message> +</context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_el_GR.ts b/src/qt/locale/bitcoin_el_GR.ts index d9f8dee5ef..b62a4756e1 100644 --- a/src/qt/locale/bitcoin_el_GR.ts +++ b/src/qt/locale/bitcoin_el_GR.ts @@ -2543,10 +2543,6 @@ <translation>Προειδοποίηση : το αρχειο wallet.dat ειναι διεφθαρμένο, τα δεδομένα σώζονται ! Original wallet.dat αποθηκεύονται ως wallet.{timestamp}.bak στο %s . Αν το υπόλοιπο του ή τις συναλλαγές σας, είναι λάθος θα πρέπει να επαναφέρετε από ένα αντίγραφο ασφαλείας</translation> </message> <message> - <source>(default: 1)</source> - <translation>(προεπιλογή: 1)</translation> - </message> - <message> <source>Block creation options:</source> <translation>Αποκλεισμός επιλογων δημιουργίας: </translation> </message> @@ -2631,10 +2627,6 @@ <translation>Αδυναμία κλειδώματος του φακέλου δεδομένων %s. Πιθανώς το Bitcoin να είναι ήδη ενεργό.</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Επιλογή φακέλου δεδομένων στην εκκίνηση (προεπιλεγμένο: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Σύνδεση μέσω διαμεσολαβητή SOCKS5</translation> </message> @@ -2675,22 +2667,10 @@ <translation>Αποστολή πληροφοριών εντοπισμού σφαλμάτων στην κονσόλα αντί του αρχείου debug.log</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Ορίστε SSL root certificates για αίτηση πληρωμής (default: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Όρισε γλώσσα, για παράδειγμα "de_DE"(προεπιλογή:τοπικές ρυθμίσεις)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Προβολή όλων των επιλογών εντοπισμού σφαλμάτων (χρήση: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Εμφάνισε την οθόνη εκκίνησης κατά την εκκίνηση(προεπιλογή:1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Συρρίκνωση του αρχείο debug.log κατα την εκκίνηση του πελάτη (προεπιλογή: 1 όταν δεν-debug)</translation> </message> @@ -2699,10 +2679,6 @@ <translation>Η υπογραφή συναλλαγής απέτυχε </translation> </message> <message> - <source>Start minimized</source> - <translation>Έναρξη ελαχιστοποιημένο</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Η εφαρμογή είναι σε πειραματικό στάδιο.</translation> </message> diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts index 21df732520..e709f8515b 100644 --- a/src/qt/locale/bitcoin_en.ts +++ b/src/qt/locale/bitcoin_en.ts @@ -299,7 +299,7 @@ <context> <name>BitcoinGUI</name> <message> - <location filename="../bitcoingui.cpp" line="+325"/> + <location filename="../bitcoingui.cpp" line="+335"/> <source>Sign &message...</source> <translation>Sign &message...</translation> </message> @@ -701,7 +701,7 @@ <context> <name>ClientModel</name> <message> - <location filename="../clientmodel.cpp" line="+143"/> + <location filename="../clientmodel.cpp" line="+135"/> <source>Network Alert</source> <translation>Network Alert</translation> </message> @@ -925,7 +925,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+160"/> + <location line="+161"/> <source>This label turns red if the transaction size is greater than 1000 bytes.</source> <translation type="unfinished"></translation> </message> @@ -940,12 +940,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+9"/> <source>Can vary +/- %1 satoshi(s) per input.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-32"/> + <location line="-33"/> <source>yes</source> <translation type="unfinished"></translation> </message> @@ -971,7 +971,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+59"/> <location line="+60"/> <source>(no label)</source> <translation type="unfinished">(no label)</translation> @@ -1086,7 +1086,7 @@ <context> <name>HelpMessageDialog</name> <message> - <location filename="../utilitydialog.cpp" line="+33"/> + <location filename="../utilitydialog.cpp" line="+36"/> <source>Bitcoin Core</source> <translation type="unfinished">Bitcoin Core</translation> </message> @@ -1121,6 +1121,41 @@ <source>command-line options</source> <translation type="unfinished">command-line options</translation> </message> + <message> + <location line="+9"/> + <source>UI Options:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Choose data directory on startup (default: %u)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>Set language, for example "de_DE" (default: system locale)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>Start minimized</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>Set SSL root certificates for payment request (default: -system-)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>Show splash screen on startup (default: %u)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>Reset all settings changes made over the GUI</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>Intro</name> @@ -1469,17 +1504,17 @@ <translation>&Cancel</translation> </message> <message> - <location filename="../optionsdialog.cpp" line="+83"/> + <location filename="../optionsdialog.cpp" line="+81"/> <source>default</source> <translation>default</translation> </message> <message> - <location line="+59"/> + <location line="+64"/> <source>none</source> <translation type="unfinished"></translation> </message> <message> - <location line="+83"/> + <location line="+71"/> <source>Confirm options reset</source> <translation>Confirm options reset</translation> </message> @@ -1500,7 +1535,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+25"/> <source>The supplied proxy address is invalid.</source> <translation>The supplied proxy address is invalid.</translation> </message> @@ -1756,7 +1791,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+760"/> + <location line="+763"/> <source>%1 d</source> <translation type="unfinished"></translation> </message> @@ -1830,11 +1865,13 @@ <location line="+26"/> <location line="+23"/> <location line="+23"/> - <location line="+36"/> + <location line="+23"/> <location line="+23"/> <location line="+36"/> <location line="+23"/> - <location line="+533"/> + <location line="+36"/> + <location line="+36"/> + <location line="+534"/> <location line="+23"/> <location line="+23"/> <location line="+23"/> @@ -1855,7 +1892,7 @@ <translation>N/A</translation> </message> <message> - <location line="-1156"/> + <location line="-1216"/> <source>Client version</source> <translation>Client version</translation> </message> @@ -1890,12 +1927,12 @@ <translation>Startup time</translation> </message> <message> - <location line="+29"/> + <location line="+170"/> <source>Network</source> <translation>Network</translation> </message> <message> - <location line="+7"/> + <location line="-147"/> <source>Name</source> <translation type="unfinished"></translation> </message> @@ -1915,12 +1952,27 @@ <translation>Current number of blocks</translation> </message> <message> - <location line="+72"/> + <location line="+52"/> + <source>Memory Pool</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>Current number of transactions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+36"/> + <source>Memory usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+231"/> + <location line="+233"/> <location line="+552"/> <source>Received</source> <translation type="unfinished"></translation> @@ -1943,8 +1995,8 @@ </message> <message> <location line="+57"/> - <location filename="../rpcconsole.cpp" line="+281"/> - <location line="+566"/> + <location filename="../rpcconsole.cpp" line="+287"/> + <location line="+578"/> <source>Select a peer to view detailed information.</source> <translation type="unfinished"></translation> </message> @@ -1979,8 +2031,8 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-913"/> - <location line="+821"/> + <location line="-973"/> + <location line="+881"/> <source>User Agent</source> <translation type="unfinished"></translation> </message> @@ -2030,17 +2082,17 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-904"/> + <location line="-977"/> <source>Last block time</source> <translation>Last block time</translation> </message> <message> - <location line="+52"/> + <location line="+123"/> <source>&Open</source> <translation>&Open</translation> </message> <message> - <location line="+24"/> + <location line="+26"/> <source>&Console</source> <translation>&Console</translation> </message> @@ -2060,7 +2112,7 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../rpcconsole.cpp" line="-333"/> + <location filename="../rpcconsole.cpp" line="-343"/> <source>In:</source> <translation type="unfinished"></translation> </message> @@ -2070,17 +2122,17 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../forms/debugwindow.ui" line="-357"/> + <location filename="../forms/debugwindow.ui" line="-417"/> <source>Build date</source> <translation>Build date</translation> </message> <message> - <location line="+183"/> + <location line="+241"/> <source>Debug log file</source> <translation>Debug log file</translation> </message> <message> - <location line="+83"/> + <location line="+85"/> <source>Clear console</source> <translation>Clear console</translation> </message> @@ -2138,7 +2190,7 @@ <translation>Type <b>help</b> for an overview of available commands.</translation> </message> <message> - <location line="+134"/> + <location line="+144"/> <source>%1 B</source> <translation type="unfinished"></translation> </message> @@ -2706,12 +2758,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+88"/> + <location line="+91"/> <source>Pay only the required fee of %1</source> <translation type="unfinished"></translation> </message> <message numerus="yes"> - <location line="+22"/> + <location line="+23"/> <source>Estimated to begin confirmation within %n block(s).</source> <translation type="unfinished"> <numerusform>Estimated to begin confirmation within %n block.</numerusform> @@ -2719,7 +2771,7 @@ </translation> </message> <message> - <location line="-136"/> + <location line="-140"/> <source>The recipient address is not valid. Please recheck.</source> <translation type="unfinished"></translation> </message> @@ -2729,7 +2781,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+231"/> + <location line="+234"/> <source>Warning: Invalid Bitcoin address</source> <translation type="unfinished"></translation> </message> @@ -2744,7 +2796,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-692"/> + <location line="-695"/> <source>Copy dust</source> <translation type="unfinished"></translation> </message> @@ -2871,7 +2923,7 @@ <context> <name>ShutdownWindow</name> <message> - <location filename="../utilitydialog.cpp" line="+81"/> + <location filename="../utilitydialog.cpp" line="+78"/> <source>Bitcoin Core is shutting down...</source> <translation type="unfinished"></translation> </message> @@ -3703,32 +3755,32 @@ <context> <name>bitcoin-core</name> <message> - <location filename="../bitcoinstrings.cpp" line="+260"/> + <location filename="../bitcoinstrings.cpp" line="+267"/> <source>Options:</source> <translation>Options:</translation> </message> <message> - <location line="+30"/> + <location line="+27"/> <source>Specify data directory</source> <translation>Specify data directory</translation> </message> <message> - <location line="-87"/> + <location line="-84"/> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Connect to a node to retrieve peer addresses, and disconnect</translation> </message> <message> - <location line="+90"/> + <location line="+87"/> <source>Specify your own public address</source> <translation>Specify your own public address</translation> </message> <message> - <location line="-109"/> + <location line="-105"/> <source>Accept command line and JSON-RPC commands</source> <translation>Accept command line and JSON-RPC commands</translation> </message> <message> - <location line="-113"/> + <location line="-118"/> <source>If <category> is not supplied or if <category> = 1, output all debugging information.</source> <translation type="unfinished"></translation> </message> @@ -3763,7 +3815,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+112"/> + <location line="+116"/> <source>Error: A fatal internal error occurred, see debug.log for details</source> <translation type="unfinished"></translation> </message> @@ -3783,17 +3835,17 @@ <translation>Run in the background as a daemon and accept commands</translation> </message> <message> - <location line="+34"/> + <location line="+29"/> <source>Unable to start HTTP server. See debug log for details.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-123"/> + <location line="-117"/> <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source> <translation>Accept connections from outside (default: 1 if no -proxy or -connect)</translation> </message> <message> - <location line="-160"/> + <location line="-168"/> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Bind to given address and always listen on it. Use [host]:port notation for IPv6</translation> </message> @@ -3813,12 +3865,12 @@ <translation>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</translation> </message> <message> - <location line="+57"/> + <location line="+60"/> <source>Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+8"/> <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source> <translation type="unfinished"></translation> </message> @@ -3838,7 +3890,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+9"/> <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source> <translation type="unfinished"></translation> </message> @@ -3869,11 +3921,6 @@ </message> <message> <location line="+11"/> - <source>(default: 1)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> <source>-maxmempool must be at least %d MB</source> <translation type="unfinished"></translation> </message> @@ -3888,7 +3935,7 @@ <translation>Block creation options:</translation> </message> <message> - <location line="+7"/> + <location line="+6"/> <source>Connect only to the specified node(s)</source> <translation>Connect only to the specified node(s)</translation> </message> @@ -4008,22 +4055,22 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+14"/> + <location line="+13"/> <source>Set database cache size in megabytes (%d to %d, default: %d)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+2"/> <source>Set maximum block size in bytes (default: %d)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+10"/> <source>Specify wallet file (within data directory)</source> <translation>Specify wallet file (within data directory)</translation> </message> <message> - <location line="+18"/> + <location line="+16"/> <source>Unsupported argument -benchmark ignored, use -debug=bench.</source> <translation type="unfinished"></translation> </message> @@ -4078,7 +4125,7 @@ <translation>You need to rebuild the database using -reindex to change -txindex</translation> </message> <message> - <location line="-304"/> + <location line="-306"/> <source>Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source> <translation type="unfinished"></translation> </message> @@ -4123,7 +4170,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+11"/> <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source> <translation type="unfinished"></translation> </message> @@ -4158,7 +4205,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+10"/> <source>The transaction amount is too small to send after the fee has been deducted</source> <translation type="unfinished"></translation> </message> @@ -4168,7 +4215,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+40"/> + <location line="+44"/> <source>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</source> <translation type="unfinished"></translation> </message> @@ -4183,7 +4230,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+5"/> <source>Accept public REST requests (default: %u)</source> <translation type="unfinished"></translation> </message> @@ -4213,12 +4260,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+2"/> - <source>Choose data directory on startup (default: 0)</source> - <translation type="unfinished">Choose data directory on startup (default: 0)</translation> - </message> - <message> - <location line="+2"/> + <location line="+3"/> <source>Connect through SOCKS5 proxy</source> <translation type="unfinished"></translation> </message> @@ -4328,27 +4370,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation type="unfinished">Set language, for example "de_DE" (default: system locale)</translation> - </message> - <message> - <location line="+4"/> + <location line="+6"/> <source>Show all debugging options (usage: --help -help-debug)</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> - <source>Show splash screen on startup (default: 1)</source> - <translation type="unfinished">Show splash screen on startup (default: 1)</translation> - </message> - <message> - <location line="+1"/> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Shrink debug.log file on client startup (default: 1 when no -debug)</translation> </message> @@ -4359,11 +4386,6 @@ </message> <message> <location line="+8"/> - <source>Start minimized</source> - <translation type="unfinished">Start minimized</translation> - </message> - <message> - <location line="+1"/> <source>The transaction amount is too small to pay the fee</source> <translation type="unfinished"></translation> </message> @@ -4404,11 +4426,6 @@ </message> <message> <location line="+1"/> - <source>UI Options:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation type="unfinished"></translation> </message> @@ -4453,27 +4470,27 @@ <translation>wallet.dat corrupt, salvage failed</translation> </message> <message> - <location line="-67"/> + <location line="-62"/> <source>Password for JSON-RPC connections</source> <translation>Password for JSON-RPC connections</translation> </message> <message> - <location line="-198"/> + <location line="-205"/> <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source> <translation>Execute command when the best block changes (%s in cmd is replaced by block hash)</translation> </message> <message> - <location line="+234"/> + <location line="+237"/> <source>This help message</source> <translation>This help message</translation> </message> <message> - <location line="-108"/> + <location line="-103"/> <source>Allow DNS lookups for -addnode, -seednode and -connect</source> <translation>Allow DNS lookups for -addnode, -seednode and -connect</translation> </message> <message> - <location line="+60"/> + <location line="+59"/> <source>Loading addresses...</source> <translation>Loading addresses...</translation> </message> @@ -4483,7 +4500,7 @@ <translation>Error loading wallet.dat: Wallet corrupted</translation> </message> <message> - <location line="-207"/> + <location line="-214"/> <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> <translation type="unfinished"></translation> </message> @@ -4509,6 +4526,11 @@ </message> <message> <location line="+17"/> + <source>Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> <translation type="unfinished"></translation> </message> @@ -4528,7 +4550,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+32"/> + <source>Support filtering of blocks and transaction with bloom filters (default: %u)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+16"/> <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source> <translation type="unfinished"></translation> </message> @@ -4548,17 +4575,22 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+3"/> + <source>Username and hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in share/rpcuser. This option can be specified multiple times</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+29"/> <source>(default: %s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+10"/> <source>Always query for peer addresses via DNS lookup (default: %u)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Error loading wallet.dat</source> <translation>Error loading wallet.dat</translation> </message> @@ -4628,12 +4660,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+7"/> <source>Set key pool size to <n> (default: %u)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+2"/> <source>Set minimum block size in bytes (default: %u)</source> <translation type="unfinished"></translation> </message> @@ -4643,7 +4675,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> <source>Specify configuration file (default: %s)</source> <translation type="unfinished"></translation> </message> @@ -4663,17 +4695,17 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> <source>Threshold for disconnecting misbehaving peers (default: %u)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+10"/> + <location line="+9"/> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Unknown network specified in -onlynet: '%s'</translation> </message> <message> - <location line="-113"/> + <location line="-107"/> <source>Cannot resolve -bind address: '%s'</source> <translation>Cannot resolve -bind address: '%s'</translation> </message> @@ -4683,7 +4715,7 @@ <translation>Cannot resolve -externalip address: '%s'</translation> </message> <message> - <location line="+46"/> + <location line="+45"/> <source>Invalid amount for -paytxfee=<amount>: '%s'</source> <translation>Invalid amount for -paytxfee=<amount>: '%s'</translation> </message> @@ -4698,17 +4730,17 @@ <translation>Loading block index...</translation> </message> <message> - <location line="-62"/> + <location line="-61"/> <source>Add a node to connect to and attempt to keep the connection open</source> <translation>Add a node to connect to and attempt to keep the connection open</translation> </message> <message> - <location line="+63"/> + <location line="+62"/> <source>Loading wallet...</source> <translation>Loading wallet...</translation> </message> <message> - <location line="-56"/> + <location line="-55"/> <source>Cannot downgrade wallet</source> <translation>Cannot downgrade wallet</translation> </message> @@ -4718,7 +4750,7 @@ <translation>Cannot write default address</translation> </message> <message> - <location line="+74"/> + <location line="+73"/> <source>Rescanning...</source> <translation>Rescanning...</translation> </message> diff --git a/src/qt/locale/bitcoin_en_GB.ts b/src/qt/locale/bitcoin_en_GB.ts new file mode 100644 index 0000000000..96cdecfe83 --- /dev/null +++ b/src/qt/locale/bitcoin_en_GB.ts @@ -0,0 +1,3667 @@ +<TS language="en_GB" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Right-click to edit address or label</source> + <translation>Right-click to edit address or label</translation> + </message> + <message> + <source>Create a new address</source> + <translation>Create a new address</translation> + </message> + <message> + <source>&New</source> + <translation>&New</translation> + </message> + <message> + <source>Copy the currently selected address to the system clipboard</source> + <translation>Copy the currently selected address to the system clipboard</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Copy</translation> + </message> + <message> + <source>C&lose</source> + <translation>C&lose</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>&Copy Address</translation> + </message> + <message> + <source>Delete the currently selected address from the list</source> + <translation>Delete the currently selected address from the list</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Export the data in the current tab to a file</translation> + </message> + <message> + <source>&Export</source> + <translation>&Export</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Delete</translation> + </message> + <message> + <source>Choose the address to send coins to</source> + <translation>Choose the address to send coins to</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Choose the address to receive coins with</translation> + </message> + <message> + <source>C&hoose</source> + <translation>C&hoose</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Sending addresses</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Receiving addresses</translation> + </message> + <message> + <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> + <translation>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</translation> + </message> + <message> + <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> + <translation>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</translation> + </message> + <message> + <source>Copy &Label</source> + <translation>Copy &Label</translation> + </message> + <message> + <source>&Edit</source> + <translation>&Edit</translation> + </message> + <message> + <source>Export Address List</source> + <translation>Export Address List</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Comma separated file (*.csv)</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Exporting Failed</translation> + </message> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>There was an error trying to save the address list to %1. Please try again.</translation> + </message> +</context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <source>Address</source> + <translation>Address</translation> + </message> + <message> + <source>(no label)</source> + <translation>(no label)</translation> + </message> +</context> +<context> + <name>AskPassphraseDialog</name> + <message> + <source>Passphrase Dialog</source> + <translation>Passphrase Dialog</translation> + </message> + <message> + <source>Enter passphrase</source> + <translation>Enter passphrase</translation> + </message> + <message> + <source>New passphrase</source> + <translation>New passphrase</translation> + </message> + <message> + <source>Repeat new passphrase</source> + <translation>Repeat new passphrase</translation> + </message> + <message> + <source>Encrypt wallet</source> + <translation>Encrypt wallet</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to unlock the wallet.</source> + <translation>This operation needs your wallet passphrase to unlock the wallet.</translation> + </message> + <message> + <source>Unlock wallet</source> + <translation>Unlock wallet</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to decrypt the wallet.</source> + <translation>This operation needs your wallet passphrase to decrypt the wallet.</translation> + </message> + <message> + <source>Decrypt wallet</source> + <translation>Decrypt wallet</translation> + </message> + <message> + <source>Change passphrase</source> + <translation>Change passphrase</translation> + </message> + <message> + <source>Confirm wallet encryption</source> + <translation>Confirm wallet encryption</translation> + </message> + <message> + <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> + <translation>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</translation> + </message> + <message> + <source>Are you sure you wish to encrypt your wallet?</source> + <translation>Are you sure you wish to encrypt your wallet?</translation> + </message> + <message> + <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source> + <translation>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</translation> + </message> + <message> + <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source> + <translation>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</translation> + </message> + <message> + <source>Warning: The Caps Lock key is on!</source> + <translation>Warning: The Caps Lock key is on!</translation> + </message> + <message> + <source>Wallet encrypted</source> + <translation>Wallet encrypted</translation> + </message> + <message> + <source>Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>.</source> + <translation>Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>.</translation> + </message> + <message> + <source>Enter the old passphrase and new passphrase to the wallet.</source> + <translation>Enter the old passphrase and new passphrase to the wallet.</translation> + </message> + <message> + <source>Wallet encryption failed</source> + <translation>Wallet encryption failed</translation> + </message> + <message> + <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source> + <translation>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</translation> + </message> + <message> + <source>The supplied passphrases do not match.</source> + <translation>The supplied passphrases do not match.</translation> + </message> + <message> + <source>Wallet unlock failed</source> + <translation>Wallet unlock failed</translation> + </message> + <message> + <source>The passphrase entered for the wallet decryption was incorrect.</source> + <translation>The passphrase entered for the wallet decryption was incorrect.</translation> + </message> + <message> + <source>Wallet decryption failed</source> + <translation>Wallet decryption failed</translation> + </message> + <message> + <source>Wallet passphrase was successfully changed.</source> + <translation>Wallet passphrase was successfully changed.</translation> + </message> +</context> +<context> + <name>BanTableModel</name> + <message> + <source>IP/Netmask</source> + <translation>IP/Netmask</translation> + </message> + <message> + <source>Banned Until</source> + <translation>Banned Until</translation> + </message> +</context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Sign &message...</source> + <translation>Sign &message...</translation> + </message> + <message> + <source>Synchronizing with network...</source> + <translation>Synchronising with network...</translation> + </message> + <message> + <source>&Overview</source> + <translation>&Overview</translation> + </message> + <message> + <source>Node</source> + <translation>Node</translation> + </message> + <message> + <source>Show general overview of wallet</source> + <translation>Show general overview of wallet</translation> + </message> + <message> + <source>&Transactions</source> + <translation>&Transactions</translation> + </message> + <message> + <source>Browse transaction history</source> + <translation>Browse transaction history</translation> + </message> + <message> + <source>E&xit</source> + <translation>E&xit</translation> + </message> + <message> + <source>Quit application</source> + <translation>Quit application</translation> + </message> + <message> + <source>About &Qt</source> + <translation>About &Qt</translation> + </message> + <message> + <source>Show information about Qt</source> + <translation>Show information about Qt</translation> + </message> + <message> + <source>&Options...</source> + <translation>&Options...</translation> + </message> + <message> + <source>&Encrypt Wallet...</source> + <translation>&Encrypt Wallet...</translation> + </message> + <message> + <source>&Backup Wallet...</source> + <translation>&Backup Wallet...</translation> + </message> + <message> + <source>&Change Passphrase...</source> + <translation>&Change Passphrase...</translation> + </message> + <message> + <source>&Sending addresses...</source> + <translation>&Sending addresses...</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>&Receiving addresses...</translation> + </message> + <message> + <source>Open &URI...</source> + <translation>Open &URI...</translation> + </message> + <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin Core client</translation> + </message> + <message> + <source>Importing blocks from disk...</source> + <translation>Importing blocks from disk...</translation> + </message> + <message> + <source>Reindexing blocks on disk...</source> + <translation>Reindexing blocks on disk...</translation> + </message> + <message> + <source>Send coins to a Bitcoin address</source> + <translation>Send coins to a Bitcoin address</translation> + </message> + <message> + <source>Backup wallet to another location</source> + <translation>Backup wallet to another location</translation> + </message> + <message> + <source>Change the passphrase used for wallet encryption</source> + <translation>Change the passphrase used for wallet encryption</translation> + </message> + <message> + <source>&Debug window</source> + <translation>&Debug window</translation> + </message> + <message> + <source>Open debugging and diagnostic console</source> + <translation>Open debugging and diagnostic console</translation> + </message> + <message> + <source>&Verify message...</source> + <translation>&Verify message...</translation> + </message> + <message> + <source>Bitcoin</source> + <translation>Bitcoin</translation> + </message> + <message> + <source>Wallet</source> + <translation>Wallet</translation> + </message> + <message> + <source>&Send</source> + <translation>&Send</translation> + </message> + <message> + <source>&Receive</source> + <translation>&Receive</translation> + </message> + <message> + <source>Show information about Bitcoin Core</source> + <translation>Show information about Bitcoin Core</translation> + </message> + <message> + <source>&Show / Hide</source> + <translation>&Show / Hide</translation> + </message> + <message> + <source>Show or hide the main Window</source> + <translation>Show or hide the main Window</translation> + </message> + <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>Encrypt the private keys that belong to your wallet</translation> + </message> + <message> + <source>Sign messages with your Bitcoin addresses to prove you own them</source> + <translation>Sign messages with your Bitcoin addresses to prove you own them</translation> + </message> + <message> + <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source> + <translation>Verify messages to ensure they were signed with specified Bitcoin addresses</translation> + </message> + <message> + <source>&File</source> + <translation>&File</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Settings</translation> + </message> + <message> + <source>&Help</source> + <translation>&Help</translation> + </message> + <message> + <source>Tabs toolbar</source> + <translation>Tabs toolbar</translation> + </message> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>Request payments (generates QR codes and bitcoin: URIs)</source> + <translation>Request payments (generates QR codes and bitcoin: URIs)</translation> + </message> + <message> + <source>&About Bitcoin Core</source> + <translation>&About Bitcoin Core</translation> + </message> + <message> + <source>Modify configuration options for Bitcoin Core</source> + <translation>Modify configuration options for Bitcoin Core</translation> + </message> + <message> + <source>Show the list of used sending addresses and labels</source> + <translation>Show the list of used sending addresses and labels</translation> + </message> + <message> + <source>Show the list of used receiving addresses and labels</source> + <translation>Show the list of used receiving addresses and labels</translation> + </message> + <message> + <source>Open a bitcoin: URI or payment request</source> + <translation>Open a bitcoin: URI or payment request</translation> + </message> + <message> + <source>&Command-line options</source> + <translation>&Command-line options</translation> + </message> + <message> + <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> + <translation>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</translation> + </message> + <message numerus="yes"> + <source>%n active connection(s) to Bitcoin network</source> + <translation><numerusform>%n active connection to Bitcoin network</numerusform><numerusform>%n active connections to Bitcoin network</numerusform></translation> + </message> + <message> + <source>No block source available...</source> + <translation>No block source available...</translation> + </message> + <message numerus="yes"> + <source>Processed %n block(s) of transaction history.</source> + <translation><numerusform>Processed %n block of transaction history.</numerusform><numerusform>Processed %n blocks of transaction history.</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n hour(s)</source> + <translation><numerusform>%n hour</numerusform><numerusform>%n hours</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n day(s)</source> + <translation><numerusform>%n day</numerusform><numerusform>%n days</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n week</numerusform><numerusform>%n weeks</numerusform></translation> + </message> + <message> + <source>%1 and %2</source> + <translation>%1 and %2</translation> + </message> + <message numerus="yes"> + <source>%n year(s)</source> + <translation><numerusform>%n year</numerusform><numerusform>%n years</numerusform></translation> + </message> + <message> + <source>%1 behind</source> + <translation>%1 behind</translation> + </message> + <message> + <source>Last received block was generated %1 ago.</source> + <translation>Last received block was generated %1 ago.</translation> + </message> + <message> + <source>Transactions after this will not yet be visible.</source> + <translation>Transactions after this will not yet be visible.</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> + <message> + <source>Warning</source> + <translation>Warning</translation> + </message> + <message> + <source>Information</source> + <translation>Information</translation> + </message> + <message> + <source>Up to date</source> + <translation>Up to date</translation> + </message> + <message> + <source>Catching up...</source> + <translation>Catching up...</translation> + </message> + <message> + <source>Date: %1 +</source> + <translation>Date: %1 +</translation> + </message> + <message> + <source>Amount: %1 +</source> + <translation>Amount: %1 +</translation> + </message> + <message> + <source>Type: %1 +</source> + <translation>Type: %1 +</translation> + </message> + <message> + <source>Label: %1 +</source> + <translation>Label: %1 +</translation> + </message> + <message> + <source>Address: %1 +</source> + <translation>Address: %1 +</translation> + </message> + <message> + <source>Sent transaction</source> + <translation>Sent transaction</translation> + </message> + <message> + <source>Incoming transaction</source> + <translation>Incoming transaction</translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>unlocked</b></source> + <translation>Wallet is <b>encrypted</b> and currently <b>unlocked</b></translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>locked</b></source> + <translation>Wallet is <b>encrypted</b> and currently <b>locked</b></translation> + </message> +</context> +<context> + <name>ClientModel</name> + <message> + <source>Network Alert</source> + <translation>Network Alert</translation> + </message> +</context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Coin Selection</source> + <translation>Coin Selection</translation> + </message> + <message> + <source>Quantity:</source> + <translation>Quantity:</translation> + </message> + <message> + <source>Bytes:</source> + <translation>Bytes:</translation> + </message> + <message> + <source>Amount:</source> + <translation>Amount:</translation> + </message> + <message> + <source>Priority:</source> + <translation>Priority:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Fee:</translation> + </message> + <message> + <source>Dust:</source> + <translation>Dust:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>After Fee:</translation> + </message> + <message> + <source>Change:</source> + <translation>Change:</translation> + </message> + <message> + <source>(un)select all</source> + <translation>(un)select all</translation> + </message> + <message> + <source>Tree mode</source> + <translation>Tree mode</translation> + </message> + <message> + <source>List mode</source> + <translation>List mode</translation> + </message> + <message> + <source>Amount</source> + <translation>Amount</translation> + </message> + <message> + <source>Received with label</source> + <translation>Received with label</translation> + </message> + <message> + <source>Received with address</source> + <translation>Received with address</translation> + </message> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Confirmations</source> + <translation>Confirmations</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Confirmed</translation> + </message> + <message> + <source>Priority</source> + <translation>Priority</translation> + </message> + <message> + <source>Copy address</source> + <translation>Copy address</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copy label</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copy amount</translation> + </message> + <message> + <source>Copy transaction ID</source> + <translation>Copy transaction ID</translation> + </message> + <message> + <source>Lock unspent</source> + <translation>Lock unspent</translation> + </message> + <message> + <source>Unlock unspent</source> + <translation>Unlock unspent</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Copy quantity</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Copy fee</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Copy after fee</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Copy bytes</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Copy priority</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Copy dust</translation> + </message> + <message> + <source>Copy change</source> + <translation>Copy change</translation> + </message> + <message> + <source>highest</source> + <translation>highest</translation> + </message> + <message> + <source>higher</source> + <translation>higher</translation> + </message> + <message> + <source>high</source> + <translation>high</translation> + </message> + <message> + <source>medium-high</source> + <translation>medium-high</translation> + </message> + <message> + <source>medium</source> + <translation>medium</translation> + </message> + <message> + <source>low-medium</source> + <translation>low-medium</translation> + </message> + <message> + <source>low</source> + <translation>low</translation> + </message> + <message> + <source>lower</source> + <translation>lower</translation> + </message> + <message> + <source>lowest</source> + <translation>lowest</translation> + </message> + <message> + <source>(%1 locked)</source> + <translation>(%1 locked)</translation> + </message> + <message> + <source>none</source> + <translation>none</translation> + </message> + <message> + <source>This label turns red if the transaction size is greater than 1000 bytes.</source> + <translation>This label turns red if the transaction size is greater than 1000 bytes.</translation> + </message> + <message> + <source>This label turns red if the priority is smaller than "medium".</source> + <translation>This label turns red if the priority is smaller than "medium".</translation> + </message> + <message> + <source>This label turns red if any recipient receives an amount smaller than %1.</source> + <translation>This label turns red if any recipient receives an amount smaller than %1.</translation> + </message> + <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Can vary +/- %1 satoshi(s) per input.</translation> + </message> + <message> + <source>yes</source> + <translation>yes</translation> + </message> + <message> + <source>no</source> + <translation>no</translation> + </message> + <message> + <source>This means a fee of at least %1 per kB is required.</source> + <translation>This means a fee of at least %1 per kB is required.</translation> + </message> + <message> + <source>Can vary +/- 1 byte per input.</source> + <translation>Can vary +/- 1 byte per input.</translation> + </message> + <message> + <source>Transactions with higher priority are more likely to get included into a block.</source> + <translation>Transactions with higher priority are more likely to get included into a block.</translation> + </message> + <message> + <source>(no label)</source> + <translation>(no label)</translation> + </message> + <message> + <source>change from %1 (%2)</source> + <translation>change from %1 (%2)</translation> + </message> + <message> + <source>(change)</source> + <translation>(change)</translation> + </message> +</context> +<context> + <name>EditAddressDialog</name> + <message> + <source>Edit Address</source> + <translation>Edit Address</translation> + </message> + <message> + <source>&Label</source> + <translation>&Label</translation> + </message> + <message> + <source>The label associated with this address list entry</source> + <translation>The label associated with this address list entry</translation> + </message> + <message> + <source>The address associated with this address list entry. This can only be modified for sending addresses.</source> + <translation>The address associated with this address list entry. This can only be modified for sending addresses.</translation> + </message> + <message> + <source>&Address</source> + <translation>&Address</translation> + </message> + <message> + <source>New receiving address</source> + <translation>New receiving address</translation> + </message> + <message> + <source>New sending address</source> + <translation>New sending address</translation> + </message> + <message> + <source>Edit receiving address</source> + <translation>Edit receiving address</translation> + </message> + <message> + <source>Edit sending address</source> + <translation>Edit sending address</translation> + </message> + <message> + <source>The entered address "%1" is already in the address book.</source> + <translation>The entered address "%1" is already in the address book.</translation> + </message> + <message> + <source>The entered address "%1" is not a valid Bitcoin address.</source> + <translation>The entered address "%1" is not a valid Bitcoin address.</translation> + </message> + <message> + <source>Could not unlock wallet.</source> + <translation>Could not unlock wallet.</translation> + </message> + <message> + <source>New key generation failed.</source> + <translation>New key generation failed.</translation> + </message> +</context> +<context> + <name>FreespaceChecker</name> + <message> + <source>A new data directory will be created.</source> + <translation>A new data directory will be created.</translation> + </message> + <message> + <source>name</source> + <translation>name</translation> + </message> + <message> + <source>Directory already exists. Add %1 if you intend to create a new directory here.</source> + <translation>Directory already exists. Add %1 if you intend to create a new directory here.</translation> + </message> + <message> + <source>Path already exists, and is not a directory.</source> + <translation>Path already exists, and is not a directory.</translation> + </message> + <message> + <source>Cannot create data directory here.</source> + <translation>Cannot create data directory here.</translation> + </message> +</context> +<context> + <name>HelpMessageDialog</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>version</source> + <translation>version</translation> + </message> + <message> + <source>(%1-bit)</source> + <translation>(%1-bit)</translation> + </message> + <message> + <source>About Bitcoin Core</source> + <translation>About Bitcoin Core</translation> + </message> + <message> + <source>Command-line options</source> + <translation>Command-line options</translation> + </message> + <message> + <source>Usage:</source> + <translation>Usage:</translation> + </message> + <message> + <source>command-line options</source> + <translation>command-line options</translation> + </message> +</context> +<context> + <name>Intro</name> + <message> + <source>Welcome</source> + <translation>Welcome</translation> + </message> + <message> + <source>Welcome to Bitcoin Core.</source> + <translation>Welcome to Bitcoin Core.</translation> + </message> + <message> + <source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source> + <translation>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</translation> + </message> + <message> + <source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source> + <translation>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</translation> + </message> + <message> + <source>Use the default data directory</source> + <translation>Use the default data directory</translation> + </message> + <message> + <source>Use a custom data directory:</source> + <translation>Use a custom data directory:</translation> + </message> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>Error: Specified data directory "%1" cannot be created.</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB of free space available</numerusform><numerusform>%n GB of free space available</numerusform></translation> + </message> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(of %n GB needed)</numerusform><numerusform>(of %n GB needed)</numerusform></translation> + </message> +</context> +<context> + <name>OpenURIDialog</name> + <message> + <source>Open URI</source> + <translation>Open URI</translation> + </message> + <message> + <source>Open payment request from URI or file</source> + <translation>Open payment request from URI or file</translation> + </message> + <message> + <source>URI:</source> + <translation>URI:</translation> + </message> + <message> + <source>Select payment request file</source> + <translation>Select payment request file</translation> + </message> + <message> + <source>Select payment request file to open</source> + <translation>Select payment request file to open</translation> + </message> +</context> +<context> + <name>OptionsDialog</name> + <message> + <source>Options</source> + <translation>Options</translation> + </message> + <message> + <source>&Main</source> + <translation>&Main</translation> + </message> + <message> + <source>Size of &database cache</source> + <translation>Size of &database cache</translation> + </message> + <message> + <source>MB</source> + <translation>MB</translation> + </message> + <message> + <source>Number of script &verification threads</source> + <translation>Number of script &verification threads</translation> + </message> + <message> + <source>Accept connections from outside</source> + <translation>Accept connections from outside</translation> + </message> + <message> + <source>Allow incoming connections</source> + <translation>Allow incoming connections</translation> + </message> + <message> + <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> + <translation>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</translation> + </message> + <message> + <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source> + <translation>Minimise instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</translation> + </message> + <message> + <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source> + <translation>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</translation> + </message> + <message> + <source>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source> + <translation>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</translation> + </message> + <message> + <source>Third party transaction URLs</source> + <translation>Third party transaction URLs</translation> + </message> + <message> + <source>Active command-line options that override above options:</source> + <translation>Active command-line options that override above options:</translation> + </message> + <message> + <source>Reset all client options to default.</source> + <translation>Reset all client options to default.</translation> + </message> + <message> + <source>&Reset Options</source> + <translation>&Reset Options</translation> + </message> + <message> + <source>&Network</source> + <translation>&Network</translation> + </message> + <message> + <source>Automatically start Bitcoin Core after logging in to the system.</source> + <translation>Automatically start Bitcoin Core after logging in to the system.</translation> + </message> + <message> + <source>&Start Bitcoin Core on system login</source> + <translation>&Start Bitcoin Core on system login</translation> + </message> + <message> + <source>(0 = auto, <0 = leave that many cores free)</source> + <translation>(0 = auto, <0 = leave that many cores free)</translation> + </message> + <message> + <source>W&allet</source> + <translation>W&allet</translation> + </message> + <message> + <source>Expert</source> + <translation>Expert</translation> + </message> + <message> + <source>Enable coin &control features</source> + <translation>Enable coin &control features</translation> + </message> + <message> + <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source> + <translation>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</translation> + </message> + <message> + <source>&Spend unconfirmed change</source> + <translation>&Spend unconfirmed change</translation> + </message> + <message> + <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source> + <translation>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</translation> + </message> + <message> + <source>Map port using &UPnP</source> + <translation>Map port using &UPnP</translation> + </message> + <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Connect to the Bitcoin network through a SOCKS5 proxy.</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>&Connect through SOCKS5 proxy (default proxy):</translation> + </message> + <message> + <source>Proxy &IP:</source> + <translation>Proxy &IP:</translation> + </message> + <message> + <source>&Port:</source> + <translation>&Port:</translation> + </message> + <message> + <source>Port of the proxy (e.g. 9050)</source> + <translation>Port of the proxy (e.g. 9050)</translation> + </message> + <message> + <source>Used for reaching peers via:</source> + <translation>Used for reaching peers via:</translation> + </message> + <message> + <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source> + <translation>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</translation> + </message> + <message> + <source>IPv4</source> + <translation>IPv4</translation> + </message> + <message> + <source>IPv6</source> + <translation>IPv6</translation> + </message> + <message> + <source>Tor</source> + <translation>Tor</translation> + </message> + <message> + <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source> + <translation>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source> + <translation>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</translation> + </message> + <message> + <source>&Window</source> + <translation>&Window</translation> + </message> + <message> + <source>Show only a tray icon after minimizing the window.</source> + <translation>Show on a tray icon after minimising the window.</translation> + </message> + <message> + <source>&Minimize to the tray instead of the taskbar</source> + <translation>&Minimise to the tray instead of the task bar</translation> + </message> + <message> + <source>M&inimize on close</source> + <translation>M&inimise on close</translation> + </message> + <message> + <source>&Display</source> + <translation>&Display</translation> + </message> + <message> + <source>User Interface &language:</source> + <translation>User Interface &language:</translation> + </message> + <message> + <source>&Unit to show amounts in:</source> + <translation>&Unit to show amounts in:</translation> + </message> + <message> + <source>Choose the default subdivision unit to show in the interface and when sending coins.</source> + <translation>Choose the default subdivision unit to show in the interface and when sending coins.</translation> + </message> + <message> + <source>Whether to show coin control features or not.</source> + <translation>Whether to show coin control features or not.</translation> + </message> + <message> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <source>&Cancel</source> + <translation>&Cancel</translation> + </message> + <message> + <source>default</source> + <translation>default</translation> + </message> + <message> + <source>none</source> + <translation>none</translation> + </message> + <message> + <source>Confirm options reset</source> + <translation>Confirm options reset</translation> + </message> + <message> + <source>Client restart required to activate changes.</source> + <translation>Client restart required to activate changes.</translation> + </message> + <message> + <source>Client will be shut down. Do you want to proceed?</source> + <translation>Client will be shut down. Do you want to proceed?</translation> + </message> + <message> + <source>This change would require a client restart.</source> + <translation>This change would require a client restart.</translation> + </message> + <message> + <source>The supplied proxy address is invalid.</source> + <translation>The supplied proxy address is invalid.</translation> + </message> +</context> +<context> + <name>OverviewPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source> + <translation>The displayed information may be out of date. Your Wallet automatically synchronises with the Bitcoin Network after a connection is established, but this process has not been completed yet.</translation> + </message> + <message> + <source>Watch-only:</source> + <translation>Watch-only:</translation> + </message> + <message> + <source>Available:</source> + <translation>Available:</translation> + </message> + <message> + <source>Your current spendable balance</source> + <translation>Your current spendable balance</translation> + </message> + <message> + <source>Pending:</source> + <translation>Pending:</translation> + </message> + <message> + <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source> + <translation>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</translation> + </message> + <message> + <source>Immature:</source> + <translation>Immature:</translation> + </message> + <message> + <source>Mined balance that has not yet matured</source> + <translation>Mined balance that has not yet matured</translation> + </message> + <message> + <source>Balances</source> + <translation>Balances</translation> + </message> + <message> + <source>Total:</source> + <translation>Total:</translation> + </message> + <message> + <source>Your current total balance</source> + <translation>Your current total balance</translation> + </message> + <message> + <source>Your current balance in watch-only addresses</source> + <translation>Your current balance in watch-only addresses</translation> + </message> + <message> + <source>Spendable:</source> + <translation>Spendable:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Recent transactions</translation> + </message> + <message> + <source>Unconfirmed transactions to watch-only addresses</source> + <translation>Unconfirmed transactions to watch-only addresses</translation> + </message> + <message> + <source>Mined balance in watch-only addresses that has not yet matured</source> + <translation>Mined balance in watch-only addresses that has not yet matured</translation> + </message> + <message> + <source>Current total balance in watch-only addresses</source> + <translation>Current total balance in watch-only addresses</translation> + </message> +</context> +<context> + <name>PaymentServer</name> + <message> + <source>URI handling</source> + <translation>URI handling</translation> + </message> + <message> + <source>Invalid payment address %1</source> + <translation>Invalid payment address %1</translation> + </message> + <message> + <source>Payment request rejected</source> + <translation>Payment request rejected</translation> + </message> + <message> + <source>Payment request network doesn't match client network.</source> + <translation>Payment request network doesn't match client network.</translation> + </message> + <message> + <source>Payment request is not initialized.</source> + <translation>Payment request is not initialised.</translation> + </message> + <message> + <source>Requested payment amount of %1 is too small (considered dust).</source> + <translation>Requested payment amount of %1 is too small (considered dust).</translation> + </message> + <message> + <source>Payment request error</source> + <translation>Payment request error</translation> + </message> + <message> + <source>Cannot start bitcoin: click-to-pay handler</source> + <translation>Cannot start bitcoin: click-to-pay handler</translation> + </message> + <message> + <source>Payment request fetch URL is invalid: %1</source> + <translation>Payment request fetch URL is invalid: %1</translation> + </message> + <message> + <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source> + <translation>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</translation> + </message> + <message> + <source>Payment request file handling</source> + <translation>Payment request file handling</translation> + </message> + <message> + <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source> + <translation>Payment request file cannot be read! This can be caused by an invalid payment request file.</translation> + </message> + <message> + <source>Payment request expired.</source> + <translation>Payment request expired.</translation> + </message> + <message> + <source>Unverified payment requests to custom payment scripts are unsupported.</source> + <translation>Unverified payment requests to custom payment scripts are unsupported.</translation> + </message> + <message> + <source>Invalid payment request.</source> + <translation>Invalid payment request.</translation> + </message> + <message> + <source>Refund from %1</source> + <translation>Refund from %1</translation> + </message> + <message> + <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source> + <translation>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</translation> + </message> + <message> + <source>Error communicating with %1: %2</source> + <translation>Error communicating with %1: %2</translation> + </message> + <message> + <source>Payment request cannot be parsed!</source> + <translation>Payment request cannot be parsed!</translation> + </message> + <message> + <source>Bad response from server %1</source> + <translation>Bad response from server %1</translation> + </message> + <message> + <source>Payment acknowledged</source> + <translation>Payment acknowledged</translation> + </message> + <message> + <source>Network request error</source> + <translation>Network request error</translation> + </message> +</context> +<context> + <name>PeerTableModel</name> + <message> + <source>User Agent</source> + <translation>User Agent</translation> + </message> + <message> + <source>Node/Service</source> + <translation>Node/Service</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Ping Time</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Amount</source> + <translation>Amount</translation> + </message> + <message> + <source>Enter a Bitcoin address (e.g. %1)</source> + <translation>Enter a Bitcoin address (e.g. %1)</translation> + </message> + <message> + <source>%1 d</source> + <translation>%1 d</translation> + </message> + <message> + <source>%1 h</source> + <translation>%1 h</translation> + </message> + <message> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <source>%1 s</source> + <translation>%1 s</translation> + </message> + <message> + <source>None</source> + <translation>None</translation> + </message> + <message> + <source>N/A</source> + <translation>N/A</translation> + </message> + <message> + <source>%1 ms</source> + <translation>%1 ms</translation> + </message> +</context> +<context> + <name>QRImageWidget</name> + <message> + <source>&Save Image...</source> + <translation>&Save Image...</translation> + </message> + <message> + <source>&Copy Image</source> + <translation>&Copy Image</translation> + </message> + <message> + <source>Save QR Code</source> + <translation>Save QR Code</translation> + </message> + <message> + <source>PNG Image (*.png)</source> + <translation>PNG Image (*.png)</translation> + </message> +</context> +<context> + <name>RPCConsole</name> + <message> + <source>Client name</source> + <translation>Client name</translation> + </message> + <message> + <source>N/A</source> + <translation>N/A</translation> + </message> + <message> + <source>Client version</source> + <translation>Client version</translation> + </message> + <message> + <source>&Information</source> + <translation>&Information</translation> + </message> + <message> + <source>Debug window</source> + <translation>Debug window</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Using OpenSSL version</source> + <translation>Using OpenSSL version</translation> + </message> + <message> + <source>Using BerkeleyDB version</source> + <translation>Using BerkeleyDB version</translation> + </message> + <message> + <source>Startup time</source> + <translation>Startup time</translation> + </message> + <message> + <source>Network</source> + <translation>Network</translation> + </message> + <message> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <source>Number of connections</source> + <translation>Number of connections</translation> + </message> + <message> + <source>Block chain</source> + <translation>Block chain</translation> + </message> + <message> + <source>Current number of blocks</source> + <translation>Current number of blocks</translation> + </message> + <message> + <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source> + <translation>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</translation> + </message> + <message> + <source>Received</source> + <translation>Received</translation> + </message> + <message> + <source>Sent</source> + <translation>Sent</translation> + </message> + <message> + <source>&Peers</source> + <translation>&Peers</translation> + </message> + <message> + <source>Banned peers</source> + <translation>Banned peers</translation> + </message> + <message> + <source>Select a peer to view detailed information.</source> + <translation>Select a peer to view detailed information.</translation> + </message> + <message> + <source>Whitelisted</source> + <translation>Whitelisted</translation> + </message> + <message> + <source>Direction</source> + <translation>Direction</translation> + </message> + <message> + <source>Version</source> + <translation>Version</translation> + </message> + <message> + <source>Starting Block</source> + <translation>Starting Block</translation> + </message> + <message> + <source>Synced Headers</source> + <translation>Synced Headers</translation> + </message> + <message> + <source>Synced Blocks</source> + <translation>Synced Blocks</translation> + </message> + <message> + <source>User Agent</source> + <translation>User Agent</translation> + </message> + <message> + <source>Services</source> + <translation>Services</translation> + </message> + <message> + <source>Ban Score</source> + <translation>Ban Score</translation> + </message> + <message> + <source>Connection Time</source> + <translation>Connection Time</translation> + </message> + <message> + <source>Last Send</source> + <translation>Last Send</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Last Receive</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Ping Time</translation> + </message> + <message> + <source>The duration of a currently outstanding ping.</source> + <translation>The duration of a currently outstanding ping.</translation> + </message> + <message> + <source>Ping Wait</source> + <translation>Ping Wait</translation> + </message> + <message> + <source>Time Offset</source> + <translation>Time Offset</translation> + </message> + <message> + <source>Last block time</source> + <translation>Last block time</translation> + </message> + <message> + <source>&Open</source> + <translation>&Open</translation> + </message> + <message> + <source>&Console</source> + <translation>&Console</translation> + </message> + <message> + <source>&Network Traffic</source> + <translation>&Network Traffic</translation> + </message> + <message> + <source>&Clear</source> + <translation>&Clear</translation> + </message> + <message> + <source>Totals</source> + <translation>Totals</translation> + </message> + <message> + <source>In:</source> + <translation>In:</translation> + </message> + <message> + <source>Out:</source> + <translation>Out:</translation> + </message> + <message> + <source>Build date</source> + <translation>Build date</translation> + </message> + <message> + <source>Debug log file</source> + <translation>Debug log file</translation> + </message> + <message> + <source>Clear console</source> + <translation>Clear console</translation> + </message> + <message> + <source>&Disconnect Node</source> + <translation>&Disconnect Node</translation> + </message> + <message> + <source>Ban Node for</source> + <translation>Ban Node for</translation> + </message> + <message> + <source>1 &hour</source> + <translation>1 &hour</translation> + </message> + <message> + <source>1 &day</source> + <translation>1 &day</translation> + </message> + <message> + <source>1 &week</source> + <translation>1 &week</translation> + </message> + <message> + <source>1 &year</source> + <translation>1 &year</translation> + </message> + <message> + <source>&Unban Node</source> + <translation>&Unban Node</translation> + </message> + <message> + <source>Welcome to the Bitcoin Core RPC console.</source> + <translation>Welcome to the Bitcoin Core RPC console.</translation> + </message> + <message> + <source>Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen.</source> + <translation>Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen.</translation> + </message> + <message> + <source>Type <b>help</b> for an overview of available commands.</source> + <translation>Type <b>help</b> for an overview of available commands.</translation> + </message> + <message> + <source>%1 B</source> + <translation>%1 B</translation> + </message> + <message> + <source>%1 KB</source> + <translation>%1 KB</translation> + </message> + <message> + <source>%1 MB</source> + <translation>%1 MB</translation> + </message> + <message> + <source>%1 GB</source> + <translation>%1 GB</translation> + </message> + <message> + <source>(node id: %1)</source> + <translation>(node id: %1)</translation> + </message> + <message> + <source>via %1</source> + <translation>via %1</translation> + </message> + <message> + <source>never</source> + <translation>never</translation> + </message> + <message> + <source>Inbound</source> + <translation>Inbound</translation> + </message> + <message> + <source>Outbound</source> + <translation>Outbound</translation> + </message> + <message> + <source>Yes</source> + <translation>Yes</translation> + </message> + <message> + <source>No</source> + <translation>No</translation> + </message> + <message> + <source>Unknown</source> + <translation>Unknown</translation> + </message> +</context> +<context> + <name>ReceiveCoinsDialog</name> + <message> + <source>&Amount:</source> + <translation>&Amount:</translation> + </message> + <message> + <source>&Label:</source> + <translation>&Label:</translation> + </message> + <message> + <source>&Message:</source> + <translation>&Message:</translation> + </message> + <message> + <source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source> + <translation>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</translation> + </message> + <message> + <source>R&euse an existing receiving address (not recommended)</source> + <translation>R&euse an existing receiving address (not recommended)</translation> + </message> + <message> + <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source> + <translation>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</translation> + </message> + <message> + <source>An optional label to associate with the new receiving address.</source> + <translation>An optional label to associate with the new receiving address.</translation> + </message> + <message> + <source>Use this form to request payments. All fields are <b>optional</b>.</source> + <translation>Use this form to request payments. All fields are <b>optional</b>.</translation> + </message> + <message> + <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source> + <translation>An optional amount to request. Leave this empty or zero to not request a specific amount.</translation> + </message> + <message> + <source>Clear all fields of the form.</source> + <translation>Clear all fields of the form.</translation> + </message> + <message> + <source>Clear</source> + <translation>Clear</translation> + </message> + <message> + <source>Requested payments history</source> + <translation>Requested payments history</translation> + </message> + <message> + <source>&Request payment</source> + <translation>&Request payment</translation> + </message> + <message> + <source>Show the selected request (does the same as double clicking an entry)</source> + <translation>Show the selected request (does the same as double clicking an entry)</translation> + </message> + <message> + <source>Show</source> + <translation>Show</translation> + </message> + <message> + <source>Remove the selected entries from the list</source> + <translation>Remove the selected entries from the list</translation> + </message> + <message> + <source>Remove</source> + <translation>Remove</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copy label</translation> + </message> + <message> + <source>Copy message</source> + <translation>Copy message</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copy amount</translation> + </message> +</context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>QR Code</source> + <translation>QR Code</translation> + </message> + <message> + <source>Copy &URI</source> + <translation>Copy &URI</translation> + </message> + <message> + <source>Copy &Address</source> + <translation>Copy &Address</translation> + </message> + <message> + <source>&Save Image...</source> + <translation>&Save Image...</translation> + </message> + <message> + <source>Request payment to %1</source> + <translation>Request payment to %1</translation> + </message> + <message> + <source>Payment information</source> + <translation>Payment information</translation> + </message> + <message> + <source>URI</source> + <translation>URI</translation> + </message> + <message> + <source>Address</source> + <translation>Address</translation> + </message> + <message> + <source>Amount</source> + <translation>Amount</translation> + </message> + <message> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <source>Message</source> + <translation>Message</translation> + </message> + <message> + <source>Resulting URI too long, try to reduce the text for label / message.</source> + <translation>Resulting URI too long, try to reduce the text for label / message.</translation> + </message> + <message> + <source>Error encoding URI into QR Code.</source> + <translation>Error encoding URI into QR Code.</translation> + </message> +</context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <source>Message</source> + <translation>Message</translation> + </message> + <message> + <source>Amount</source> + <translation>Amount</translation> + </message> + <message> + <source>(no label)</source> + <translation>(no label)</translation> + </message> + <message> + <source>(no message)</source> + <translation>(no message)</translation> + </message> + <message> + <source>(no amount)</source> + <translation>(no amount)</translation> + </message> +</context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>Send Coins</source> + <translation>Send Coins</translation> + </message> + <message> + <source>Coin Control Features</source> + <translation>Coin Control Features</translation> + </message> + <message> + <source>Inputs...</source> + <translation>Inputs...</translation> + </message> + <message> + <source>automatically selected</source> + <translation>automatically selected</translation> + </message> + <message> + <source>Insufficient funds!</source> + <translation>Insufficient funds!</translation> + </message> + <message> + <source>Quantity:</source> + <translation>Quantity:</translation> + </message> + <message> + <source>Bytes:</source> + <translation>Bytes:</translation> + </message> + <message> + <source>Amount:</source> + <translation>Amount:</translation> + </message> + <message> + <source>Priority:</source> + <translation>Priority:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Fee:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>After Fee:</translation> + </message> + <message> + <source>Change:</source> + <translation>Change:</translation> + </message> + <message> + <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source> + <translation>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</translation> + </message> + <message> + <source>Custom change address</source> + <translation>Custom change address</translation> + </message> + <message> + <source>Transaction Fee:</source> + <translation>Transaction Fee:</translation> + </message> + <message> + <source>Choose...</source> + <translation>Choose...</translation> + </message> + <message> + <source>collapse fee-settings</source> + <translation>collapse fee-settings</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>per kilobyte</translation> + </message> + <message> + <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source> + <translation>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</translation> + </message> + <message> + <source>Hide</source> + <translation>Hide</translation> + </message> + <message> + <source>total at least</source> + <translation>total at least</translation> + </message> + <message> + <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source> + <translation>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</translation> + </message> + <message> + <source>(read the tooltip)</source> + <translation>(read the tooltip)</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Recommended:</translation> + </message> + <message> + <source>Custom:</source> + <translation>Custom:</translation> + </message> + <message> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation>(Smart fee not initialised yet. This usually takes a few blocks...)</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Confirmation time:</translation> + </message> + <message> + <source>normal</source> + <translation>normal</translation> + </message> + <message> + <source>fast</source> + <translation>fast</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Send as zero-fee transaction if possible</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(confirmation may take longer)</translation> + </message> + <message> + <source>Send to multiple recipients at once</source> + <translation>Send to multiple recipients at once</translation> + </message> + <message> + <source>Add &Recipient</source> + <translation>Add &Recipient</translation> + </message> + <message> + <source>Clear all fields of the form.</source> + <translation>Clear all fields of the form.</translation> + </message> + <message> + <source>Dust:</source> + <translation>Dust:</translation> + </message> + <message> + <source>Clear &All</source> + <translation>Clear &All</translation> + </message> + <message> + <source>Balance:</source> + <translation>Balance:</translation> + </message> + <message> + <source>Confirm the send action</source> + <translation>Confirm the send action</translation> + </message> + <message> + <source>S&end</source> + <translation>S&end</translation> + </message> + <message> + <source>Confirm send coins</source> + <translation>Confirm send coins</translation> + </message> + <message> + <source>%1 to %2</source> + <translation>%1 to %2</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Copy quantity</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copy amount</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Copy fee</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Copy after fee</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Copy bytes</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Copy priority</translation> + </message> + <message> + <source>Copy change</source> + <translation>Copy change</translation> + </message> + <message> + <source>Total Amount %1</source> + <translation>Total Amount %1</translation> + </message> + <message> + <source>or</source> + <translation>or</translation> + </message> + <message> + <source>The amount to pay must be larger than 0.</source> + <translation>The amount to pay must be larger than 0.</translation> + </message> + <message> + <source>The amount exceeds your balance.</source> + <translation>The amount exceeds your balance.</translation> + </message> + <message> + <source>The total exceeds your balance when the %1 transaction fee is included.</source> + <translation>The total exceeds your balance when the %1 transaction fee is included.</translation> + </message> + <message> + <source>Transaction creation failed!</source> + <translation>Transaction creation failed!</translation> + </message> + <message> + <source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source> + <translation>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</translation> + </message> + <message> + <source>A fee higher than %1 is considered an absurdly high fee.</source> + <translation>A fee higher than %1 is considered an absurdly high fee.</translation> + </message> + <message> + <source>Payment request expired.</source> + <translation>Payment request expired.</translation> + </message> + <message> + <source>Pay only the required fee of %1</source> + <translation>Pay only the required fee of %1</translation> + </message> + <message numerus="yes"> + <source>Estimated to begin confirmation within %n block(s).</source> + <translation><numerusform>Estimated to begin confirmation within %n block.</numerusform><numerusform>Estimated to begin confirmation within %n blocks.</numerusform></translation> + </message> + <message> + <source>The recipient address is not valid. Please recheck.</source> + <translation>The recipient address is not valid. Please recheck.</translation> + </message> + <message> + <source>Duplicate address found: addresses should only be used once each.</source> + <translation>Duplicate address found: addresses should only be used once each.</translation> + </message> + <message> + <source>Warning: Invalid Bitcoin address</source> + <translation>Warning: Invalid Bitcoin address</translation> + </message> + <message> + <source>(no label)</source> + <translation>(no label)</translation> + </message> + <message> + <source>Warning: Unknown change address</source> + <translation>Warning: Unknown change address</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Copy dust</translation> + </message> + <message> + <source>Are you sure you want to send?</source> + <translation>Are you sure you want to send?</translation> + </message> + <message> + <source>added as transaction fee</source> + <translation>added as transaction fee</translation> + </message> +</context> +<context> + <name>SendCoinsEntry</name> + <message> + <source>A&mount:</source> + <translation>A&mount:</translation> + </message> + <message> + <source>Pay &To:</source> + <translation>Pay &To:</translation> + </message> + <message> + <source>Enter a label for this address to add it to your address book</source> + <translation>Enter a label for this address to add it to your address book</translation> + </message> + <message> + <source>&Label:</source> + <translation>&Label:</translation> + </message> + <message> + <source>Choose previously used address</source> + <translation>Choose previously used address</translation> + </message> + <message> + <source>This is a normal payment.</source> + <translation>This is a normal payment.</translation> + </message> + <message> + <source>The Bitcoin address to send the payment to</source> + <translation>The Bitcoin address to send the payment to</translation> + </message> + <message> + <source>Alt+A</source> + <translation>Alt+A</translation> + </message> + <message> + <source>Paste address from clipboard</source> + <translation>Paste address from clipboard</translation> + </message> + <message> + <source>Alt+P</source> + <translation>Alt+P</translation> + </message> + <message> + <source>Remove this entry</source> + <translation>Remove this entry</translation> + </message> + <message> + <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source> + <translation>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</translation> + </message> + <message> + <source>S&ubtract fee from amount</source> + <translation>S&ubtract fee from amount</translation> + </message> + <message> + <source>Message:</source> + <translation>Message:</translation> + </message> + <message> + <source>This is an unauthenticated payment request.</source> + <translation>This is an unauthenticated payment request.</translation> + </message> + <message> + <source>This is an authenticated payment request.</source> + <translation>This is an authenticated payment request.</translation> + </message> + <message> + <source>Enter a label for this address to add it to the list of used addresses</source> + <translation>Enter a label for this address to add it to the list of used addresses</translation> + </message> + <message> + <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source> + <translation>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</translation> + </message> + <message> + <source>Pay To:</source> + <translation>Pay To:</translation> + </message> + <message> + <source>Memo:</source> + <translation>Memo:</translation> + </message> +</context> +<context> + <name>ShutdownWindow</name> + <message> + <source>Bitcoin Core is shutting down...</source> + <translation>Bitcoin Core is shutting down...</translation> + </message> + <message> + <source>Do not shut down the computer until this window disappears.</source> + <translation>Do not shut down the computer until this window disappears.</translation> + </message> +</context> +<context> + <name>SignVerifyMessageDialog</name> + <message> + <source>Signatures - Sign / Verify a Message</source> + <translation>Signatures - Sign / Verify a Message</translation> + </message> + <message> + <source>&Sign Message</source> + <translation>&Sign Message</translation> + </message> + <message> + <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source> + <translation>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</translation> + </message> + <message> + <source>The Bitcoin address to sign the message with</source> + <translation>The Bitcoin address to sign the message with</translation> + </message> + <message> + <source>Choose previously used address</source> + <translation>Choose previously used address</translation> + </message> + <message> + <source>Alt+A</source> + <translation>Alt+A</translation> + </message> + <message> + <source>Paste address from clipboard</source> + <translation>Paste address from clipboard</translation> + </message> + <message> + <source>Alt+P</source> + <translation>Alt+P</translation> + </message> + <message> + <source>Enter the message you want to sign here</source> + <translation>Enter the message you want to sign here</translation> + </message> + <message> + <source>Signature</source> + <translation>Signature</translation> + </message> + <message> + <source>Copy the current signature to the system clipboard</source> + <translation>Copy the current signature to the system clipboard</translation> + </message> + <message> + <source>Sign the message to prove you own this Bitcoin address</source> + <translation>Sign the message to prove you own this Bitcoin address</translation> + </message> + <message> + <source>Sign &Message</source> + <translation>Sign &Message</translation> + </message> + <message> + <source>Reset all sign message fields</source> + <translation>Reset all sign message fields</translation> + </message> + <message> + <source>Clear &All</source> + <translation>Clear &All</translation> + </message> + <message> + <source>&Verify Message</source> + <translation>&Verify Message</translation> + </message> + <message> + <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source> + <translation>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</translation> + </message> + <message> + <source>The Bitcoin address the message was signed with</source> + <translation>The Bitcoin address the message was signed with</translation> + </message> + <message> + <source>Verify the message to ensure it was signed with the specified Bitcoin address</source> + <translation>Verify the message to ensure it was signed with the specified Bitcoin address</translation> + </message> + <message> + <source>Verify &Message</source> + <translation>Verify &Message</translation> + </message> + <message> + <source>Reset all verify message fields</source> + <translation>Reset all verify message fields</translation> + </message> + <message> + <source>Click "Sign Message" to generate signature</source> + <translation>Click "Sign Message" to generate signature</translation> + </message> + <message> + <source>The entered address is invalid.</source> + <translation>The entered address is invalid.</translation> + </message> + <message> + <source>Please check the address and try again.</source> + <translation>Please check the address and try again.</translation> + </message> + <message> + <source>The entered address does not refer to a key.</source> + <translation>The entered address does not refer to a key.</translation> + </message> + <message> + <source>Wallet unlock was cancelled.</source> + <translation>Wallet unlock was cancelled.</translation> + </message> + <message> + <source>Private key for the entered address is not available.</source> + <translation>Private key for the entered address is not available.</translation> + </message> + <message> + <source>Message signing failed.</source> + <translation>Message signing failed.</translation> + </message> + <message> + <source>Message signed.</source> + <translation>Message signed.</translation> + </message> + <message> + <source>The signature could not be decoded.</source> + <translation>The signature could not be decoded.</translation> + </message> + <message> + <source>Please check the signature and try again.</source> + <translation>Please check the signature and try again.</translation> + </message> + <message> + <source>The signature did not match the message digest.</source> + <translation>The signature did not match the message digest.</translation> + </message> + <message> + <source>Message verification failed.</source> + <translation>Message verification failed.</translation> + </message> + <message> + <source>Message verified.</source> + <translation>Message verified.</translation> + </message> +</context> +<context> + <name>SplashScreen</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>The Bitcoin Core developers</source> + <translation>The Bitcoin Core developers</translation> + </message> + <message> + <source>[testnet]</source> + <translation>[testnet]</translation> + </message> +</context> +<context> + <name>TrafficGraphWidget</name> + <message> + <source>KB/s</source> + <translation>KB/s</translation> + </message> +</context> +<context> + <name>TransactionDesc</name> + <message> + <source>Open until %1</source> + <translation>Open until %1</translation> + </message> + <message> + <source>conflicted</source> + <translation>conflicted</translation> + </message> + <message> + <source>%1/offline</source> + <translation>%1/offline</translation> + </message> + <message> + <source>%1/unconfirmed</source> + <translation>%1/unconfirmed</translation> + </message> + <message> + <source>%1 confirmations</source> + <translation>%1 confirmations</translation> + </message> + <message> + <source>Status</source> + <translation>Status</translation> + </message> + <message numerus="yes"> + <source>, broadcast through %n node(s)</source> + <translation><numerusform>, broadcast through %n node</numerusform><numerusform>, broadcast through %n nodes</numerusform></translation> + </message> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Source</source> + <translation>Source</translation> + </message> + <message> + <source>Generated</source> + <translation>Generated</translation> + </message> + <message> + <source>From</source> + <translation>From</translation> + </message> + <message> + <source>To</source> + <translation>To</translation> + </message> + <message> + <source>own address</source> + <translation>own address</translation> + </message> + <message> + <source>watch-only</source> + <translation>watch-only</translation> + </message> + <message> + <source>label</source> + <translation>label</translation> + </message> + <message> + <source>Credit</source> + <translation>Credit</translation> + </message> + <message numerus="yes"> + <source>matures in %n more block(s)</source> + <translation><numerusform>matures in %n more block</numerusform><numerusform>matures in %n more blocks</numerusform></translation> + </message> + <message> + <source>not accepted</source> + <translation>not accepted</translation> + </message> + <message> + <source>Debit</source> + <translation>Debit</translation> + </message> + <message> + <source>Total debit</source> + <translation>Total debit</translation> + </message> + <message> + <source>Total credit</source> + <translation>Total credit</translation> + </message> + <message> + <source>Transaction fee</source> + <translation>Transaction fee</translation> + </message> + <message> + <source>Net amount</source> + <translation>Net amount</translation> + </message> + <message> + <source>Message</source> + <translation>Message</translation> + </message> + <message> + <source>Comment</source> + <translation>Comment</translation> + </message> + <message> + <source>Transaction ID</source> + <translation>Transaction ID</translation> + </message> + <message> + <source>Merchant</source> + <translation>Merchant</translation> + </message> + <message> + <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source> + <translation>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</translation> + </message> + <message> + <source>Debug information</source> + <translation>Debug information</translation> + </message> + <message> + <source>Transaction</source> + <translation>Transaction</translation> + </message> + <message> + <source>Inputs</source> + <translation>Inputs</translation> + </message> + <message> + <source>Amount</source> + <translation>Amount</translation> + </message> + <message> + <source>true</source> + <translation>true</translation> + </message> + <message> + <source>false</source> + <translation>false</translation> + </message> + <message> + <source>, has not been successfully broadcast yet</source> + <translation>, has not been successfully broadcast yet</translation> + </message> + <message numerus="yes"> + <source>Open for %n more block(s)</source> + <translation><numerusform>Open for %n more block</numerusform><numerusform>Open for %n more blocks</numerusform></translation> + </message> + <message> + <source>unknown</source> + <translation>unknown</translation> + </message> +</context> +<context> + <name>TransactionDescDialog</name> + <message> + <source>Transaction details</source> + <translation>Transaction details</translation> + </message> + <message> + <source>This pane shows a detailed description of the transaction</source> + <translation>This pane shows a detailed description of the transaction</translation> + </message> +</context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Type</source> + <translation>Type</translation> + </message> + <message> + <source>Immature (%1 confirmations, will be available after %2)</source> + <translation>Immature (%1 confirmations, will be available after %2)</translation> + </message> + <message numerus="yes"> + <source>Open for %n more block(s)</source> + <translation><numerusform>Open for %n more block</numerusform><numerusform>Open for %n more blocks</numerusform></translation> + </message> + <message> + <source>Open until %1</source> + <translation>Open until %1</translation> + </message> + <message> + <source>Confirmed (%1 confirmations)</source> + <translation>Confirmed (%1 confirmations)</translation> + </message> + <message> + <source>This block was not received by any other nodes and will probably not be accepted!</source> + <translation>This block was not received by any other nodes and will probably not be accepted!</translation> + </message> + <message> + <source>Generated but not accepted</source> + <translation>Generated but not accepted</translation> + </message> + <message> + <source>Offline</source> + <translation>Offline</translation> + </message> + <message> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <source>Unconfirmed</source> + <translation>Unconfirmed</translation> + </message> + <message> + <source>Confirming (%1 of %2 recommended confirmations)</source> + <translation>Confirming (%1 of %2 recommended confirmations)</translation> + </message> + <message> + <source>Conflicted</source> + <translation>Conflicted</translation> + </message> + <message> + <source>Received with</source> + <translation>Received with</translation> + </message> + <message> + <source>Received from</source> + <translation>Received from</translation> + </message> + <message> + <source>Sent to</source> + <translation>Sent to</translation> + </message> + <message> + <source>Payment to yourself</source> + <translation>Payment to yourself</translation> + </message> + <message> + <source>Mined</source> + <translation>Mined</translation> + </message> + <message> + <source>watch-only</source> + <translation>watch-only</translation> + </message> + <message> + <source>(n/a)</source> + <translation>(n/a)</translation> + </message> + <message> + <source>Transaction status. Hover over this field to show number of confirmations.</source> + <translation>Transaction status. Hover over this field to show number of confirmations.</translation> + </message> + <message> + <source>Date and time that the transaction was received.</source> + <translation>Date and time that the transaction was received.</translation> + </message> + <message> + <source>Type of transaction.</source> + <translation>Type of transaction.</translation> + </message> + <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Whether or not a watch-only address is involved in this transaction.</translation> + </message> + <message> + <source>User-defined intent/purpose of the transaction.</source> + <translation>User-defined intent/purpose of the transaction.</translation> + </message> + <message> + <source>Amount removed from or added to balance.</source> + <translation>Amount removed from or added to balance.</translation> + </message> +</context> +<context> + <name>TransactionView</name> + <message> + <source>All</source> + <translation>All</translation> + </message> + <message> + <source>Today</source> + <translation>Today</translation> + </message> + <message> + <source>This week</source> + <translation>This week</translation> + </message> + <message> + <source>This month</source> + <translation>This month</translation> + </message> + <message> + <source>Last month</source> + <translation>Last month</translation> + </message> + <message> + <source>This year</source> + <translation>This year</translation> + </message> + <message> + <source>Range...</source> + <translation>Range...</translation> + </message> + <message> + <source>Received with</source> + <translation>Received with</translation> + </message> + <message> + <source>Sent to</source> + <translation>Sent to</translation> + </message> + <message> + <source>To yourself</source> + <translation>To yourself</translation> + </message> + <message> + <source>Mined</source> + <translation>Mined</translation> + </message> + <message> + <source>Other</source> + <translation>Other</translation> + </message> + <message> + <source>Enter address or label to search</source> + <translation>Enter address or label to search</translation> + </message> + <message> + <source>Min amount</source> + <translation>Min amount</translation> + </message> + <message> + <source>Copy address</source> + <translation>Copy address</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copy label</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copy amount</translation> + </message> + <message> + <source>Copy transaction ID</source> + <translation>Copy transaction ID</translation> + </message> + <message> + <source>Copy raw transaction</source> + <translation>Copy raw transaction</translation> + </message> + <message> + <source>Edit label</source> + <translation>Edit label</translation> + </message> + <message> + <source>Show transaction details</source> + <translation>Show transaction details</translation> + </message> + <message> + <source>Export Transaction History</source> + <translation>Export Transaction History</translation> + </message> + <message> + <source>Watch-only</source> + <translation>Watch-only</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Exporting Failed</translation> + </message> + <message> + <source>There was an error trying to save the transaction history to %1.</source> + <translation>There was an error trying to save the transaction history to %1.</translation> + </message> + <message> + <source>Exporting Successful</source> + <translation>Exporting Successful</translation> + </message> + <message> + <source>The transaction history was successfully saved to %1.</source> + <translation>The transaction history was successfully saved to %1.</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Comma separated file (*.csv)</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Confirmed</translation> + </message> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Type</source> + <translation>Type</translation> + </message> + <message> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <source>Address</source> + <translation>Address</translation> + </message> + <message> + <source>ID</source> + <translation>ID</translation> + </message> + <message> + <source>Range:</source> + <translation>Range:</translation> + </message> + <message> + <source>to</source> + <translation>to</translation> + </message> +</context> +<context> + <name>UnitDisplayStatusBarControl</name> + <message> + <source>Unit to show amounts in. Click to select another unit.</source> + <translation>Unit to show amounts in. Click to select another unit.</translation> + </message> +</context> +<context> + <name>WalletFrame</name> + <message> + <source>No wallet has been loaded.</source> + <translation>No wallet has been loaded.</translation> + </message> +</context> +<context> + <name>WalletModel</name> + <message> + <source>Send Coins</source> + <translation>Send Coins</translation> + </message> +</context> +<context> + <name>WalletView</name> + <message> + <source>&Export</source> + <translation>&Export</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Export the data in the current tab to a file</translation> + </message> + <message> + <source>Backup Wallet</source> + <translation>Backup Wallet</translation> + </message> + <message> + <source>Wallet Data (*.dat)</source> + <translation>Wallet Data (*.dat)</translation> + </message> + <message> + <source>Backup Failed</source> + <translation>Backup Failed</translation> + </message> + <message> + <source>There was an error trying to save the wallet data to %1.</source> + <translation>There was an error trying to save the wallet data to %1.</translation> + </message> + <message> + <source>The wallet data was successfully saved to %1.</source> + <translation>The wallet data was successfully saved to %1.</translation> + </message> + <message> + <source>Backup Successful</source> + <translation>Backup Successful</translation> + </message> +</context> +<context> + <name>bitcoin-core</name> + <message> + <source>Options:</source> + <translation>Options:</translation> + </message> + <message> + <source>Specify data directory</source> + <translation>Specify data directory</translation> + </message> + <message> + <source>Connect to a node to retrieve peer addresses, and disconnect</source> + <translation>Connect to a node to retrieve peer addresses, and disconnect</translation> + </message> + <message> + <source>Specify your own public address</source> + <translation>Specify your own public address</translation> + </message> + <message> + <source>Accept command line and JSON-RPC commands</source> + <translation>Accept command line and JSON-RPC commands</translation> + </message> + <message> + <source>If <category> is not supplied or if <category> = 1, output all debugging information.</source> + <translation>If <category> is not supplied or if <category> = 1, output all debugging information.</translation> + </message> + <message> + <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source> + <translation>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</translation> + </message> + <message> + <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> + <translation>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</translation> + </message> + <message> + <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source> + <translation>Prune configured below the minimum of %d MiB. Please use a higher number.</translation> + </message> + <message> + <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source> + <translation>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</translation> + </message> + <message> + <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, >%u = target size in MiB to use for block files)</source> + <translation>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, >%u = target size in MiB to use for block files)</translation> + </message> + <message> + <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source> + <translation>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</translation> + </message> + <message> + <source>Error: A fatal internal error occurred, see debug.log for details</source> + <translation>Error: A fatal internal error occurred, see debug.log for details</translation> + </message> + <message> + <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source> + <translation>Fee (in %s/kB) to add to transactions you send (default: %s)</translation> + </message> + <message> + <source>Pruning blockstore...</source> + <translation>Pruning blockstore...</translation> + </message> + <message> + <source>Run in the background as a daemon and accept commands</source> + <translation>Run in the background as a daemon and accept commands</translation> + </message> + <message> + <source>Unable to start HTTP server. See debug log for details.</source> + <translation>Unable to start HTTP server. See debug log for details.</translation> + </message> + <message> + <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source> + <translation>Accept connections from outside (default: 1 if no -proxy or -connect)</translation> + </message> + <message> + <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> + <translation>Bind to given address and always listen on it. Use [host]:port notation for IPv6</translation> + </message> + <message> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</translation> + </message> + <message> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</translation> + </message> + <message> + <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source> + <translation>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</translation> + </message> + <message> + <source>Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)</source> + <translation>Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)</translation> + </message> + <message> + <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source> + <translation>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</translation> + </message> + <message> + <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> + <translation>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</translation> + </message> + <message> + <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source> + <translation>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</translation> + </message> + <message> + <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source> + <translation>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</translation> + </message> + <message> + <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source> + <translation>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</translation> + </message> + <message> + <source>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</source> + <translation>WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)</translation> + </message> + <message> + <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source> + <translation>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</translation> + </message> + <message> + <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source> + <translation>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</translation> + </message> + <message> + <source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source> + <translation>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</translation> + </message> + <message> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</translation> + </message> + <message> + <source>-maxmempool must be at least %d MB</source> + <translation>-maxmempool must be at least %d MB</translation> + </message> + <message> + <source><category> can be:</source> + <translation><category> can be:</translation> + </message> + <message> + <source>Block creation options:</source> + <translation>Block creation options:</translation> + </message> + <message> + <source>Connect only to the specified node(s)</source> + <translation>Connect only to the specified node(s)</translation> + </message> + <message> + <source>Connection options:</source> + <translation>Connection options:</translation> + </message> + <message> + <source>Corrupted block database detected</source> + <translation>Corrupted block database detected</translation> + </message> + <message> + <source>Debugging/Testing options:</source> + <translation>Debugging/Testing options:</translation> + </message> + <message> + <source>Do not load the wallet and disable wallet RPC calls</source> + <translation>Do not load the wallet and disable wallet RPC calls</translation> + </message> + <message> + <source>Do you want to rebuild the block database now?</source> + <translation>Do you want to rebuild the block database now?</translation> + </message> + <message> + <source>Enable publish hash block in <address></source> + <translation>Enable publish hash block in <address></translation> + </message> + <message> + <source>Enable publish hash transaction in <address></source> + <translation>Enable publish hash transaction in <address></translation> + </message> + <message> + <source>Enable publish raw block in <address></source> + <translation>Enable publish raw block in <address></translation> + </message> + <message> + <source>Enable publish raw transaction in <address></source> + <translation>Enable publish raw transaction in <address></translation> + </message> + <message> + <source>Error initializing block database</source> + <translation>Error initialising block database</translation> + </message> + <message> + <source>Error initializing wallet database environment %s!</source> + <translation>Error initialising wallet database environment %s!</translation> + </message> + <message> + <source>Error loading block database</source> + <translation>Error loading block database</translation> + </message> + <message> + <source>Error opening block database</source> + <translation>Error opening block database</translation> + </message> + <message> + <source>Error: Disk space is low!</source> + <translation>Error: Disk space is low!</translation> + </message> + <message> + <source>Failed to listen on any port. Use -listen=0 if you want this.</source> + <translation>Failed to listen on any port. Use -listen=0 if you want this.</translation> + </message> + <message> + <source>Importing...</source> + <translation>Importing...</translation> + </message> + <message> + <source>Incorrect or no genesis block found. Wrong datadir for network?</source> + <translation>Incorrect or no genesis block found. Wrong datadir for network?</translation> + </message> + <message> + <source>Invalid -onion address: '%s'</source> + <translation>Invalid -onion address: '%s'</translation> + </message> + <message> + <source>Keep the transaction memory pool below <n> megabytes (default: %u)</source> + <translation>Keep the transaction memory pool below <n> megabytes (default: %u)</translation> + </message> + <message> + <source>Not enough file descriptors available.</source> + <translation>Not enough file descriptors available.</translation> + </message> + <message> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</translation> + </message> + <message> + <source>Prune cannot be configured with a negative value.</source> + <translation>Prune cannot be configured with a negative value.</translation> + </message> + <message> + <source>Prune mode is incompatible with -txindex.</source> + <translation>Prune mode is incompatible with -txindex.</translation> + </message> + <message> + <source>Set database cache size in megabytes (%d to %d, default: %d)</source> + <translation>Set database cache size in megabytes (%d to %d, default: %d)</translation> + </message> + <message> + <source>Set maximum block size in bytes (default: %d)</source> + <translation>Set maximum block size in bytes (default: %d)</translation> + </message> + <message> + <source>Specify wallet file (within data directory)</source> + <translation>Specify wallet file (within data directory)</translation> + </message> + <message> + <source>Unsupported argument -benchmark ignored, use -debug=bench.</source> + <translation>Unsupported argument -benchmark ignored, use -debug=bench.</translation> + </message> + <message> + <source>Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>Unsupported argument -debugnet ignored, use -debug=net.</translation> + </message> + <message> + <source>Unsupported argument -tor found, use -onion.</source> + <translation>Unsupported argument -tor found, use -onion.</translation> + </message> + <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Use UPnP to map the listening port (default: %u)</translation> + </message> + <message> + <source>User Agent comment (%s) contains unsafe characters.</source> + <translation>User Agent comment (%s) contains unsafe characters.</translation> + </message> + <message> + <source>Verifying blocks...</source> + <translation>Verifying blocks...</translation> + </message> + <message> + <source>Verifying wallet...</source> + <translation>Verifying wallet...</translation> + </message> + <message> + <source>Wallet %s resides outside data directory %s</source> + <translation>Wallet %s resides outside data directory %s</translation> + </message> + <message> + <source>Wallet options:</source> + <translation>Wallet options:</translation> + </message> + <message> + <source>Warning: This version is obsolete; upgrade required!</source> + <translation>Warning: This version is obsolete; upgrade required!</translation> + </message> + <message> + <source>You need to rebuild the database using -reindex to change -txindex</source> + <translation>You need to rebuild the database using -reindex to change -txindex</translation> + </message> + <message> + <source>Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source> + <translation>Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</translation> + </message> + <message> + <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source> + <translation>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</translation> + </message> + <message> + <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source> + <translation>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</translation> + </message> + <message> + <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> + <translation>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</translation> + </message> + <message> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</translation> + </message> + <message> + <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source> + <translation>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</translation> + </message> + <message> + <source>Error: Listening for incoming connections failed (listen returned error %s)</source> + <translation>Error: Listening for incoming connections failed (listen returned error %s)</translation> + </message> + <message> + <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> + <translation>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</translation> + </message> + <message> + <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source> + <translation>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source> + <translation>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</translation> + </message> + <message> + <source>Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source> + <translation>Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</translation> + </message> + <message> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Maximum size of data in data carrier transactions we relay and mine (default: %u)</translation> + </message> + <message> + <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> + <translation>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</translation> + </message> + <message> + <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source> + <translation>Randomise credentials for every proxy connection. This enables Tor stream isolation (default: %u)</translation> + </message> + <message> + <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> + <translation>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</translation> + </message> + <message> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</translation> + </message> + <message> + <source>The transaction amount is too small to send after the fee has been deducted</source> + <translation>The transaction amount is too small to send after the fee has been deducted</translation> + </message> + <message> + <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> + <translation>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</translation> + </message> + <message> + <source>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</source> + <translation>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</translation> + </message> + <message> + <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source> + <translation>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</translation> + </message> + <message> + <source>(default: %u)</source> + <translation>(default: %u)</translation> + </message> + <message> + <source>Accept public REST requests (default: %u)</source> + <translation>Accept public REST requests (default: %u)</translation> + </message> + <message> + <source>Activating best chain...</source> + <translation>Activating best chain...</translation> + </message> + <message> + <source>Always relay transactions received from whitelisted peers (default: %d)</source> + <translation>Always relay transactions received from whitelisted peers (default: %d)</translation> + </message> + <message> + <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> + <translation>Attempt to recover private keys from a corrupt wallet.dat on startup</translation> + </message> + <message> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>Automatically create Tor hidden service (default: %d)</translation> + </message> + <message> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Cannot resolve -whitebind address: '%s'</translation> + </message> + <message> + <source>Connect through SOCKS5 proxy</source> + <translation>Connect through SOCKS5 proxy</translation> + </message> + <message> + <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> + <translation>Copyright (C) 2009-%i The Bitcoin Core Developers</translation> + </message> + <message> + <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source> + <translation>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</translation> + </message> + <message> + <source>Error reading from database, shutting down.</source> + <translation>Error reading from database, shutting down.</translation> + </message> + <message> + <source>Imports blocks from external blk000??.dat file on startup</source> + <translation>Imports blocks from external blk000??.dat file on startup</translation> + </message> + <message> + <source>Information</source> + <translation>Information</translation> + </message> + <message> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>Initialisation sanity check failed. Bitcoin Core is shutting down.</translation> + </message> + <message> + <source>Invalid amount for -maxtxfee=<amount>: '%s'</source> + <translation>Invalid amount for -maxtxfee=<amount>: '%s'</translation> + </message> + <message> + <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> + <translation>Invalid amount for -minrelaytxfee=<amount>: '%s'</translation> + </message> + <message> + <source>Invalid amount for -mintxfee=<amount>: '%s'</source> + <translation>Invalid amount for -mintxfee=<amount>: '%s'</translation> + </message> + <message> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</translation> + </message> + <message> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>Invalid netmask specified in -whitelist: '%s'</translation> + </message> + <message> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Keep at most <n> unconnectable transactions in memory (default: %u)</translation> + </message> + <message> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>Need to specify a port with -whitebind: '%s'</translation> + </message> + <message> + <source>Node relay options:</source> + <translation>Node relay options:</translation> + </message> + <message> + <source>RPC server options:</source> + <translation>RPC server options:</translation> + </message> + <message> + <source>Rebuild block chain index from current blk000??.dat files on startup</source> + <translation>Rebuild block chain index from current blk000??.dat files on startup</translation> + </message> + <message> + <source>Receive and display P2P network alerts (default: %u)</source> + <translation>Receive and display P2P network alerts (default: %u)</translation> + </message> + <message> + <source>Reducing -maxconnections from %d to %d, because of system limitations.</source> + <translation>Reducing -maxconnections from %d to %d, because of system limitations.</translation> + </message> + <message> + <source>Rescan the block chain for missing wallet transactions on startup</source> + <translation>Rescan the block chain for missing wallet transactions on startup</translation> + </message> + <message> + <source>Send trace/debug info to console instead of debug.log file</source> + <translation>Send trace/debug info to console instead of debug.log file</translation> + </message> + <message> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Send transactions as zero-fee transactions if possible (default: %u)</translation> + </message> + <message> + <source>Show all debugging options (usage: --help -help-debug)</source> + <translation>Show all debugging options (usage: --help -help-debug)</translation> + </message> + <message> + <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> + <translation>Shrink debug.log file on client startup (default: 1 when no -debug)</translation> + </message> + <message> + <source>Signing transaction failed</source> + <translation>Signing transaction failed</translation> + </message> + <message> + <source>The transaction amount is too small to pay the fee</source> + <translation>The transaction amount is too small to pay the fee</translation> + </message> + <message> + <source>This is experimental software.</source> + <translation>This is experimental software.</translation> + </message> + <message> + <source>Tor control port password (default: empty)</source> + <translation>Tor control port password (default: empty)</translation> + </message> + <message> + <source>Tor control port to use if onion listening enabled (default: %s)</source> + <translation>Tor control port to use if onion listening enabled (default: %s)</translation> + </message> + <message> + <source>Transaction amount too small</source> + <translation>Transaction amount too small</translation> + </message> + <message> + <source>Transaction amounts must be positive</source> + <translation>Transaction amounts must be positive</translation> + </message> + <message> + <source>Transaction too large for fee policy</source> + <translation>Transaction too large for fee policy</translation> + </message> + <message> + <source>Transaction too large</source> + <translation>Transaction too large</translation> + </message> + <message> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>Unable to bind to %s on this computer (bind returned error %s)</translation> + </message> + <message> + <source>Upgrade wallet to latest format on startup</source> + <translation>Upgrade wallet to latest format on startup</translation> + </message> + <message> + <source>Username for JSON-RPC connections</source> + <translation>Username for JSON-RPC connections</translation> + </message> + <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Wallet needed to be rewritten: restart Bitcoin Core to complete</translation> + </message> + <message> + <source>Warning</source> + <translation>Warning</translation> + </message> + <message> + <source>Whether to operate in a blocks only mode (default: %u)</source> + <translation>Whether to operate in a blocks only mode (default: %u)</translation> + </message> + <message> + <source>Zapping all transactions from wallet...</source> + <translation>Zapping all transactions from wallet...</translation> + </message> + <message> + <source>ZeroMQ notification options:</source> + <translation>ZeroMQ notification options:</translation> + </message> + <message> + <source>wallet.dat corrupt, salvage failed</source> + <translation>wallet.dat corrupt, salvage failed</translation> + </message> + <message> + <source>Password for JSON-RPC connections</source> + <translation>Password for JSON-RPC connections</translation> + </message> + <message> + <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source> + <translation>Execute command when the best block changes (%s in cmd is replaced by block hash)</translation> + </message> + <message> + <source>This help message</source> + <translation>This help message</translation> + </message> + <message> + <source>Allow DNS lookups for -addnode, -seednode and -connect</source> + <translation>Allow DNS lookups for -addnode, -seednode and -connect</translation> + </message> + <message> + <source>Loading addresses...</source> + <translation>Loading addresses...</translation> + </message> + <message> + <source>Error loading wallet.dat: Wallet corrupted</source> + <translation>Error loading wallet.dat: Wallet corrupted</translation> + </message> + <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</translation> + </message> + <message> + <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source> + <translation>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</translation> + </message> + <message> + <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> + <translation>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</translation> + </message> + <message> + <source>Do not keep transactions in the mempool longer than <n> hours (default: %u)</source> + <translation>Do not keep transactions in the mempool longer than <n> hours (default: %u)</translation> + </message> + <message> + <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source> + <translation>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>How thorough the block verification of -checkblocks is (0-4, default: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Output debugging information (default: %u, supplying <category> is optional)</translation> + </message> + <message> + <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source> + <translation>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</translation> + </message> + <message> + <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source> + <translation>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</translation> + </message> + <message> + <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source> + <translation>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(default: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Always query for peer addresses via DNS lookup (default: %u)</translation> + </message> + <message> + <source>Error loading wallet.dat</source> + <translation>Error loading wallet.dat</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Generate coins (default: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>How many blocks to check at startup (default: %u, 0 = all)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Include IP addresses in debug output (default: %u)</translation> + </message> + <message> + <source>Invalid -proxy address: '%s'</source> + <translation>Invalid -proxy address: '%s'</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Listen for connections on <port> (default: %u or testnet: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Maintain at most <n> connections to peers (default: %u)</translation> + </message> + <message> + <source>Make the wallet broadcast transactions</source> + <translation>Make the wallet broadcast transactions</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Prepend debug output with timestamp (default: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Relay and mine data carrier transactions (default: %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Relay non-P2SH multisig (default: %u)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Set key pool size to <n> (default: %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Set minimum block size in bytes (default: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Set the number of threads to service RPC calls (default: %d)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Specify configuration file (default: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Specify connection timeout in milliseconds (minimum: 1, default: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Specify pid file (default: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Spend unconfirmed change when sending transactions (default: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Threshold for disconnecting misbehaving peers (default: %u)</translation> + </message> + <message> + <source>Unknown network specified in -onlynet: '%s'</source> + <translation>Unknown network specified in -onlynet: '%s'</translation> + </message> + <message> + <source>Cannot resolve -bind address: '%s'</source> + <translation>Cannot resolve -bind address: '%s'</translation> + </message> + <message> + <source>Cannot resolve -externalip address: '%s'</source> + <translation>Cannot resolve -externalip address: '%s'</translation> + </message> + <message> + <source>Invalid amount for -paytxfee=<amount>: '%s'</source> + <translation>Invalid amount for -paytxfee=<amount>: '%s'</translation> + </message> + <message> + <source>Insufficient funds</source> + <translation>Insufficient funds</translation> + </message> + <message> + <source>Loading block index...</source> + <translation>Loading block index...</translation> + </message> + <message> + <source>Add a node to connect to and attempt to keep the connection open</source> + <translation>Add a node to connect to and attempt to keep the connection open</translation> + </message> + <message> + <source>Loading wallet...</source> + <translation>Loading wallet...</translation> + </message> + <message> + <source>Cannot downgrade wallet</source> + <translation>Cannot downgrade wallet</translation> + </message> + <message> + <source>Cannot write default address</source> + <translation>Cannot write default address</translation> + </message> + <message> + <source>Rescanning...</source> + <translation>Rescanning...</translation> + </message> + <message> + <source>Done loading</source> + <translation>Done loading</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> +</context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_eo.ts b/src/qt/locale/bitcoin_eo.ts index 4bd64f68d1..c17e477654 100644 --- a/src/qt/locale/bitcoin_eo.ts +++ b/src/qt/locale/bitcoin_eo.ts @@ -2210,10 +2210,6 @@ <translation>Plenumi komandon kiam rilata alerto riceviĝas, aŭ kiam ni vidas tre longan forkon (%s en cms anstataŭiĝas per mesaĝo)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Elekti dosierujon por datumoj dum lanĉo (defaŭlte: 0)</translation> - </message> - <message> <source>Information</source> <translation>Informoj</translation> </message> @@ -2230,14 +2226,6 @@ <translation>Sendi spurajn/sencimigajn informojn al la konzolo anstataŭ al dosiero debug.log</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Agordi lingvon, ekzemple "de_DE" (defaŭlte: tiu de la sistemo)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Montri salutŝildon dum lanĉo (defaŭlte: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Malpligrandigi la sencimigan protokol-dosieron kiam kliento lanĉiĝas (defaŭlte: 1 kiam mankas -debug)</translation> </message> @@ -2246,10 +2234,6 @@ <translation>Subskriba transakcio fiaskis</translation> </message> <message> - <source>Start minimized</source> - <translation>Lanĉiĝi plejete</translation> - </message> - <message> <source>This is experimental software.</source> <translation>ĝi estas eksperimenta programo</translation> </message> diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts index ec8261173b..bb7fcb1095 100644 --- a/src/qt/locale/bitcoin_es.ts +++ b/src/qt/locale/bitcoin_es.ts @@ -2911,8 +2911,8 @@ <translation>Poner en lista blanca a los equipos que se conecten desde la máscara de subred o dirección IP especificada. Se puede especificar múltiples veces.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(predeterminado: 1)</translation> + <source>-maxmempool must be at least %d MB</source> + <translation>-maxmempool debe ser por lo menos de %d MB</translation> </message> <message> <source><category> can be:</source> @@ -3127,12 +3127,12 @@ <translation>Intento de recuperar claves privadas de un wallet.dat corrupto</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>No se puede resolver -whitebind address: '%s'</translation> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>Automáticamente crea el servicio Tor oculto (por defecto: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Elegir directorio de datos al iniciar (predeterminado: 0)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>No se puede resolver -whitebind address: '%s'</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3219,22 +3219,10 @@ <translation>Mandar transacciones como comisión-cero si es posible (por defecto: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Establecer los certificados raíz SSL para solicitudes de pago (predeterminado: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Muestra todas las opciones de depuración (uso: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostrar pantalla de bienvenida en el inicio (predeterminado: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Reducir el archivo debug.log al iniciar el cliente (predeterminado: 1 sin -debug)</translation> </message> @@ -3243,10 +3231,6 @@ <translation>Transacción falló</translation> </message> <message> - <source>Start minimized</source> - <translation>Arrancar minimizado</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Cantidad de la transacción demasiado pequeña para pagar la comisión</translation> </message> @@ -3271,10 +3255,6 @@ <translation>Transacción demasiado grande</translation> </message> <message> - <source>UI Options:</source> - <translation>Opciones de interfaz de usuario</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>No es posible conectar con %s en este sistema (bind ha dado el error %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts index df17411ab5..c303007b7a 100644 --- a/src/qt/locale/bitcoin_es_CL.ts +++ b/src/qt/locale/bitcoin_es_CL.ts @@ -1313,11 +1313,6 @@ <translation>Enviar informacion de seguimiento a la consola en vez del archivo debug.log</translation> </message> <message> - <source>Start minimized</source> - <translation>Arranca minimizado -</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>Usuario para las conexiones JSON-RPC </translation> diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts index c67d642de7..60347070df 100644 --- a/src/qt/locale/bitcoin_es_DO.ts +++ b/src/qt/locale/bitcoin_es_DO.ts @@ -2221,10 +2221,6 @@ <translation>Establecer tamaño máximo de las transacciones de alta prioridad/comisión baja en bytes (por defecto: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Elegir directorio de datos al iniciar (predeterminado: 0)</translation> - </message> - <message> <source>Information</source> <translation>Información</translation> </message> @@ -2245,18 +2241,10 @@ <translation>Enviar información de trazas/depuración a la consola en lugar de al archivo debug.log</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostrar todas las opciones de depuración (uso: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostrar pantalla de bienvenida en el inicio (predeterminado: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Reducir el archivo debug.log al iniciar el cliente (predeterminado: 1 sin -debug)</translation> </message> @@ -2265,10 +2253,6 @@ <translation>Transacción falló</translation> </message> <message> - <source>Start minimized</source> - <translation>Arrancar minimizado</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Monto de la transacción muy pequeño</translation> </message> diff --git a/src/qt/locale/bitcoin_es_ES.ts b/src/qt/locale/bitcoin_es_ES.ts new file mode 100644 index 0000000000..b19387d9ed --- /dev/null +++ b/src/qt/locale/bitcoin_es_ES.ts @@ -0,0 +1,469 @@ +<TS language="es_ES" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Right-click to edit address or label</source> + <translation>Haz clic derecho para editar la dirección o la etiqueta</translation> + </message> + <message> + <source>Create a new address</source> + <translation>Crea una nueva direccióon</translation> + </message> + <message> + <source>&New</source> + <translation>&Nuevo</translation> + </message> + <message> + <source>Copy the currently selected address to the system clipboard</source> + <translation>Copia la direccón seleccionada al portapapeles del sistema</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Copiar</translation> + </message> + <message> + <source>C&lose</source> + <translation>C&errar</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>&Copiar Direccón</translation> + </message> + <message> + <source>Delete the currently selected address from the list</source> + <translation>Elimina la dirección seleccionada de la lista</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Exporta los datos de la pestaña actual a un archivo</translation> + </message> + <message> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Eliminar</translation> + </message> + <message> + <source>Choose the address to send coins to</source> + <translation>Elige la dirección a la que enviar las monedas</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Elige la direccón con la que recibir monedas</translation> + </message> + <message> + <source>C&hoose</source> + <translation>E&legir</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Enviando direcciones</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Recibiendo direcciones</translation> + </message> + <message> + <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> + <translation>Estas son tus direcciones de Bitcoin para enviar pagos. Comprueba siempre la cantidad y la dirección receptora antes de enviar monedas.</translation> + </message> + <message> + <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> + <translation>Estas son tus direcciones de Bitcoin para recibir pagos. Se recomienda usar una nueva dirección receptora para cada transacción</translation> + </message> + <message> + <source>Copy &Label</source> + <translation>Copiar &Etiqueta</translation> + </message> + <message> + <source>&Edit</source> + <translation>&Editar</translation> + </message> + <message> + <source>Export Address List</source> + <translation>Exportar Lista de Direcciones</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Archivo separado por comas (*.csv)</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Exportacón Fallida</translation> + </message> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>Ha ocurrido un error intentando guardar la lista de direcciones en %1. Por favor intentalo de nuevo.</translation> + </message> +</context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <source>Address</source> + <translation>Dirección</translation> + </message> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> +</context> +<context> + <name>AskPassphraseDialog</name> + <message> + <source>Passphrase Dialog</source> + <translation>Dialogo de Contraseña</translation> + </message> + <message> + <source>Enter passphrase</source> + <translation>Introduzca la contraseña</translation> + </message> + <message> + <source>New passphrase</source> + <translation>Nueva contraseña</translation> + </message> + <message> + <source>Repeat new passphrase</source> + <translation>Repite la nueva contraseña</translation> + </message> + <message> + <source>Encrypt wallet</source> + <translation>Encriptar cartera</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to unlock the wallet.</source> + <translation>Esta operacón necesita tu contraseña de la cartera para desbloquear la cartera.</translation> + </message> + <message> + <source>Unlock wallet</source> + <translation>Desbloquear cartera</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to decrypt the wallet.</source> + <translation>Esta operación requiere tu contraseña de la cartera para desencriptar la cartera.</translation> + </message> + <message> + <source>Decrypt wallet</source> + <translation>Desencriptar cartera</translation> + </message> + <message> + <source>Change passphrase</source> + <translation>Cambiar contraseña</translation> + </message> + <message> + <source>Confirm wallet encryption</source> + <translation>Confirmar encriptación de la cartera</translation> + </message> + <message> + <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> + <translation>Advertencia: Si encriptas tu cartera y pierdes tu contraseña, <b>PERDERÁS TODOS TUS BITCOINS</B></translation> + </message> + <message> + <source>Are you sure you wish to encrypt your wallet?</source> + <translation>Estás seguro ue deseas encriptar tu cartera?</translation> + </message> + <message> + <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source> + <translation>Bitcoin Core se cerrará ahora para finalizar el proceso de encriptación. Recuerda que encriptar tu cartera no protege completamente tus bitcoins de ser robados por malware infectando tu ordenador.</translation> + </message> + <message> + <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source> + <translation>IMPORTANTE: Cualquier copia de seguridad anterior del archivo de tu cartera debería ser remplazado con el nuevo archivo encriptado. Por motivos de seguridad, las copias de seguridad anteriores de la cartera desencriptada quedaran inusables tan pronto como empieces a usar la nueva cartera encriptada.</translation> + </message> + <message> + <source>Warning: The Caps Lock key is on!</source> + <translation>Advertencia: La Tecla de Bloqueo de Mayusculas esta activada!</translation> + </message> + <message> + <source>Wallet encrypted</source> + <translation>Cartera encriptada</translation> + </message> + <message> + <source>Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>.</source> + <translation>Introduzca la nueva contraseña de la cartera. <br/>Por favor utilice una contraseña de <b>diez o mas caracteres aleatorios</b>, o <b>ocho o mas palabras</b>.</translation> + </message> + <message> + <source>Enter the old passphrase and new passphrase to the wallet.</source> + <translation>Introduzca la antigua contraseña y la nueva contraseña en la cartera.</translation> + </message> + <message> + <source>Wallet encryption failed</source> + <translation>Encriptación de la cartera fallida</translation> + </message> + <message> + <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source> + <translation>La encriptación de la cartera ha fallado debido a un error interno. Tu cartera no ha sido encriptada.</translation> + </message> + <message> + <source>The supplied passphrases do not match.</source> + <translation>Las contraseñas proporcianadas no se corresponden.</translation> + </message> + <message> + <source>Wallet unlock failed</source> + <translation>Desbloqueo de la cartera fallido</translation> + </message> + <message> + <source>The passphrase entered for the wallet decryption was incorrect.</source> + <translation>La contraseña introducida para desencriptar la cartera es incorrecta.</translation> + </message> + <message> + <source>Wallet decryption failed</source> + <translation>Desencriptación de la cartera fallida</translation> + </message> + <message> + <source>Wallet passphrase was successfully changed.</source> + <translation>Contraseña de la cartera cambiada correctamente</translation> + </message> +</context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Sign &message...</source> + <translation>Firmar &mensaje...</translation> + </message> + <message> + <source>Synchronizing with network...</source> + <translation>Sincronizando con la red...</translation> + </message> + <message> + <source>&Overview</source> + <translation>&Vista general</translation> + </message> + <message> + <source>Node</source> + <translation>Nodo</translation> + </message> + <message> + <source>Show general overview of wallet</source> + <translation>Mostrar vista general de la cartera</translation> + </message> + <message> + <source>&Transactions</source> + <translation>&Transacciones</translation> + </message> + <message> + <source>Browse transaction history</source> + <translation>Navegar historial de transacciones</translation> + </message> + <message> + <source>E&xit</source> + <translation>S&alir</translation> + </message> + <message> + <source>Quit application</source> + <translation>Salir de la aplicación</translation> + </message> + <message> + <source>About &Qt</source> + <translation>Acerca de &Qt</translation> + </message> + <message> + <source>Show information about Qt</source> + <translation>Muestra información acerca de Qt</translation> + </message> + <message> + <source>&Options...</source> + <translation>&Opciones...</translation> + </message> + <message> + <source>&Encrypt Wallet...</source> + <translation>&Encriptar Cartera...</translation> + </message> + <message> + <source>&Backup Wallet...</source> + <translation>&Hacer copia de seguridad de la cartera...</translation> + </message> + <message> + <source>&Change Passphrase...</source> + <translation>&Cambiar contraseña...</translation> + </message> + <message> + <source>&Sending addresses...</source> + <translation>&Enviando direcciones...</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>&Recibiendo direcciones..</translation> + </message> + <message> + <source>Open &URI...</source> + <translation>Abrir &URI...</translation> + </message> + <message> + <source>Bitcoin Core client</source> + <translation>Cliente Bitcoin Core</translation> + </message> + <message> + <source>Importing blocks from disk...</source> + <translation>Importando bloques desde disco...</translation> + </message> + <message> + <source>Reindexing blocks on disk...</source> + <translation>Reindexando bloques en el disco...</translation> + </message> + <message> + <source>Send coins to a Bitcoin address</source> + <translation>Envia monedas a una dirección Bitcoin</translation> + </message> + <message> + <source>Backup wallet to another location</source> + <translation>Crea una copia de seguridad de tu cartera en otra ubicación</translation> + </message> + </context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> + </context> +<context> + <name>EditAddressDialog</name> + </context> +<context> + <name>FreespaceChecker</name> + </context> +<context> + <name>HelpMessageDialog</name> + </context> +<context> + <name>Intro</name> + </context> +<context> + <name>OpenURIDialog</name> + </context> +<context> + <name>OptionsDialog</name> + </context> +<context> + <name>OverviewPage</name> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + </context> +<context> + <name>ReceiveCoinsDialog</name> + </context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>Address</source> + <translation>Dirección</translation> + </message> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + </context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + </context> +<context> + <name>TransactionDescDialog</name> + </context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>Exporting Failed</source> + <translation>Exportacón Fallida</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Archivo separado por comas (*.csv)</translation> + </message> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <source>Address</source> + <translation>Dirección</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + <message> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Exporta los datos de la pestaña actual a un archivo</translation> + </message> + </context> +<context> + <name>bitcoin-core</name> + </context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts index 1075fb08bb..e9a80e2f5f 100644 --- a/src/qt/locale/bitcoin_es_MX.ts +++ b/src/qt/locale/bitcoin_es_MX.ts @@ -1062,22 +1062,6 @@ <translation>Opciones de cartera:</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Escojer el directorio de información al iniciar (por defecto : 0)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Definir idioma, por ejemplo "de_DE" (por defecto: Sistema local)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostrar pantalla de arraque al iniciar (por defecto: 1)</translation> - </message> - <message> - <source>Start minimized</source> - <translation>Iniciar minimizado</translation> - </message> - <message> <source>Loading addresses...</source> <translation>Cargando direcciones...</translation> </message> diff --git a/src/qt/locale/bitcoin_es_VE.ts b/src/qt/locale/bitcoin_es_VE.ts new file mode 100644 index 0000000000..f9db056553 --- /dev/null +++ b/src/qt/locale/bitcoin_es_VE.ts @@ -0,0 +1,1077 @@ +<TS language="es_VE" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Right-click to edit address or label</source> + <translation>Click derecho para editar la dirección o etiqueta</translation> + </message> + <message> + <source>Create a new address</source> + <translation>Crear una nueva dirección</translation> + </message> + <message> + <source>&New</source> + <translation>&Nuevo</translation> + </message> + <message> + <source>Copy the currently selected address to the system clipboard</source> + <translation>Copie las direcciones seleccionadas actualmente al portapapeles del sistema</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Copiar</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>&Copiar Dirección</translation> + </message> + <message> + <source>Delete the currently selected address from the list</source> + <translation>Borrar las direcciones seleccionadas recientemente de la lista</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Exportar los datos en la pestaña actual a un archivo</translation> + </message> + <message> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Borrar</translation> + </message> + <message> + <source>Choose the address to send coins to</source> + <translation>Elige la dirección para enviar monedas</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Elige la dirección para recibir monedas</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Envío de direcciones</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Recepción de direcciones</translation> + </message> + <message> + <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> + <translation>Estas son tus direcciones Bitcoin para realizar pagos. Siempre checa el monto y la dirección de recepción antes de enviar monedas.</translation> + </message> + <message> + <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> + <translation>Estas son tus direcciones Bitcoin para recibir pagos. Es recomendable usar una nueva dirección para cada transacción.</translation> + </message> + <message> + <source>Copy &Label</source> + <translation>Copiar &Etiqueta</translation> + </message> + <message> + <source>&Edit</source> + <translation>&Editar</translation> + </message> + <message> + <source>Export Address List</source> + <translation>Exportar lista de direcciones</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Archivo separado por comas (*.csv)</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Exportación fallida</translation> + </message> + </context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <source>Address</source> + <translation>Dirección</translation> + </message> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> +</context> +<context> + <name>AskPassphraseDialog</name> + <message> + <source>Passphrase Dialog</source> + <translation>Diálogo contraseña</translation> + </message> + <message> + <source>Enter passphrase</source> + <translation>Ingresa frase de contraseña</translation> + </message> + <message> + <source>New passphrase</source> + <translation>Nueva frase de contraseña</translation> + </message> + <message> + <source>Repeat new passphrase</source> + <translation>Repetir nueva frase de contraseña</translation> + </message> + <message> + <source>Encrypt wallet</source> + <translation>Encriptar billetera</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to unlock the wallet.</source> + <translation>Esta operación necesita tu frase de contraseña de la billetera para desbloquearla.</translation> + </message> + <message> + <source>Unlock wallet</source> + <translation>Desbloquear billetera</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to decrypt the wallet.</source> + <translation>Esta operacción necesita tu frase de contraseña para desepcriptar la billetera</translation> + </message> + <message> + <source>Decrypt wallet</source> + <translation>Desencriptar billetera</translation> + </message> + <message> + <source>Change passphrase</source> + <translation>Cambiar frase secreta</translation> + </message> + <message> + <source>Confirm wallet encryption</source> + <translation>Confirmar encriptación de billetera</translation> + </message> + <message> + <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> + <translation>Aviso: Si encriptas tu billetera y pierdes tu frase secreta, ¡PERDERÁS TODOS TUS BITCOINS!</translation> + </message> + <message> + <source>Are you sure you wish to encrypt your wallet?</source> + <translation>¿Está seguro que desea encriptar su billetera?</translation> + </message> + <message> + <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source> + <translation>IMPORTANTE: Algunas copias de seguridad que hayas hecho de tu archivo de billetera deberían ser reemplazadas con la billetera encriptada generada recientemente. Por razones de seguridad, las copias de seguridad previas del archivo de billetera sin cifrar serán inútiles tan pronto uses la nueva billetera encriptada.</translation> + </message> + <message> + <source>Warning: The Caps Lock key is on!</source> + <translation>Aviso: El bloqueo de mayúsculas está activado.</translation> + </message> + <message> + <source>Wallet encrypted</source> + <translation>Billetera encriptada</translation> + </message> + <message> + <source>Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>.</source> + <translation>Introduce la nueva frase secreta a la billetera. Por favor use una frase secreta de diez o más caracteres aleatorios, u ocho o más palabras.</translation> + </message> + <message> + <source>Wallet encryption failed</source> + <translation>Encriptación de billetera fallida</translation> + </message> + <message> + <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source> + <translation>Encriptación de billetera fallida debido a un error interno. Tu billetera no fue encriptada.</translation> + </message> + <message> + <source>The supplied passphrases do not match.</source> + <translation>Las frases secretas introducidas no concuerdan.</translation> + </message> + <message> + <source>Wallet unlock failed</source> + <translation>Desbloqueo de billetera fallido</translation> + </message> + <message> + <source>The passphrase entered for the wallet decryption was incorrect.</source> + <translation>La frase secreta introducida para la desencriptación de la billetera fué incorrecta.</translation> + </message> + <message> + <source>Wallet decryption failed</source> + <translation>Desencriptación de billetera fallida</translation> + </message> + <message> + <source>Wallet passphrase was successfully changed.</source> + <translation>La frase secreta de la billetera fué cambiada exitosamente.</translation> + </message> +</context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Sign &message...</source> + <translation>Firmar &mensaje...</translation> + </message> + <message> + <source>Synchronizing with network...</source> + <translation>Sincronizando con la red...</translation> + </message> + <message> + <source>Node</source> + <translation>Nodo</translation> + </message> + <message> + <source>Show general overview of wallet</source> + <translation>Mostrar visión general de la billetera</translation> + </message> + <message> + <source>&Transactions</source> + <translation>&Transacciones</translation> + </message> + <message> + <source>Browse transaction history</source> + <translation>Buscar historial de transacciones</translation> + </message> + <message> + <source>Quit application</source> + <translation>Quitar aplicación</translation> + </message> + <message> + <source>Bitcoin Core client</source> + <translation>Cliente Bitcoin Core</translation> + </message> + <message> + <source>Importing blocks from disk...</source> + <translation>Importando bloques desde el disco...</translation> + </message> + <message> + <source>Reindexing blocks on disk...</source> + <translation>Reindexando bloques en el disco...</translation> + </message> + <message> + <source>Send coins to a Bitcoin address</source> + <translation>Enviar monedas a una dirección Bitcoin</translation> + </message> + <message> + <source>Backup wallet to another location</source> + <translation>Respaldar billetera en otra ubicación</translation> + </message> + <message> + <source>Change the passphrase used for wallet encryption</source> + <translation>Cambiar frase secreta usada para la encriptación de la billetera</translation> + </message> + <message> + <source>Open debugging and diagnostic console</source> + <translation>Abre la consola de depuración y diágnostico</translation> + </message> + <message> + <source>Bitcoin</source> + <translation>Bitcoin</translation> + </message> + <message> + <source>Wallet</source> + <translation>Billetera</translation> + </message> + <message> + <source>&Send</source> + <translation>&Enviar</translation> + </message> + <message> + <source>&Receive</source> + <translation>&Recibir</translation> + </message> + <message> + <source>Show information about Bitcoin Core</source> + <translation>Mostrar información acerca de Bitcoin Core</translation> + </message> + <message> + <source>&Show / Hide</source> + <translation>&Mostar / Ocultar</translation> + </message> + <message> + <source>Show or hide the main Window</source> + <translation>Mostar u ocultar la ventana principal</translation> + </message> + <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>Encriptar las llaves privadas que pertenecen a tu billetera</translation> + </message> + <message> + <source>Sign messages with your Bitcoin addresses to prove you own them</source> + <translation>Firma mensajes con tus direcciones Bitcoin para probar que eres dueño de ellas</translation> + </message> + <message> + <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source> + <translation>Verificar mensajes para asegurar que estaban firmados con direcciones Bitcoin especificas</translation> + </message> + <message> + <source>&File</source> + <translation>&Archivo</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Configuración</translation> + </message> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>%1 and %2</source> + <translation>%1 y %2</translation> + </message> + <message> + <source>%1 behind</source> + <translation>%1 detrás</translation> + </message> + <message> + <source>Last received block was generated %1 ago.</source> + <translation>El último bloque recibido fue generado hace %1 hora(s).</translation> + </message> + <message> + <source>Transactions after this will not yet be visible.</source> + <translation>Transacciones después de esta no serán visibles todavía.</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> + <message> + <source>Warning</source> + <translation>Advertencia</translation> + </message> + <message> + <source>Information</source> + <translation>Información</translation> + </message> + <message> + <source>Up to date</source> + <translation>Al día</translation> + </message> + <message> + <source>Catching up...</source> + <translation>Alcanzando...</translation> + </message> + <message> + <source>Sent transaction</source> + <translation>Transacción enviada</translation> + </message> + <message> + <source>Incoming transaction</source> + <translation>Transacción entrante</translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>unlocked</b></source> + <translation>La billetera está encriptada y desbloqueada recientemente</translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>locked</b></source> + <translation>La billetera está encriptada y bloqueada recientemente</translation> + </message> +</context> +<context> + <name>ClientModel</name> + <message> + <source>Network Alert</source> + <translation>Alerta de red</translation> + </message> +</context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Coin Selection</source> + <translation>Selección de moneda</translation> + </message> + <message> + <source>Quantity:</source> + <translation>Cantidad:</translation> + </message> + <message> + <source>Bytes:</source> + <translation>Bytes:</translation> + </message> + <message> + <source>Amount:</source> + <translation>Monto:</translation> + </message> + <message> + <source>Priority:</source> + <translation>Prioridad:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Comisión:</translation> + </message> + <message> + <source>Dust:</source> + <translation>Polvo:</translation> + </message> + <message> + <source>Change:</source> + <translation>Cambio:</translation> + </message> + <message> + <source>(un)select all</source> + <translation>(de)seleccionar todo</translation> + </message> + <message> + <source>Tree mode</source> + <translation>Modo de árbol</translation> + </message> + <message> + <source>List mode</source> + <translation>Modo de lista</translation> + </message> + <message> + <source>Amount</source> + <translation>Monto</translation> + </message> + <message> + <source>Received with label</source> + <translation>Recibido con etiqueta</translation> + </message> + <message> + <source>Received with address</source> + <translation>Recibido con dirección</translation> + </message> + <message> + <source>Date</source> + <translation>Fecha</translation> + </message> + <message> + <source>Confirmations</source> + <translation>Confirmaciones</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Confirmado</translation> + </message> + <message> + <source>Priority</source> + <translation>Prioridad</translation> + </message> + <message> + <source>Copy address</source> + <translation>Copiar dirección</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copiar etiqueta</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copiar monto</translation> + </message> + <message> + <source>Copy transaction ID</source> + <translation>Copiar ID de la transacción</translation> + </message> + <message> + <source>Lock unspent</source> + <translation>Bloqueo no gastado</translation> + </message> + <message> + <source>Unlock unspent</source> + <translation>Desbloqueo no gastado</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Copiar cantidad</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Copiar comisión</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Copiar bytes</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Copiar prioridad</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Copiar dust</translation> + </message> + <message> + <source>Copy change</source> + <translation>Copiar cambio</translation> + </message> + <message> + <source>highest</source> + <translation>Más alto</translation> + </message> + <message> + <source>higher</source> + <translation>superior</translation> + </message> + <message> + <source>high</source> + <translation>alto</translation> + </message> + <message> + <source>medium-high</source> + <translation>medio-alto</translation> + </message> + <message> + <source>medium</source> + <translation>medio</translation> + </message> + <message> + <source>low-medium</source> + <translation>bajo-medio</translation> + </message> + <message> + <source>low</source> + <translation>bajo</translation> + </message> + <message> + <source>lower</source> + <translation>inferior</translation> + </message> + <message> + <source>lowest</source> + <translation>más bajo</translation> + </message> + <message> + <source>(%1 locked)</source> + <translation>(%1 bloqueado)</translation> + </message> + <message> + <source>none</source> + <translation>ninguno</translation> + </message> + <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Puede variar +/- %1 satoshi(s) por entrada.</translation> + </message> + <message> + <source>yes</source> + <translation>si</translation> + </message> + <message> + <source>no</source> + <translation>no</translation> + </message> + <message> + <source>This means a fee of at least %1 per kB is required.</source> + <translation>Esto significa que se requiere al menos de una comisión de %1 por kB</translation> + </message> + <message> + <source>Can vary +/- 1 byte per input.</source> + <translation>Puede variar +/- 1 byte por entrada.</translation> + </message> + <message> + <source>Transactions with higher priority are more likely to get included into a block.</source> + <translation>Transacciones con mayor prioridad son más probables de ser incluidas en un bloque.</translation> + </message> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> + <message> + <source>change from %1 (%2)</source> + <translation>Cambio desde %1 (%2)</translation> + </message> + <message> + <source>(change)</source> + <translation>(cambio)</translation> + </message> +</context> +<context> + <name>EditAddressDialog</name> + <message> + <source>Edit Address</source> + <translation>Editar dirección</translation> + </message> + <message> + <source>&Label</source> + <translation>&Etiqueta</translation> + </message> + <message> + <source>The label associated with this address list entry</source> + <translation>La etiqueta asociada con esta entrada de la lista de direcciones</translation> + </message> + <message> + <source>The address associated with this address list entry. This can only be modified for sending addresses.</source> + <translation>La dirección asociada con esta entrada de la lista de direcciones. Esta puede ser modificada solo para el envío de direcciones.</translation> + </message> + <message> + <source>&Address</source> + <translation>&Dirección</translation> + </message> + <message> + <source>New receiving address</source> + <translation>Nueva dirección de recibo</translation> + </message> + <message> + <source>New sending address</source> + <translation>Nueva dirección de envío</translation> + </message> + <message> + <source>Edit receiving address</source> + <translation>Editar dirección de envío</translation> + </message> + <message> + <source>Edit sending address</source> + <translation>Editar dirección de envío</translation> + </message> + <message> + <source>The entered address "%1" is already in the address book.</source> + <translation>La dirección introducida "%1" ya está en el libro de direcciones.</translation> + </message> + <message> + <source>The entered address "%1" is not a valid Bitcoin address.</source> + <translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation> + </message> + <message> + <source>Could not unlock wallet.</source> + <translation>No se pudo desbloquear la billetera.</translation> + </message> + <message> + <source>New key generation failed.</source> + <translation>Creación de la nueva llave fallida</translation> + </message> +</context> +<context> + <name>FreespaceChecker</name> + <message> + <source>A new data directory will be created.</source> + <translation>Un nuevo directorio de datos será creado.</translation> + </message> + <message> + <source>name</source> + <translation>nombre</translation> + </message> + <message> + <source>Directory already exists. Add %1 if you intend to create a new directory here.</source> + <translation>El directorio ya existe. Agrega %1 si tiene la intención de crear un nuevo directorio aquí.</translation> + </message> + <message> + <source>Path already exists, and is not a directory.</source> + <translation>La ruta ya existe, y no es un directorio.</translation> + </message> + <message> + <source>Cannot create data directory here.</source> + <translation>No puede crear directorio de datos aquí.</translation> + </message> +</context> +<context> + <name>HelpMessageDialog</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>version</source> + <translation>versión</translation> + </message> + <message> + <source>(%1-bit)</source> + <translation>(%1-bit)</translation> + </message> + <message> + <source>About Bitcoin Core</source> + <translation>Acerca de Bitcoin Core</translation> + </message> + <message> + <source>Command-line options</source> + <translation>Opciones de línea de comandos</translation> + </message> + <message> + <source>Usage:</source> + <translation>Uso:</translation> + </message> + <message> + <source>command-line options</source> + <translation>opciones de línea de comandos</translation> + </message> +</context> +<context> + <name>Intro</name> + <message> + <source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source> + <translation>Bitcoin Core descargará y almacenará una copia de la cadena de bloques Bitcoin. Al menos %1GB de datos serán almacenados en este directorio, y crecerá con el tiempo. La billetera será también almacenada en este directorio.</translation> + </message> + <message> + <source>Use the default data directory</source> + <translation>Usar el directorio de datos por defecto</translation> + </message> + <message> + <source>Use a custom data directory:</source> + <translation>Usa un directorio de datos personalizado:</translation> + </message> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>Error: Directorio de datos especificado "%1" no puede ser creado.</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> + </context> +<context> + <name>OpenURIDialog</name> + <message> + <source>Open URI</source> + <translation>Abrir URI</translation> + </message> + <message> + <source>Open payment request from URI or file</source> + <translation>Abrir solicitud de pago desde URI o archivo</translation> + </message> + <message> + <source>URI:</source> + <translation>URI:</translation> + </message> + <message> + <source>Select payment request file</source> + <translation>Seleccionar archivo de solicitud de pago</translation> + </message> + <message> + <source>Select payment request file to open</source> + <translation>Seleccionar archivo de solicitud de pago para abrir</translation> + </message> +</context> +<context> + <name>OptionsDialog</name> + <message> + <source>Options</source> + <translation>Opciones</translation> + </message> + <message> + <source>&Main</source> + <translation>&Main</translation> + </message> + <message> + <source>none</source> + <translation>ninguno</translation> + </message> + </context> +<context> + <name>OverviewPage</name> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + <message> + <source>Amount</source> + <translation>Monto</translation> + </message> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + </context> +<context> + <name>ReceiveCoinsDialog</name> + <message> + <source>Copy label</source> + <translation>Copiar etiqueta</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copiar monto</translation> + </message> +</context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>Address</source> + <translation>Dirección</translation> + </message> + <message> + <source>Amount</source> + <translation>Monto</translation> + </message> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>Fecha</translation> + </message> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <source>Amount</source> + <translation>Monto</translation> + </message> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>Quantity:</source> + <translation>Cantidad:</translation> + </message> + <message> + <source>Bytes:</source> + <translation>Bytes:</translation> + </message> + <message> + <source>Amount:</source> + <translation>Monto:</translation> + </message> + <message> + <source>Priority:</source> + <translation>Prioridad:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Comisión:</translation> + </message> + <message> + <source>Change:</source> + <translation>Cambio:</translation> + </message> + <message> + <source>Dust:</source> + <translation>Polvo:</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Copiar cantidad</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copiar monto</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Copiar comisión</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Copiar bytes</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Copiar prioridad</translation> + </message> + <message> + <source>Copy change</source> + <translation>Copiar cambio</translation> + </message> + <message> + <source>(no label)</source> + <translation>(sin etiqueta)</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Copiar dust</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + </context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + <message> + <source>Date</source> + <translation>Fecha</translation> + </message> + <message> + <source>Amount</source> + <translation>Monto</translation> + </message> + </context> +<context> + <name>TransactionDescDialog</name> + </context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>Fecha</translation> + </message> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>Copy address</source> + <translation>Copiar dirección</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copiar etiqueta</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copiar monto</translation> + </message> + <message> + <source>Copy transaction ID</source> + <translation>Copiar ID de la transacción</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Exportación fallida</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Archivo separado por comas (*.csv)</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Confirmado</translation> + </message> + <message> + <source>Date</source> + <translation>Fecha</translation> + </message> + <message> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <source>Address</source> + <translation>Dirección</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + <message> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Exportar los datos en la pestaña actual a un archivo</translation> + </message> + <message> + <source>Backup Failed</source> + <translation>Copia de seguridad fallida</translation> + </message> + <message> + <source>Backup Successful</source> + <translation>Copia de seguridad completada</translation> + </message> +</context> +<context> + <name>bitcoin-core</name> + <message> + <source>Options:</source> + <translation>Opciones:</translation> + </message> + <message> + <source>Specify data directory</source> + <translation>Especifique directorio de datos</translation> + </message> + <message> + <source>Connect to a node to retrieve peer addresses, and disconnect</source> + <translation>Conecte un nodo para recuperar direcciones pares, y desconecte</translation> + </message> + <message> + <source>Specify your own public address</source> + <translation>Especifique su propia dirección pública</translation> + </message> + <message> + <source>Accept command line and JSON-RPC commands</source> + <translation>Aceptar linea de comando y comandos JSON-RPC</translation> + </message> + <message> + <source>Run in the background as a daemon and accept commands</source> + <translation>Correr en segundo plano como daemon y aceptar comandos</translation> + </message> + <message> + <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> + <translation>Enlazar dirección dada y siempre escuchar en ella. Usar [host]:port notación para IPv6</translation> + </message> + <message> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>Borrar todas las transacciones de la billetera y solo recuperar aquellas partes de la cadena de bloques a través de -rescan en el inicio del sistema.</translation> + </message> + <message> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation>Distribuido bajo la licensia de software MIT, ver el archivo adjunto COPYING o <http://www.opensource.org/licenses/mit-license.php>.</translation> + </message> + <message> + <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source> + <translation>Ejecutar comando cuando una transacción de la billetera cambia (%s en cmd es reemplazado por TxID)</translation> + </message> + <message> + <source>Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)</source> + <translation>Fija el número de verificación de hilos de script (%u a %d, 0 = auto, <0 = leave that many cores free, default: %d)</translation> + </message> + <message> + <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> + <translation>Esta es una compilación de prueba pre-lanzamiento - use bajo su propio riesgo - no utilizar para aplicaciones de minería o mercantes</translation> + </message> + <message> + <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source> + <translation>Deshabilitar para enlezar a %s en esta computadora. Bitcoin Core probablemente ya está ejecutándose.</translation> + </message> + <message> + <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source> + <translation>Aviso: ¡La red no parece estar totalmente de acuerdo! Algunos mineros parecen estar teniendo inconvenientes.</translation> + </message> + <message> + <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source> + <translation>Aviso: ¡No parecen estar totalmente de acuerdo con nuestros compañeros! Puede que tengas que actualizar, u otros nodos tengan que actualizarce.</translation> + </message> + <message> + <source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source> + <translation>Aviso: wallet.dat está corrupto, ¡datos salvados! wallet.dat original guardado como wallet.{timestamp}.bak en %s; si tus transacciones o balance está incorrecto deberías restaurarlo desde una copia de seguridad.</translation> + </message> + <message> + <source>Information</source> + <translation>Información</translation> + </message> + <message> + <source>Warning</source> + <translation>Advertencia</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> +</context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts index 9279834af3..1d6d1b89e5 100644 --- a/src/qt/locale/bitcoin_et.ts +++ b/src/qt/locale/bitcoin_et.ts @@ -1744,14 +1744,6 @@ <translation>Saada jälitus/debug, debug.log faili asemel, konsooli</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Keele valik, nt "ee_ET" (vaikeväärtus: system locale)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Käivitamisel teabeakna kuvamine (vaikeväärtus: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Kahanda programmi käivitamisel debug.log faili (vaikeväärtus: 1, kui ei ole -debug)</translation> </message> @@ -1760,10 +1752,6 @@ <translation>Tehingu allkirjastamine ebaõnnestus</translation> </message> <message> - <source>Start minimized</source> - <translation>Käivitu tegumiribale</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Tehingu summa on tasu maksmiseks liiga väikene</translation> </message> @@ -1776,10 +1764,6 @@ <translation>Tehing liiga suur</translation> </message> <message> - <source>UI Options:</source> - <translation>UI Valikud:</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>JSON-RPC ühenduste kasutajatunnus</translation> </message> diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts index fb4e25dfb8..3ef9766604 100644 --- a/src/qt/locale/bitcoin_fa.ts +++ b/src/qt/locale/bitcoin_fa.ts @@ -1926,10 +1926,6 @@ <translation>در حال بازبینی کیف پول...</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>انتخاب مسیر دادهها در ابتدای اجرای برنامه (پیشفرض: 0)</translation> - </message> - <message> <source>Information</source> <translation>اطلاعات</translation> </message> @@ -1938,26 +1934,10 @@ <translation>اطلاعات ردگیری/اشکالزدایی را به جای فایل لاگ اشکالزدایی به کنسول بفرستید</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>زبان را تنظیم کنید؛ برای مثال «de_DE» (زبان پیشفرض محلی)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>نمایش پنجرهٔ خوشامدگویی در ابتدای اجرای برنامه (پیشفرض: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>فایل debug.log را در startup مشتری کوچک کن (پیش فرض:1 اگر اشکال زدایی روی نداد)</translation> </message> <message> - <source>Start minimized</source> - <translation>اجرای برنامه به صورت کوچکشده</translation> - </message> - <message> - <source>UI Options:</source> - <translation>گزینههای رابط کاربری:</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>JSON-RPC شناسه برای ارتباطات</translation> </message> diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts index 7026fff1f5..71ea96644b 100644 --- a/src/qt/locale/bitcoin_fi.ts +++ b/src/qt/locale/bitcoin_fi.ts @@ -2772,10 +2772,6 @@ <translation>Varoitus: wallet.dat -lompakkotiedosto on korruptoitunut, tiedot pelastettu. Alkuperäinen wallet.dat -lompakkotiedosto on tallennettu wallet.{timestamp}.bak kansioon %s; jos balanssisi tai siirtohistoria on virheellinen, sinun tulisi palauttaa lompakkotiedosto varmuuskopiosta.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(oletus: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> voi olla:</translation> </message> @@ -2928,10 +2924,6 @@ <translation>-whitebind -osoitetta '%s' ei voida jäsentää</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Valitse data-hakemisto käynnistyksessä (oletus: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Yhdistä SOCKS5 proxin kautta</translation> </message> @@ -2976,22 +2968,10 @@ <translation>Lähetä jäljitys/debug-tieto konsoliin, debug.log-tiedoston sijaan</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Aseta SSL root varmenne maksupyynnöille (oletus: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Set language, for example "de_DE" (default: system locale)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Näytä kaikki debuggaus valinnat: (käyttö: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Näytä aloitusruutu käynnistettäessä (oletus: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Pienennä debug.log tiedosto käynnistyksen yhteydessä (vakioasetus: 1 kun ei -debug)</translation> </message> @@ -3000,10 +2980,6 @@ <translation>Siirron vahvistus epäonnistui</translation> </message> <message> - <source>Start minimized</source> - <translation>Käynnistä pienennettynä</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Tämä on ohjelmistoa kokeelliseen käyttöön.</translation> </message> @@ -3020,10 +2996,6 @@ <translation>Siirtosumma liian iso</translation> </message> <message> - <source>UI Options:</source> - <translation>Ulkoasun asetukset:</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>Käyttäjätunnus JSON-RPC-yhteyksille</translation> </message> diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts index 97dccdac06..d43e08cf9d 100644 --- a/src/qt/locale/bitcoin_fr.ts +++ b/src/qt/locale/bitcoin_fr.ts @@ -2836,10 +2836,6 @@ <translation>Pairs de la liste blanche se connectant à partir du masque réseau ou de l'IP donné. Peut être spécifié plusieurs fois.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(par défaut : 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> peut être :</translation> </message> @@ -3056,10 +3052,6 @@ <translation>Impossible de résoudre l'adresse -whitebind : « %s »</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Choisir un répertoire de données au démarrage (par défaut : 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Se connecter par un mandataire SOCKS5</translation> </message> @@ -3136,22 +3128,10 @@ <translation>Envoyer si possible les transactions comme étant sans frais (par défaut : %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Définir les certificats racine SSL pour les demandes de paiement (par défaut : -système-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Définir la langue, par exemple « fr_CA » (par défaut : la langue du système)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Montrer toutes les options de débogage (utilisation : --help --help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Afficher la page de garde au démarrage (par défaut : 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Réduire le fichier debug.log lors du démarrage du client (par défaut : 1 lorsque -debug n'est pas présent)</translation> </message> @@ -3160,10 +3140,6 @@ <translation>La signature de la transaction a échoué</translation> </message> <message> - <source>Start minimized</source> - <translation>Démarrer minimisé</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Le montant de la transaction est trop bas pour que les frais soient payés</translation> </message> @@ -3188,10 +3164,6 @@ <translation>Transaction trop volumineuse</translation> </message> <message> - <source>UI Options:</source> - <translation>Options de l'IU :</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Impossible de se lier à %s sur cet ordinateur (bind a retourné l'erreur %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_fr_FR.ts b/src/qt/locale/bitcoin_fr_FR.ts new file mode 100644 index 0000000000..c55b08b646 --- /dev/null +++ b/src/qt/locale/bitcoin_fr_FR.ts @@ -0,0 +1,877 @@ +<TS language="fr_FR" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Create a new address</source> + <translation>Créer une nouvelle adresse</translation> + </message> + <message> + <source>Copy the currently selected address to the system clipboard</source> + <translation>Copier l'adresse surlignée dans votre presse-papiers</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Exporter les données de l'onglet courant vers un fichier</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Supprimer</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Valeurs séparées par des virgules (*.csv)</translation> + </message> + </context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Étiquette</translation> + </message> + <message> + <source>Address</source> + <translation>Adresse</translation> + </message> + <message> + <source>(no label)</source> + <translation>(aucune étiquette)</translation> + </message> +</context> +<context> + <name>AskPassphraseDialog</name> + <message> + <source>Enter passphrase</source> + <translation>Entrez la phrase de passe</translation> + </message> + <message> + <source>New passphrase</source> + <translation>Nouvelle phrase de passe</translation> + </message> + <message> + <source>Repeat new passphrase</source> + <translation>Répétez la phrase de passe</translation> + </message> + <message> + <source>Encrypt wallet</source> + <translation>Chiffrer le porte-monnaie</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to unlock the wallet.</source> + <translation>Cette opération nécessite votre phrase de passe pour déverrouiller le porte-monnaie.</translation> + </message> + <message> + <source>Unlock wallet</source> + <translation>Déverrouiller le porte-monnaie</translation> + </message> + <message> + <source>This operation needs your wallet passphrase to decrypt the wallet.</source> + <translation>Cette opération nécessite votre phrase de passe pour décrypter le porte-monnaie.</translation> + </message> + <message> + <source>Decrypt wallet</source> + <translation>Décrypter le porte-monnaie</translation> + </message> + <message> + <source>Change passphrase</source> + <translation>Changer la phrase de passe</translation> + </message> + <message> + <source>Confirm wallet encryption</source> + <translation>Confirmer le chiffrement du porte-monnaie</translation> + </message> + <message> + <source>Wallet encrypted</source> + <translation>Porte-monnaie chiffré</translation> + </message> + <message> + <source>Wallet encryption failed</source> + <translation>Le chiffrement du porte-monnaie a échoué</translation> + </message> + <message> + <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source> + <translation>Le chiffrement du porte-monnaie a échoué en raison d'une erreur interne. Votre porte-monnaie n'a pas été chiffré.</translation> + </message> + <message> + <source>The supplied passphrases do not match.</source> + <translation>Les phrases de passe entrées ne correspondent pas.</translation> + </message> + <message> + <source>Wallet unlock failed</source> + <translation>Le déverrouillage du porte-monnaie a échoué</translation> + </message> + <message> + <source>The passphrase entered for the wallet decryption was incorrect.</source> + <translation>La phrase de passe entrée pour décrypter le porte-monnaie était erronée.</translation> + </message> + <message> + <source>Wallet decryption failed</source> + <translation>Le décryptage du porte-monnaie a échoué</translation> + </message> + </context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Synchronizing with network...</source> + <translation>Synchronisation avec le réseau...</translation> + </message> + <message> + <source>&Overview</source> + <translation>&Vue d'ensemble</translation> + </message> + <message> + <source>Show general overview of wallet</source> + <translation>Affiche une vue d'ensemble du porte-monnaie</translation> + </message> + <message> + <source>&Transactions</source> + <translation>&Transactions</translation> + </message> + <message> + <source>Browse transaction history</source> + <translation>Permet de parcourir l'historique des transactions</translation> + </message> + <message> + <source>E&xit</source> + <translation>Qui&tter</translation> + </message> + <message> + <source>Quit application</source> + <translation>Quitter l'application</translation> + </message> + <message> + <source>About &Qt</source> + <translation>À propos de &Qt</translation> + </message> + <message> + <source>Show information about Qt</source> + <translation>Afficher des informations sur Qt</translation> + </message> + <message> + <source>&Options...</source> + <translation>&Options...</translation> + </message> + <message> + <source>Backup wallet to another location</source> + <translation>Sauvegarder le porte-monnaie à un autre emplacement</translation> + </message> + <message> + <source>Change the passphrase used for wallet encryption</source> + <translation>Modifier la phrase de passe utilisée pour le cryptage du porte-monnaie</translation> + </message> + <message> + <source>Bitcoin</source> + <translation>Bitcoin</translation> + </message> + <message> + <source>&Send</source> + <translation>&Envoyer</translation> + </message> + <message> + <source>&File</source> + <translation>&Fichier</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Réglages</translation> + </message> + <message> + <source>&Help</source> + <translation>&Aide</translation> + </message> + <message> + <source>Tabs toolbar</source> + <translation>Barre d'outils des onglets</translation> + </message> + <message> + <source>Up to date</source> + <translation>À jour</translation> + </message> + <message> + <source>Catching up...</source> + <translation>Rattrapage...</translation> + </message> + <message> + <source>Sent transaction</source> + <translation>Transaction envoyée</translation> + </message> + <message> + <source>Incoming transaction</source> + <translation>Transaction entrante</translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>unlocked</b></source> + <translation>Le porte-monnaie est <b>chiffré</b> et est actuellement <b>déverrouillé</b></translation> + </message> + <message> + <source>Wallet is <b>encrypted</b> and currently <b>locked</b></source> + <translation>Le porte-monnaie est <b>chiffré</b> et est actuellement <b>verrouillé</b></translation> + </message> +</context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Amount:</source> + <translation>Montant :</translation> + </message> + <message> + <source>Amount</source> + <translation>Montant</translation> + </message> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Confirmée</translation> + </message> + <message> + <source>Copy address</source> + <translation>Copier l'adresse</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copier l'étiquette</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copier le montant</translation> + </message> + <message> + <source>(no label)</source> + <translation>(aucune étiquette)</translation> + </message> + </context> +<context> + <name>EditAddressDialog</name> + <message> + <source>Edit Address</source> + <translation>Éditer l'adresse</translation> + </message> + <message> + <source>&Label</source> + <translation>&Étiquette</translation> + </message> + <message> + <source>&Address</source> + <translation>&Adresse</translation> + </message> + <message> + <source>New receiving address</source> + <translation>Nouvelle adresse de réception</translation> + </message> + <message> + <source>New sending address</source> + <translation>Nouvelle adresse d'envoi</translation> + </message> + <message> + <source>Edit receiving address</source> + <translation>Éditer l'adresse de réception</translation> + </message> + <message> + <source>Edit sending address</source> + <translation>Éditer l'adresse d'envoi</translation> + </message> + <message> + <source>The entered address "%1" is already in the address book.</source> + <translation>L'adresse fournie « %1 » est déjà présente dans le carnet d'adresses.</translation> + </message> + <message> + <source>Could not unlock wallet.</source> + <translation>Impossible de déverrouiller le porte-monnaie.</translation> + </message> + <message> + <source>New key generation failed.</source> + <translation>Échec de la génération de la nouvelle clef.</translation> + </message> +</context> +<context> + <name>FreespaceChecker</name> + </context> +<context> + <name>HelpMessageDialog</name> + <message> + <source>Usage:</source> + <translation>Utilisation :</translation> + </message> + </context> +<context> + <name>Intro</name> + </context> +<context> + <name>OpenURIDialog</name> + </context> +<context> + <name>OptionsDialog</name> + <message> + <source>Options</source> + <translation>Options</translation> + </message> + <message> + <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source> + <translation>Ouvrir le port du client Bitcoin automatiquement sur le routeur. Cela ne fonctionne que si votre routeur supporte l'UPnP et si la fonctionnalité est activée.</translation> + </message> + <message> + <source>Map port using &UPnP</source> + <translation>Ouvrir le port avec l'&UPnP</translation> + </message> + <message> + <source>&Minimize to the tray instead of the taskbar</source> + <translation>&Minimiser dans la barre système au lieu de la barre des tâches</translation> + </message> + <message> + <source>M&inimize on close</source> + <translation>Mi&nimiser lors de la fermeture</translation> + </message> + </context> +<context> + <name>OverviewPage</name> + <message> + <source>Form</source> + <translation>Formulaire</translation> + </message> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + <message> + <source>Amount</source> + <translation>Montant</translation> + </message> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + <message> + <source>Name</source> + <translation>Nom</translation> + </message> + </context> +<context> + <name>ReceiveCoinsDialog</name> + <message> + <source>&Label:</source> + <translation>&Étiquette :</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copier l'étiquette</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copier le montant</translation> + </message> +</context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>QR Code</source> + <translation>QR Code</translation> + </message> + <message> + <source>Address</source> + <translation>Adresse</translation> + </message> + <message> + <source>Amount</source> + <translation>Montant</translation> + </message> + <message> + <source>Label</source> + <translation>Étiquette</translation> + </message> + <message> + <source>Message</source> + <translation>Message</translation> + </message> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Label</source> + <translation>Étiquette</translation> + </message> + <message> + <source>Message</source> + <translation>Message</translation> + </message> + <message> + <source>Amount</source> + <translation>Montant</translation> + </message> + <message> + <source>(no label)</source> + <translation>(aucune étiquette)</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>Send Coins</source> + <translation>Envoyer des pièces</translation> + </message> + <message> + <source>Amount:</source> + <translation>Montant :</translation> + </message> + <message> + <source>Send to multiple recipients at once</source> + <translation>Envoyer des pièces à plusieurs destinataires à la fois</translation> + </message> + <message> + <source>Balance:</source> + <translation>Solde :</translation> + </message> + <message> + <source>Confirm the send action</source> + <translation>Confirmer l'action d'envoi</translation> + </message> + <message> + <source>Confirm send coins</source> + <translation>Confirmer l'envoi des pièces</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copier le montant</translation> + </message> + <message> + <source>The amount to pay must be larger than 0.</source> + <translation>Le montant à payer doit être supérieur à 0.</translation> + </message> + <message> + <source>(no label)</source> + <translation>(aucune étiquette)</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + <message> + <source>A&mount:</source> + <translation>&Montant :</translation> + </message> + <message> + <source>Pay &To:</source> + <translation>Payer &à :</translation> + </message> + <message> + <source>Enter a label for this address to add it to your address book</source> + <translation>Entrez une étiquette pour cette adresse afin de l'ajouter à votre carnet d'adresses</translation> + </message> + <message> + <source>&Label:</source> + <translation>&Étiquette :</translation> + </message> + <message> + <source>Alt+A</source> + <translation>Alt+A</translation> + </message> + <message> + <source>Paste address from clipboard</source> + <translation>Coller une adresse depuis le presse-papiers</translation> + </message> + <message> + <source>Alt+P</source> + <translation>Alt+P</translation> + </message> + <message> + <source>Message:</source> + <translation>Message :</translation> + </message> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + <message> + <source>&Sign Message</source> + <translation>&Signer le message</translation> + </message> + <message> + <source>Alt+A</source> + <translation>Alt+A</translation> + </message> + <message> + <source>Paste address from clipboard</source> + <translation>Coller une adresse depuis le presse-papiers</translation> + </message> + <message> + <source>Alt+P</source> + <translation>Alt+P</translation> + </message> + <message> + <source>Enter the message you want to sign here</source> + <translation>Entrez ici le message que vous désirez signer</translation> + </message> + </context> +<context> + <name>SplashScreen</name> + <message> + <source>[testnet]</source> + <translation>[testnet]</translation> + </message> +</context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + <message> + <source>Open until %1</source> + <translation>Ouvert jusqu'à %1</translation> + </message> + <message> + <source>%1/unconfirmed</source> + <translation>%1/non confirmée</translation> + </message> + <message> + <source>%1 confirmations</source> + <translation>%1 confirmations</translation> + </message> + <message> + <source>Status</source> + <translation>État</translation> + </message> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Generated</source> + <translation>Généré</translation> + </message> + <message> + <source>Credit</source> + <translation>Crédit</translation> + </message> + <message> + <source>Debit</source> + <translation>Débit</translation> + </message> + <message> + <source>Message</source> + <translation>Message</translation> + </message> + <message> + <source>Amount</source> + <translation>Montant</translation> + </message> + <message> + <source>, has not been successfully broadcast yet</source> + <translation>, n'a pas encore été diffusée avec succès</translation> + </message> + <message> + <source>unknown</source> + <translation>inconnue</translation> + </message> +</context> +<context> + <name>TransactionDescDialog</name> + <message> + <source>Transaction details</source> + <translation>Détails de la transaction</translation> + </message> + <message> + <source>This pane shows a detailed description of the transaction</source> + <translation>Ce panneau affiche une description détaillée de la transaction</translation> + </message> +</context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Type</source> + <translation>Type</translation> + </message> + <message> + <source>Open until %1</source> + <translation>Ouvert jusqu'à %1</translation> + </message> + <message> + <source>Confirmed (%1 confirmations)</source> + <translation>Confirmée (%1 confirmations)</translation> + </message> + <message> + <source>This block was not received by any other nodes and will probably not be accepted!</source> + <translation>Ce bloc n'a été reçu par aucun autre nœud et ne sera probablement pas accepté !</translation> + </message> + <message> + <source>Generated but not accepted</source> + <translation>Généré mais pas accepté</translation> + </message> + <message> + <source>Label</source> + <translation>Étiquette</translation> + </message> + <message> + <source>Received with</source> + <translation>Reçues avec</translation> + </message> + <message> + <source>Received from</source> + <translation>Reçue de</translation> + </message> + <message> + <source>Sent to</source> + <translation>Envoyées à</translation> + </message> + <message> + <source>Payment to yourself</source> + <translation>Paiement à vous-même</translation> + </message> + <message> + <source>Mined</source> + <translation>Extraction</translation> + </message> + <message> + <source>(n/a)</source> + <translation>(indisponible)</translation> + </message> + <message> + <source>Transaction status. Hover over this field to show number of confirmations.</source> + <translation>État de la transaction. Laissez le pointeur de la souris sur ce champ pour voir le nombre de confirmations.</translation> + </message> + <message> + <source>Date and time that the transaction was received.</source> + <translation>Date et heure de réception de la transaction.</translation> + </message> + <message> + <source>Type of transaction.</source> + <translation>Type de transaction.</translation> + </message> + <message> + <source>Amount removed from or added to balance.</source> + <translation>Montant ajouté au ou enlevé du solde.</translation> + </message> +</context> +<context> + <name>TransactionView</name> + <message> + <source>All</source> + <translation>Toutes</translation> + </message> + <message> + <source>Today</source> + <translation>Aujourd'hui</translation> + </message> + <message> + <source>This week</source> + <translation>Cette semaine</translation> + </message> + <message> + <source>This month</source> + <translation>Ce mois</translation> + </message> + <message> + <source>Last month</source> + <translation>Mois dernier</translation> + </message> + <message> + <source>This year</source> + <translation>Cette année</translation> + </message> + <message> + <source>Range...</source> + <translation>Intervalle...</translation> + </message> + <message> + <source>Received with</source> + <translation>Reçues avec</translation> + </message> + <message> + <source>Sent to</source> + <translation>Envoyées à</translation> + </message> + <message> + <source>To yourself</source> + <translation>À vous-même</translation> + </message> + <message> + <source>Mined</source> + <translation>Extraction</translation> + </message> + <message> + <source>Other</source> + <translation>Autres</translation> + </message> + <message> + <source>Enter address or label to search</source> + <translation>Entrez une adresse ou une étiquette à rechercher</translation> + </message> + <message> + <source>Min amount</source> + <translation>Montant min</translation> + </message> + <message> + <source>Copy address</source> + <translation>Copier l'adresse</translation> + </message> + <message> + <source>Copy label</source> + <translation>Copier l'étiquette</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Copier le montant</translation> + </message> + <message> + <source>Edit label</source> + <translation>Éditer l'étiquette</translation> + </message> + <message> + <source>Comma separated file (*.csv)</source> + <translation>Valeurs séparées par des virgules (*.csv)</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Confirmée</translation> + </message> + <message> + <source>Date</source> + <translation>Date</translation> + </message> + <message> + <source>Type</source> + <translation>Type</translation> + </message> + <message> + <source>Label</source> + <translation>Étiquette</translation> + </message> + <message> + <source>Address</source> + <translation>Adresse</translation> + </message> + <message> + <source>ID</source> + <translation>ID</translation> + </message> + <message> + <source>Range:</source> + <translation>Intervalle :</translation> + </message> + <message> + <source>to</source> + <translation>à</translation> + </message> +</context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + <message> + <source>Send Coins</source> + <translation>Envoyer des pièces</translation> + </message> +</context> +<context> + <name>WalletView</name> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Exporter les données de l'onglet courant vers un fichier</translation> + </message> + <message> + <source>Backup Wallet</source> + <translation>Sauvegarder le porte-monnaie</translation> + </message> + <message> + <source>Wallet Data (*.dat)</source> + <translation>Données de porte-monnaie (*.dat)</translation> + </message> + <message> + <source>Backup Failed</source> + <translation>La sauvegarde a échoué</translation> + </message> + </context> +<context> + <name>bitcoin-core</name> + <message> + <source>Options:</source> + <translation>Options :</translation> + </message> + <message> + <source>Specify data directory</source> + <translation>Spécifier le répertoire de données</translation> + </message> + <message> + <source>Accept command line and JSON-RPC commands</source> + <translation>Accepter les commandes de JSON-RPC et de la ligne de commande</translation> + </message> + <message> + <source>Run in the background as a daemon and accept commands</source> + <translation>Fonctionner en arrière-plan en tant que démon et accepter les commandes</translation> + </message> + <message> + <source>Send trace/debug info to console instead of debug.log file</source> + <translation>Envoyer les informations de débogage/trace à la console au lieu du fichier debug.log</translation> + </message> + <message> + <source>Username for JSON-RPC connections</source> + <translation>Nom d'utilisateur pour les connexions JSON-RPC</translation> + </message> + <message> + <source>Password for JSON-RPC connections</source> + <translation>Mot de passe pour les connexions JSON-RPC</translation> + </message> + <message> + <source>This help message</source> + <translation>Ce message d'aide</translation> + </message> + <message> + <source>Loading addresses...</source> + <translation>Chargement des adresses...</translation> + </message> + <message> + <source>Error loading wallet.dat: Wallet corrupted</source> + <translation>Erreur lors du chargement de wallet.dat : porte-monnaie corrompu</translation> + </message> + <message> + <source>Error loading wallet.dat</source> + <translation>Erreur lors du chargement de wallet.dat</translation> + </message> + <message> + <source>Insufficient funds</source> + <translation>Fonds insuffisants</translation> + </message> + <message> + <source>Loading block index...</source> + <translation>Chargement de l'index des blocs...</translation> + </message> + <message> + <source>Loading wallet...</source> + <translation>Chargement du porte-monnaie...</translation> + </message> + <message> + <source>Rescanning...</source> + <translation>Nouvelle analyse...</translation> + </message> + <message> + <source>Done loading</source> + <translation>Chargement terminé</translation> + </message> + </context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_gl.ts b/src/qt/locale/bitcoin_gl.ts index 79f0d46d3f..0b0800e742 100644 --- a/src/qt/locale/bitcoin_gl.ts +++ b/src/qt/locale/bitcoin_gl.ts @@ -2042,10 +2042,6 @@ <translation>Executar comando cando se recibe unha alerta relevante ou vemos un fork realmente longo (%s no cmd é substituído pola mensaxe)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Escolle directorio de datos ao arrancar (por defecto: 0)</translation> - </message> - <message> <source>Information</source> <translation>Información</translation> </message> @@ -2062,14 +2058,6 @@ <translation>Enviar traza/información de depuración á consola en lugar de ao arquivo debug.log</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Fixar idioma, por exemplo "de_DE" (por defecto: locale del sistema)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Amosar pantalla splash no arranque (por defecto: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Recortar o arquivo debug.log ao arrancar o cliente (por defecto: 1 cando no-debug)</translation> </message> @@ -2078,10 +2066,6 @@ <translation>Fallou a sinatura da transacción</translation> </message> <message> - <source>Start minimized</source> - <translation>Comezar minimizado</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>A cantidade da transacción é demasiado pequena</translation> </message> diff --git a/src/qt/locale/bitcoin_gu_IN.ts b/src/qt/locale/bitcoin_gu_IN.ts deleted file mode 100644 index 5de6a6109a..0000000000 --- a/src/qt/locale/bitcoin_gu_IN.ts +++ /dev/null @@ -1,113 +0,0 @@ -<TS language="gu_IN" version="2.1"> -<context> - <name>AddressBookPage</name> - </context> -<context> - <name>AddressTableModel</name> - </context> -<context> - <name>AskPassphraseDialog</name> - </context> -<context> - <name>BanTableModel</name> - </context> -<context> - <name>BitcoinGUI</name> - </context> -<context> - <name>ClientModel</name> - </context> -<context> - <name>CoinControlDialog</name> - </context> -<context> - <name>EditAddressDialog</name> - </context> -<context> - <name>FreespaceChecker</name> - </context> -<context> - <name>HelpMessageDialog</name> - </context> -<context> - <name>Intro</name> - </context> -<context> - <name>OpenURIDialog</name> - </context> -<context> - <name>OptionsDialog</name> - </context> -<context> - <name>OverviewPage</name> - </context> -<context> - <name>PaymentServer</name> - </context> -<context> - <name>PeerTableModel</name> - </context> -<context> - <name>QObject</name> - </context> -<context> - <name>QRImageWidget</name> - </context> -<context> - <name>RPCConsole</name> - </context> -<context> - <name>ReceiveCoinsDialog</name> - </context> -<context> - <name>ReceiveRequestDialog</name> - </context> -<context> - <name>RecentRequestsTableModel</name> - </context> -<context> - <name>SendCoinsDialog</name> - </context> -<context> - <name>SendCoinsEntry</name> - </context> -<context> - <name>ShutdownWindow</name> - </context> -<context> - <name>SignVerifyMessageDialog</name> - </context> -<context> - <name>SplashScreen</name> - </context> -<context> - <name>TrafficGraphWidget</name> - </context> -<context> - <name>TransactionDesc</name> - </context> -<context> - <name>TransactionDescDialog</name> - </context> -<context> - <name>TransactionTableModel</name> - </context> -<context> - <name>TransactionView</name> - </context> -<context> - <name>UnitDisplayStatusBarControl</name> - </context> -<context> - <name>WalletFrame</name> - </context> -<context> - <name>WalletModel</name> - </context> -<context> - <name>WalletView</name> - </context> -<context> - <name>bitcoin-core</name> - </context> -</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts index 048b268200..7db2a9dd34 100644 --- a/src/qt/locale/bitcoin_he.ts +++ b/src/qt/locale/bitcoin_he.ts @@ -2518,10 +2518,6 @@ <translation>אזהרה: הקובץ wallet.dat הושחת, המידע חולץ! קובץ ה־wallet.dat המקורי נשמר בשם wallet.{timestamp}.bak במיקום %s; אם המאזן או ההעברות שגויים עליך לשחזר גיבוי.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(בררת מחדל: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><קטגוריה> יכולה להיות:</translation> </message> @@ -2638,10 +2634,6 @@ <translation>לא ניתן לפתור את הכתובת -whitebind: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>בחירת תיקיית נתונים עם ההפעלה (בררת מחדל: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>התחברות דרך מתווך SOCKS5</translation> </message> @@ -2694,22 +2686,10 @@ <translation>שלח מידע דיבאג ועקבה לקונסולה במקום לקובץ debug.log</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>הגדרות אישורי בסיס של SSL לבקשות תשלום (בררת המחדל: -מערכת-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>הגדרת שפה, למשל „he_il“ (בררת מחדל: שפת המערכת)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>הצגת כל אפשרויות הניפוי (שימוש: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>הצגת מסך פתיחה בעת הפעלה (בררת מחדל: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>כיווץ הקובץ debug.log בהפעלת הלקוח (בררת מחדל: 1 ללא -debug)</translation> </message> @@ -2718,10 +2698,6 @@ <translation>החתימה על ההעברה נכשלה</translation> </message> <message> - <source>Start minimized</source> - <translation>התחלה במצב ממוזער</translation> - </message> - <message> <source>This is experimental software.</source> <translation>זוהי תכנית נסיונית.</translation> </message> diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts index aa28ecf24f..624cbbbc23 100644 --- a/src/qt/locale/bitcoin_hr.ts +++ b/src/qt/locale/bitcoin_hr.ts @@ -1784,10 +1784,6 @@ <translation>Šalji trace/debug informacije na konzolu umjesto u debug.log datoteku</translation> </message> <message> - <source>Start minimized</source> - <translation>Pokreni minimiziran</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>Korisničko ime za JSON-RPC veze</translation> </message> diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts index 27cfedc728..9825a28543 100644 --- a/src/qt/locale/bitcoin_hu.ts +++ b/src/qt/locale/bitcoin_hu.ts @@ -2373,10 +2373,6 @@ <translation>Az adatbázist újra kell építeni -reindex használatával (módosítás -tindex).</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Adatkönyvtár kiválasztása induláskor (alapbeállítás: 0)</translation> - </message> - <message> <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> <translation>Copyright (C) 2009-%i A Bitcoin Core Fejlesztői</translation> </message> @@ -2401,27 +2397,10 @@ <translation>trace/debug információ küldése a konzolra a debog.log fájl helyett</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>SLL gyökér-igazolások megadása fizetési kérelmekhez (alapértelmezett: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Nyelvbeállítás, például "de_DE" (alapértelmezett: rendszer nyelve)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Indítóképernyő mutatása induláskor (alapértelmezett: 1)</translation> - </message> - <message> <source>Signing transaction failed</source> <translation>Tranzakció aláírása sikertelen</translation> </message> <message> - <source>Start minimized</source> - <translation>Indítás lekicsinyítve -</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Ez egy kísérleti szoftver.</translation> </message> @@ -2438,10 +2417,6 @@ <translation>Túl nagy tranzakció</translation> </message> <message> - <source>UI Options:</source> - <translation>Kezelőfelület beállításai:</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>Felhasználói név JSON-RPC csatlakozásokhoz </translation> diff --git a/src/qt/locale/bitcoin_id_ID.ts b/src/qt/locale/bitcoin_id_ID.ts index 22ce3efecb..4124ef0951 100644 --- a/src/qt/locale/bitcoin_id_ID.ts +++ b/src/qt/locale/bitcoin_id_ID.ts @@ -2362,10 +2362,6 @@ <translation>Peringatan: Kami tidak bersetujuh dengan peer-peer kami! Kemungkinan Anda harus upgrade, atau node-node lain yang harus diupgrade.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(pengaturan awal: 1)</translation> - </message> - <message> <source>Block creation options:</source> <translation>Pilihan pembuatan blok:</translation> </message> @@ -2482,14 +2478,6 @@ <translation>Kirim info jejak/debug ke konsol bukan berkas debug.log</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Atur bahasa, sebagai contoh "id_ID" (standar: system locale)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Tampilkan layar pembuka saat nyala (standar: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Mengecilkan berkas debug.log saat klien berjalan (Standar: 1 jika tidak -debug)</translation> </message> @@ -2498,10 +2486,6 @@ <translation>Tandatangani transaksi tergagal</translation> </message> <message> - <source>Start minimized</source> - <translation>Memulai terminimalisi</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Nilai transaksi terlalu kecil</translation> </message> diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts index 7a2b7bd843..5ec6e480ba 100644 --- a/src/qt/locale/bitcoin_it.ts +++ b/src/qt/locale/bitcoin_it.ts @@ -2833,10 +2833,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation> <translation>Inserisce in whitelist i peer che si connettono da un dato indirizzo IP o netmask. Può essere specificato più volte.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(predefinito: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation>Valori possibili per <category>:</translation> </message> @@ -3053,10 +3049,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation> <translation>Impossibile risolvere indirizzo -whitebind: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Seleziona la cartella dati all'avvio (predefinito: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Connessione attraverso un proxy SOCKS5</translation> </message> @@ -3133,22 +3125,10 @@ Per specificare più URL separarli con una barra verticale "|".</translation> <translation>Invia transazioni a zero commissioni se possibile (predefinito: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Imposta i certificati radice SSL per le richieste di pagamento (predefinito: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Imposta lingua, ad esempio "it_IT" (predefinito: lingua di sistema)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra tutte le opzioni di debug (utilizzo: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostra finestra di presentazione all'avvio (predefinito: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Riduce il file debug.log all'avvio del client (predefinito: 1 se -debug non è impostato)</translation> </message> @@ -3157,10 +3137,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation> <translation>Firma transazione fallita</translation> </message> <message> - <source>Start minimized</source> - <translation>Avvia ridotto a icona</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>L'importo della transazione è troppo basso per pagare la commissione</translation> </message> @@ -3185,10 +3161,6 @@ Per specificare più URL separarli con una barra verticale "|".</translation> <translation>Transazione troppo grande</translation> </message> <message> - <source>UI Options:</source> - <translation>Opzioni Interfaccia Utente:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Impossibile associarsi a %s su questo computer (l'associazione ha restituito l'errore %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts index 140ed2445b..37306da5a7 100644 --- a/src/qt/locale/bitcoin_ja.ts +++ b/src/qt/locale/bitcoin_ja.ts @@ -2737,6 +2737,10 @@ <translation>取引 ID をコピー</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>生トランザクションをコピー</translation> + </message> + <message> <source>Edit label</source> <translation>ラベルの編集</translation> </message> @@ -2996,10 +3000,6 @@ <translation>与えられたネットマスクやIPアドレスから接続を行う、ホワイトリストのピア。複数回指定できます。</translation> </message> <message> - <source>(default: 1)</source> - <translation>(デフォルト: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>-maxmempoolは最低でも %d MB必要です</translation> </message> @@ -3257,16 +3257,20 @@ <translation>最優良のチェインを有効化しています...</translation> </message> <message> + <source>Always relay transactions received from whitelisted peers (default: %d)</source> + <translation>ホワイトリストにあるピアから受け取ったトランザクションを常にリレーする (初期値: %d)</translation> + </message> + <message> <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> <translation>起動時に壊れた wallet.dat から秘密鍵を復旧することを試す</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>-whitebind アドレス '%s' を解決できません</translation> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>Tor秘匿サービスを自動的に作成する (初期値: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>起動時にデータ ディレクトリを選ぶ (初期値: 0)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>-whitebind アドレス '%s' を解決できません</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3357,22 +3361,10 @@ <translation>可能な場合には手数料ゼロのトランザクションとしてトランザクションを送信する (初期値: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>支払いリクエスト用にSSLルート証明書を設定する(デフォルト:-system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>言語設定 例: "de_DE" (初期値: システムの言語)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>すべてのデバッグオプションを表示する (使い方: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>起動時にスプラッシュ画面を表示する (初期値: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>クライアント起動時に debug.log ファイルを縮小 (初期値: -debug オプションを指定しない場合は1)</translation> </message> @@ -3381,10 +3373,6 @@ <translation>取引の署名に失敗しました</translation> </message> <message> - <source>Start minimized</source> - <translation>最小化された状態で起動する</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>トランザクションの金額が小さすぎて手数料を支払えません</translation> </message> @@ -3393,6 +3381,14 @@ <translation>これは実験的なソフトウェアです。</translation> </message> <message> + <source>Tor control port password (default: empty)</source> + <translation>Tor管理ポートのパスワード (初期値: 空文字)</translation> + </message> + <message> + <source>Tor control port to use if onion listening enabled (default: %s)</source> + <translation>Onion のリッスンが有効になっている場合に使用するTor管理ポート (初期値: %s)</translation> + </message> + <message> <source>Transaction amount too small</source> <translation>取引の額が小さ過ぎます</translation> </message> @@ -3409,10 +3405,6 @@ <translation>取引が大き過ぎます</translation> </message> <message> - <source>UI Options:</source> - <translation>UIオプション:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>このコンピュータの %s にバインドすることができません (バインドが返したエラーは %s)</translation> </message> @@ -3433,6 +3425,10 @@ <translation>警告</translation> </message> <message> + <source>Whether to operate in a blocks only mode (default: %u)</source> + <translation>ブロック限定モードにおいて動作を行うかどうか (初期値: %u)</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>ウォレットからすべてのトランザクションを消去しています...</translation> </message> diff --git a/src/qt/locale/bitcoin_ka.ts b/src/qt/locale/bitcoin_ka.ts index e8f5286697..68666cfb25 100644 --- a/src/qt/locale/bitcoin_ka.ts +++ b/src/qt/locale/bitcoin_ka.ts @@ -2326,10 +2326,6 @@ <translation>მაღალპრიორიტეტული/დაბალსაკომისიოიანი ტრანსაქციების მაქსიმალური ზომა ბაიტებში (ნაგულისხმევი: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>მონაცემთა კატალოგის მითითება ყოველი გაშვებისას (ნაგულისხმევი: 0)</translation> - </message> - <message> <source>Information</source> <translation>ინფორმაცია</translation> </message> @@ -2346,14 +2342,6 @@ <translation>ტრასირების/დახვეწის ინფოს გაგზავნა კონსოლზე debug.log ფაილის ნაცვლად</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>აირჩიეთ ენა, მაგალითად "de_DE" (ნაგულისხმევია სისტემური ლოკალი)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>მისალმების ეკრანის ჩვენება გაშვებისას (ნაგულისხმევი:1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>debug.log ფაილის შეკუმშვა გაშვებისას (ნაგულისხმევია: 1 როცა არ აყენია -debug)</translation> </message> @@ -2362,10 +2350,6 @@ <translation>ტრანსაქციების ხელმოწერა ვერ მოხერხდა</translation> </message> <message> - <source>Start minimized</source> - <translation>გაშვება მინიმიზებული ეკრანით</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>ტრანსაქციების რაოდენობა ძალიან ცოტაა</translation> </message> diff --git a/src/qt/locale/bitcoin_ko_KR.ts b/src/qt/locale/bitcoin_ko_KR.ts index 8243618f11..81677b4732 100644 --- a/src/qt/locale/bitcoin_ko_KR.ts +++ b/src/qt/locale/bitcoin_ko_KR.ts @@ -3,7 +3,7 @@ <name>AddressBookPage</name> <message> <source>Right-click to edit address or label</source> - <translation>지갑 주소나 이름을 수정하려면 우클릭하세요.</translation> + <translation>지갑 주소나 라벨을 수정하려면 우클릭하세요.</translation> </message> <message> <source>Create a new address</source> @@ -27,7 +27,7 @@ </message> <message> <source>&Copy Address</source> - <translation>계좌 복사(&C)</translation> + <translation>주소 복사(&C)</translation> </message> <message> <source>Delete the currently selected address from the list</source> @@ -59,11 +59,11 @@ </message> <message> <source>Sending addresses</source> - <translation>보내는 주소들</translation> + <translation>타인 계좌 주소목록</translation> </message> <message> <source>Receiving addresses</source> - <translation>받은 주소들</translation> + <translation>내 계좌 주소목록</translation> </message> <message> <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> @@ -75,7 +75,7 @@ </message> <message> <source>Copy &Label</source> - <translation>표 복사</translation> + <translation>라벨 복사</translation> </message> <message> <source>&Edit</source> @@ -87,7 +87,7 @@ </message> <message> <source>Comma separated file (*.csv)</source> - <translation>각각의 파일에 쉼표하기(*.csv)</translation> + <translation>쉼표로 구분된 파일(*.csv)</translation> </message> <message> <source>Exporting Failed</source> @@ -95,14 +95,14 @@ </message> <message> <source>There was an error trying to save the address list to %1. Please try again.</source> - <translation>%1으로 주소 리스트를 저장하는 동안 오류가 발생했습니다. 다시 시도해주세요.</translation> + <translation>%1으로 주소 목록을 저장하는 동안 오류가 발생했습니다. 다시 시도해주세요.</translation> </message> </context> <context> <name>AddressTableModel</name> <message> <source>Label</source> - <translation>표</translation> + <translation>라벨</translation> </message> <message> <source>Address</source> @@ -110,7 +110,7 @@ </message> <message> <source>(no label)</source> - <translation>(표 없음)</translation> + <translation>(라벨 없음)</translation> </message> </context> <context> @@ -129,7 +129,7 @@ </message> <message> <source>Repeat new passphrase</source> - <translation>새 암호 반복</translation> + <translation>새로운 암호 재확인</translation> </message> <message> <source>Encrypt wallet</source> @@ -141,7 +141,7 @@ </message> <message> <source>Unlock wallet</source> - <translation>지갑 열기</translation> + <translation>지갑 잠금해제</translation> </message> <message> <source>This operation needs your wallet passphrase to decrypt the wallet.</source> @@ -157,11 +157,11 @@ </message> <message> <source>Confirm wallet encryption</source> - <translation>지갑의 암호화를 확정</translation> + <translation>지갑 암호화 승인</translation> </message> <message> <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> - <translation>경고: 만약 암호화된 지갑의 비밀번호를 잃어버릴 경우, 모든 비트코인들을 잃어버릴 수 있습니다!</translation> + <translation>경고: 만약 암호화 된 지갑의 비밀번호를 잃어버릴 경우, <b>모든 비트코인들을 잃어버릴 수 있습니다</b>!</translation> </message> <message> <source>Are you sure you wish to encrypt your wallet?</source> @@ -169,17 +169,21 @@ </message> <message> <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source> - <translation>중요: 본인 지갑파일에서 만든 예전 백업들은 새로 생성한 암화화된 지갑 파일로 교체됩니다. 보안상 이유로 이전에 암호화 하지 않은 지갑 파일 백업은 사용할 수 없게 되니 빠른 시일 내로 새로 암화화된 지갑을 사용하시기 바랍니다.</translation> + <translation>중요: 본인 지갑파일에서 만든 예전 백업들은 새로 생성한 암호화 된 지갑 파일로 교체됩니다. 보안상 이유로 이전에 암호화 하지 않은 지갑 파일 백업은 사용할 수 없게 되니 빠른 시일 내로 새로 암호화 된 지갑을 사용하시기 바랍니다.</translation> </message> <message> <source>Warning: The Caps Lock key is on!</source> - <translation>경고: 캡스록 키가 켜져있습니다!</translation> + <translation>경고: Caps Lock키가 켜져있습니다!</translation> </message> <message> <source>Wallet encrypted</source> <translation>지갑 암호화 완료</translation> </message> <message> + <source>Enter the old passphrase and new passphrase to the wallet.</source> + <translation>지갑의 기존 암호와 새로운 암호를 입력해주세요.</translation> + </message> + <message> <source>Wallet encryption failed</source> <translation>지갑 암호화 실패</translation> </message> @@ -964,6 +968,18 @@ <translation>프록시의 포트번호입니다(예: 9050)</translation> </message> <message> + <source>IPv4</source> + <translation>IPv4</translation> + </message> + <message> + <source>IPv6</source> + <translation>IPv6</translation> + </message> + <message> + <source>Tor</source> + <translation>Tor</translation> + </message> + <message> <source>&Window</source> <translation>창(&W)</translation> </message> @@ -1071,6 +1087,10 @@ <translation>아직 사용 가능하지 않은 채굴된 잔액</translation> </message> <message> + <source>Balances</source> + <translation>잔액</translation> + </message> + <message> <source>Total:</source> <translation>총액:</translation> </message> @@ -1082,6 +1102,10 @@ <source>Your current balance in watch-only addresses</source> <translation>모니터링 지갑의 현재 잔액</translation> </message> + <message> + <source>Recent transactions</source> + <translation>최근 거래</translation> + </message> </context> <context> <name>PaymentServer</name> @@ -1152,10 +1176,18 @@ <translation>비트코인 주소를 입력하기 (예. %1)</translation> </message> <message> + <source>%1 s</source> + <translation>%1 초</translation> + </message> + <message> <source>N/A</source> <translation>없음</translation> </message> - </context> + <message> + <source>%1 ms</source> + <translation>%1 ms</translation> + </message> +</context> <context> <name>QRImageWidget</name> <message> @@ -1203,7 +1235,11 @@ </message> <message> <source>Using OpenSSL version</source> - <translation>오픈SSL 버전을 사용합니다</translation> + <translation>사용중인 OpenSSL 버전</translation> + </message> + <message> + <source>Using BerkeleyDB version</source> + <translation>사용중인 BerkeleyDB 버전</translation> </message> <message> <source>Startup time</source> @@ -1230,6 +1266,22 @@ <translation>현재 블럭 수</translation> </message> <message> + <source>Received</source> + <translation>받음</translation> + </message> + <message> + <source>Sent</source> + <translation>보냄</translation> + </message> + <message> + <source>&Peers</source> + <translation>&피어</translation> + </message> + <message> + <source>Version</source> + <translation>버전</translation> + </message> + <message> <source>Last block time</source> <translation>최종 블럭 시각</translation> </message> @@ -1290,7 +1342,7 @@ </message> <message> <source>&Label:</source> - <translation>표:</translation> + <translation>라벨:</translation> </message> <message> <source>&Message:</source> @@ -1432,7 +1484,7 @@ </message> <message> <source>(no label)</source> - <translation>(표 없음)</translation> + <translation>(라벨 없음)</translation> </message> <message> <source>(no message)</source> @@ -1498,6 +1550,14 @@ <translation>주소변경</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>거래 수수료:</translation> + </message> + <message> + <source>Recommended:</source> + <translation>권장:</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>다수의 수령인들에게 한번에 보내기</translation> </message> @@ -2300,10 +2360,6 @@ <translation>경고 : wallet.dat가 손상되어 데이터가 복구되었습니다. 원래의 wallet.dat 파일은 %s 후에 wallet.{timestamp}.bak 이름으로 저장됩니다. 잔액과 거래 내역이 정확하지 않다면 백업 파일로 부터 복원해야 합니다. </translation> </message> <message> - <source>(default: 1)</source> - <translation>(기본값: 1)</translation> - </message> - <message> <source>Block creation options:</source> <translation>블록 생성 옵션:</translation> </message> @@ -2412,10 +2468,6 @@ <translation>최대 크기를 최우선으로 설정 / 바이트당 최소 수수료로 거래(기본값: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>파일목록을 선택하여 시작하시오(기본값: 0)</translation> - </message> - <message> <source>Information</source> <translation>정보</translation> </message> @@ -2436,22 +2488,10 @@ <translation>추적오류 정보를 degug.log 자료로 보내는 대신 콘솔로 보내기</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>지불 요청을 위해 SSL 최상위 인증을 설정합니다. (기본값: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>"de_DE"와 같이 언어를 설정하십시오 (기본값: 시스템 로캘)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>모든 디버그 설정 보기(설정: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>시작시 시작 화면 표시 (기본값: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>클라이언트 시작시 debug.log 파일 비우기(기본값: 디버그 안할때 1)</translation> </message> @@ -2460,10 +2500,6 @@ <translation>거래를 서명하는것을 실패하였습니다.</translation> </message> <message> - <source>Start minimized</source> - <translation>최소화 상태에서 시작</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>거래량이 너무 적습니다</translation> </message> diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts index b297a35d4b..f775002050 100644 --- a/src/qt/locale/bitcoin_la.ts +++ b/src/qt/locale/bitcoin_la.ts @@ -1478,14 +1478,6 @@ <translation>Mitte informationem vestigii/debug ad terminale potius quam plicam debug.log</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Constitue linguam, exempli gratia "de_DE" (praedefinitum: lingua systematis)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Monstra principem imaginem ad initium (praedefinitum: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Diminue plicam debug.log ad initium clientis (praedefinitum: 1 nisi -debug)</translation> </message> @@ -1494,10 +1486,6 @@ <translation>Signandum transactionis abortum est</translation> </message> <message> - <source>Start minimized</source> - <translation>Incipe minifactum ut icon</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Magnitudo transactionis nimis parva</translation> </message> diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts index 7820977375..c125d1b72b 100644 --- a/src/qt/locale/bitcoin_lt.ts +++ b/src/qt/locale/bitcoin_lt.ts @@ -1634,14 +1634,6 @@ <translation>Siųsti atsekimo/derinimo info į konsolę vietoj debug.log failo</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Nustatyti kalbą, pavyzdžiui "lt_LT" (numatyta: sistemos kalba)</translation> - </message> - <message> - <source>Start minimized</source> - <translation>Paleisti sumažintą</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>Vartotojo vardas JSON-RPC jungimuisi</translation> </message> diff --git a/src/qt/locale/bitcoin_lv_LV.ts b/src/qt/locale/bitcoin_lv_LV.ts index fa7abdf2ab..2d3eab3394 100644 --- a/src/qt/locale/bitcoin_lv_LV.ts +++ b/src/qt/locale/bitcoin_lv_LV.ts @@ -2114,10 +2114,6 @@ <translation>Darbināt fonā kā servisu un pieņemt komandas</translation> </message> <message> - <source>(default: 1)</source> - <translation>(noklusējums: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> var būt:</translation> </message> @@ -2174,22 +2170,10 @@ <translation>Debug/trace informāciju izvadīt konsolē, nevis debug.log failā</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Uzstādiet valodu, piemēram "de_DE" (pēc noklusēšanas: sistēmas lokāle)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Uzsākot, parādīt programmas informācijas logu (pēc noklusēšanas: 1)</translation> - </message> - <message> <source>Signing transaction failed</source> <translation>Transakcijas parakstīšana neizdevās</translation> </message> <message> - <source>Start minimized</source> - <translation>Sākt minimizētu</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Transakcijas summa ir pārāk maza</translation> </message> diff --git a/src/qt/locale/bitcoin_mk_MK.ts b/src/qt/locale/bitcoin_mk_MK.ts new file mode 100644 index 0000000000..269b06f83a --- /dev/null +++ b/src/qt/locale/bitcoin_mk_MK.ts @@ -0,0 +1,1027 @@ +<TS language="mk_MK" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Right-click to edit address or label</source> + <translation>Десен клик за уредување на адреса или етикета</translation> + </message> + <message> + <source>Create a new address</source> + <translation>Креирај нова адреса</translation> + </message> + <message> + <source>&New</source> + <translation>&Нова</translation> + </message> + <message> + <source>Copy the currently selected address to the system clipboard</source> + <translation>Копирај ја избраната адреса на системскиот клипборд</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Копирај</translation> + </message> + <message> + <source>C&lose</source> + <translation>З&атвори</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>&Копирај Адреса</translation> + </message> + <message> + <source>Delete the currently selected address from the list</source> + <translation>Избриши ја избраната адреса од листата</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Експортирај ги податоците од активното јазиче во датотека</translation> + </message> + <message> + <source>&Export</source> + <translation>&Експорт</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Избриши</translation> + </message> + <message> + <source>Choose the address to send coins to</source> + <translation>Изберете адресата за да пратите биткоини</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Изберете адресата за да примите биткоини</translation> + </message> + <message> + <source>C&hoose</source> + <translation>И&збери</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Адреси за праќање</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Адреси за примање</translation> + </message> + <message> + <source>Copy &Label</source> + <translation>Копирај &Етикета</translation> + </message> + <message> + <source>&Edit</source> + <translation>&Уреди</translation> + </message> + <message> + <source>Export Address List</source> + <translation>Експортирај Листа со Адреси</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Експортирањето не Успеа</translation> + </message> + </context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Етикета</translation> + </message> + <message> + <source>Address</source> + <translation>Адреса</translation> + </message> + <message> + <source>(no label)</source> + <translation>(без етикета)</translation> + </message> +</context> +<context> + <name>AskPassphraseDialog</name> + <message> + <source>Enter passphrase</source> + <translation>Внеси тајна фраза</translation> + </message> + <message> + <source>New passphrase</source> + <translation>Нова тајна фраза</translation> + </message> + <message> + <source>Repeat new passphrase</source> + <translation>Повторете ја новата тајна фраза</translation> + </message> + <message> + <source>Encrypt wallet</source> + <translation>Криптирање на паричник</translation> + </message> + <message> + <source>Unlock wallet</source> + <translation>Отклучи паричник</translation> + </message> + <message> + <source>Decrypt wallet</source> + <translation>Декриптирање на паричник</translation> + </message> + <message> + <source>Change passphrase</source> + <translation>Измени тајна фраза</translation> + </message> + <message> + <source>Confirm wallet encryption</source> + <translation>Потврдете го криптирањето на паричникот</translation> + </message> + <message> + <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> + <translation>Предупредување: Ако го шифрирате вашиот паричник и ја изгубите вашата тајна фраза, ќе <b>ГИ ИЗГУБИТЕ СИТЕ ВАШИ БИТКОИНИ</b>!</translation> + </message> + <message> + <source>Are you sure you wish to encrypt your wallet?</source> + <translation>Дали сте сигурни дека сакате да криптирате вашиот паричник?</translation> + </message> + <message> + <source>Warning: The Caps Lock key is on!</source> + <translation>Предупредување: Caps Lock копчето е активно!</translation> + </message> + <message> + <source>Wallet encrypted</source> + <translation>Паричникот е криптиран</translation> + </message> + <message> + <source>Wallet encryption failed</source> + <translation>Криптирањето на паричникот е неуспешно</translation> + </message> + <message> + <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source> + <translation>Криптирањето на паричникот не успеа поради интерна грешка. Вашиот паричник не е криптиран.</translation> + </message> + <message> + <source>The supplied passphrases do not match.</source> + <translation>Приложените тајни фрази не се поклопуваат</translation> + </message> + <message> + <source>Wallet unlock failed</source> + <translation>Отклучувањето на паричникот е неуспешно</translation> + </message> + <message> + <source>The passphrase entered for the wallet decryption was incorrect.</source> + <translation>Тајната фраза која што ја внесовте за декриптирање на паричникот е неточна.</translation> + </message> + <message> + <source>Wallet decryption failed</source> + <translation>Декриптирањето на паричникот е неуспешно</translation> + </message> + <message> + <source>Wallet passphrase was successfully changed.</source> + <translation>Тајната фраза е успешно променета.</translation> + </message> +</context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Sign &message...</source> + <translation>Потпиши &порака...</translation> + </message> + <message> + <source>Synchronizing with network...</source> + <translation>Синхронизација со мрежата...</translation> + </message> + <message> + <source>&Overview</source> + <translation>&Преглед</translation> + </message> + <message> + <source>Node</source> + <translation>Јазол</translation> + </message> + <message> + <source>&Transactions</source> + <translation>&Трансакции</translation> + </message> + <message> + <source>Browse transaction history</source> + <translation>Преглед на историјата на трансакции</translation> + </message> + <message> + <source>E&xit</source> + <translation>И&злез</translation> + </message> + <message> + <source>Quit application</source> + <translation>Напушти ја апликацијата</translation> + </message> + <message> + <source>About &Qt</source> + <translation>За &Qt</translation> + </message> + <message> + <source>Show information about Qt</source> + <translation>Прикажи информации за Qt</translation> + </message> + <message> + <source>&Options...</source> + <translation>&Опции...</translation> + </message> + <message> + <source>&Encrypt Wallet...</source> + <translation>&Криптирање на Паричник...</translation> + </message> + <message> + <source>&Backup Wallet...</source> + <translation>&Бекап на Паричник...</translation> + </message> + <message> + <source>&Change Passphrase...</source> + <translation>&Измени Тајна Фраза...</translation> + </message> + <message> + <source>&Sending addresses...</source> + <translation>&Адреси за Испраќање...</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>&Адреси за Примање...</translation> + </message> + <message> + <source>Open &URI...</source> + <translation>Отвори &URI...</translation> + </message> + <message> + <source>Bitcoin Core client</source> + <translation>Биткоин Core софтверот</translation> + </message> + <message> + <source>Importing blocks from disk...</source> + <translation>Внесување на блокови од дискот...</translation> + </message> + <message> + <source>Reindexing blocks on disk...</source> + <translation>Повторно индексирање на блокови од дискот...</translation> + </message> + <message> + <source>Send coins to a Bitcoin address</source> + <translation>Испрати биткоини на Биткоин адреса</translation> + </message> + <message> + <source>&Verify message...</source> + <translation>&Потврди порака...</translation> + </message> + <message> + <source>Bitcoin</source> + <translation>Биткоин</translation> + </message> + <message> + <source>Wallet</source> + <translation>Паричник</translation> + </message> + <message> + <source>&Send</source> + <translation>&Испрати</translation> + </message> + <message> + <source>&Receive</source> + <translation>&Прими</translation> + </message> + <message> + <source>Show information about Bitcoin Core</source> + <translation>Прикажи информации за Биткоин Core</translation> + </message> + <message> + <source>&Show / Hide</source> + <translation>&Прикажи / Сокриј</translation> + </message> + <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>Криптирај ги приватните клучеви кои припаѓаат на твојот паричник</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Подесувања</translation> + </message> + <message> + <source>&Help</source> + <translation>&Помош</translation> + </message> + <message> + <source>Bitcoin Core</source> + <translation>Биткоин Core</translation> + </message> + <message> + <source>&About Bitcoin Core</source> + <translation>&За Биткоин Core</translation> + </message> + <message numerus="yes"> + <source>Processed %n block(s) of transaction history.</source> + <translation><numerusform>Обработен %n блок од историјата на трансакции.</numerusform><numerusform>Обработени %n блокови од историјата на трансакции.</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n hour(s)</source> + <translation><numerusform>%n час</numerusform><numerusform>%n часови</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n day(s)</source> + <translation><numerusform>%n ден</numerusform><numerusform>%n денови</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n недела</numerusform><numerusform>%n недели</numerusform></translation> + </message> + <message> + <source>%1 and %2</source> + <translation>%1 и %2</translation> + </message> + <message numerus="yes"> + <source>%n year(s)</source> + <translation><numerusform>%n година</numerusform><numerusform>%n години</numerusform></translation> + </message> + <message> + <source>%1 behind</source> + <translation>%1 позади</translation> + </message> + <message> + <source>Error</source> + <translation>Грешка</translation> + </message> + <message> + <source>Warning</source> + <translation>Предупредување</translation> + </message> + <message> + <source>Up to date</source> + <translation>Во тек</translation> + </message> + <message> + <source>Date: %1 +</source> + <translation>Дата: %1 +</translation> + </message> + <message> + <source>Amount: %1 +</source> + <translation>Сума: %1 +</translation> + </message> + <message> + <source>Type: %1 +</source> + <translation>Тип: %1 +</translation> + </message> + <message> + <source>Label: %1 +</source> + <translation>Етикета: %1 +</translation> + </message> + <message> + <source>Address: %1 +</source> + <translation>Адреса: %1 +</translation> + </message> + </context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Bytes:</source> + <translation>Бајти:</translation> + </message> + <message> + <source>Amount:</source> + <translation>Сума:</translation> + </message> + <message> + <source>Priority:</source> + <translation>Приоритет:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Провизија:</translation> + </message> + <message> + <source>Dust:</source> + <translation>Прашина:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>После Провизија:</translation> + </message> + <message> + <source>Change:</source> + <translation>Кусур:</translation> + </message> + <message> + <source>Amount</source> + <translation>Сума</translation> + </message> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + <message> + <source>Priority</source> + <translation>Приоритет</translation> + </message> + <message> + <source>Copy address</source> + <translation>Копирај адреса</translation> + </message> + <message> + <source>Copy label</source> + <translation>Копирај етикета</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Копирај сума</translation> + </message> + <message> + <source>Lock unspent</source> + <translation>Заклучи непотрошени</translation> + </message> + <message> + <source>Unlock unspent</source> + <translation>Отклучи непотрошени</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Копирај количина</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Копирај провизија</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Копирај после провизија</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Копирај бајти</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Копирај приоритет</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Копирај прашина</translation> + </message> + <message> + <source>Copy change</source> + <translation>Копирај кусур</translation> + </message> + <message> + <source>highest</source> + <translation>највисок</translation> + </message> + <message> + <source>higher</source> + <translation>повисок</translation> + </message> + <message> + <source>high</source> + <translation>висок</translation> + </message> + <message> + <source>medium-high</source> + <translation>средно-висок</translation> + </message> + <message> + <source>medium</source> + <translation>среден</translation> + </message> + <message> + <source>low-medium</source> + <translation>ниско-среден</translation> + </message> + <message> + <source>low</source> + <translation>низок</translation> + </message> + <message> + <source>lower</source> + <translation>понизок</translation> + </message> + <message> + <source>lowest</source> + <translation>најнизок</translation> + </message> + <message> + <source>none</source> + <translation>нема</translation> + </message> + <message> + <source>This label turns red if the transaction size is greater than 1000 bytes.</source> + <translation>Оваа етикета станува црвена ако големината на трансакцијата е поголема од 1000 бајти.</translation> + </message> + <message> + <source>This label turns red if the priority is smaller than "medium".</source> + <translation>Оваа етикета станува црвена ако приоритетот е помал од "среден".</translation> + </message> + <message> + <source>This label turns red if any recipient receives an amount smaller than %1.</source> + <translation>Оваа етикета станува црвена ако примачот прими сума помала од %1.</translation> + </message> + <message> + <source>yes</source> + <translation>да</translation> + </message> + <message> + <source>no</source> + <translation>не</translation> + </message> + <message> + <source>Transactions with higher priority are more likely to get included into a block.</source> + <translation>Трансакциите со повисок приоритет имаат поголеми шанси да бидат вклучени во блок.</translation> + </message> + <message> + <source>(no label)</source> + <translation>(без етикета)</translation> + </message> + <message> + <source>(change)</source> + <translation>(кусур)</translation> + </message> +</context> +<context> + <name>EditAddressDialog</name> + <message> + <source>Edit Address</source> + <translation>Измени Адреса</translation> + </message> + <message> + <source>&Label</source> + <translation>&Етикета</translation> + </message> + <message> + <source>&Address</source> + <translation>&Адреса</translation> + </message> + </context> +<context> + <name>FreespaceChecker</name> + <message> + <source>name</source> + <translation>име</translation> + </message> + </context> +<context> + <name>HelpMessageDialog</name> + <message> + <source>Bitcoin Core</source> + <translation>Биткоин Core</translation> + </message> + <message> + <source>version</source> + <translation>верзија</translation> + </message> + <message> + <source>(%1-bit)</source> + <translation>(%1-бит)</translation> + </message> + <message> + <source>About Bitcoin Core</source> + <translation>За Биткоин Core</translation> + </message> + </context> +<context> + <name>Intro</name> + <message> + <source>Bitcoin Core</source> + <translation>Биткоин Core</translation> + </message> + <message> + <source>Error</source> + <translation>Грешка</translation> + </message> + </context> +<context> + <name>OpenURIDialog</name> + <message> + <source>Open URI</source> + <translation>Отвори URI</translation> + </message> + <message> + <source>URI:</source> + <translation>URI:</translation> + </message> + </context> +<context> + <name>OptionsDialog</name> + <message> + <source>Options</source> + <translation>Опции</translation> + </message> + <message> + <source>MB</source> + <translation>МБ</translation> + </message> + <message> + <source>&Network</source> + <translation>&Мрежа</translation> + </message> + <message> + <source>W&allet</source> + <translation>П&аричник</translation> + </message> + <message> + <source>&Window</source> + <translation>&Прозорец</translation> + </message> + <message> + <source>&OK</source> + <translation>&ОК</translation> + </message> + <message> + <source>&Cancel</source> + <translation>&Откажи</translation> + </message> + <message> + <source>none</source> + <translation>нема</translation> + </message> + </context> +<context> + <name>OverviewPage</name> + <message> + <source>Total:</source> + <translation>Вкупно:</translation> + </message> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + <message> + <source>Amount</source> + <translation>Сума</translation> + </message> + <message> + <source>%1 d</source> + <translation>%1 д</translation> + </message> + <message> + <source>%1 h</source> + <translation>%1 ч</translation> + </message> + <message> + <source>%1 m</source> + <translation>%1 м</translation> + </message> + <message> + <source>%1 s</source> + <translation>%1 с</translation> + </message> + <message> + <source>%1 ms</source> + <translation>%1 мс</translation> + </message> +</context> +<context> + <name>QRImageWidget</name> + <message> + <source>&Save Image...</source> + <translation>&Сними Слика...</translation> + </message> + <message> + <source>Save QR Code</source> + <translation>Сними QR Код</translation> + </message> + <message> + <source>PNG Image (*.png)</source> + <translation>PNG Слика (*.png)</translation> + </message> +</context> +<context> + <name>RPCConsole</name> + <message> + <source>Network</source> + <translation>Мрежа</translation> + </message> + <message> + <source>Name</source> + <translation>Име</translation> + </message> + <message> + <source>Number of connections</source> + <translation>Број на конекции</translation> + </message> + <message> + <source>Block chain</source> + <translation>Block chain</translation> + </message> + <message> + <source>Sent</source> + <translation>Испратени</translation> + </message> + <message> + <source>Version</source> + <translation>Верзија</translation> + </message> + <message> + <source>&Console</source> + <translation>&Конзола</translation> + </message> + <message> + <source>%1 B</source> + <translation>%1 Б</translation> + </message> + <message> + <source>%1 KB</source> + <translation>%1 КБ</translation> + </message> + <message> + <source>%1 MB</source> + <translation>%1 МБ</translation> + </message> + <message> + <source>%1 GB</source> + <translation>%1 ГБ</translation> + </message> + </context> +<context> + <name>ReceiveCoinsDialog</name> + <message> + <source>&Amount:</source> + <translation>&Сума:</translation> + </message> + <message> + <source>&Label:</source> + <translation>&Етикета:</translation> + </message> + <message> + <source>&Message:</source> + <translation>&Порака:</translation> + </message> + <message> + <source>Show</source> + <translation>Прикажи</translation> + </message> + <message> + <source>Copy label</source> + <translation>Копирај етикета</translation> + </message> + <message> + <source>Copy message</source> + <translation>Копирај порака</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Копирај сума</translation> + </message> +</context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>QR Code</source> + <translation>QR Код</translation> + </message> + <message> + <source>Copy &URI</source> + <translation>Копирај &URI</translation> + </message> + <message> + <source>Copy &Address</source> + <translation>Копирај &Адреса</translation> + </message> + <message> + <source>&Save Image...</source> + <translation>&Сними Слика...</translation> + </message> + <message> + <source>URI</source> + <translation>URI</translation> + </message> + <message> + <source>Address</source> + <translation>Адреса</translation> + </message> + <message> + <source>Amount</source> + <translation>Сума</translation> + </message> + <message> + <source>Label</source> + <translation>Етикета</translation> + </message> + <message> + <source>Message</source> + <translation>Порака</translation> + </message> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + <message> + <source>Label</source> + <translation>Етикета</translation> + </message> + <message> + <source>Message</source> + <translation>Порака</translation> + </message> + <message> + <source>Amount</source> + <translation>Сума</translation> + </message> + <message> + <source>(no label)</source> + <translation>(без етикета)</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>Bytes:</source> + <translation>Бајти:</translation> + </message> + <message> + <source>Amount:</source> + <translation>Сума:</translation> + </message> + <message> + <source>Priority:</source> + <translation>Приоритет:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Провизија:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>После Провизија:</translation> + </message> + <message> + <source>Change:</source> + <translation>Кусур:</translation> + </message> + <message> + <source>Dust:</source> + <translation>Прашина:</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Копирај количина</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Копирај сума</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Копирај провизија</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Копирај после провизија</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Копирај бајти</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Копирај приоритет</translation> + </message> + <message> + <source>Copy change</source> + <translation>Копирај кусур</translation> + </message> + <message> + <source>(no label)</source> + <translation>(без етикета)</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Копирај прашина</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + <message> + <source>&Label:</source> + <translation>&Етикета:</translation> + </message> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + <message> + <source>Bitcoin Core</source> + <translation>Биткоин Core</translation> + </message> + </context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + <message> + <source>Message</source> + <translation>Порака</translation> + </message> + <message> + <source>Amount</source> + <translation>Сума</translation> + </message> + </context> +<context> + <name>TransactionDescDialog</name> + </context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + <message> + <source>Label</source> + <translation>Етикета</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>Copy address</source> + <translation>Копирај Адреса</translation> + </message> + <message> + <source>Copy label</source> + <translation>Копирај етикета</translation> + </message> + <message> + <source>Copy amount</source> + <translation>Копирај сума</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Експортирањето не Успеа</translation> + </message> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + <message> + <source>Label</source> + <translation>Етикета</translation> + </message> + <message> + <source>Address</source> + <translation>Адреса</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + <message> + <source>&Export</source> + <translation>&Експорт</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Експортирај ги податоците од активното јазиче во датотека</translation> + </message> + </context> +<context> + <name>bitcoin-core</name> + <message> + <source>Warning</source> + <translation>Предупредување</translation> + </message> + <message> + <source>Error</source> + <translation>Грешка</translation> + </message> +</context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts index 6cded5e135..554ac21a02 100644 --- a/src/qt/locale/bitcoin_nb.ts +++ b/src/qt/locale/bitcoin_nb.ts @@ -2737,6 +2737,10 @@ <translation>Kopier transaksjons-ID</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>Kopier råtransaksjon</translation> + </message> + <message> <source>Edit label</source> <translation>Rediger merkelapp</translation> </message> @@ -2992,10 +2996,6 @@ <translation>Hvitelist noder som kobler til fra den oppgitte nettmasken eller IP-adressen. Kan oppgis flere ganger.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(standardverdi: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>-maxmempool må være minst %d MB</translation> </message> @@ -3041,11 +3041,11 @@ </message> <message> <source>Enable publish raw block in <address></source> - <translation>Slå på publish raw block i <address></translation> + <translation>Slå på publisering av råblokk i <address></translation> </message> <message> <source>Enable publish raw transaction in <address></source> - <translation>Slå på publish raw transaction i <address></translation> + <translation>Slå på publisering av råtransaksjon i <address></translation> </message> <message> <source>Error initializing block database</source> @@ -3252,16 +3252,20 @@ <translation>Aktiverer beste kjede...</translation> </message> <message> + <source>Always relay transactions received from whitelisted peers (default: %d)</source> + <translation>Alltid videresend transaksjoner mottatt fra hvitlistede noder (standardverdi: %d)</translation> + </message> + <message> <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> <translation>Forsøk å berge private nøkler fra en korrupt wallet.dat ved oppstart</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>Kan ikke løse -whitebind-adresse: '%s'</translation> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>Automatisk opprette Tor skjult tjeneste (standardverdi: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Velg datamappe ved oppstart (standard: 0)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Kan ikke løse -whitebind-adresse: '%s'</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3352,22 +3356,10 @@ <translation>Send transaksjoner uten transaksjonsgebyr hvis mulig (standardverdi: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Sett SSL-rotsertifikat for betalingsetterspørring (standard: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Sett språk, for eksempel "nb_NO" (standardverdi: fra operativsystem)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Vis alle feilsøkingsvalg (bruk: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Vis splashskjerm ved oppstart (standardverdi: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Krymp filen debug.log når klienten starter (standardverdi: 1 hvis uten -debug)</translation> </message> @@ -3376,10 +3368,6 @@ <translation>Signering av transaksjon feilet</translation> </message> <message> - <source>Start minimized</source> - <translation>Start minimert</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Transaksjonsbeløpet er for lite til å betale gebyr</translation> </message> @@ -3388,6 +3376,14 @@ <translation>Dette er eksperimentell programvare.</translation> </message> <message> + <source>Tor control port password (default: empty)</source> + <translation>Passord for Tor-kontrollport (standardverdi: tom)</translation> + </message> + <message> + <source>Tor control port to use if onion listening enabled (default: %s)</source> + <translation>Tor-kontrollport å bruke hvis onion-lytting er aktivert (standardverdi: %s)</translation> + </message> + <message> <source>Transaction amount too small</source> <translation>Transaksjonen er for liten</translation> </message> @@ -3404,10 +3400,6 @@ <translation>Transaksjonen er for stor</translation> </message> <message> - <source>UI Options:</source> - <translation>Innstillinger for Brukergrensesnitt:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Kan ikke binde til %s på denne datamaskinen (binding returnerte feilen %s)</translation> </message> @@ -3428,6 +3420,10 @@ <translation>Advarsel</translation> </message> <message> + <source>Whether to operate in a blocks only mode (default: %u)</source> + <translation>Hvorvidt å operere i modus med kun blokker (standardverdi: %u)</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>Zapper alle transaksjoner fra lommeboken...</translation> </message> diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts index c307f0ab6a..be2ec9ac4f 100644 --- a/src/qt/locale/bitcoin_nl.ts +++ b/src/qt/locale/bitcoin_nl.ts @@ -222,7 +222,11 @@ </context> <context> <name>BanTableModel</name> - </context> + <message> + <source>Banned Until</source> + <translation>Geband tot</translation> + </message> +</context> <context> <name>BitcoinGUI</name> <message> @@ -1072,6 +1076,18 @@ <translation>Poort van de proxy (bijv. 9050)</translation> </message> <message> + <source>IPv4</source> + <translation>IPv4</translation> + </message> + <message> + <source>IPv6</source> + <translation>IPv6</translation> + </message> + <message> + <source>Tor</source> + <translation>Tor</translation> + </message> + <message> <source>&Window</source> <translation>&Scherm</translation> </message> @@ -1317,6 +1333,10 @@ <translation>User Agent</translation> </message> <message> + <source>Node/Service</source> + <translation>Node/Service</translation> + </message> + <message> <source>Ping Time</source> <translation>Ping tijd</translation> </message> @@ -1466,6 +1486,14 @@ <translation>Versie</translation> </message> <message> + <source>Synced Headers</source> + <translation>Gesynchroniseerde headers</translation> + </message> + <message> + <source>Synced Blocks</source> + <translation>Gesynchroniseerde blokken</translation> + </message> + <message> <source>User Agent</source> <translation>User Agent</translation> </message> @@ -1494,6 +1522,10 @@ <translation>Ping Tijd</translation> </message> <message> + <source>The duration of a currently outstanding ping.</source> + <translation>De tijdsduur van een op het moment openstaande ping.</translation> + </message> + <message> <source>Last block time</source> <translation>Tijd laatste blok</translation> </message> @@ -1538,6 +1570,22 @@ <translation>Maak console leeg</translation> </message> <message> + <source>1 &hour</source> + <translation>1 &uur</translation> + </message> + <message> + <source>1 &day</source> + <translation>1 &dag</translation> + </message> + <message> + <source>1 &week</source> + <translation>1 &week</translation> + </message> + <message> + <source>1 &year</source> + <translation>1 &jaar</translation> + </message> + <message> <source>Welcome to the Bitcoin Core RPC console.</source> <translation>Welkom op de Bitcoin Core RPC console.</translation> </message> @@ -1958,6 +2006,10 @@ <translation>Kopieer wijziging</translation> </message> <message> + <source>Total Amount %1</source> + <translation>Totaalbedrag %1</translation> + </message> + <message> <source>or</source> <translation>of</translation> </message> @@ -2613,6 +2665,10 @@ <translation>Kopieer transactie-ID</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>Kopieer </translation> + </message> + <message> <source>Edit label</source> <translation>Bewerk label</translation> </message> @@ -2760,6 +2816,10 @@ <translation>Aanvaard commandoregel- en JSON-RPC-commando's</translation> </message> <message> + <source>If <category> is not supplied or if <category> = 1, output all debugging information.</source> + <translation>Als er geen <category> is opgegeven of als de <category> 1 is, laat dan alle debugging informatie zien.</translation> + </message> + <message> <source>Error: A fatal internal error occurred, see debug.log for details</source> <translation>Fout: er is een fout opgetreden, zie debug.log voor details</translation> </message> @@ -2820,10 +2880,6 @@ <translation>Goedgekeurde peers die verbinden van het ingegeven netmask of IP adres. Kan meerdere keren gespecificeerd worden.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(standaard: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> kan zijn:</translation> </message> @@ -3021,10 +3077,6 @@ <translation>Kan -whitebind adres niet herleiden: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Kies de gegevensmap tijdens het opstarten (standaard: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Verbind door SOCKS5 proxy</translation> </message> @@ -3093,22 +3145,10 @@ <translation>Verstuur transacties zonder verzendkosten indien mogelijk (standaard: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Zet SSL root certificaten voor betalingsverzoek (standaard: -sytem-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Stel taal in, bijvoorbeeld ''de_DE" (standaard: systeeminstellingen)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Toon alle foutopsporingsopties (gebruik: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Laat laadscherm zien bij het opstarten. (standaard: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Verklein debug.log-bestand bij het opstarten van de client (standaard: 1 als geen -debug)</translation> </message> @@ -3117,10 +3157,6 @@ <translation>Ondertekenen van transactie mislukt</translation> </message> <message> - <source>Start minimized</source> - <translation>Geminimaliseerd starten</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Het transactiebedrag is te klein om de vergoeding te betalen</translation> </message> @@ -3145,10 +3181,6 @@ <translation>Transactie te groot</translation> </message> <message> - <source>UI Options:</source> - <translation>UI Opties:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Niet in staat om aan %s te binden op deze computer (bind gaf error %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts index 893ae43c55..ec99a1f572 100644 --- a/src/qt/locale/bitcoin_pam.ts +++ b/src/qt/locale/bitcoin_pam.ts @@ -1374,18 +1374,6 @@ <translation>Magpadalang trace/debug info okeng console kesa keng debug.log file</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Mamiling Amanu, alimbawa "de_DE"(default: system locale)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Ipalto ing splash screen keng umpisa (default: 1)</translation> - </message> - <message> - <source>Start minimized</source> - <translation>Umpisan ing pamaglati</translation> - </message> - <message> <source>Transaction too large</source> <translation>Maragul yang masiadu ing transaksion</translation> </message> diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts index 228e02a5ee..a351552b63 100644 --- a/src/qt/locale/bitcoin_pl.ts +++ b/src/qt/locale/bitcoin_pl.ts @@ -222,7 +222,15 @@ </context> <context> <name>BanTableModel</name> - </context> + <message> + <source>IP/Netmask</source> + <translation>IP/Maska Sieci</translation> + </message> + <message> + <source>Banned Until</source> + <translation>Blokada do</translation> + </message> +</context> <context> <name>BitcoinGUI</name> <message> @@ -1068,6 +1076,18 @@ <translation>Port proxy (np. 9050)</translation> </message> <message> + <source>IPv4</source> + <translation>IPv4</translation> + </message> + <message> + <source>IPv6</source> + <translation>IPv6</translation> + </message> + <message> + <source>Tor</source> + <translation>Tor</translation> + </message> + <message> <source>&Window</source> <translation>&Okno</translation> </message> @@ -1454,6 +1474,10 @@ <translation>&Węzły</translation> </message> <message> + <source>Banned peers</source> + <translation>Blokowane węzły</translation> + </message> + <message> <source>Select a peer to view detailed information.</source> <translation>Wybierz węzeł żeby zobaczyć szczegóły.</translation> </message> @@ -1542,6 +1566,14 @@ <translation>Wyczyść konsolę</translation> </message> <message> + <source>Ban Node for</source> + <translation>Blokuj węzeł na okres</translation> + </message> + <message> + <source>&Unban Node</source> + <translation>Odblokuj węzeł</translation> + </message> + <message> <source>Welcome to the Bitcoin Core RPC console.</source> <translation>Witaj w konsoli Bitcoin Core RPC.</translation> </message> @@ -1586,6 +1618,14 @@ <translation>Wyjściowy</translation> </message> <message> + <source>Yes</source> + <translation>Tak</translation> + </message> + <message> + <source>No</source> + <translation>Nie</translation> + </message> + <message> <source>Unknown</source> <translation>Nieznany</translation> </message> @@ -1981,6 +2021,10 @@ <source>Payment request expired.</source> <translation>Żądanie płatności upłynęło.</translation> </message> + <message> + <source>Pay only the required fee of %1</source> + <translation>Zapłać tylko wymaganą opłatę %1</translation> + </message> <message numerus="yes"> <source>Estimated to begin confirmation within %n block(s).</source> <translation><numerusform>Przybliżony czas zatwierdzenia: %n bloków.</numerusform><numerusform>Przybliżony czas zatwierdzenia: %n bloków.</numerusform><numerusform>Przybliżony czas zatwierdzenia: %n bloków.</numerusform></translation> @@ -2828,10 +2872,6 @@ <translation>Dodawaj do białej listy węzły łączące się z podanej maski sieciowej lub adresu IP. Może być określona kilka razy.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(domyślnie: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> mogą być:</translation> </message> @@ -3040,10 +3080,6 @@ <translation>Nie można rozwiązać adresu -whitebind: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Wybierz folder danych przy starcie (domyślnie: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Połącz przez SOCKS5 proxy</translation> </message> @@ -3116,22 +3152,10 @@ <translation>Wyślij bez opłaty jeżeli to możliwe (domyślnie: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Ustaw certyfikaty główne SSL dla żądań płatności (domyślnie: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Ustaw Język, na przykład "pl_PL" (domyślnie: systemowy)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Pokaż wszystkie opcje odpluskwiania (użycie: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Pokazuj okno powitalne przy starcie (domyślnie: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Zmniejsz plik debug.log przy starcie programu (domyślnie: 1 jeśli nie użyto -debug)</translation> </message> @@ -3140,10 +3164,6 @@ <translation>Podpisywanie transakcji nie powiodło się</translation> </message> <message> - <source>Start minimized</source> - <translation>Uruchom zminimalizowany</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Zbyt niska kwota transakcji by zapłacić opłatę</translation> </message> @@ -3168,10 +3188,6 @@ <translation>Transakcja zbyt duża</translation> </message> <message> - <source>UI Options:</source> - <translation>Opcje UI</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Nie można przywiązać do %s na tym komputerze (bind zwrócił błąd %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts index 4863591ac4..bb6de064d4 100644 --- a/src/qt/locale/bitcoin_pt_BR.ts +++ b/src/qt/locale/bitcoin_pt_BR.ts @@ -1550,6 +1550,14 @@ <translation>A duração de um ping excepcional no momento.</translation> </message> <message> + <source>Ping Wait</source> + <translation>Espera de ping</translation> + </message> + <message> + <source>Time Offset</source> + <translation>Offset de tempo</translation> + </message> + <message> <source>Last block time</source> <translation>Horário do último bloco</translation> </message> @@ -2638,6 +2646,10 @@ <translation>Mostrar ou não endereços Bitcoin na lista de transações.</translation> </message> <message> + <source>User-defined intent/purpose of the transaction.</source> + <translation>Intenção/Propósito definido pelo usuário para a transação</translation> + </message> + <message> <source>Amount removed from or added to balance.</source> <translation>Quantidade debitada ou creditada ao saldo.</translation> </message> @@ -2717,6 +2729,10 @@ <translation>Copiar ID da transação</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>Copia os dados brutos da transação</translation> + </message> + <message> <source>Edit label</source> <translation>Editar rótulo</translation> </message> @@ -2868,6 +2884,18 @@ <translation>Se <category> não for suprida ou se <category> = 1, mostrar toda informação de depuração.</translation> </message> <message> + <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> + <translation>Por favor verifique se a data e horário estão corretos no seu computador! Se o seu relógio estiver incorreto, a Carteira Bitcoin não irá funcionar corretamente.</translation> + </message> + <message> + <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source> + <translation>Corte: a ultima sincronização da carteira foi além do dado comprimido. Você precisa reindexar ( -reindex , faça o download de toda a blockchain novamente)</translation> + </message> + <message> + <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source> + <translation>Rescans não são possíveis no modo de corte. Você precisa usar -reindex, que irá fazer o download de toda a blockchain novamente.</translation> + </message> + <message> <source>Error: A fatal internal error occurred, see debug.log for details</source> <translation>Erro: Um erro interno fatal ocorreu, veja debug.log para detalhes</translation> </message> @@ -2952,10 +2980,6 @@ <translation>Lista Branca pares de ligação da máscara de rede dado ou o endereço IP . Pode ser especificado várias vezes.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(padrão: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>-maxmempool deve ser pelo menos %d MB</translation> </message> @@ -2992,6 +3016,22 @@ <translation>Você quer reconstruir o banco de dados de blocos agora?</translation> </message> <message> + <source>Enable publish hash block in <address></source> + <translation>Abilitar a publicação da hash do block em <endereço></translation> + </message> + <message> + <source>Enable publish hash transaction in <address></source> + <translation>Abilitar a publicação da hash da transação em <endereço></translation> + </message> + <message> + <source>Enable publish raw block in <address></source> + <translation>Abilitar a publicação dos dados brutos do block em <endereço></translation> + </message> + <message> + <source>Enable publish raw transaction in <address></source> + <translation>Abilitar a publicação dos dados brutos da transação em <endereço></translation> + </message> + <message> <source>Error initializing block database</source> <translation>Erro ao inicializar banco de dados de blocos</translation> </message> @@ -3112,6 +3152,10 @@ <translation>Vincular ao endereço fornecido e sempre escutar nele. Use a notação [host]:port para IPv6</translation> </message> <message> + <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source> + <translation>Conecte ao endereço dado para receber conecções JSON-RPC. Use a notação [destino]:porta para IPv6. Essa opção pode ser especificada várias vezes (padrão: conecte a todas as interfaces)</translation> + </message> + <message> <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> <translation>Não foi possível obter acesso exclusivo ao diretório de dados %s. Provavelmente Bitcoin já está sendo executado.</translation> </message> @@ -3144,6 +3188,10 @@ <translation>A quantia da transação é muito pequena para mandar </translation> </message> <message> + <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> + <translation>Esse produto inclui software desenvolvido pelo Open SSL Project para uso na OpenSSL Toolkit<https://www.openssl.org/> e software criptográfico escrito por Eric Young e software UPnP escrito por Thomas Bernard. </translation> + </message> + <message> <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source> <translation>Você precisa reconstruir o banco de dados usando -reindex para sair do modo prune. Isso irá rebaixar todo o blockchain.</translation> </message> @@ -3160,10 +3208,6 @@ <translation>Impossível resolver endereço -whitebind: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Escolha o diretório de dados na inicialização (padrão: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Connecte-se através de um proxy SOCKS5</translation> </message> @@ -3228,22 +3272,10 @@ <translation>Enviar transação sem taxa, se possível (padrão: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Define certificados SSL root para requisição de pagamento (padrão: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Escolher língua, por exemplo "de_DE" (padrão: localização do sistema)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Exibir todas opções de depuração (uso: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostrar tela inicial ao ligar (padrão: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Encolher arquivo debug.log ao iniciar o cliente (padrão 1 se opção -debug não estiver presente)</translation> </message> @@ -3252,10 +3284,6 @@ <translation>Assinatura de transação falhou</translation> </message> <message> - <source>Start minimized</source> - <translation>Inicializar minimizado</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>A quantidade da transação é pequena demais para pagar a taxa</translation> </message> @@ -3280,10 +3308,6 @@ <translation>Transação muito larga</translation> </message> <message> - <source>UI Options:</source> - <translation>Opções da interface:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Impossível se ligar a %s neste computador (bind retornou erro %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_pt_PT.ts b/src/qt/locale/bitcoin_pt_PT.ts index 4549066363..b5ede206dd 100644 --- a/src/qt/locale/bitcoin_pt_PT.ts +++ b/src/qt/locale/bitcoin_pt_PT.ts @@ -2773,10 +2773,6 @@ <translation>Ligações na lista branca conectam desde a seguinte netmask ou endereço IP. Posse ser especificado varias vezes.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(padrão: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><categoria> pode ser:</translation> </message> @@ -2921,10 +2917,6 @@ <translation>(por defeito: %u)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Escolha a pasta de dados ao iniciar (por defeito: 0)</translation> - </message> - <message> <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> <translation>Copyright (C) 2009-%i Os Programadores do Bitcoin Core</translation> </message> @@ -2949,18 +2941,6 @@ <translation>Enviar informação de rastreio/depuração para a consola e não para o ficheiro debug.log</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Configurar certificados SSL root para pedido de pagamento (default: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Definir linguagem, por exemplo "pt_PT" (por defeito: linguagem do sistema)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Mostrar imagem ao iniciar (por defeito: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Encolher ficheiro debug.log ao iniciar o cliente (por defeito: 1 sem -debug definido)</translation> </message> @@ -2969,10 +2949,6 @@ <translation>Falhou assinatura da transação</translation> </message> <message> - <source>Start minimized</source> - <translation>Iniciar minimizado</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Quantia da transação é muito baixa</translation> </message> diff --git a/src/qt/locale/bitcoin_ro_RO.ts b/src/qt/locale/bitcoin_ro_RO.ts index 72ab2c5bdb..c88908263a 100644 --- a/src/qt/locale/bitcoin_ro_RO.ts +++ b/src/qt/locale/bitcoin_ro_RO.ts @@ -2716,10 +2716,6 @@ <translation>Atenţie: fişierul wallet.dat este corupt, date salvate! Fişierul original wallet.dat a fost salvat ca wallet.{timestamp}.bak in %s; dacă balansul sau tranzactiile sînt incorecte ar trebui să restauraţi dintr-o copie de siguranţă.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(iniţial: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> poate fi:</translation> </message> @@ -2856,10 +2852,6 @@ <translation>Acceptă cererile publice REST (implicit: %u)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Alege dosarul de date la pornire (implicit: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Conectare prin proxy SOCKS5</translation> </message> @@ -2916,22 +2908,10 @@ <translation>Trimitere tranzacţii ca tranzacţii taxă-zero dacă este posibil (implicit: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Setare rădăcină certificat SSL pentru cerere de plată (implicit: -sistem- )</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Setează limba, de exemplu: "de_DE" (implicit: sistem local)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Arată toate opţiunile de depanare (uz: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Afişează pe ecran splash la pornire (implicit: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Micşorează fişierul debug.log la pornirea clientului (implicit: 1 cînd nu se foloseşte -debug)</translation> </message> @@ -2940,10 +2920,6 @@ <translation>Nu s-a reuşit semnarea tranzacţiei</translation> </message> <message> - <source>Start minimized</source> - <translation>Începe minimizat</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Acesta este un program experimental.</translation> </message> diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts index b69a3bda54..ea577694ac 100644 --- a/src/qt/locale/bitcoin_ru.ts +++ b/src/qt/locale/bitcoin_ru.ts @@ -218,7 +218,15 @@ </context> <context> <name>BanTableModel</name> - </context> + <message> + <source>IP/Netmask</source> + <translation>IP/префикс</translation> + </message> + <message> + <source>Banned Until</source> + <translation>Заблокировано до</translation> + </message> +</context> <context> <name>BitcoinGUI</name> <message> @@ -421,6 +429,10 @@ <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> <translation>Показать помощь по Bitcoin Core и получить список доступных параметров командной строки.</translation> </message> + <message numerus="yes"> + <source>%n active connection(s) to Bitcoin network</source> + <translation><numerusform>%n активных соединений с сетью Bitcoin</numerusform><numerusform>%n активных соединений с сетью Bitcoin</numerusform><numerusform>%n активных соединений с сетью Bitcoin</numerusform><numerusform>%n активных соединений с сетью Bitcoin</numerusform></translation> + </message> <message> <source>No block source available...</source> <translation>Источник блоков недоступен...</translation> @@ -433,10 +445,22 @@ <source>%n hour(s)</source> <translation><numerusform>%n час</numerusform><numerusform>%n часа</numerusform><numerusform>%n часов</numerusform><numerusform>%n часов</numerusform></translation> </message> + <message numerus="yes"> + <source>%n day(s)</source> + <translation><numerusform>%n день</numerusform><numerusform>%n дня</numerusform><numerusform>%n дней</numerusform><numerusform>%n дней</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n неделю</numerusform><numerusform>%n недели</numerusform><numerusform>%n недель</numerusform><numerusform>%n недель</numerusform></translation> + </message> <message> <source>%1 and %2</source> <translation>%1 и %2</translation> </message> + <message numerus="yes"> + <source>%n year(s)</source> + <translation><numerusform>%n год</numerusform><numerusform>%n лет</numerusform><numerusform>%n лет</numerusform><numerusform>%n года</numerusform></translation> + </message> <message> <source>%1 behind</source> <translation>%1 позади</translation> @@ -893,7 +917,15 @@ <source>Error</source> <translation>Ошибка</translation> </message> - </context> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n ГБ свободного места доступно</numerusform><numerusform>%n ГБ свободного места доступно</numerusform><numerusform>%n ГБ свободного места доступно</numerusform><numerusform>%n ГБ свободного места доступно</numerusform></translation> + </message> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(из необходимых %n ГБ)</numerusform><numerusform>(из необходимых %n ГБ)</numerusform><numerusform>(из необходимых %n ГБ)</numerusform><numerusform>(из необходимых %n ГБ)</numerusform></translation> + </message> +</context> <context> <name>OpenURIDialog</name> <message> @@ -1044,10 +1076,34 @@ <translation>Порт прокси-сервера (например, 9050)</translation> </message> <message> + <source>Used for reaching peers via:</source> + <translation>Используется для достижения участников через:</translation> + </message> + <message> + <source>Shows, if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source> + <translation>Показывается, если включено прокси SOCKS5 по умолчанию, используемое для соединения с участниками по этому типу сети.</translation> + </message> + <message> + <source>IPv4</source> + <translation>IPv4</translation> + </message> + <message> + <source>IPv6</source> + <translation>IPv6</translation> + </message> + <message> <source>Tor</source> <translation>Tor</translation> </message> <message> + <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services.</source> + <translation>Подключаться к сети Bitcoin через прокси SOCKS5 для скрытых сервисов Tor.</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services:</source> + <translation>Использовать отдельный прокси SOCKS5 для соединения с участниками через скрытые сервисы Tor:</translation> + </message> + <message> <source>&Window</source> <translation>&Окно</translation> </message> @@ -1434,10 +1490,18 @@ <translation>&Участники</translation> </message> <message> + <source>Banned peers</source> + <translation>Заблокированные участники</translation> + </message> + <message> <source>Select a peer to view detailed information.</source> <translation>Выберите участника для просмотра подробностей.</translation> </message> <message> + <source>Whitelisted</source> + <translation>Доверенный</translation> + </message> + <message> <source>Direction</source> <translation>Направление</translation> </message> @@ -1446,6 +1510,18 @@ <translation>Версия</translation> </message> <message> + <source>Starting Block</source> + <translation>Начальный блок</translation> + </message> + <message> + <source>Synced Headers</source> + <translation>Синхронизировано заголовков</translation> + </message> + <message> + <source>Synced Blocks</source> + <translation>Синхронизировано блоков</translation> + </message> + <message> <source>User Agent</source> <translation>Юзер-агент</translation> </message> @@ -1474,6 +1550,14 @@ <translation>Время задержки</translation> </message> <message> + <source>The duration of a currently outstanding ping.</source> + <translation>Длительность текущего пинга.</translation> + </message> + <message> + <source>Ping Wait</source> + <translation>Время задержки</translation> + </message> + <message> <source>Time Offset</source> <translation>Смещение времени</translation> </message> @@ -1522,6 +1606,34 @@ <translation>Очистить консоль</translation> </message> <message> + <source>&Disconnect Node</source> + <translation>&Отключить узел</translation> + </message> + <message> + <source>Ban Node for</source> + <translation>Заблокировать узел на</translation> + </message> + <message> + <source>1 &hour</source> + <translation>1 &час</translation> + </message> + <message> + <source>1 &day</source> + <translation>1 &день</translation> + </message> + <message> + <source>1 &week</source> + <translation>1 &неделю</translation> + </message> + <message> + <source>1 &year</source> + <translation>1 &год</translation> + </message> + <message> + <source>&Unban Node</source> + <translation>&Разблокировать узел</translation> + </message> + <message> <source>Welcome to the Bitcoin Core RPC console.</source> <translation>Добро пожаловать в RPC-консоль Bitcoin Core.</translation> </message> @@ -1550,6 +1662,10 @@ <translation>%1 ГБ</translation> </message> <message> + <source>(node id: %1)</source> + <translation>(номер узла: %1)</translation> + </message> + <message> <source>via %1</source> <translation>через %1</translation> </message> @@ -1942,6 +2058,10 @@ <translation>Копировать размен</translation> </message> <message> + <source>Total Amount %1</source> + <translation>Общая сумма %1</translation> + </message> + <message> <source>or</source> <translation>или</translation> </message> @@ -2287,6 +2407,10 @@ <source>Status</source> <translation>Статус</translation> </message> + <message numerus="yes"> + <source>, broadcast through %n node(s)</source> + <translation><numerusform>, разослано через %n узел</numerusform><numerusform>, разослано через %n узла</numerusform><numerusform>, разослано через %n узлов</numerusform><numerusform>, разослано через %n узлов</numerusform></translation> + </message> <message> <source>Date</source> <translation>Дата</translation> @@ -2323,6 +2447,10 @@ <source>Credit</source> <translation>Кредит</translation> </message> + <message numerus="yes"> + <source>matures in %n more block(s)</source> + <translation><numerusform>будет доступно через %n блок</numerusform><numerusform>будет доступно через %n блока</numerusform><numerusform>будет доступно через %n блоков</numerusform><numerusform>будет доступно через %n блоков</numerusform></translation> + </message> <message> <source>not accepted</source> <translation>не принято</translation> @@ -2395,6 +2523,10 @@ <source>, has not been successfully broadcast yet</source> <translation>, ещё не было успешно разослано</translation> </message> + <message numerus="yes"> + <source>Open for %n more block(s)</source> + <translation><numerusform>Открыто для ещё %n блока</numerusform><numerusform>Открыто для ещё %n блоков</numerusform><numerusform>Открыто для ещё %n блоков</numerusform><numerusform>Открыто для ещё %n блоков</numerusform></translation> + </message> <message> <source>unknown</source> <translation>неизвестно</translation> @@ -2425,6 +2557,10 @@ <source>Immature (%1 confirmations, will be available after %2)</source> <translation>Незрелый (%1 подтверждений, будет доступен после %2)</translation> </message> + <message numerus="yes"> + <source>Open for %n more block(s)</source> + <translation><numerusform>Открыто для ещё %n блока</numerusform><numerusform>Открыто для ещё %n блоков</numerusform><numerusform>Открыто для ещё %n блоков</numerusform><numerusform>Открыто для ещё %n блоков</numerusform></translation> + </message> <message> <source>Open until %1</source> <translation>Открыто до %1</translation> @@ -2585,6 +2721,10 @@ <translation>Скопировать ID транзакции</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>Скопировать исходную транзакции</translation> + </message> + <message> <source>Edit label</source> <translation>Изменить метку</translation> </message> @@ -2732,10 +2872,42 @@ <translation>Принимать командную строку и команды JSON-RPC</translation> </message> <message> + <source>If <category> is not supplied or if <category> = 1, output all debugging information.</source> + <translation>Если <category> не предоставлена или равна 1, выводить всю отладочную информацию.</translation> + </message> + <message> + <source>Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source> + <translation>Максимальная сумма комиссий (%s) для одной транзакции в бумажнике; слишком низкое значение может вызвать прерывание больших транзакций (по умолчанию: %s)</translation> + </message> + <message> + <source>Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> + <translation>Внимание: убедитесь, что дата и время на Вашем компьютере выставлены верно! Если Ваши часы идут неправильно, Bitcoin Core будет работать некорректно.</translation> + </message> + <message> + <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source> + <translation>Удаление блоков выставлено ниже, чем минимум в %d Мб. Пожалуйста, используйте большее значение.</translation> + </message> + <message> + <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source> + <translation>Удаление: последняя синхронизация кошелька вышла за рамки удаленных данных. Вам нужен -reindex (скачать всю цепь блоков в случае удаленного узла)</translation> + </message> + <message> + <source>Reduce storage requirements by pruning (deleting) old blocks. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, >%u = target size in MiB to use for block files)</source> + <translation>Уменьшить размер хранилища за счёт удаления (обрезания) старых блоков. Этот режим несовместим с -txindex и -rescan. Внимание: переключение этой опции обратно потребует полной загрузки цепи блоков. (по умолчанию: 0 = отключить удаление блоков, >%u = целевой размер в Мб для файлов блоков)</translation> + </message> + <message> + <source>Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again.</source> + <translation>Повторное сканирование не возможно в режиме удаления. Вам надо будет использовать -reindex, который загрузит заново всю цепь блоков.</translation> + </message> + <message> <source>Error: A fatal internal error occurred, see debug.log for details</source> <translation>Ошибка: произошла неустранимая ошибка, подробности в debug.log</translation> </message> <message> + <source>Fee (in %s/kB) to add to transactions you send (default: %s)</source> + <translation>Комиссия (в %s/Кб) для добавления к вашим транзакциям (по умолчанию: %s)</translation> + </message> + <message> <source>Pruning blockstore...</source> <translation>Очистка хранилища блоков...</translation> </message> @@ -2744,6 +2916,10 @@ <translation>Запускаться в фоне как демон и принимать команды</translation> </message> <message> + <source>Unable to start HTTP server. See debug log for details.</source> + <translation>Невозможно запустить HTTP сервер. Смотри debug лог для подробностей.</translation> + </message> + <message> <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source> <translation>Принимать подключения извне (по умолчанию: 1, если не используется -proxy или -connect)</translation> </message> @@ -2768,6 +2944,10 @@ <translation>Задать число потоков проверки скрипта (от %u до %d, 0=авто, <0 = оставить столько ядер свободными, по умолчанию: %d)</translation> </message> <message> + <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source> + <translation>База данных блоков содержит блок, который появляется из будущего. Это может из-за некорректно установленных даты и времени на вашем компьютере. Остается только перестроивать базу блоков, если вы уверены, что дата и время корректны.</translation> + </message> + <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Это пре-релизная тестовая сборка - используйте на свой страх и риск - не используйте для добычи или торговых приложений</translation> </message> @@ -2776,6 +2956,10 @@ <translation>Не удалось забиндиться на %s на этом компьютере. Возможно, Bitcoin Core уже запущен.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: 1 when listening and no -proxy)</source> + <translation>Использовать UPnP для проброса порта (по умолчанию: 1, если используется прослушивание и нет -proxy)</translation> + </message> + <message> <source>WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)</source> <translation>ВНИМАНИЕ: сгенерировано ненормально большое число блоков, %d блоков получено за последние %d часов (ожидалось %d)</translation> </message> @@ -2800,8 +2984,8 @@ <translation>Вносить в белый список участников, подключающихся с указанной маски сети или IP. Можно использовать многократно.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(по умолчанию: 1)</translation> + <source>-maxmempool must be at least %d MB</source> + <translation>-maxmempool должен быть как минимум %d MB</translation> </message> <message> <source><category> can be:</source> @@ -2836,6 +3020,22 @@ <translation>Пересобрать БД блоков прямо сейчас?</translation> </message> <message> + <source>Enable publish hash block in <address></source> + <translation>Включить публичный хеш блока в <address></translation> + </message> + <message> + <source>Enable publish hash transaction in <address></source> + <translation>Включить публичный хеш транзакции в <address></translation> + </message> + <message> + <source>Enable publish raw block in <address></source> + <translation>Включить публичный сырой блок в <address></translation> + </message> + <message> + <source>Enable publish raw transaction in <address></source> + <translation>Включить публичную сырую транзакцию в <address></translation> + </message> + <message> <source>Error initializing block database</source> <translation>Ошибка инициализации БД блоков</translation> </message> @@ -2872,6 +3072,10 @@ <translation>Неверный -onion адрес: '%s'</translation> </message> <message> + <source>Keep the transaction memory pool below <n> megabytes (default: %u)</source> + <translation>Сбрасывать транзакции из памяти на диск каждые <n> мегабайт (по умолчанию: %u)</translation> + </message> + <message> <source>Not enough file descriptors available.</source> <translation>Недостаточно файловых дескрипторов.</translation> </message> @@ -2900,10 +3104,26 @@ <translation>Укажите файл бумажника (внутри каталога данных)</translation> </message> <message> + <source>Unsupported argument -benchmark ignored, use -debug=bench.</source> + <translation>Неподдерживаемый аргумент -benchmark проигнорирован, используйте -debug=bench.</translation> + </message> + <message> + <source>Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>Неподдерживаемый аргумент -debugnet проигнорирован, используйте -debug=net.</translation> + </message> + <message> + <source>Unsupported argument -tor found, use -onion.</source> + <translation>Обнаружен не поддерживаемый параметр -tor, используйте -onion.</translation> + </message> + <message> <source>Use UPnP to map the listening port (default: %u)</source> <translation>Использовать UPnP для проброса порта (по умолчанию: %u)</translation> </message> <message> + <source>User Agent comment (%s) contains unsafe characters.</source> + <translation>Комментарий пользователя (%s) содержит небезопасные символы.</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Проверка блоков...</translation> </message> @@ -2960,6 +3180,10 @@ <translation>Выполнить команду, когда приходит соответствующее сообщение о тревоге или наблюдается очень длинное расщепление цепи (%s в команде заменяется на сообщение)</translation> </message> <message> + <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source> + <translation>Комиссии (в %s/Кб) меньшие этого значения считаются нулевыми для создания, ретрансляции, получения транзакции (по умолчанию: %s)</translation> + </message> + <message> <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source> <translation>Если paytxfee не задан, включить достаточную комиссию для подтверждения транзакции в среднем за n блоков (по умолчанию: %u)</translation> </message> @@ -3016,12 +3240,20 @@ <translation>Активируется лучшая цепь...</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>Не удаётся разрешить адрес в параметре -whitebind: '%s'</translation> + <source>Always relay transactions received from whitelisted peers (default: %d)</source> + <translation>Всегда транслировать транзакции, полученные из белого списка участников (по умолчанию: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Выбрать каталог данных при запуске (по умолчанию: 0)</translation> + <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> + <translation>Попытаться восстановить приватные ключи из повреждённого wallet.dat при запуске</translation> + </message> + <message> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>Автоматически создавать скрытый Tor сервис (по умолчанию: %d)</translation> + </message> + <message> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Не удаётся разрешить адрес в параметре -whitebind: '%s'</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3040,6 +3272,10 @@ <translation>Ошибка чтения базы данных, работа завершается.</translation> </message> <message> + <source>Imports blocks from external blk000??.dat file on startup</source> + <translation>Импортировать блоки из внешнего файла blk000?.dat при запуске</translation> + </message> + <message> <source>Information</source> <translation>Информация</translation> </message> @@ -3092,30 +3328,26 @@ <translation>Получать и отображать P2P сетевые тревоги (по умолчанию: %u)</translation> </message> <message> - <source>Send trace/debug info to console instead of debug.log file</source> - <translation>Выводить информацию трассировки/отладки на консоль вместо файла debug.log</translation> + <source>Reducing -maxconnections from %d to %d, because of system limitations.</source> + <translation>Уменьшите -maxconnections с %d до %d, из-за ограничений системы.</translation> </message> <message> - <source>Send transactions as zero-fee transactions if possible (default: %u)</source> - <translation>Осуществить транзакцию бесплатно, если возможно (по умолчанию: %u)</translation> + <source>Rescan the block chain for missing wallet transactions on startup</source> + <translation>Перепроверить цепь блоков на предмет отсутствующих в бумажнике транзакций при запуске</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Указать корневые SSL-сертификаты для запроса платежа (по умолчанию: -system-)</translation> + <source>Send trace/debug info to console instead of debug.log file</source> + <translation>Выводить информацию трассировки/отладки на консоль вместо файла debug.log</translation> </message> <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Выберите язык, например "de_DE" (по умолчанию: как в системе)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Осуществить транзакцию бесплатно, если возможно (по умолчанию: %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Показать все отладочные параметры (использование: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Показывать сплэш при запуске (по умолчанию: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Сжимать файл debug.log при запуске клиента (по умолчанию: 1, если нет -debug)</translation> </message> @@ -3124,10 +3356,6 @@ <translation>Не удалось подписать транзакцию</translation> </message> <message> - <source>Start minimized</source> - <translation>Запускать свёрнутым</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Сумма транзакции слишком мала для уплаты комиссии</translation> </message> @@ -3136,6 +3364,14 @@ <translation>Это экспериментальное ПО.</translation> </message> <message> + <source>Tor control port password (default: empty)</source> + <translation>Пароль контроля порта Tor (по умолчанию: пустой)</translation> + </message> + <message> + <source>Tor control port to use if onion listening enabled (default: %s)</source> + <translation>Порт контроля Tor используется, если включено прослушивание onion (по умолчанию: %s)</translation> + </message> + <message> <source>Transaction amount too small</source> <translation>Сумма транзакции слишком мала</translation> </message> @@ -3152,14 +3388,14 @@ <translation>Транзакция слишком большая</translation> </message> <message> - <source>UI Options:</source> - <translation>Настройки интерфейса:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Невозможно привязаться к %s на этом компьютере (bind вернул ошибку %s)</translation> </message> <message> + <source>Upgrade wallet to latest format on startup</source> + <translation>Обновить бумажник до последнего формата при запуске</translation> + </message> + <message> <source>Username for JSON-RPC connections</source> <translation>Имя для подключений JSON-RPC</translation> </message> @@ -3172,10 +3408,18 @@ <translation>Внимание</translation> </message> <message> + <source>Whether to operate in a blocks only mode (default: %u)</source> + <translation>Будет работать в режиме только блоков (по умолчанию: %u)</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>Стираем все транзакции из кошелька...</translation> </message> <message> + <source>ZeroMQ notification options:</source> + <translation>ZeroMQ параметры оповещения:</translation> + </message> + <message> <source>wallet.dat corrupt, salvage failed</source> <translation>wallet.dat повреждён, спасение данных не удалось</translation> </message> @@ -3208,6 +3452,22 @@ <translation>(1 = сохранять метаданные транзакции: например, владельца аккаунта и информацию запроса платежа; 2 = отбросить метаданные)</translation> </message> <message> + <source>-maxtxfee is set very high! Fees this large could be paid on a single transaction.</source> + <translation>Установлено очень большое значение -maxtxfee. Такие большие комиссии могут быть уплачены в отдельной транзакции.</translation> + </message> + <message> + <source>-paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> + <translation>Установлено очень большое значение -paytxfee. Такие большие комиссии могут быть уплачены в отдельной транзакции.</translation> + </message> + <message> + <source>Do not keep transactions in the mempool longer than <n> hours (default: %u)</source> + <translation>Не хранить транзакции в памяти дольше, чем <n> часов (по умолчанию %u)</translation> + </message> + <message> + <source>Error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source> + <translation>Ошибка чтения wallet.dat! Все ключи прочитаны верно, но данные транзакций или записи адресной книги могут отсутствовать или быть неправильными.</translation> + </message> + <message> <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> <translation>Насколько тщательна проверка контрольных блоков -checkblocks (0-4, по умолчанию: %u)</translation> </message> @@ -3224,6 +3484,18 @@ <translation>Выводить отладочную информацию (по умолчанию: %u, указание <category> необязательно)</translation> </message> <message> + <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source> + <translation>Текущая длина строки версии сети (%i) превышает максимальную длину (%i). Увеливается количество или размер uacomments.</translation> + </message> + <message> + <source>Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)</source> + <translation>Пытается ограничить исходящий трафик до (в МБ за 24ч), 0 = не ограничивать (по умолчанию: %d)</translation> + </message> + <message> + <source>Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source> + <translation>Обнаружен не поддерживаемый аргумент -socks. Выбор версии SOCKS более невозможен, поддерживаются только прокси SOCKS5.</translation> + </message> + <message> <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> <translation>Использовать отдельный прокси SOCKS5 для соединения с участниками через скрытые сервисы Tor (по умолчанию: %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_ru_RU.ts b/src/qt/locale/bitcoin_ru_RU.ts new file mode 100644 index 0000000000..fa42dfaaad --- /dev/null +++ b/src/qt/locale/bitcoin_ru_RU.ts @@ -0,0 +1,229 @@ +<TS language="ru_RU" version="2.1"> +<context> + <name>AddressBookPage</name> + </context> +<context> + <name>AddressTableModel</name> + </context> +<context> + <name>AskPassphraseDialog</name> + </context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>Error</source> + <translation>Ошибка</translation> + </message> + <message> + <source>Warning</source> + <translation>Предупреждение</translation> + </message> + <message> + <source>Information</source> + <translation>Информация</translation> + </message> + </context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + <message> + <source>Confirmations</source> + <translation>Подтверждения</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Подтвержденные</translation> + </message> + <message> + <source>Copy address</source> + <translation>Копировать адрес</translation> + </message> + <message> + <source>yes</source> + <translation>Да</translation> + </message> + <message> + <source>no</source> + <translation>Нет</translation> + </message> + </context> +<context> + <name>EditAddressDialog</name> + <message> + <source>Edit Address</source> + <translation>Изменить адрес</translation> + </message> + </context> +<context> + <name>FreespaceChecker</name> + </context> +<context> + <name>HelpMessageDialog</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>version</source> + <translation>версия</translation> + </message> + <message> + <source>About Bitcoin Core</source> + <translation>О Bitcoin Core</translation> + </message> + <message> + <source>Command-line options</source> + <translation>Опции командной строки</translation> + </message> + </context> +<context> + <name>Intro</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>Error</source> + <translation>Ошибка</translation> + </message> + </context> +<context> + <name>OpenURIDialog</name> + <message> + <source>Open URI</source> + <translation>Открыть URI</translation> + </message> + <message> + <source>URI:</source> + <translation>URI:</translation> + </message> + </context> +<context> + <name>OptionsDialog</name> + </context> +<context> + <name>OverviewPage</name> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + </context> +<context> + <name>ReceiveCoinsDialog</name> + </context> +<context> + <name>ReceiveRequestDialog</name> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + </context> +<context> + <name>SendCoinsEntry</name> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + </context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + </context> +<context> + <name>TransactionDescDialog</name> + </context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>Copy address</source> + <translation>Копировать адрес</translation> + </message> + <message> + <source>Confirmed</source> + <translation>Подтвержденные</translation> + </message> + <message> + <source>Date</source> + <translation>Дата</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + </context> +<context> + <name>bitcoin-core</name> + <message> + <source>Information</source> + <translation>Информация</translation> + </message> + <message> + <source>Warning</source> + <translation>Предупреждение</translation> + </message> + <message> + <source>Error</source> + <translation>Ошибка</translation> + </message> +</context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_sah.ts b/src/qt/locale/bitcoin_sah.ts deleted file mode 100644 index 8af88a87d5..0000000000 --- a/src/qt/locale/bitcoin_sah.ts +++ /dev/null @@ -1,113 +0,0 @@ -<TS language="sah" version="2.1"> -<context> - <name>AddressBookPage</name> - </context> -<context> - <name>AddressTableModel</name> - </context> -<context> - <name>AskPassphraseDialog</name> - </context> -<context> - <name>BanTableModel</name> - </context> -<context> - <name>BitcoinGUI</name> - </context> -<context> - <name>ClientModel</name> - </context> -<context> - <name>CoinControlDialog</name> - </context> -<context> - <name>EditAddressDialog</name> - </context> -<context> - <name>FreespaceChecker</name> - </context> -<context> - <name>HelpMessageDialog</name> - </context> -<context> - <name>Intro</name> - </context> -<context> - <name>OpenURIDialog</name> - </context> -<context> - <name>OptionsDialog</name> - </context> -<context> - <name>OverviewPage</name> - </context> -<context> - <name>PaymentServer</name> - </context> -<context> - <name>PeerTableModel</name> - </context> -<context> - <name>QObject</name> - </context> -<context> - <name>QRImageWidget</name> - </context> -<context> - <name>RPCConsole</name> - </context> -<context> - <name>ReceiveCoinsDialog</name> - </context> -<context> - <name>ReceiveRequestDialog</name> - </context> -<context> - <name>RecentRequestsTableModel</name> - </context> -<context> - <name>SendCoinsDialog</name> - </context> -<context> - <name>SendCoinsEntry</name> - </context> -<context> - <name>ShutdownWindow</name> - </context> -<context> - <name>SignVerifyMessageDialog</name> - </context> -<context> - <name>SplashScreen</name> - </context> -<context> - <name>TrafficGraphWidget</name> - </context> -<context> - <name>TransactionDesc</name> - </context> -<context> - <name>TransactionDescDialog</name> - </context> -<context> - <name>TransactionTableModel</name> - </context> -<context> - <name>TransactionView</name> - </context> -<context> - <name>UnitDisplayStatusBarControl</name> - </context> -<context> - <name>WalletFrame</name> - </context> -<context> - <name>WalletModel</name> - </context> -<context> - <name>WalletView</name> - </context> -<context> - <name>bitcoin-core</name> - </context> -</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts index 83f5f2c8e7..0451b1485e 100644 --- a/src/qt/locale/bitcoin_sk.ts +++ b/src/qt/locale/bitcoin_sk.ts @@ -2798,10 +2798,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Uzle na zoznam povolených, ktoré sa pripájajú z danej netmask alebo IP adresy. Môže byť zadané viac krát.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(predvolené: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> môže byť:</translation> </message> @@ -2986,10 +2982,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Nedá sa vyriešiť -whitebind adresa: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Zvoľte dátový priečinok pri štarte (prednastavené: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Pripojiť cez proxy server SOCKS5</translation> </message> @@ -3058,22 +3050,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Poslať ako transakcie bez poplatku, ak je to možné (predvolené: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Nastaviť koreňový certifikát pre výzvy na platbu (prednastavené: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Nastaviť jazyk, napríklad "sk_SK" (predvolené: systémový)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Zobraziť všetky možnosti ladenia (použitie: --help --help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Zobraziť splash screen pri spustení (predvolené: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Zmenšiť debug.log pri spustení klienta (predvolené: 1 ak bez -debug)</translation> </message> @@ -3082,10 +3062,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Podpísanie správy zlyhalo</translation> </message> <message> - <source>Start minimized</source> - <translation>Spustiť minimalizované</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Toto je experimentálny softvér.</translation> </message> @@ -3106,10 +3082,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Transakcia príliš veľká</translation> </message> <message> - <source>UI Options:</source> - <translation>Možnosti používateľského rozhrania:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Na tomto počítači sa nedá vytvoriť väzba %s (vytvorenie väzby vrátilo chybu %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_sl_SI.ts b/src/qt/locale/bitcoin_sl_SI.ts index ca65810396..f26e350545 100644 --- a/src/qt/locale/bitcoin_sl_SI.ts +++ b/src/qt/locale/bitcoin_sl_SI.ts @@ -2832,10 +2832,6 @@ <translation>Sprejemaj povezave samo od soležnikov, ki so na naslovih, ki ustrezajo navedeni omrežni maski ali naslovu. Opcijo lahko navedete večkrat.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(privzeto: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> je lahko:</translation> </message> @@ -3012,10 +3008,6 @@ <translation>Naslova %s, podanega pri opciji -whitebind ni mogoče razrešiti.</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Ob zagonu pozovi uporabnika, naj izbere podatkovno mapo (privzeto: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Poveži se preko posredniškega strežnika SOCKS5</translation> </message> @@ -3036,18 +3028,6 @@ <translation>Pošilja sledilne/razhroščevalne informacije na konzolo namesto v datoteko debug.log</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Nastavi korenske certifikate SSL za preverjanje zahtevkov za plačilo (privzeto: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Nastavi jezik, npr. "sl_SI" (privzeto: jezik sistema)</translation> - </message> - <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Ob zagonu prikaži uvodni zaslon (privzeto: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Ob zagonu skrajšaj datoteko debug.log (privzeto: 1, če ni vklopljena opcija -debug)</translation> </message> @@ -3056,10 +3036,6 @@ <translation>Transakcije ni bilo mogoče podpisati.</translation> </message> <message> - <source>Start minimized</source> - <translation>Zaženi v minimiranem oknu</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Program je eksperimentalne narave.</translation> </message> @@ -3076,10 +3052,6 @@ <translation>Transkacija je prevelika</translation> </message> <message> - <source>UI Options:</source> - <translation>Možnosti uporabniškega vmesnika:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Na tem računalniku ni bilo mogoče vezati naslova %s (vrnjena napaka: %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts index 69c175645b..18f096b841 100644 --- a/src/qt/locale/bitcoin_sv.ts +++ b/src/qt/locale/bitcoin_sv.ts @@ -2055,6 +2055,10 @@ Var vänlig och försök igen.</translation> <translation>Kopiera växel</translation> </message> <message> + <source>Total Amount %1</source> + <translation>Total summa %1</translation> + </message> + <message> <source>or</source> <translation>eller</translation> </message> @@ -2086,6 +2090,10 @@ Var vänlig och försök igen.</translation> <source>Payment request expired.</source> <translation>Betalningsbegäran löpte ut.</translation> </message> + <message> + <source>Pay only the required fee of %1</source> + <translation>Betala endast den nödvändiga avgiften på %1</translation> + </message> <message numerus="yes"> <source>Estimated to begin confirmation within %n block(s).</source> <translation><numerusform>Uppskattas till att påbörja bekräftelse inom %n block.</numerusform><numerusform>Uppskattas till att påbörja bekräftelse inom %n block.</numerusform></translation> @@ -2718,6 +2726,10 @@ Var vänlig och försök igen.</translation> <translation>Kopiera transaktions ID</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>Kopiera rå transaktion</translation> + </message> + <message> <source>Edit label</source> <translation>Ändra etikett</translation> </message> @@ -2977,10 +2989,6 @@ Var vänlig och försök igen.</translation> <translation>Vitlista klienter som ansluter från angivna nätmasker eller IP-adresser. Kan specificeras flera gånger.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(förvalt: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>-maxmempool måste vara minst %d MB</translation> </message> @@ -3177,6 +3185,10 @@ Var vänlig och försök igen.</translation> <translation>Exekvera kommando när ett relevant meddelande är mottagen eller när vi ser en väldigt lång förgrening (%s i cmd är utbytt med ett meddelande)</translation> </message> <message> + <source>Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)</source> + <translation>Avgifter (i %s/kB) mindre än detta betraktas som nollavgift för vidarebefordran, mining och transaktionsskapande (förvalt: %s)</translation> + </message> + <message> <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source> <translation>Om paytxfee inte är satt, inkludera tillräcklig avgift så att transaktionen börjar att konfirmeras inom n blocks (förvalt: %u)</translation> </message> @@ -3229,12 +3241,20 @@ Var vänlig och försök igen.</translation> <translation>Aktiverar bästa kedjan...</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>Kan inte matcha -whitebind adress: '%s'</translation> + <source>Always relay transactions received from whitelisted peers (default: %d)</source> + <translation>Vidarebefordra alltid transaktioner från vitlistade noder (förval: %d)</translation> + </message> + <message> + <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> + <translation>Försök att rädda privata nycklar från en korrupt wallet.dat vid uppstart</translation> + </message> + <message> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>Skapa automatiskt dold tjänst i Tor (förval: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Välj datakatalog vid uppstart (förvalt: 0)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Kan inte matcha -whitebind adress: '%s'</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3253,6 +3273,10 @@ Var vänlig och försök igen.</translation> <translation>Fel vid läsning från databas, avslutar.</translation> </message> <message> + <source>Imports blocks from external blk000??.dat file on startup</source> + <translation>Importera block från extern blk000??.dat-fil vid uppstart</translation> + </message> + <message> <source>Information</source> <translation>Information</translation> </message> @@ -3309,6 +3333,10 @@ Var vänlig och försök igen.</translation> <translation>Minskar -maxconnections från %d till %d, på grund av systembegränsningar.</translation> </message> <message> + <source>Rescan the block chain for missing wallet transactions on startup</source> + <translation>Sök i blockkedjan efter saknade plånbokstransaktioner vid uppstart</translation> + </message> + <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Skicka trace-/debuginformation till terminalen istället för till debug.log</translation> </message> @@ -3317,22 +3345,10 @@ Var vänlig och försök igen.</translation> <translation>Sänd transaktioner som nollavgiftstransaktioner om möjligt (förvalt: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Sätt SSL root-certifikat för betalningsbegäran (förvalt: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Ändra språk, till exempel "de_DE" (förvalt: systemets språk)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Visa alla avlusningsalternativ (använd: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Visa startbilden vid uppstart (förvalt: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Krymp debug.log filen vid klient start (förvalt: 1 vid ingen -debug)</translation> </message> @@ -3341,10 +3357,6 @@ Var vänlig och försök igen.</translation> <translation>Signering av transaktion misslyckades</translation> </message> <message> - <source>Start minimized</source> - <translation>Starta som minimerad</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Transaktionen är för liten för att betala avgiften</translation> </message> @@ -3353,6 +3365,14 @@ Var vänlig och försök igen.</translation> <translation>Detta är experimentmjukvara.</translation> </message> <message> + <source>Tor control port password (default: empty)</source> + <translation>Lösenord för Tor-kontrollport (förval: inget)</translation> + </message> + <message> + <source>Tor control port to use if onion listening enabled (default: %s)</source> + <translation>Tor-kontrollport att använda om onion är aktiverat (förval: %s)</translation> + </message> + <message> <source>Transaction amount too small</source> <translation>Transaktions belopp för liten</translation> </message> @@ -3369,14 +3389,14 @@ Var vänlig och försök igen.</translation> <translation>Transaktionen är för stor</translation> </message> <message> - <source>UI Options:</source> - <translation>UI Alternativ:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Det går inte att binda till %s på den här datorn (bind returnerade felmeddelande %s)</translation> </message> <message> + <source>Upgrade wallet to latest format on startup</source> + <translation>Uppgradera plånbok till senaste formatet vid uppstart</translation> + </message> + <message> <source>Username for JSON-RPC connections</source> <translation>Användarnamn för JSON-RPC-anslutningar</translation> </message> @@ -3389,6 +3409,10 @@ Var vänlig och försök igen.</translation> <translation>Varning</translation> </message> <message> + <source>Whether to operate in a blocks only mode (default: %u)</source> + <translation>Ska allt göras i endast block-läge (förval: %u)</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>Töm plånboken på alla transaktioner...</translation> </message> diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts index fa8392b3df..36ca1ab6fe 100644 --- a/src/qt/locale/bitcoin_tr.ts +++ b/src/qt/locale/bitcoin_tr.ts @@ -2836,10 +2836,6 @@ <translation>Belirtilen ağ maskesi ya da IP adresinden bağlanan eşleri beyaz listeye al. Birden fazla kez belirtilebilir.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(varsayılan: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><kategori> şunlar olabilir:</translation> </message> @@ -3056,10 +3052,6 @@ <translation>-whitebind adresi çözümlenemedi: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Başlangıçta veri klasörü seç (varsayılan: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>SOCKS5 vekil sunucusu vasıtasıyla bağlan</translation> </message> @@ -3136,22 +3128,10 @@ <translation>Muameleleri mümkünse ücretsiz olarak gönder (varsayılan: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Ödeme talebi için SSL kök sertifikalarını belirle (varsayılan: -system-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Lisan belirt, mesela "de_De" (varsayılan: sistem dili)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Tüm hata ayıklama seçeneklerini göster (kullanımı: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Başlatıldığında başlangıç ekranını göster (varsayılan: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>İstemci başlatıldığında debug.log dosyasını küçült (varsayılan: -debug bulunmadığında 1)</translation> </message> @@ -3160,10 +3140,6 @@ <translation>Muamelenin imzalanması başarısız oldu</translation> </message> <message> - <source>Start minimized</source> - <translation>Küçültülmüş olarak başlat</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Muamele meblağı ücreti ödemek için çok düşük</translation> </message> @@ -3188,10 +3164,6 @@ <translation>Muamele çok büyük</translation> </message> <message> - <source>UI Options:</source> - <translation>Arayüz Seçenkleri:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Bu bilgisayarda %s unsuruna bağlanılamadı (bağlanma %s hatasını verdi)</translation> </message> diff --git a/src/qt/locale/bitcoin_tr_TR.ts b/src/qt/locale/bitcoin_tr_TR.ts new file mode 100644 index 0000000000..bca64ba05d --- /dev/null +++ b/src/qt/locale/bitcoin_tr_TR.ts @@ -0,0 +1,265 @@ +<TS language="tr_TR" version="2.1"> +<context> + <name>AddressBookPage</name> + <message> + <source>Right-click to edit address or label</source> + <translation>Adresi veya etiketi düzenlemek için sağ tıklayın</translation> + </message> + <message> + <source>Create a new address</source> + <translation>Yeni adres oluştur</translation> + </message> + <message> + <source>&New</source> + <translation>&Yeni</translation> + </message> + <message> + <source>Copy the currently selected address to the system clipboard</source> + <translation>Seçili adresi panoya kopyala</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Kopyala</translation> + </message> + <message> + <source>C&lose</source> + <translation>K&apat</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>&Adresi Kopyala</translation> + </message> + <message> + <source>Delete the currently selected address from the list</source> + <translation>Seçili adresi listeden sil</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Seçili sekmedeki veriyi dosya olarak dışa aktar</translation> + </message> + <message> + <source>&Export</source> + <translation>&Dışa Aktar</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Sil</translation> + </message> + <message> + <source>Choose the address to send coins to</source> + <translation>Para göndereceğiniz adresi seçin</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Parayı alacağınız adresi seçin</translation> + </message> + <message> + <source>C&hoose</source> + <translation>S&eç</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Gönderim adresleri</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Alış adresleri</translation> + </message> + <message> + <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> + <translation>Bunlar ödeme gönderebileceğiniz Bitcoin adreslerinizdir. Para göndermeden önce mutlaka alıcı adresini ve tutarı kontrol edin.</translation> + </message> + <message> + <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> + <translation>Bunlar ödeme alabileceğiniz Bitcoin adreslerinizdir. Her işlem için yeni bir adres kullanmanız önerilir.</translation> + </message> + <message> + <source>Copy &Label</source> + <translation>Kopyala &Etiketle</translation> + </message> + <message> + <source>&Edit</source> + <translation>&Düzenle</translation> + </message> + <message> + <source>Export Address List</source> + <translation>Adres Listesini Dışa Aktar</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Dışa Aktarma Başarısız Oldu</translation> + </message> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>Adres listesini %1'e kaydederken bir hata oluştu. Lütfen tekrar deneyin.</translation> + </message> +</context> +<context> + <name>AddressTableModel</name> + <message> + <source>Label</source> + <translation>Etiket</translation> + </message> + <message> + <source>Address</source> + <translation>Adres</translation> + </message> + <message> + <source>(no label)</source> + <translation>(etiket yok)</translation> + </message> +</context> +<context> + <name>AskPassphraseDialog</name> + </context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + </context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>(no label)</source> + <translation>(etiket yok)</translation> + </message> + </context> +<context> + <name>EditAddressDialog</name> + </context> +<context> + <name>FreespaceChecker</name> + </context> +<context> + <name>HelpMessageDialog</name> + </context> +<context> + <name>Intro</name> + </context> +<context> + <name>OpenURIDialog</name> + </context> +<context> + <name>OptionsDialog</name> + </context> +<context> + <name>OverviewPage</name> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + </context> +<context> + <name>ReceiveCoinsDialog</name> + </context> +<context> + <name>ReceiveRequestDialog</name> + <message> + <source>Address</source> + <translation>Adres</translation> + </message> + <message> + <source>Label</source> + <translation>Etiket</translation> + </message> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Label</source> + <translation>Etiket</translation> + </message> + <message> + <source>(no label)</source> + <translation>(etiket yok)</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>(no label)</source> + <translation>(etiket yok)</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + </context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + </context> +<context> + <name>TransactionDescDialog</name> + </context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Label</source> + <translation>Etiket</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>Exporting Failed</source> + <translation>Dışa Aktarma Başarısız Oldu</translation> + </message> + <message> + <source>Label</source> + <translation>Etiket</translation> + </message> + <message> + <source>Address</source> + <translation>Adres</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + <message> + <source>&Export</source> + <translation>&Dışa Aktar</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Seçili sekmedeki veriyi dosya olarak dışa aktar</translation> + </message> + </context> +<context> + <name>bitcoin-core</name> + </context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts index e0afa8eff8..5e2a06c731 100644 --- a/src/qt/locale/bitcoin_uk.ts +++ b/src/qt/locale/bitcoin_uk.ts @@ -2980,10 +2980,6 @@ <translation>Додати учасників, що під'єднуються з заданої підмережі чи IP-адреси, в білий список. Можна вказувати декілька разів.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(типово: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>-maxmempool має бути не менше %d МБ</translation> </message> @@ -3224,10 +3220,6 @@ <translation>Не вдалося розпізнати адресу для -whitebind: «%s»</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Обрати каталог даних під час запуску (типово: 0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>Підключитись через SOCKS5-проксі</translation> </message> @@ -3308,22 +3300,10 @@ <translation>Не сплачувати комісію за надсилання транзакцій, якщо це можливо (типово: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Вказати кореневі SSL-сертифікати для запиту платежу (типово: -системні-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>Встановлення мови, наприклад "de_DE" (типово: системна)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Показати всі налагоджувальні параметри (використання: --help -help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>Показувати заставку під час запуску (типово: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Стискати файл debug.log під час старту клієнта (типово: 1 коли відсутній параметр -debug)</translation> </message> @@ -3332,10 +3312,6 @@ <translation>Підписання транзакції не вдалося</translation> </message> <message> - <source>Start minimized</source> - <translation>Запускати згорнутим</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>Неможливо сплатити комісію із-за малої суми транзакції</translation> </message> @@ -3360,10 +3336,6 @@ <translation>Транзакція занадто велика</translation> </message> <message> - <source>UI Options:</source> - <translation>Параметри інтерфейсу:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>Неможливо прив'язатися до %s на цьому комп'ютері (bind повернув помилку: %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_uz@Cyrl.ts b/src/qt/locale/bitcoin_uz@Cyrl.ts index 004857cf01..4350d0ac8a 100644 --- a/src/qt/locale/bitcoin_uz@Cyrl.ts +++ b/src/qt/locale/bitcoin_uz@Cyrl.ts @@ -2114,22 +2114,10 @@ <translation>Уланиш кўрсаткичлари:</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>Ишга тушиш вақтида маълумотлар директориясини танлаш (стандарт: 0)</translation> - </message> - <message> <source>Information</source> <translation>Маълумот</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>Тўлов сўровлари учун SSL асос сертификатларини ўрнатиш (стандарт: -system-)</translation> - </message> - <message> - <source>Start minimized</source> - <translation>Йиғилганларни бошлаш</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>JSON-RPC уланишлари учун фойдаланувчи номи</translation> </message> diff --git a/src/qt/locale/bitcoin_zh.ts b/src/qt/locale/bitcoin_zh.ts new file mode 100644 index 0000000000..288c1c5f25 --- /dev/null +++ b/src/qt/locale/bitcoin_zh.ts @@ -0,0 +1,217 @@ +<TS language="zh" version="2.1"> +<context> + <name>AddressBookPage</name> + </context> +<context> + <name>AddressTableModel</name> + </context> +<context> + <name>AskPassphraseDialog</name> + </context> +<context> + <name>BanTableModel</name> + </context> +<context> + <name>BitcoinGUI</name> + <message> + <source>Error</source> + <translation>错误</translation> + </message> + <message> + <source>Warning</source> + <translation>警告</translation> + </message> + </context> +<context> + <name>ClientModel</name> + </context> +<context> + <name>CoinControlDialog</name> + <message> + <source>Date</source> + <translation>日期</translation> + </message> + </context> +<context> + <name>EditAddressDialog</name> + </context> +<context> + <name>FreespaceChecker</name> + </context> +<context> + <name>HelpMessageDialog</name> + </context> +<context> + <name>Intro</name> + <message> + <source>Error</source> + <translation>错误</translation> + </message> + </context> +<context> + <name>OpenURIDialog</name> + </context> +<context> + <name>OptionsDialog</name> + </context> +<context> + <name>OverviewPage</name> + </context> +<context> + <name>PaymentServer</name> + </context> +<context> + <name>PeerTableModel</name> + </context> +<context> + <name>QObject</name> + </context> +<context> + <name>QRImageWidget</name> + </context> +<context> + <name>RPCConsole</name> + </context> +<context> + <name>ReceiveCoinsDialog</name> + </context> +<context> + <name>ReceiveRequestDialog</name> + </context> +<context> + <name>RecentRequestsTableModel</name> + <message> + <source>Date</source> + <translation>日期</translation> + </message> + </context> +<context> + <name>SendCoinsDialog</name> + <message> + <source>Choose...</source> + <translation>选择...</translation> + </message> + <message> + <source>Pay only the required fee of %1</source> + <translation>仅支付全额的%1</translation> + </message> + <message> + <source>The recipient address is not valid. Please recheck.</source> + <translation>收款人地址无效,请再次确认。</translation> + </message> + <message> + <source>Warning: Invalid Bitcoin address</source> + <translation>警告:比特币地址无效</translation> + </message> + </context> +<context> + <name>SendCoinsEntry</name> + </context> +<context> + <name>ShutdownWindow</name> + </context> +<context> + <name>SignVerifyMessageDialog</name> + </context> +<context> + <name>SplashScreen</name> + </context> +<context> + <name>TrafficGraphWidget</name> + </context> +<context> + <name>TransactionDesc</name> + <message> + <source>Date</source> + <translation>日期</translation> + </message> + </context> +<context> + <name>TransactionDescDialog</name> + </context> +<context> + <name>TransactionTableModel</name> + <message> + <source>Date</source> + <translation>日期</translation> + </message> + </context> +<context> + <name>TransactionView</name> + <message> + <source>Date</source> + <translation>日期</translation> + </message> + </context> +<context> + <name>UnitDisplayStatusBarControl</name> + </context> +<context> + <name>WalletFrame</name> + </context> +<context> + <name>WalletModel</name> + </context> +<context> + <name>WalletView</name> + </context> +<context> + <name>bitcoin-core</name> + <message> + <source>Transaction amounts must be positive</source> + <translation>转账额度须为正数</translation> + </message> + <message> + <source>Transaction too large for fee policy</source> + <translation>根据费率标准,本次转账超额</translation> + </message> + <message> + <source>Transaction too large</source> + <translation>超额转账</translation> + </message> + <message> + <source>Warning</source> + <translation>警告</translation> + </message> + <message> + <source>wallet.dat corrupt, salvage failed</source> + <translation>wallet.dat文件受损,修复失败</translation> + </message> + <message> + <source>This help message</source> + <translation>此条帮助信息</translation> + </message> + <message> + <source>Loading addresses...</source> + <translation>正在载入地址...</translation> + </message> + <message> + <source>Error loading wallet.dat: Wallet corrupted</source> + <translation>wallet.dat文件加载错误:钱包受损</translation> + </message> + <message> + <source>Error loading wallet.dat</source> + <translation>wallet.dat文件加载错误</translation> + </message> + <message> + <source>Insufficient funds</source> + <translation>余额不足</translation> + </message> + <message> + <source>Loading wallet...</source> + <translation>正在载入钱包...</translation> + </message> + <message> + <source>Rescanning...</source> + <translation>再次扫描...</translation> + </message> + <message> + <source>Done loading</source> + <translation>载入完成</translation> + </message> + <message> + <source>Error</source> + <translation>错误</translation> + </message> +</context> +</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts index 1cd7eed503..778462e681 100644 --- a/src/qt/locale/bitcoin_zh_CN.ts +++ b/src/qt/locale/bitcoin_zh_CN.ts @@ -2901,10 +2901,6 @@ <translation>节点白名单,网络掩码或IP址。可多次指定。</translation> </message> <message> - <source>(default: 1)</source> - <translation>(默认值: 1)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> 可能是:</translation> </message> @@ -3121,10 +3117,6 @@ <translation>无法解析 -whitebind 地址: '%s'</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>在启动时选择数据目录(默认:0)</translation> - </message> - <message> <source>Connect through SOCKS5 proxy</source> <translation>通过 SOCKS5 代理连接</translation> </message> @@ -3197,22 +3189,10 @@ <translation>发送时尽可能 不支付交易费用 (默认: %u) </translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>设置SSL根证书的付款请求(默认:-系统-)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>设置语言, 例如“zh-TW”(默认为系统语言)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>显示所有调试选项 (用法: --帮助 -帮助调试)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>启动时显示版权页 (缺省: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>客户端启动时压缩debug.log文件(缺省:no-debug模式时为1)</translation> </message> @@ -3221,11 +3201,6 @@ <translation>签署交易失败</translation> </message> <message> - <source>Start minimized</source> - <translation>启动时最小化 -</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>交易金额太小,不足以支付交易费</translation> </message> @@ -3250,10 +3225,6 @@ <translation>交易太大</translation> </message> <message> - <source>UI Options:</source> - <translation>界面选项:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>无法在此计算机上绑定 %s (绑定返回错误 %s)</translation> </message> diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts deleted file mode 100644 index 4b4c1c687d..0000000000 --- a/src/qt/locale/bitcoin_zh_HK.ts +++ /dev/null @@ -1,113 +0,0 @@ -<TS language="zh_HK" version="2.1"> -<context> - <name>AddressBookPage</name> - </context> -<context> - <name>AddressTableModel</name> - </context> -<context> - <name>AskPassphraseDialog</name> - </context> -<context> - <name>BanTableModel</name> - </context> -<context> - <name>BitcoinGUI</name> - </context> -<context> - <name>ClientModel</name> - </context> -<context> - <name>CoinControlDialog</name> - </context> -<context> - <name>EditAddressDialog</name> - </context> -<context> - <name>FreespaceChecker</name> - </context> -<context> - <name>HelpMessageDialog</name> - </context> -<context> - <name>Intro</name> - </context> -<context> - <name>OpenURIDialog</name> - </context> -<context> - <name>OptionsDialog</name> - </context> -<context> - <name>OverviewPage</name> - </context> -<context> - <name>PaymentServer</name> - </context> -<context> - <name>PeerTableModel</name> - </context> -<context> - <name>QObject</name> - </context> -<context> - <name>QRImageWidget</name> - </context> -<context> - <name>RPCConsole</name> - </context> -<context> - <name>ReceiveCoinsDialog</name> - </context> -<context> - <name>ReceiveRequestDialog</name> - </context> -<context> - <name>RecentRequestsTableModel</name> - </context> -<context> - <name>SendCoinsDialog</name> - </context> -<context> - <name>SendCoinsEntry</name> - </context> -<context> - <name>ShutdownWindow</name> - </context> -<context> - <name>SignVerifyMessageDialog</name> - </context> -<context> - <name>SplashScreen</name> - </context> -<context> - <name>TrafficGraphWidget</name> - </context> -<context> - <name>TransactionDesc</name> - </context> -<context> - <name>TransactionDescDialog</name> - </context> -<context> - <name>TransactionTableModel</name> - </context> -<context> - <name>TransactionView</name> - </context> -<context> - <name>UnitDisplayStatusBarControl</name> - </context> -<context> - <name>WalletFrame</name> - </context> -<context> - <name>WalletModel</name> - </context> -<context> - <name>WalletView</name> - </context> -<context> - <name>bitcoin-core</name> - </context> -</TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts index b4dbf85a33..67fb692ea1 100644 --- a/src/qt/locale/bitcoin_zh_TW.ts +++ b/src/qt/locale/bitcoin_zh_TW.ts @@ -403,7 +403,7 @@ </message> <message> <source>Request payments (generates QR codes and bitcoin: URIs)</source> - <translation>要求付款(產生 QR Code 和位元幣付款協議的 URI)</translation> + <translation>要求付款(產生 QR Code 和位元幣付款協議的資源識別碼: URI)</translation> </message> <message> <source>&About Bitcoin Core</source> @@ -423,7 +423,7 @@ </message> <message> <source>Open a bitcoin: URI or payment request</source> - <translation>開啓 bitcoin 協議的 URI 或付款要求</translation> + <translation>開啓 bitcoin 協議的資源識別碼(URI)或付款要求</translation> </message> <message> <source>&Command-line options</source> @@ -907,7 +907,7 @@ </message> <message> <source>Use a custom data directory:</source> - <translation>使用自定的資料目錄:</translation> + <translation>使用自訂的資料目錄:</translation> </message> <message> <source>Bitcoin Core</source> @@ -997,7 +997,7 @@ </message> <message> <source>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source> - <translation>在交易頁籤的情境選單出現的第三方(比如說區塊探索網站)網址連結。網址中的 %s 會被取代為交易的雜湊值。可以用直線符號 | 來分隔多個連結。</translation> + <translation>在交易頁籤的情境選單出現的第三方網址連結(URL),比如說區塊探索網站。網址中的 %s 會被取代為交易的雜湊值。可以用直線符號 | 來分隔多個連結。</translation> </message> <message> <source>Third party transaction URLs</source> @@ -1291,11 +1291,11 @@ </message> <message> <source>Payment request fetch URL is invalid: %1</source> - <translation>取得付款要求的 URL 無效: %1</translation> + <translation>取得付款要求的網址連結(URL)無效: %1</translation> </message> <message> <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source> - <translation>沒辦法解析 URI 位址!可能是因為位元幣位址無效,或是 URI 參數格式錯誤。</translation> + <translation>沒辦法解析資源識別碼(URI)!可能是因為位元幣位址無效,或是 URI 參數格式錯誤。</translation> </message> <message> <source>Payment request file handling</source> @@ -1923,7 +1923,7 @@ </message> <message> <source>Custom change address</source> - <translation>自定找零位址</translation> + <translation>自訂找零位址</translation> </message> <message> <source>Transaction Fee:</source> @@ -2194,11 +2194,11 @@ </message> <message> <source>This is an unauthenticated payment request.</source> - <translation>這是個沒驗證過的付款要求。</translation> + <translation>這是個沒有驗證過身份的付款要求。</translation> </message> <message> <source>This is an authenticated payment request.</source> - <translation>這是個已驗證的付款要求。</translation> + <translation>這是個已經驗證過身份的付款要求。</translation> </message> <message> <source>Enter a label for this address to add it to the list of used addresses</source> @@ -2206,7 +2206,7 @@ </message> <message> <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source> - <translation>附加在位元幣付款協議 URI 中的訊息,會和交易內容一起存起來,給你自己做參考。注意: 這個訊息不會送到位元幣網路上。</translation> + <translation>附加在位元幣付款協議的資源識別碼(URI)中的訊息,會和交易內容一起存起來,給你自己做參考。注意: 這個訊息不會送到位元幣網路上。</translation> </message> <message> <source>Pay To:</source> @@ -2733,6 +2733,10 @@ <translation>複製交易識別碼</translation> </message> <message> + <source>Copy raw transaction</source> + <translation>複製交易原始資料</translation> + </message> + <message> <source>Edit label</source> <translation>編輯標記</translation> </message> @@ -2993,10 +2997,6 @@ <translation>把來自指定網域或位址的節點放進白名單。這個選項可以設定多次。</translation> </message> <message> - <source>(default: 1)</source> - <translation>(預設值: 1)</translation> - </message> - <message> <source>-maxmempool must be at least %d MB</source> <translation>參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation> </message> @@ -3094,7 +3094,7 @@ </message> <message> <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> - <translation>只有連接到網絡節點 <net> (IPv4,IPv6或onion)</translation> + <translation>只和 <net> 網路上的節點連線(ipv4, ipv6, 或 onion)</translation> </message> <message> <source>Prune cannot be configured with a negative value.</source> @@ -3249,16 +3249,20 @@ <translation>啟用最佳鏈結...</translation> </message> <message> + <source>Always relay transactions received from whitelisted peers (default: %d)</source> + <translation>無條件轉發從白名點節點收到的交易(預設值: %d)</translation> + </message> + <message> <source>Attempt to recover private keys from a corrupt wallet.dat on startup</source> <translation>啟動時嘗試從壞掉的錢包檔 wallet.dat 復原密鑰</translation> </message> <message> - <source>Cannot resolve -whitebind address: '%s'</source> - <translation>沒辦法解析 -whitebind 指定的位址: '%s'</translation> + <source>Automatically create Tor hidden service (default: %d)</source> + <translation>自動產生 Tor 隱藏服務(預設值: %d)</translation> </message> <message> - <source>Choose data directory on startup (default: 0)</source> - <translation>啓動時選擇資料目錄(預設值: 0)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>沒辦法解析 -whitebind 指定的位址: '%s'</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3349,22 +3353,10 @@ <translation>盡可能送出不用付手續費的交易(預設值: %u)</translation> </message> <message> - <source>Set SSL root certificates for payment request (default: -system-)</source> - <translation>設定付款請求時所使用的 SSL 根憑證 (預設值: 系統憑證庫)</translation> - </message> - <message> - <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>設定語言,比如說 de_DE (預設值: 系統語系)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>顯示所有的除錯選項 (用法: --help --help-debug)</translation> </message> <message> - <source>Show splash screen on startup (default: 1)</source> - <translation>顯示啓動畫面(預設值: 1)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>客戶端軟體啓動時把 debug.log 檔縮小(預設值: 當沒有 -debug 時為 1)</translation> </message> @@ -3373,10 +3365,6 @@ <translation>簽署交易失敗</translation> </message> <message> - <source>Start minimized</source> - <translation>啓動時縮到最小</translation> - </message> - <message> <source>The transaction amount is too small to pay the fee</source> <translation>交易金額太少而付不起手續費</translation> </message> @@ -3385,6 +3373,14 @@ <translation>這套軟體屬於實驗性質。</translation> </message> <message> + <source>Tor control port password (default: empty)</source> + <translation>Tor 控制埠密碼(預設值: 空白)</translation> + </message> + <message> + <source>Tor control port to use if onion listening enabled (default: %s)</source> + <translation>開啟聽候 onion 連線時的 Tor 控制埠號碼(預設值: %s)</translation> + </message> + <message> <source>Transaction amount too small</source> <translation>交易金額太小</translation> </message> @@ -3401,10 +3397,6 @@ <translation>交易位元量太大</translation> </message> <message> - <source>UI Options:</source> - <translation>使用介面選項:</translation> - </message> - <message> <source>Unable to bind to %s on this computer (bind returned error %s)</source> <translation>無法和這台電腦上的 %s 繫結(回傳錯誤 %s)</translation> </message> @@ -3425,6 +3417,10 @@ <translation>警告</translation> </message> <message> + <source>Whether to operate in a blocks only mode (default: %u)</source> + <translation>是否要用只要區塊模式運作(預設值: %u)</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>正在砍掉錢包中的所有交易...</translation> </message> diff --git a/src/qt/paymentrequestplus.cpp b/src/qt/paymentrequestplus.cpp index 1f54c62b6e..1000c143f3 100644 --- a/src/qt/paymentrequestplus.cpp +++ b/src/qt/paymentrequestplus.cpp @@ -201,7 +201,7 @@ QList<std::pair<CScript,CAmount> > PaymentRequestPlus::getPayTo() const const unsigned char* scriptStr = (const unsigned char*)details.outputs(i).script().data(); CScript s(scriptStr, scriptStr+details.outputs(i).script().size()); - result.append(make_pair(s, details.outputs(i).amount())); + result.append(std::make_pair(s, details.outputs(i).amount())); } return result; } diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp index 770a860544..94837679d8 100644 --- a/src/qt/peertablemodel.cpp +++ b/src/qt/peertablemodel.cpp @@ -85,7 +85,7 @@ public: } if (sortColumn >= 0) - // sort cacheNodeStats (use stable sort to prevent rows jumping around unneceesarily) + // sort cacheNodeStats (use stable sort to prevent rows jumping around unnecessarily) qStableSort(cachedNodeStats.begin(), cachedNodeStats.end(), NodeLessThan(sortColumn, sortOrder)); // build index map diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index b2b4fd0fab..30e551de19 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -343,8 +343,8 @@ void RPCConsole::setClientModel(ClientModel *model) setNumConnections(model->getNumConnections()); connect(model, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); - setNumBlocks(model->getNumBlocks(), model->getLastBlockDate()); - connect(model, SIGNAL(numBlocksChanged(int,QDateTime)), this, SLOT(setNumBlocks(int,QDateTime))); + setNumBlocks(model->getNumBlocks(), model->getLastBlockDate(), model->getVerificationProgress(NULL)); + connect(model, SIGNAL(numBlocksChanged(int,QDateTime,double)), this, SLOT(setNumBlocks(int,QDateTime,double))); updateTrafficStats(model->getTotalBytesRecv(), model->getTotalBytesSent()); connect(model, SIGNAL(bytesChanged(quint64,quint64)), this, SLOT(updateTrafficStats(quint64, quint64))); @@ -525,7 +525,7 @@ void RPCConsole::setNumConnections(int count) ui->numberOfConnections->setText(connections); } -void RPCConsole::setNumBlocks(int count, const QDateTime& blockDate) +void RPCConsole::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress) { ui->numberOfBlocks->setText(QString::number(count)); ui->lastBlockTime->setText(blockDate.toString()); diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h index 4b242affcd..4aebad480c 100644 --- a/src/qt/rpcconsole.h +++ b/src/qt/rpcconsole.h @@ -83,7 +83,7 @@ public Q_SLOTS: /** Set number of connections shown in the UI */ void setNumConnections(int count); /** Set number of blocks and last block date shown in the UI */ - void setNumBlocks(int count, const QDateTime& blockDate); + void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress); /** Set size (number of transactions and memory usage) of the mempool in the UI */ void setMempoolSize(long numberOfTxs, size_t dynUsage); /** Go forward or back in history */ diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 7b714be5b1..ec4e598bf9 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -124,7 +124,7 @@ void SendCoinsDialog::setClientModel(ClientModel *clientModel) this->clientModel = clientModel; if (clientModel) { - connect(clientModel, SIGNAL(numBlocksChanged(int,QDateTime)), this, SLOT(updateSmartFeeLabel())); + connect(clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double)), this, SLOT(updateSmartFeeLabel())); } } @@ -585,7 +585,7 @@ void SendCoinsDialog::updateFeeSectionControls() ui->checkBoxMinimumFee ->setEnabled(ui->radioCustomFee->isChecked()); ui->labelMinFeeWarning ->setEnabled(ui->radioCustomFee->isChecked()); ui->radioCustomPerKilobyte ->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked()); - ui->radioCustomAtLeast ->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked()); + ui->radioCustomAtLeast ->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked() && CoinControlDialog::coinControl->HasSelected()); ui->customFee ->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked()); } @@ -600,7 +600,10 @@ void SendCoinsDialog::updateGlobalFeeVariables() { nTxConfirmTarget = defaultConfirmTarget; payTxFee = CFeeRate(ui->customFee->value()); - fPayAtLeastCustomFee = ui->radioCustomAtLeast->isChecked(); + + // if user has selected to set a minimum absolute fee, pass the value to coincontrol + // set nMinimumTotalFee to 0 in case of user has selected that the fee is per KB + CoinControlDialog::coinControl->nMinimumTotalFee = ui->radioCustomAtLeast->isChecked() ? ui->customFee->value() : 0; } fSendFreeTransactions = ui->checkBoxFreeTx->isChecked(); @@ -707,8 +710,7 @@ void SendCoinsDialog::coinControlFeatureChanged(bool checked) if (!checked && model) // coin control features disabled CoinControlDialog::coinControl->SetNull(); - if (checked) - coinControlUpdateLabels(); + coinControlUpdateLabels(); } // Coin Control: button inputs -> show actual coin control dialog @@ -782,9 +784,24 @@ void SendCoinsDialog::coinControlChangeEdited(const QString& text) // Coin Control: update labels void SendCoinsDialog::coinControlUpdateLabels() { - if (!model || !model->getOptionsModel() || !model->getOptionsModel()->getCoinControlFeatures()) + if (!model || !model->getOptionsModel()) return; + if (model->getOptionsModel()->getCoinControlFeatures()) + { + // enable minium absolute fee UI controls + ui->radioCustomAtLeast->setVisible(true); + + // only enable the feature if inputs are selected + ui->radioCustomAtLeast->setEnabled(CoinControlDialog::coinControl->HasSelected()); + } + else + { + // in case coin control is disabled (=default), hide minimum absolute fee UI controls + ui->radioCustomAtLeast->setVisible(false); + return; + } + // set pay amounts CoinControlDialog::payAmounts.clear(); CoinControlDialog::fSubtractFeeFromAmount = false; diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp index f609289749..81b597e2eb 100644 --- a/src/qt/utilitydialog.cpp +++ b/src/qt/utilitydialog.cpp @@ -75,16 +75,16 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) : std::string strUsage = HelpMessage(HMM_BITCOIN_QT); const bool showDebug = GetBoolArg("-help-debug", false); - strUsage += HelpMessageGroup(_("UI Options:")); + strUsage += HelpMessageGroup(tr("UI Options:").toStdString()); if (showDebug) { strUsage += HelpMessageOpt("-allowselfsignedrootcertificates", strprintf("Allow self signed root certificates (default: %u)", DEFAULT_SELFSIGNED_ROOTCERTS)); } - strUsage += HelpMessageOpt("-choosedatadir", strprintf(_("Choose data directory on startup (default: %u)"), DEFAULT_CHOOSE_DATADIR)); - strUsage += HelpMessageOpt("-lang=<lang>", _("Set language, for example \"de_DE\" (default: system locale)")); - strUsage += HelpMessageOpt("-min", _("Start minimized")); - strUsage += HelpMessageOpt("-rootcertificates=<file>", _("Set SSL root certificates for payment request (default: -system-)")); - strUsage += HelpMessageOpt("-splash", strprintf(_("Show splash screen on startup (default: %u)"), DEFAULT_SPLASHSCREEN)); - strUsage += HelpMessageOpt("-resetguisettings", _("Reset all settings changes made over the GUI")); + strUsage += HelpMessageOpt("-choosedatadir", strprintf(tr("Choose data directory on startup (default: %u)").toStdString(), DEFAULT_CHOOSE_DATADIR)); + strUsage += HelpMessageOpt("-lang=<lang>", tr("Set language, for example \"de_DE\" (default: system locale)").toStdString()); + strUsage += HelpMessageOpt("-min", tr("Start minimized").toStdString()); + strUsage += HelpMessageOpt("-rootcertificates=<file>", tr("Set SSL root certificates for payment request (default: -system-)").toStdString()); + strUsage += HelpMessageOpt("-splash", strprintf(tr("Show splash screen on startup (default: %u)").toStdString(), DEFAULT_SPLASHSCREEN)); + strUsage += HelpMessageOpt("-resetguisettings", tr("Reset all settings changes made over the GUI").toStdString()); if (showDebug) { strUsage += HelpMessageOpt("-uiplatform", strprintf("Select platform to customize UI for (one of windows, macosx, other; default: %s)", BitcoinGUI::DEFAULT_UIPLATFORM)); } diff --git a/src/rest.cpp b/src/rest.cpp index 5d69542a91..2ad7bc1065 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -494,7 +494,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart) if (vOutPoints.size() > MAX_GETUTXOS_OUTPOINTS) return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, strprintf("Error: max outpoints exceeded (max: %d, tried: %d)", MAX_GETUTXOS_OUTPOINTS, vOutPoints.size())); - // check spentness and form a bitmap (as well as a JSON capable human-readble string representation) + // check spentness and form a bitmap (as well as a JSON capable human-readable string representation) vector<unsigned char> bitmap; vector<CCoin> outs; std::string bitmapStringRepresentation; diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index c872822759..ee04636ce8 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -190,6 +190,7 @@ UniValue mempoolToJSON(bool fVerbose = false) UniValue info(UniValue::VOBJ); info.push_back(Pair("size", (int)e.GetTxSize())); info.push_back(Pair("fee", ValueFromAmount(e.GetFee()))); + info.push_back(Pair("modifiedfee", ValueFromAmount(e.GetModifiedFee()))); info.push_back(Pair("time", e.GetTime())); info.push_back(Pair("height", (int)e.GetHeight())); info.push_back(Pair("startingpriority", e.GetPriority(e.GetHeight()))); @@ -247,6 +248,7 @@ UniValue getrawmempool(const UniValue& params, bool fHelp) " \"transactionid\" : { (json object)\n" " \"size\" : n, (numeric) transaction size in bytes\n" " \"fee\" : n, (numeric) transaction fee in " + CURRENCY_UNIT + "\n" + " \"modifiedfee\" : n, (numeric) transaction fee with fee deltas used for mining priority\n" " \"time\" : n, (numeric) local time transaction entered pool in seconds since 1 Jan 1970 GMT\n" " \"height\" : n, (numeric) block height when transaction entered pool\n" " \"startingpriority\" : n, (numeric) priority when transaction entered pool\n" @@ -795,9 +797,11 @@ UniValue getmempoolinfo(const UniValue& params, bool fHelp) "\nReturns details on the active state of the TX memory pool.\n" "\nResult:\n" "{\n" - " \"size\": xxxxx (numeric) Current tx count\n" - " \"bytes\": xxxxx (numeric) Sum of all tx sizes\n" - " \"usage\": xxxxx (numeric) Total memory usage for the mempool\n" + " \"size\": xxxxx, (numeric) Current tx count\n" + " \"bytes\": xxxxx, (numeric) Sum of all tx sizes\n" + " \"usage\": xxxxx, (numeric) Total memory usage for the mempool\n" + " \"maxmempool\": xxxxx, (numeric) Maximum memory usage for the mempool\n" + " \"mempoolminfee\": xxxxx (numeric) Minimum fee for tx to be accepted\n" "}\n" "\nExamples:\n" + HelpExampleCli("getmempoolinfo", "") diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 3bda459245..1f2d77aef0 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -62,6 +62,7 @@ void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fInclud void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry) { entry.push_back(Pair("txid", tx.GetHash().GetHex())); + entry.push_back(Pair("size", (int)::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION))); entry.push_back(Pair("version", tx.nVersion)); entry.push_back(Pair("locktime", (int64_t)tx.nLockTime)); UniValue vin(UniValue::VARR); @@ -133,6 +134,7 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp) "{\n" " \"hex\" : \"data\", (string) The serialized, hex-encoded data for 'txid'\n" " \"txid\" : \"id\", (string) The transaction id (same as provided)\n" + " \"size\" : n, (numeric) The transaction size\n" " \"version\" : n, (numeric) The version\n" " \"locktime\" : ttt, (numeric) The lock time\n" " \"vin\" : [ (array of json objects)\n" @@ -429,6 +431,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp) "\nResult:\n" "{\n" " \"txid\" : \"id\", (string) The transaction id\n" + " \"size\" : n, (numeric) The transaction size\n" " \"version\" : n, (numeric) The version\n" " \"locktime\" : ttt, (numeric) The lock time\n" " \"vin\" : [ (array of json objects)\n" diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 8dcab832cb..57e0edc4b4 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1023,7 +1023,7 @@ public: // Serialize the script if (nInput != nIn) // Blank out other inputs' signatures - ::Serialize(s, CScript(), nType, nVersion); + ::Serialize(s, CScriptBase(), nType, nVersion); else SerializeScriptCode(s, nType, nVersion); // Serialize the nSequence diff --git a/src/script/script.cpp b/src/script/script.cpp index 263c89defe..9c77ed9fc1 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -205,9 +205,9 @@ bool CScript::IsPayToScriptHash() const { // Extra-fast test for pay-to-script-hash CScripts: return (this->size() == 23 && - this->at(0) == OP_HASH160 && - this->at(1) == 0x14 && - this->at(22) == OP_EQUAL); + (*this)[0] == OP_HASH160 && + (*this)[1] == 0x14 && + (*this)[22] == OP_EQUAL); } bool CScript::IsPushOnly(const_iterator pc) const diff --git a/src/script/script.h b/src/script/script.h index a38d33a189..3650957fc9 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -7,6 +7,7 @@ #define BITCOIN_SCRIPT_SCRIPT_H #include "crypto/common.h" +#include "prevector.h" #include <assert.h> #include <climits> @@ -354,8 +355,10 @@ private: int64_t m_value; }; +typedef prevector<28, unsigned char> CScriptBase; + /** Serialized script, used inside transaction inputs and outputs */ -class CScript : public std::vector<unsigned char> +class CScript : public CScriptBase { protected: CScript& push_int64(int64_t n) @@ -376,9 +379,10 @@ protected: } public: CScript() { } - CScript(const CScript& b) : std::vector<unsigned char>(b.begin(), b.end()) { } - CScript(const_iterator pbegin, const_iterator pend) : std::vector<unsigned char>(pbegin, pend) { } - CScript(const unsigned char* pbegin, const unsigned char* pend) : std::vector<unsigned char>(pbegin, pend) { } + CScript(const CScript& b) : CScriptBase(b.begin(), b.end()) { } + CScript(const_iterator pbegin, const_iterator pend) : CScriptBase(pbegin, pend) { } + CScript(std::vector<unsigned char>::const_iterator pbegin, std::vector<unsigned char>::const_iterator pend) : CScriptBase(pbegin, pend) { } + CScript(const unsigned char* pbegin, const unsigned char* pend) : CScriptBase(pbegin, pend) { } CScript& operator+=(const CScript& b) { @@ -611,7 +615,7 @@ public: void clear() { // The default std::vector::clear() does not release memory. - std::vector<unsigned char>().swap(*this); + CScriptBase().swap(*this); } }; diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 8b43183b6d..90f557fc60 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -16,7 +16,7 @@ using namespace std; -typedef vector<unsigned char> valtype; +typedef std::vector<unsigned char> valtype; TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), checker(txTo, nIn) {} @@ -118,7 +118,7 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu bool fSolved = SignStep(creator, subscript, scriptSig, subType) && subType != TX_SCRIPTHASH; // Append serialized subscript whether or not it is completely signed: - scriptSig << static_cast<valtype>(subscript); + scriptSig << valtype(subscript.begin(), subscript.end()); if (!fSolved) return false; } diff --git a/src/serialize.h b/src/serialize.h index 53d8af142f..5fe7fc1f35 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -20,7 +20,7 @@ #include <utility> #include <vector> -class CScript; +#include "prevector.h" static const unsigned int MAX_SIZE = 0x02000000; @@ -49,26 +49,26 @@ inline T* NCONST_PTR(const T* val) * @note These functions avoid the undefined case of indexing into an empty * vector, as well as that of indexing after the end of the vector. */ -template <class T, class TAl> -inline T* begin_ptr(std::vector<T,TAl>& v) +template <typename V> +inline typename V::value_type* begin_ptr(V& v) { return v.empty() ? NULL : &v[0]; } /** Get begin pointer of vector (const version) */ -template <class T, class TAl> -inline const T* begin_ptr(const std::vector<T,TAl>& v) +template <typename V> +inline const typename V::value_type* begin_ptr(const V& v) { return v.empty() ? NULL : &v[0]; } /** Get end pointer of vector (non-const version) */ -template <class T, class TAl> -inline T* end_ptr(std::vector<T,TAl>& v) +template <typename V> +inline typename V::value_type* end_ptr(V& v) { return v.empty() ? NULL : (&v[0] + v.size()); } /** Get end pointer of vector (const version) */ -template <class T, class TAl> -inline const T* end_ptr(const std::vector<T,TAl>& v) +template <typename V> +inline const typename V::value_type* end_ptr(const V& v) { return v.empty() ? NULL : (&v[0] + v.size()); } @@ -391,6 +391,12 @@ public: pbegin = (char*)begin_ptr(v); pend = (char*)end_ptr(v); } + template <unsigned int N, typename T, typename S, typename D> + explicit CFlatData(prevector<N, T, S, D> &v) + { + pbegin = (char*)begin_ptr(v); + pend = (char*)end_ptr(v); + } char* begin() { return pbegin; } const char* begin() const { return pbegin; } char* end() { return pend; } @@ -486,6 +492,20 @@ template<typename Stream, typename C> void Serialize(Stream& os, const std::basi template<typename Stream, typename C> void Unserialize(Stream& is, std::basic_string<C>& str, int, int=0); /** + * prevector + * prevectors of unsigned char are a special case and are intended to be serialized as a single opaque blob. + */ +template<unsigned int N, typename T> unsigned int GetSerializeSize_impl(const prevector<N, T>& v, int nType, int nVersion, const unsigned char&); +template<unsigned int N, typename T, typename V> unsigned int GetSerializeSize_impl(const prevector<N, T>& v, int nType, int nVersion, const V&); +template<unsigned int N, typename T> inline unsigned int GetSerializeSize(const prevector<N, T>& v, int nType, int nVersion); +template<typename Stream, unsigned int N, typename T> void Serialize_impl(Stream& os, const prevector<N, T>& v, int nType, int nVersion, const unsigned char&); +template<typename Stream, unsigned int N, typename T, typename V> void Serialize_impl(Stream& os, const prevector<N, T>& v, int nType, int nVersion, const V&); +template<typename Stream, unsigned int N, typename T> inline void Serialize(Stream& os, const prevector<N, T>& v, int nType, int nVersion); +template<typename Stream, unsigned int N, typename T> void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, const unsigned char&); +template<typename Stream, unsigned int N, typename T, typename V> void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, const V&); +template<typename Stream, unsigned int N, typename T> inline void Unserialize(Stream& is, prevector<N, T>& v, int nType, int nVersion); + +/** * vector * vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob. */ @@ -500,13 +520,6 @@ template<typename Stream, typename T, typename A, typename V> void Unserialize_i template<typename Stream, typename T, typename A> inline void Unserialize(Stream& is, std::vector<T, A>& v, int nType, int nVersion); /** - * others derived from vector - */ -extern inline unsigned int GetSerializeSize(const CScript& v, int nType, int nVersion); -template<typename Stream> void Serialize(Stream& os, const CScript& v, int nType, int nVersion); -template<typename Stream> void Unserialize(Stream& is, CScript& v, int nType, int nVersion); - -/** * pair */ template<typename K, typename T> unsigned int GetSerializeSize(const std::pair<K, T>& item, int nType, int nVersion); @@ -588,6 +601,96 @@ void Unserialize(Stream& is, std::basic_string<C>& str, int, int) /** + * prevector + */ +template<unsigned int N, typename T> +unsigned int GetSerializeSize_impl(const prevector<N, T>& v, int nType, int nVersion, const unsigned char&) +{ + return (GetSizeOfCompactSize(v.size()) + v.size() * sizeof(T)); +} + +template<unsigned int N, typename T, typename V> +unsigned int GetSerializeSize_impl(const prevector<N, T>& v, int nType, int nVersion, const V&) +{ + unsigned int nSize = GetSizeOfCompactSize(v.size()); + for (typename prevector<N, T>::const_iterator vi = v.begin(); vi != v.end(); ++vi) + nSize += GetSerializeSize((*vi), nType, nVersion); + return nSize; +} + +template<unsigned int N, typename T> +inline unsigned int GetSerializeSize(const prevector<N, T>& v, int nType, int nVersion) +{ + return GetSerializeSize_impl(v, nType, nVersion, T()); +} + + +template<typename Stream, unsigned int N, typename T> +void Serialize_impl(Stream& os, const prevector<N, T>& v, int nType, int nVersion, const unsigned char&) +{ + WriteCompactSize(os, v.size()); + if (!v.empty()) + os.write((char*)&v[0], v.size() * sizeof(T)); +} + +template<typename Stream, unsigned int N, typename T, typename V> +void Serialize_impl(Stream& os, const prevector<N, T>& v, int nType, int nVersion, const V&) +{ + WriteCompactSize(os, v.size()); + for (typename prevector<N, T>::const_iterator vi = v.begin(); vi != v.end(); ++vi) + ::Serialize(os, (*vi), nType, nVersion); +} + +template<typename Stream, unsigned int N, typename T> +inline void Serialize(Stream& os, const prevector<N, T>& v, int nType, int nVersion) +{ + Serialize_impl(os, v, nType, nVersion, T()); +} + + +template<typename Stream, unsigned int N, typename T> +void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, const unsigned char&) +{ + // Limit size per read so bogus size value won't cause out of memory + v.clear(); + unsigned int nSize = ReadCompactSize(is); + unsigned int i = 0; + while (i < nSize) + { + unsigned int blk = std::min(nSize - i, (unsigned int)(1 + 4999999 / sizeof(T))); + v.resize(i + blk); + is.read((char*)&v[i], blk * sizeof(T)); + i += blk; + } +} + +template<typename Stream, unsigned int N, typename T, typename V> +void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, const V&) +{ + v.clear(); + unsigned int nSize = ReadCompactSize(is); + unsigned int i = 0; + unsigned int nMid = 0; + while (nMid < nSize) + { + nMid += 5000000 / sizeof(T); + if (nMid > nSize) + nMid = nSize; + v.resize(nMid); + for (; i < nMid; i++) + Unserialize(is, v[i], nType, nVersion); + } +} + +template<typename Stream, unsigned int N, typename T> +inline void Unserialize(Stream& is, prevector<N, T>& v, int nType, int nVersion) +{ + Unserialize_impl(is, v, nType, nVersion, T()); +} + + + +/** * vector */ template<typename T, typename A> @@ -678,28 +781,6 @@ inline void Unserialize(Stream& is, std::vector<T, A>& v, int nType, int nVersio /** - * others derived from vector - */ -inline unsigned int GetSerializeSize(const CScript& v, int nType, int nVersion) -{ - return GetSerializeSize((const std::vector<unsigned char>&)v, nType, nVersion); -} - -template<typename Stream> -void Serialize(Stream& os, const CScript& v, int nType, int nVersion) -{ - Serialize(os, (const std::vector<unsigned char>&)v, nType, nVersion); -} - -template<typename Stream> -void Unserialize(Stream& is, CScript& v, int nType, int nVersion) -{ - Unserialize(is, (std::vector<unsigned char>&)v, nType, nVersion); -} - - - -/** * pair */ template<typename K, typename T> diff --git a/src/test/mempool_tests.cpp b/src/test/mempool_tests.cpp index 896e1237ed..e9f7378f74 100644 --- a/src/test/mempool_tests.cpp +++ b/src/test/mempool_tests.cpp @@ -102,12 +102,13 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest) removed.clear(); } +template<int index> void CheckSort(CTxMemPool &pool, std::vector<std::string> &sortedOrder) { BOOST_CHECK_EQUAL(pool.size(), sortedOrder.size()); - CTxMemPool::indexed_transaction_set::nth_index<1>::type::iterator it = pool.mapTx.get<1>().begin(); + typename CTxMemPool::indexed_transaction_set::nth_index<index>::type::iterator it = pool.mapTx.get<index>().begin(); int count=0; - for (; it != pool.mapTx.get<1>().end(); ++it, ++count) { + for (; it != pool.mapTx.get<index>().end(); ++it, ++count) { BOOST_CHECK_EQUAL(it->GetTx().GetHash().ToString(), sortedOrder[count]); } } @@ -163,7 +164,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) sortedOrder[2] = tx1.GetHash().ToString(); // 10000 sortedOrder[3] = tx4.GetHash().ToString(); // 15000 sortedOrder[4] = tx2.GetHash().ToString(); // 20000 - CheckSort(pool, sortedOrder); + CheckSort<1>(pool, sortedOrder); /* low fee but with high fee child */ /* tx6 -> tx7 -> tx8, tx9 -> tx10 */ @@ -175,7 +176,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) BOOST_CHECK_EQUAL(pool.size(), 6); // Check that at this point, tx6 is sorted low sortedOrder.insert(sortedOrder.begin(), tx6.GetHash().ToString()); - CheckSort(pool, sortedOrder); + CheckSort<1>(pool, sortedOrder); CTxMemPool::setEntries setAncestors; setAncestors.insert(pool.mapTx.find(tx6.GetHash())); @@ -201,7 +202,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) sortedOrder.erase(sortedOrder.begin()); sortedOrder.push_back(tx6.GetHash().ToString()); sortedOrder.push_back(tx7.GetHash().ToString()); - CheckSort(pool, sortedOrder); + CheckSort<1>(pool, sortedOrder); /* low fee child of tx7 */ CMutableTransaction tx8 = CMutableTransaction(); @@ -216,7 +217,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) // Now tx8 should be sorted low, but tx6/tx both high sortedOrder.insert(sortedOrder.begin(), tx8.GetHash().ToString()); - CheckSort(pool, sortedOrder); + CheckSort<1>(pool, sortedOrder); /* low fee child of tx7 */ CMutableTransaction tx9 = CMutableTransaction(); @@ -231,7 +232,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) // tx9 should be sorted low BOOST_CHECK_EQUAL(pool.size(), 9); sortedOrder.insert(sortedOrder.begin(), tx9.GetHash().ToString()); - CheckSort(pool, sortedOrder); + CheckSort<1>(pool, sortedOrder); std::vector<std::string> snapshotOrder = sortedOrder; @@ -273,7 +274,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) sortedOrder.insert(sortedOrder.begin()+5, tx9.GetHash().ToString()); sortedOrder.insert(sortedOrder.begin()+6, tx8.GetHash().ToString()); sortedOrder.insert(sortedOrder.begin()+7, tx10.GetHash().ToString()); // tx10 is just before tx6 - CheckSort(pool, sortedOrder); + CheckSort<1>(pool, sortedOrder); // there should be 10 transactions in the mempool BOOST_CHECK_EQUAL(pool.size(), 10); @@ -281,9 +282,42 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest) // Now try removing tx10 and verify the sort order returns to normal std::list<CTransaction> removed; pool.remove(pool.mapTx.find(tx10.GetHash())->GetTx(), removed, true); - CheckSort(pool, snapshotOrder); + CheckSort<1>(pool, snapshotOrder); + + pool.remove(pool.mapTx.find(tx9.GetHash())->GetTx(), removed, true); + pool.remove(pool.mapTx.find(tx8.GetHash())->GetTx(), removed, true); + /* Now check the sort on the mining score index. + * Final order should be: + * + * tx7 (2M) + * tx2 (20k) + * tx4 (15000) + * tx1/tx5 (10000) + * tx3/6 (0) + * (Ties resolved by hash) + */ + sortedOrder.clear(); + sortedOrder.push_back(tx7.GetHash().ToString()); + sortedOrder.push_back(tx2.GetHash().ToString()); + sortedOrder.push_back(tx4.GetHash().ToString()); + if (tx1.GetHash() < tx5.GetHash()) { + sortedOrder.push_back(tx5.GetHash().ToString()); + sortedOrder.push_back(tx1.GetHash().ToString()); + } else { + sortedOrder.push_back(tx1.GetHash().ToString()); + sortedOrder.push_back(tx5.GetHash().ToString()); + } + if (tx3.GetHash() < tx6.GetHash()) { + sortedOrder.push_back(tx6.GetHash().ToString()); + sortedOrder.push_back(tx3.GetHash().ToString()); + } else { + sortedOrder.push_back(tx3.GetHash().ToString()); + sortedOrder.push_back(tx6.GetHash().ToString()); + } + CheckSort<3>(pool, sortedOrder); } + BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) { CTxMemPool pool(CFeeRate(1000)); diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 1d7c9f65c0..19ddb5b79c 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -119,7 +119,23 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { tx.vout[0].nValue -= 1000000; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase + // If we don't set the # of sig ops in the CTxMemPoolEntry, template creation fails + mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx)); + tx.vin[0].prevout.hash = hash; + } + BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error); + mempool.clear(); + + tx.vin[0].prevout.hash = txFirst[0]->GetHash(); + tx.vout[0].nValue = 5000000000LL; + for (unsigned int i = 0; i < 1001; ++i) + { + tx.vout[0].nValue -= 1000000; + hash = tx.GetHash(); + bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase + // If we do set the # of sig ops in the CTxMemPoolEntry, template creation passes + mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(spendsCoinbase).SigOps(20).FromTx(tx)); tx.vin[0].prevout.hash = hash; } BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); @@ -139,18 +155,18 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { tx.vout[0].nValue -= 10000000; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + bool spendsCoinbase = (i == 0) ? true : false; // only first tx spends coinbase + mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx)); tx.vin[0].prevout.hash = hash; } BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); delete pblocktemplate; mempool.clear(); - // orphan in mempool + // orphan in mempool, template creation fails hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); - BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); - delete pblocktemplate; + mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).FromTx(tx)); + BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error); mempool.clear(); // child with higher priority than parent @@ -158,7 +174,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[0].prevout.hash = txFirst[1]->GetHash(); tx.vout[0].nValue = 4900000000LL; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Fee(100000000LL).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); tx.vin[0].prevout.hash = hash; tx.vin.resize(2); tx.vin[1].scriptSig = CScript() << OP_1; @@ -166,23 +182,23 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vin[1].prevout.n = 0; tx.vout[0].nValue = 5900000000LL; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Fee(400000000LL).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); delete pblocktemplate; mempool.clear(); - // coinbase in mempool + // coinbase in mempool, template creation fails tx.vin.resize(1); tx.vin[0].prevout.SetNull(); tx.vin[0].scriptSig = CScript() << OP_0 << OP_1; tx.vout[0].nValue = 0; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); - BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); - delete pblocktemplate; + // give it a fee so it'll get mined + mempool.addUnchecked(hash, entry.Fee(100000).Time(GetTime()).SpendsCoinbase(false).FromTx(tx)); + BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error); mempool.clear(); - // invalid (pre-p2sh) txn in mempool + // invalid (pre-p2sh) txn in mempool, template creation fails tx.vin[0].prevout.hash = txFirst[0]->GetHash(); tx.vin[0].prevout.n = 0; tx.vin[0].scriptSig = CScript() << OP_1; @@ -190,28 +206,26 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) script = CScript() << OP_0; tx.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(script)); hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Fee(10000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); tx.vin[0].prevout.hash = hash; - tx.vin[0].scriptSig = CScript() << (std::vector<unsigned char>)script; + tx.vin[0].scriptSig = CScript() << std::vector<unsigned char>(script.begin(), script.end()); tx.vout[0].nValue -= 1000000; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); - BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); - delete pblocktemplate; + mempool.addUnchecked(hash, entry.Fee(1000000).Time(GetTime()).SpendsCoinbase(false).FromTx(tx)); + BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error); mempool.clear(); - // double spend txn pair in mempool + // double spend txn pair in mempool, template creation fails tx.vin[0].prevout.hash = txFirst[0]->GetHash(); tx.vin[0].scriptSig = CScript() << OP_1; tx.vout[0].nValue = 4900000000LL; tx.vout[0].scriptPubKey = CScript() << OP_1; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); tx.vout[0].scriptPubKey = CScript() << OP_2; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); - BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); - delete pblocktemplate; + mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); + BOOST_CHECK_THROW(CreateNewBlock(chainparams, scriptPubKey), std::runtime_error); mempool.clear(); // subsidy changing @@ -235,7 +249,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].scriptPubKey = CScript() << OP_1; tx.nLockTime = chainActive.Tip()->nHeight+1; hash = tx.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); + mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); BOOST_CHECK(!CheckFinalTx(tx, LOCKTIME_MEDIAN_TIME_PAST)); // time locked @@ -249,7 +263,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx2.vout[0].scriptPubKey = CScript() << OP_1; tx2.nLockTime = chainActive.Tip()->GetMedianTimePast()+1; hash = tx2.GetHash(); - mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx2)); + mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx2)); BOOST_CHECK(!CheckFinalTx(tx2, LOCKTIME_MEDIAN_TIME_PAST)); BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp index 1315146f10..644c3da213 100644 --- a/src/test/policyestimator_tests.cpp +++ b/src/test/policyestimator_tests.cpp @@ -196,7 +196,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates) // Test that if the mempool is limited, estimateSmartFee won't return a value below the mempool min fee // and that estimateSmartPriority returns essentially an infinite value - mpool.addUnchecked(tx.GetHash(), CTxMemPoolEntry(tx, feeV[0][5], GetTime(), priV[1][5], blocknum, mpool.HasNoInputsOf(tx))); + mpool.addUnchecked(tx.GetHash(), entry.Fee(feeV[0][5]).Time(GetTime()).Priority(priV[1][5]).Height(blocknum).FromTx(tx, &mpool)); // evict that transaction which should set a mempool min fee of minRelayTxFee + feeV[0][5] mpool.TrimToSize(1); BOOST_CHECK(mpool.GetMinFee(1).GetFeePerK() > feeV[0][5]); diff --git a/src/test/prevector_tests.cpp b/src/test/prevector_tests.cpp new file mode 100644 index 0000000000..01a45b540d --- /dev/null +++ b/src/test/prevector_tests.cpp @@ -0,0 +1,217 @@ +// Copyright (c) 2015 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include <vector> +#include "prevector.h" +#include "random.h" + +#include "serialize.h" +#include "streams.h" + +#include "test/test_bitcoin.h" + +#include <boost/test/unit_test.hpp> + +BOOST_FIXTURE_TEST_SUITE(PrevectorTests, TestingSetup) + +template<unsigned int N, typename T> +class prevector_tester { + typedef std::vector<T> realtype; + realtype real_vector; + + typedef prevector<N, T> pretype; + pretype pre_vector; + + typedef typename pretype::size_type Size; + + void test() { + const pretype& const_pre_vector = pre_vector; + BOOST_CHECK_EQUAL(real_vector.size(), pre_vector.size()); + BOOST_CHECK_EQUAL(real_vector.empty(), pre_vector.empty()); + for (Size s = 0; s < real_vector.size(); s++) { + BOOST_CHECK(real_vector[s] == pre_vector[s]); + BOOST_CHECK(&(pre_vector[s]) == &(pre_vector.begin()[s])); + BOOST_CHECK(&(pre_vector[s]) == &*(pre_vector.begin() + s)); + BOOST_CHECK(&(pre_vector[s]) == &*((pre_vector.end() + s) - real_vector.size())); + } + // BOOST_CHECK(realtype(pre_vector) == real_vector); + BOOST_CHECK(pretype(real_vector.begin(), real_vector.end()) == pre_vector); + BOOST_CHECK(pretype(pre_vector.begin(), pre_vector.end()) == pre_vector); + size_t pos = 0; + BOOST_FOREACH(const T& v, pre_vector) { + BOOST_CHECK(v == real_vector[pos++]); + } + BOOST_REVERSE_FOREACH(const T& v, pre_vector) { + BOOST_CHECK(v == real_vector[--pos]); + } + BOOST_FOREACH(const T& v, const_pre_vector) { + BOOST_CHECK(v == real_vector[pos++]); + } + BOOST_REVERSE_FOREACH(const T& v, const_pre_vector) { + BOOST_CHECK(v == real_vector[--pos]); + } + CDataStream ss1(SER_DISK, 0); + CDataStream ss2(SER_DISK, 0); + ss1 << real_vector; + ss2 << pre_vector; + BOOST_CHECK_EQUAL(ss1.size(), ss2.size()); + for (Size s = 0; s < ss1.size(); s++) { + BOOST_CHECK_EQUAL(ss1[s], ss2[s]); + } + } + +public: + void resize(Size s) { + real_vector.resize(s); + BOOST_CHECK_EQUAL(real_vector.size(), s); + pre_vector.resize(s); + BOOST_CHECK_EQUAL(pre_vector.size(), s); + test(); + } + + void reserve(Size s) { + real_vector.reserve(s); + BOOST_CHECK(real_vector.capacity() >= s); + pre_vector.reserve(s); + BOOST_CHECK(pre_vector.capacity() >= s); + test(); + } + + void insert(Size position, const T& value) { + real_vector.insert(real_vector.begin() + position, value); + pre_vector.insert(pre_vector.begin() + position, value); + test(); + } + + void insert(Size position, Size count, const T& value) { + real_vector.insert(real_vector.begin() + position, count, value); + pre_vector.insert(pre_vector.begin() + position, count, value); + test(); + } + + template<typename I> + void insert_range(Size position, I first, I last) { + real_vector.insert(real_vector.begin() + position, first, last); + pre_vector.insert(pre_vector.begin() + position, first, last); + test(); + } + + void erase(Size position) { + real_vector.erase(real_vector.begin() + position); + pre_vector.erase(pre_vector.begin() + position); + test(); + } + + void erase(Size first, Size last) { + real_vector.erase(real_vector.begin() + first, real_vector.begin() + last); + pre_vector.erase(pre_vector.begin() + first, pre_vector.begin() + last); + test(); + } + + void update(Size pos, const T& value) { + real_vector[pos] = value; + pre_vector[pos] = value; + test(); + } + + void push_back(const T& value) { + real_vector.push_back(value); + pre_vector.push_back(value); + test(); + } + + void pop_back() { + real_vector.pop_back(); + pre_vector.pop_back(); + test(); + } + + void clear() { + real_vector.clear(); + pre_vector.clear(); + } + + void assign(Size n, const T& value) { + real_vector.assign(n, value); + pre_vector.assign(n, value); + } + + Size size() { + return real_vector.size(); + } + + Size capacity() { + return pre_vector.capacity(); + } + + void shrink_to_fit() { + pre_vector.shrink_to_fit(); + test(); + } +}; + +BOOST_AUTO_TEST_CASE(PrevectorTestInt) +{ + for (int j = 0; j < 64; j++) { + prevector_tester<8, int> test; + for (int i = 0; i < 2048; i++) { + int r = insecure_rand(); + if ((r % 4) == 0) { + test.insert(insecure_rand() % (test.size() + 1), insecure_rand()); + } + if (test.size() > 0 && ((r >> 2) % 4) == 1) { + test.erase(insecure_rand() % test.size()); + } + if (((r >> 4) % 8) == 2) { + int new_size = std::max<int>(0, std::min<int>(30, test.size() + (insecure_rand() % 5) - 2)); + test.resize(new_size); + } + if (((r >> 7) % 8) == 3) { + test.insert(insecure_rand() % (test.size() + 1), 1 + (insecure_rand() % 2), insecure_rand()); + } + if (((r >> 10) % 8) == 4) { + int del = std::min<int>(test.size(), 1 + (insecure_rand() % 2)); + int beg = insecure_rand() % (test.size() + 1 - del); + test.erase(beg, beg + del); + } + if (((r >> 13) % 16) == 5) { + test.push_back(insecure_rand()); + } + if (test.size() > 0 && ((r >> 17) % 16) == 6) { + test.pop_back(); + } + if (((r >> 21) % 32) == 7) { + int values[4]; + int num = 1 + (insecure_rand() % 4); + for (int i = 0; i < num; i++) { + values[i] = insecure_rand(); + } + test.insert_range(insecure_rand() % (test.size() + 1), values, values + num); + } + if (((r >> 26) % 32) == 8) { + int del = std::min<int>(test.size(), 1 + (insecure_rand() % 4)); + int beg = insecure_rand() % (test.size() + 1 - del); + test.erase(beg, beg + del); + } + r = insecure_rand(); + if (r % 32 == 9) { + test.reserve(insecure_rand() % 32); + } + if ((r >> 5) % 64 == 10) { + test.shrink_to_fit(); + } + if (test.size() > 0) { + test.update(insecure_rand() % test.size(), insecure_rand()); + } + if (((r >> 11) & 1024) == 11) { + test.clear(); + } + if (((r >> 21) & 512) == 12) { + test.assign(insecure_rand() % 32, insecure_rand()); + } + } + } +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp index 2a486f08e4..ce22975005 100644 --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -72,6 +72,7 @@ BOOST_AUTO_TEST_CASE(rpc_rawparams) BOOST_CHECK_THROW(CallRPC("decoderawtransaction DEADBEEF"), runtime_error); string rawtx = "0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000"; BOOST_CHECK_NO_THROW(r = CallRPC(string("decoderawtransaction ")+rawtx)); + BOOST_CHECK_EQUAL(find_value(r.get_obj(), "size").get_int(), 193); BOOST_CHECK_EQUAL(find_value(r.get_obj(), "version").get_int(), 1); BOOST_CHECK_EQUAL(find_value(r.get_obj(), "locktime").get_int(), 0); BOOST_CHECK_THROW(r = CallRPC(string("decoderawtransaction ")+rawtx+" extra"), runtime_error); diff --git a/src/test/scheduler_tests.cpp b/src/test/scheduler_tests.cpp index cb1a427db0..fc07aa72c1 100644 --- a/src/test/scheduler_tests.cpp +++ b/src/test/scheduler_tests.cpp @@ -40,6 +40,7 @@ static void MicroSleep(uint64_t n) #endif } +#if 0 /* Disabled for now because there is a race condition issue in this test - see #6540 */ BOOST_AUTO_TEST_CASE(manythreads) { seed_insecure_rand(false); @@ -115,5 +116,6 @@ BOOST_AUTO_TEST_CASE(manythreads) } BOOST_CHECK_EQUAL(counterSum, 200); } +#endif BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index 16c9a4a868..e36aca8dfa 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -25,7 +25,7 @@ using namespace std; static std::vector<unsigned char> Serialize(const CScript& s) { - std::vector<unsigned char> sSerialized(s); + std::vector<unsigned char> sSerialized(s.begin(), s.end()); return sSerialized; } @@ -339,8 +339,8 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) // SignSignature doesn't know how to sign these. We're // not testing validating signatures, so just create // dummy signatures that DO include the correct P2SH scripts: - txTo.vin[3].scriptSig << OP_11 << OP_11 << static_cast<vector<unsigned char> >(oneAndTwo); - txTo.vin[4].scriptSig << static_cast<vector<unsigned char> >(fifteenSigops); + txTo.vin[3].scriptSig << OP_11 << OP_11 << vector<unsigned char>(oneAndTwo.begin(), oneAndTwo.end()); + txTo.vin[4].scriptSig << vector<unsigned char>(fifteenSigops.begin(), fifteenSigops.end()); BOOST_CHECK(::AreInputsStandard(txTo, coins)); // 22 P2SH sigops for all inputs (1 for vin[0], 6 for vin[3], 15 for vin[4] @@ -362,7 +362,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) txToNonStd1.vin.resize(1); txToNonStd1.vin[0].prevout.n = 5; txToNonStd1.vin[0].prevout.hash = txFrom.GetHash(); - txToNonStd1.vin[0].scriptSig << static_cast<vector<unsigned char> >(sixteenSigops); + txToNonStd1.vin[0].scriptSig << vector<unsigned char>(sixteenSigops.begin(), sixteenSigops.end()); BOOST_CHECK(!::AreInputsStandard(txToNonStd1, coins)); BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txToNonStd1, coins), 16U); @@ -374,7 +374,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) txToNonStd2.vin.resize(1); txToNonStd2.vin[0].prevout.n = 6; txToNonStd2.vin[0].prevout.hash = txFrom.GetHash(); - txToNonStd2.vin[0].scriptSig << static_cast<vector<unsigned char> >(twentySigops); + txToNonStd2.vin[0].scriptSig << vector<unsigned char>(twentySigops.begin(), twentySigops.end()); BOOST_CHECK(!::AreInputsStandard(txToNonStd2, coins)); BOOST_CHECK_EQUAL(GetP2SHSigOpCount(txToNonStd2, coins), 20U); diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index 882f9eb199..0059e4a998 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -260,7 +260,7 @@ public: TestBuilder& PushRedeem() { - DoPush(static_cast<std::vector<unsigned char> >(scriptPubKey)); + DoPush(std::vector<unsigned char>(scriptPubKey.begin(), scriptPubKey.end())); return *this; } @@ -892,7 +892,7 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig); // dummy scriptSigCopy with placeholder, should always choose non-placeholder: - scriptSigCopy = CScript() << OP_0 << static_cast<vector<unsigned char> >(pkSingle); + scriptSigCopy = CScript() << OP_0 << vector<unsigned char>(pkSingle.begin(), pkSingle.end()); combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); BOOST_CHECK(combined == scriptSig); combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, scriptSigCopy); diff --git a/src/test/sigopcount_tests.cpp b/src/test/sigopcount_tests.cpp index b26fed99f2..ea2b9b795f 100644 --- a/src/test/sigopcount_tests.cpp +++ b/src/test/sigopcount_tests.cpp @@ -20,7 +20,7 @@ using namespace std; static std::vector<unsigned char> Serialize(const CScript& s) { - std::vector<unsigned char> sSerialized(s); + std::vector<unsigned char> sSerialized(s.begin(), s.end()); return sSerialized; } diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 2fe190f885..2147dbb065 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -144,8 +144,13 @@ TestChain100Setup::~TestChain100Setup() CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(CMutableTransaction &tx, CTxMemPool *pool) { - return CTxMemPoolEntry(tx, nFee, nTime, dPriority, nHeight, - pool ? pool->HasNoInputsOf(tx) : hadNoDependencies); + CTransaction txn(tx); + bool hasNoDependencies = pool ? pool->HasNoInputsOf(tx) : hadNoDependencies; + // Hack to assume either its completely dependent on other mempool txs or not at all + CAmount inChainValue = hasNoDependencies ? txn.GetValueOut() : 0; + + return CTxMemPoolEntry(txn, nFee, nTime, dPriority, nHeight, + hasNoDependencies, inChainValue, spendsCoinbase, sigOpCount); } void Shutdown(void* parg) diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index 815b227411..273bfdd7f4 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -65,11 +65,13 @@ struct TestMemPoolEntryHelper double dPriority; unsigned int nHeight; bool hadNoDependencies; - + bool spendsCoinbase; + unsigned int sigOpCount; + TestMemPoolEntryHelper() : nFee(0), nTime(0), dPriority(0.0), nHeight(1), - hadNoDependencies(false) { } - + hadNoDependencies(false), spendsCoinbase(false), sigOpCount(1) { } + CTxMemPoolEntry FromTx(CMutableTransaction &tx, CTxMemPool *pool = NULL); // Change the default value @@ -78,5 +80,7 @@ struct TestMemPoolEntryHelper TestMemPoolEntryHelper &Priority(double _priority) { dPriority = _priority; return *this; } TestMemPoolEntryHelper &Height(unsigned int _height) { nHeight = _height; return *this; } TestMemPoolEntryHelper &HadNoDependencies(bool _hnd) { hadNoDependencies = _hnd; return *this; } + TestMemPoolEntryHelper &SpendsCoinbase(bool _flag) { spendsCoinbase = _flag; return *this; } + TestMemPoolEntryHelper &SigOps(unsigned int _sigops) { sigOpCount = _sigops; return *this; } }; #endif diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 31a2917203..8eccc81e30 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -617,7 +617,9 @@ void TorController::disconnected_cb(TorControlConnection& conn) service = CService(); if (!reconnect) return; - LogPrintf("tor: Disconnected from Tor control port %s, trying to reconnect\n", target); + + LogPrint("tor", "tor: Disconnected from Tor control port %s, trying to reconnect\n", target); + // Single-shot timer for reconnect. Use exponential backoff. struct timeval time = MillisToTimeval(int64_t(reconnect_timeout * 1000.0)); reconnect_ev = event_new(base, -1, 0, reconnect_cb, this); diff --git a/src/txmempool.cpp b/src/txmempool.cpp index ec7971c2f1..fea5da8029 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -11,6 +11,7 @@ #include "main.h" #include "policy/fees.h" #include "streams.h" +#include "timedata.h" #include "util.h" #include "utilmoneystr.h" #include "utiltime.h" @@ -19,10 +20,12 @@ using namespace std; CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, - int64_t _nTime, double _dPriority, - unsigned int _nHeight, bool poolHasNoInputsOf): - tx(_tx), nFee(_nFee), nTime(_nTime), dPriority(_dPriority), nHeight(_nHeight), - hadNoDependencies(poolHasNoInputsOf) + int64_t _nTime, double _entryPriority, unsigned int _entryHeight, + bool poolHasNoInputsOf, CAmount _inChainInputValue, + bool _spendsCoinbase, unsigned int _sigOps): + tx(_tx), nFee(_nFee), nTime(_nTime), entryPriority(_entryPriority), entryHeight(_entryHeight), + hadNoDependencies(poolHasNoInputsOf), inChainInputValue(_inChainInputValue), + spendsCoinbase(_spendsCoinbase), sigOpCount(_sigOps) { nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); nModSize = tx.CalculateModifiedSize(nTxSize); @@ -31,6 +34,10 @@ CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, nCountWithDescendants = 1; nSizeWithDescendants = nTxSize; nFeesWithDescendants = nFee; + CAmount nValueIn = tx.GetValueOut()+nFee; + assert(inChainInputValue <= nValueIn); + + feeDelta = 0; } CTxMemPoolEntry::CTxMemPoolEntry(const CTxMemPoolEntry& other) @@ -41,12 +48,18 @@ CTxMemPoolEntry::CTxMemPoolEntry(const CTxMemPoolEntry& other) double CTxMemPoolEntry::GetPriority(unsigned int currentHeight) const { - CAmount nValueIn = tx.GetValueOut()+nFee; - double deltaPriority = ((double)(currentHeight-nHeight)*nValueIn)/nModSize; - double dResult = dPriority + deltaPriority; + double deltaPriority = ((double)(currentHeight-entryHeight)*inChainInputValue)/nModSize; + double dResult = entryPriority + deltaPriority; + if (dResult < 0) // This should only happen if it was called with a height below entry height + dResult = 0; return dResult; } +void CTxMemPoolEntry::UpdateFeeDelta(int64_t newFeeDelta) +{ + feeDelta = newFeeDelta; +} + // Update the given tx for any in-mempool descendants. // Assumes that setMemPoolChildren is correct for the given tx and all // descendants. @@ -386,6 +399,15 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, } UpdateAncestorsOf(true, newit, setAncestors); + // Update transaction's score for any feeDelta created by PrioritiseTransaction + std::map<uint256, std::pair<double, CAmount> >::const_iterator pos = mapDeltas.find(hash); + if (pos != mapDeltas.end()) { + const std::pair<double, CAmount> &deltas = pos->second; + if (deltas.second) { + mapTx.modify(newit, update_fee_delta(deltas.second)); + } + } + nTransactionsUpdated++; totalTxSize += entry.GetTxSize(); minerPolicyEstimator->processTransaction(entry, fCurrentEstimate); @@ -475,22 +497,26 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& rem } } -void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight) +void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight, int flags) { - // Remove transactions spending a coinbase which are now immature + // Remove transactions spending a coinbase which are now immature and no-longer-final transactions LOCK(cs); list<CTransaction> transactionsToRemove; for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { const CTransaction& tx = it->GetTx(); - BOOST_FOREACH(const CTxIn& txin, tx.vin) { - indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); - if (it2 != mapTx.end()) - continue; - const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); - if (nCheckFrequency != 0) assert(coins); - if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { - transactionsToRemove.push_back(tx); - break; + if (!CheckFinalTx(tx, flags)) { + transactionsToRemove.push_back(tx); + } else if (it->GetSpendsCoinbase()) { + BOOST_FOREACH(const CTxIn& txin, tx.vin) { + indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); + if (it2 != mapTx.end()) + continue; + const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); + if (nCheckFrequency != 0) assert(coins); + if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { + transactionsToRemove.push_back(tx); + break; + } } } } @@ -759,6 +785,10 @@ void CTxMemPool::PrioritiseTransaction(const uint256 hash, const string strHash, std::pair<double, CAmount> &deltas = mapDeltas[hash]; deltas.first += dPriorityDelta; deltas.second += nFeeDelta; + txiter it = mapTx.find(hash); + if (it != mapTx.end()) { + mapTx.modify(it, update_fee_delta(deltas.second)); + } } LogPrintf("PrioritiseTransaction: %s priority += %f, fee += %d\n", strHash, dPriorityDelta, FormatMoney(nFeeDelta)); } @@ -808,8 +838,8 @@ bool CCoinsViewMemPool::HaveCoins(const uint256 &txid) const { size_t CTxMemPool::DynamicMemoryUsage() const { LOCK(cs); - // Estimate the overhead of mapTx to be 9 pointers + an allocation, as no exact formula for boost::multi_index_contained is implemented. - return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 9 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(mapLinks) + cachedInnerUsage; + // Estimate the overhead of mapTx to be 12 pointers + an allocation, as no exact formula for boost::multi_index_contained is implemented. + return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 12 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(mapLinks) + cachedInnerUsage; } void CTxMemPool::RemoveStaged(setEntries &stage) { @@ -914,7 +944,7 @@ void CTxMemPool::trackPackageRemoved(const CFeeRate& rate) { } } -void CTxMemPool::TrimToSize(size_t sizelimit) { +void CTxMemPool::TrimToSize(size_t sizelimit, std::vector<uint256>* pvNoSpendsRemaining) { LOCK(cs); unsigned nTxnRemoved = 0; @@ -933,8 +963,26 @@ void CTxMemPool::TrimToSize(size_t sizelimit) { setEntries stage; CalculateDescendants(mapTx.project<0>(it), stage); - RemoveStaged(stage); nTxnRemoved += stage.size(); + + std::vector<CTransaction> txn; + if (pvNoSpendsRemaining) { + txn.reserve(stage.size()); + BOOST_FOREACH(txiter it, stage) + txn.push_back(it->GetTx()); + } + RemoveStaged(stage); + if (pvNoSpendsRemaining) { + BOOST_FOREACH(const CTransaction& tx, txn) { + BOOST_FOREACH(const CTxIn& txin, tx.vin) { + if (exists(txin.prevout.hash)) + continue; + std::map<COutPoint, CInPoint>::iterator it = mapNextTx.lower_bound(COutPoint(txin.prevout.hash, 0)); + if (it == mapNextTx.end() || it->first.hash != txin.prevout.hash) + pvNoSpendsRemaining->push_back(txin.prevout.hash); + } + } + } } if (maxFeeRateRemoved > CFeeRate(0)) diff --git a/src/txmempool.h b/src/txmempool.h index 7f43120f7f..9203171868 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -63,9 +63,13 @@ private: size_t nModSize; //! ... and modified size for priority size_t nUsageSize; //! ... and total memory usage int64_t nTime; //! Local time when entering the mempool - double dPriority; //! Priority when entering the mempool - unsigned int nHeight; //! Chain height when entering the mempool + double entryPriority; //! Priority when entering the mempool + unsigned int entryHeight; //! Chain height when entering the mempool bool hadNoDependencies; //! Not dependent on any other txs when it entered the mempool + CAmount inChainInputValue; //! Sum of all txin values that are already in blockchain + bool spendsCoinbase; //! keep track of transactions that spend a coinbase + unsigned int sigOpCount; //! Legacy sig ops plus P2SH sig op count + int64_t feeDelta; //! Used for determining the priority of the transaction for mining in a block // Information about descendants of this transaction that are in the // mempool; if we remove this transaction we must remove all of these @@ -78,20 +82,30 @@ private: public: CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, - int64_t _nTime, double _dPriority, unsigned int _nHeight, bool poolHasNoInputsOf = false); + int64_t _nTime, double _entryPriority, unsigned int _entryHeight, + bool poolHasNoInputsOf, CAmount _inChainInputValue, bool spendsCoinbase, + unsigned int nSigOps); CTxMemPoolEntry(const CTxMemPoolEntry& other); const CTransaction& GetTx() const { return this->tx; } + /** + * Fast calculation of lower bound of current priority as update + * from entry priority. Only inputs that were originally in-chain will age. + */ double GetPriority(unsigned int currentHeight) const; const CAmount& GetFee() const { return nFee; } size_t GetTxSize() const { return nTxSize; } int64_t GetTime() const { return nTime; } - unsigned int GetHeight() const { return nHeight; } + unsigned int GetHeight() const { return entryHeight; } bool WasClearAtEntry() const { return hadNoDependencies; } + unsigned int GetSigOpCount() const { return sigOpCount; } + int64_t GetModifiedFee() const { return nFee + feeDelta; } size_t DynamicMemoryUsage() const { return nUsageSize; } // Adjusts the descendant state, if this entry is not dirty. void UpdateState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount); + // Updates the fee delta used for mining priority score + void UpdateFeeDelta(int64_t feeDelta); /** We can set the entry to be dirty if doing the full calculation of in- * mempool descendants will be too expensive, which can potentially happen @@ -103,6 +117,8 @@ public: uint64_t GetCountWithDescendants() const { return nCountWithDescendants; } uint64_t GetSizeWithDescendants() const { return nSizeWithDescendants; } CAmount GetFeesWithDescendants() const { return nFeesWithDescendants; } + + bool GetSpendsCoinbase() const { return spendsCoinbase; } }; // Helpers for modifying CTxMemPool::mapTx, which is a boost multi_index. @@ -127,6 +143,16 @@ struct set_dirty { e.SetDirty(); } }; +struct update_fee_delta +{ + update_fee_delta(int64_t _feeDelta) : feeDelta(_feeDelta) { } + + void operator() (CTxMemPoolEntry &e) { e.UpdateFeeDelta(feeDelta); } + +private: + int64_t feeDelta; +}; + // extracts a TxMemPoolEntry's transaction hash struct mempoolentry_txid { @@ -174,6 +200,24 @@ public: } }; +/** \class CompareTxMemPoolEntryByScore + * + * Sort by score of entry ((fee+delta)/size) in descending order + */ +class CompareTxMemPoolEntryByScore +{ +public: + bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) + { + double f1 = (double)a.GetModifiedFee() * b.GetTxSize(); + double f2 = (double)b.GetModifiedFee() * a.GetTxSize(); + if (f1 == f2) { + return b.GetTx().GetHash() < a.GetTx().GetHash(); + } + return f1 > f2; + } +}; + class CompareTxMemPoolEntryByEntryTime { public: @@ -211,10 +255,11 @@ public: * * CTxMemPool::mapTx, and CTxMemPoolEntry bookkeeping: * - * mapTx is a boost::multi_index that sorts the mempool on 3 criteria: + * mapTx is a boost::multi_index that sorts the mempool on 4 criteria: * - transaction hash * - feerate [we use max(feerate of tx, feerate of tx with all descendants)] * - time in mempool + * - mining score (feerate modified by any fee deltas from PrioritiseTransaction) * * Note: the term "descendant" refers to in-mempool transactions that depend on * this one, while "ancestor" refers to in-mempool transactions that a given @@ -311,6 +356,11 @@ public: boost::multi_index::ordered_non_unique< boost::multi_index::identity<CTxMemPoolEntry>, CompareTxMemPoolEntryByEntryTime + >, + // sorted by score (for mining prioritization) + boost::multi_index::ordered_unique< + boost::multi_index::identity<CTxMemPoolEntry>, + CompareTxMemPoolEntryByScore > > > indexed_transaction_set; @@ -325,6 +375,8 @@ public: }; typedef std::set<txiter, CompareIteratorByHash> setEntries; + const setEntries & GetMemPoolParents(txiter entry) const; + const setEntries & GetMemPoolChildren(txiter entry) const; private: typedef std::map<txiter, setEntries, CompareIteratorByHash> cacheMap; @@ -336,8 +388,6 @@ private: typedef std::map<txiter, TxLinks, CompareIteratorByHash> txlinksMap; txlinksMap mapLinks; - const setEntries & GetMemPoolParents(txiter entry) const; - const setEntries & GetMemPoolChildren(txiter entry) const; void UpdateParent(txiter entry, txiter parent, bool add); void UpdateChild(txiter entry, txiter child, bool add); @@ -370,7 +420,7 @@ public: bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, setEntries &setAncestors, bool fCurrentEstimate = true); void remove(const CTransaction &tx, std::list<CTransaction>& removed, bool fRecursive = false); - void removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight); + void removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight, int flags); void removeConflicts(const CTransaction &tx, std::list<CTransaction>& removed); void removeForBlock(const std::vector<CTransaction>& vtx, unsigned int nBlockHeight, std::list<CTransaction>& conflicts, bool fCurrentEstimate = true); @@ -433,8 +483,11 @@ public: */ CFeeRate GetMinFee(size_t sizelimit) const; - /** Remove transactions from the mempool until its dynamic size is <= sizelimit. */ - void TrimToSize(size_t sizelimit); + /** Remove transactions from the mempool until its dynamic size is <= sizelimit. + * pvNoSpendsRemaining, if set, will be populated with the list of transactions + * which are not in mempool which no longer have any spends in this mempool. + */ + void TrimToSize(size_t sizelimit, std::vector<uint256>* pvNoSpendsRemaining=NULL); /** Expire all transaction (and their dependencies) in the mempool older than time. Return the number of removed transactions. */ int Expire(int64_t time); @@ -537,4 +590,17 @@ public: bool HaveCoins(const uint256 &txid) const; }; +// We want to sort transactions by coin age priority +typedef std::pair<double, CTxMemPool::txiter> TxCoinAgePriority; + +struct TxCoinAgePriorityCompare +{ + bool operator()(const TxCoinAgePriority& a, const TxCoinAgePriority& b) + { + if (a.first == b.first) + return CompareTxMemPoolEntryByScore()(*(b.second), *(a.second)); //Reverse order to make sort less than + return a.first < b.first; + } +}; + #endif // BITCOIN_TXMEMPOOL_H diff --git a/src/ui_interface.h b/src/ui_interface.h index e402479933..00d9303124 100644 --- a/src/ui_interface.h +++ b/src/ui_interface.h @@ -15,6 +15,7 @@ class CBasicKeyStore; class CWallet; class uint256; +class CBlockIndex; /** General change type (added, updated, removed). */ enum ChangeType @@ -94,7 +95,7 @@ public: boost::signals2::signal<void (const std::string &title, int nProgress)> ShowProgress; /** New block has been accepted */ - boost::signals2::signal<void (const uint256& hash)> NotifyBlockTip; + boost::signals2::signal<void (bool, const CBlockIndex *)> NotifyBlockTip; /** Banlist did change. */ boost::signals2::signal<void (void)> BannedListChanged; diff --git a/src/univalue/.gitignore b/src/univalue/.gitignore index a7a2ca9197..19e42f814a 100644 --- a/src/univalue/.gitignore +++ b/src/univalue/.gitignore @@ -18,6 +18,7 @@ univalue-config.h* test-driver libtool ltmain.sh +test-suite.log *.a *.la diff --git a/src/univalue/.travis.yml b/src/univalue/.travis.yml index af632c78d9..d318d9cc8f 100644 --- a/src/univalue/.travis.yml +++ b/src/univalue/.travis.yml @@ -36,7 +36,7 @@ script: - ./configure --cache-file=config.cache $UNIVALUE_CONFIG_ALL $UNIVALUE_CONFIG || ( cat config.log && false) - make -s $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL ; false ) - export LD_LIBRARY_PATH=$TRAVIS_BUILD_DIR/depends/$HOST/lib - - if [ "$RUN_TESTS" = "true" ]; then make check; fi + - if [ "$RUN_TESTS" = "true" ]; then make $MAKEJOBS distcheck; fi matrix: fast_finish: true diff --git a/src/univalue/Makefile.am b/src/univalue/Makefile.am index df9e66229c..34fe9e3f13 100644 --- a/src/univalue/Makefile.am +++ b/src/univalue/Makefile.am @@ -70,6 +70,9 @@ TEST_FILES = \ $(TEST_DATA_DIR)/fail32.json \ $(TEST_DATA_DIR)/fail33.json \ $(TEST_DATA_DIR)/fail34.json \ + $(TEST_DATA_DIR)/fail35.json \ + $(TEST_DATA_DIR)/fail36.json \ + $(TEST_DATA_DIR)/fail37.json \ $(TEST_DATA_DIR)/fail3.json \ $(TEST_DATA_DIR)/fail4.json \ $(TEST_DATA_DIR)/fail5.json \ @@ -79,6 +82,7 @@ TEST_FILES = \ $(TEST_DATA_DIR)/fail9.json \ $(TEST_DATA_DIR)/pass1.json \ $(TEST_DATA_DIR)/pass2.json \ - $(TEST_DATA_DIR)/pass3.json + $(TEST_DATA_DIR)/pass3.json \ + $(TEST_DATA_DIR)/round1.json EXTRA_DIST=$(TEST_FILES) $(GEN_SRCS) diff --git a/src/univalue/configure.ac b/src/univalue/configure.ac index 6cd9516229..0515b632bd 100644 --- a/src/univalue/configure.ac +++ b/src/univalue/configure.ac @@ -14,7 +14,7 @@ m4_define([libunivalue_age], [m4_eval(libunivalue_binary_age - libunivalue_inter m4_define([libunivalue_version], [libunivalue_major_version().libunivalue_minor_version().libunivalue_micro_version()libunivalue_extraversion()]) -AC_INIT([univalue], [1.0.0], +AC_INIT([univalue], [1.0.1], [http://github.com/jgarzik/univalue/]) dnl make the compilation flags quiet unless V=1 is used diff --git a/src/univalue/gen/gen.cpp b/src/univalue/gen/gen.cpp index 5e5a4d4aed..17f361941d 100644 --- a/src/univalue/gen/gen.cpp +++ b/src/univalue/gen/gen.cpp @@ -8,7 +8,6 @@ // $ ./gen > univalue_escapes.h // -#include <ctype.h> #include <stdio.h> #include <string.h> #include "univalue.h" @@ -16,10 +15,17 @@ using namespace std; static bool initEscapes; -static const char *escapes[256]; +static std::string escapes[256]; static void initJsonEscape() { + // Escape all lower control characters (some get overridden with smaller sequences below) + for (int ch=0x00; ch<0x20; ++ch) { + char tmpbuf[20]; + snprintf(tmpbuf, sizeof(tmpbuf), "\\u%04x", ch); + escapes[ch] = std::string(tmpbuf); + } + escapes[(int)'"'] = "\\\""; escapes[(int)'\\'] = "\\\\"; escapes[(int)'\b'] = "\\b"; @@ -27,6 +33,7 @@ static void initJsonEscape() escapes[(int)'\n'] = "\\n"; escapes[(int)'\r'] = "\\r"; escapes[(int)'\t'] = "\\t"; + escapes[(int)'\x7f'] = "\\u007f"; // U+007F DELETE initEscapes = true; } @@ -39,13 +46,13 @@ static void outputEscape() "static const char *escapes[256] = {\n"); for (unsigned int i = 0; i < 256; i++) { - if (!escapes[i]) { + if (escapes[i].empty()) { printf("\tNULL,\n"); } else { printf("\t\""); unsigned int si; - for (si = 0; si < strlen(escapes[i]); si++) { + for (si = 0; si < escapes[i].size(); si++) { char ch = escapes[i][si]; switch (ch) { case '"': diff --git a/src/univalue/include/univalue.h b/src/univalue/include/univalue.h index ac05116011..8428b1c683 100644 --- a/src/univalue/include/univalue.h +++ b/src/univalue/include/univalue.h @@ -243,8 +243,41 @@ extern enum jtokentype getJsonToken(std::string& tokenVal, unsigned int& consumed, const char *raw); extern const char *uvTypeName(UniValue::VType t); +static inline bool jsonTokenIsValue(enum jtokentype jtt) +{ + switch (jtt) { + case JTOK_KW_NULL: + case JTOK_KW_TRUE: + case JTOK_KW_FALSE: + case JTOK_NUMBER: + case JTOK_STRING: + return true; + + default: + return false; + } + + // not reached +} + +static inline bool json_isspace(int ch) +{ + switch (ch) { + case 0x20: + case 0x09: + case 0x0a: + case 0x0d: + return true; + + default: + return false; + } + + // not reached +} + extern const UniValue NullUniValue; const UniValue& find_value( const UniValue& obj, const std::string& name); -#endif // __UNIVALUE_H__
\ No newline at end of file +#endif // __UNIVALUE_H__ diff --git a/src/univalue/lib/univalue.cpp b/src/univalue/lib/univalue.cpp index 883e8651fe..0076d6678e 100644 --- a/src/univalue/lib/univalue.cpp +++ b/src/univalue/lib/univalue.cpp @@ -4,7 +4,6 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include <stdint.h> -#include <ctype.h> #include <errno.h> #include <iomanip> #include <limits> @@ -21,7 +20,7 @@ static bool ParsePrechecks(const std::string& str) { if (str.empty()) // No empty string allowed return false; - if (str.size() >= 1 && (isspace(str[0]) || isspace(str[str.size()-1]))) // No padding allowed + if (str.size() >= 1 && (json_isspace(str[0]) || json_isspace(str[str.size()-1]))) // No padding allowed return false; if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed return false; @@ -210,7 +209,7 @@ bool UniValue::pushKVs(const UniValue& obj) for (unsigned int i = 0; i < obj.keys.size(); i++) { keys.push_back(obj.keys[i]); - values.push_back(obj.values[i]); + values.push_back(obj.values.at(i)); } return true; @@ -234,7 +233,7 @@ bool UniValue::checkObject(const std::map<std::string,UniValue::VType>& t) if (idx < 0) return false; - if (values[idx].getType() != it->second) + if (values.at(idx).getType() != it->second) return false; } @@ -250,7 +249,7 @@ const UniValue& UniValue::operator[](const std::string& key) const if (index < 0) return NullUniValue; - return values[index]; + return values.at(index); } const UniValue& UniValue::operator[](unsigned int index) const @@ -260,7 +259,7 @@ const UniValue& UniValue::operator[](unsigned int index) const if (index >= values.size()) return NullUniValue; - return values[index]; + return values.at(index); } const char *uvTypeName(UniValue::VType t) @@ -278,15 +277,11 @@ const char *uvTypeName(UniValue::VType t) return NULL; } -const UniValue& find_value( const UniValue& obj, const std::string& name) +const UniValue& find_value(const UniValue& obj, const std::string& name) { for (unsigned int i = 0; i < obj.keys.size(); i++) - { - if( obj.keys[i] == name ) - { - return obj.values[i]; - } - } + if (obj.keys[i] == name) + return obj.values.at(i); return NullUniValue; } diff --git a/src/univalue/lib/univalue_escapes.h b/src/univalue/lib/univalue_escapes.h index 4133b24ca1..74596aab6d 100644 --- a/src/univalue/lib/univalue_escapes.h +++ b/src/univalue/lib/univalue_escapes.h @@ -2,38 +2,38 @@ #ifndef BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H #define BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H static const char *escapes[256] = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, + "\\u0000", + "\\u0001", + "\\u0002", + "\\u0003", + "\\u0004", + "\\u0005", + "\\u0006", + "\\u0007", "\\b", "\\t", "\\n", - NULL, + "\\u000b", "\\f", "\\r", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, + "\\u000e", + "\\u000f", + "\\u0010", + "\\u0011", + "\\u0012", + "\\u0013", + "\\u0014", + "\\u0015", + "\\u0016", + "\\u0017", + "\\u0018", + "\\u0019", + "\\u001a", + "\\u001b", + "\\u001c", + "\\u001d", + "\\u001e", + "\\u001f", NULL, NULL, "\\\"", @@ -129,7 +129,7 @@ static const char *escapes[256] = { NULL, NULL, NULL, - NULL, + "\\u007f", NULL, NULL, NULL, diff --git a/src/univalue/lib/univalue_read.cpp b/src/univalue/lib/univalue_read.cpp index 64591234cb..c7516b9628 100644 --- a/src/univalue/lib/univalue_read.cpp +++ b/src/univalue/lib/univalue_read.cpp @@ -9,6 +9,11 @@ using namespace std; +static bool json_isdigit(int ch) +{ + return ((ch >= '0') && (ch <= '9')); +} + // convert hexadecimal string to unsigned integer static const char *hatoui(const char *first, const char *last, unsigned int& out) @@ -17,7 +22,7 @@ static const char *hatoui(const char *first, const char *last, for (; first != last; ++first) { int digit; - if (isdigit(*first)) + if (json_isdigit(*first)) digit = *first - '0'; else if (*first >= 'a' && *first <= 'f') @@ -44,7 +49,7 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed, const char *rawStart = raw; - while ((*raw) && (isspace(*raw))) // skip whitespace + while ((*raw) && (json_isspace(*raw))) // skip whitespace raw++; switch (*raw) { @@ -113,18 +118,18 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed, const char *first = raw; const char *firstDigit = first; - if (!isdigit(*firstDigit)) + if (!json_isdigit(*firstDigit)) firstDigit++; - if ((*firstDigit == '0') && isdigit(firstDigit[1])) + if ((*firstDigit == '0') && json_isdigit(firstDigit[1])) return JTOK_ERR; numStr += *raw; // copy first char raw++; - if ((*first == '-') && (!isdigit(*raw))) + if ((*first == '-') && (!json_isdigit(*raw))) return JTOK_ERR; - while ((*raw) && isdigit(*raw)) { // copy digits + while ((*raw) && json_isdigit(*raw)) { // copy digits numStr += *raw; raw++; } @@ -134,9 +139,9 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed, numStr += *raw; // copy . raw++; - if (!isdigit(*raw)) + if (!json_isdigit(*raw)) return JTOK_ERR; - while ((*raw) && isdigit(*raw)) { // copy digits + while ((*raw) && json_isdigit(*raw)) { // copy digits numStr += *raw; raw++; } @@ -152,9 +157,9 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed, raw++; } - if (!isdigit(*raw)) + if (!json_isdigit(*raw)) return JTOK_ERR; - while ((*raw) && isdigit(*raw)) { // copy digits + while ((*raw) && json_isdigit(*raw)) { // copy digits numStr += *raw; raw++; } @@ -236,12 +241,23 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed, } } +enum expect_bits { + EXP_OBJ_NAME = (1U << 0), + EXP_COLON = (1U << 1), + EXP_ARR_VALUE = (1U << 2), + EXP_VALUE = (1U << 3), + EXP_NOT_VALUE = (1U << 4), +}; + +#define expect(bit) (expectMask & (EXP_##bit)) +#define setExpect(bit) (expectMask |= EXP_##bit) +#define clearExpect(bit) (expectMask &= ~EXP_##bit) + bool UniValue::read(const char *raw) { clear(); - bool expectName = false; - bool expectColon = false; + uint32_t expectMask = 0; vector<UniValue*> stack; string tokenVal; @@ -256,6 +272,41 @@ bool UniValue::read(const char *raw) return false; raw += consumed; + bool isValueOpen = jsonTokenIsValue(tok) || + tok == JTOK_OBJ_OPEN || tok == JTOK_ARR_OPEN; + + if (expect(VALUE)) { + if (!isValueOpen) + return false; + clearExpect(VALUE); + + } else if (expect(ARR_VALUE)) { + bool isArrValue = isValueOpen || (tok == JTOK_ARR_CLOSE); + if (!isArrValue) + return false; + + clearExpect(ARR_VALUE); + + } else if (expect(OBJ_NAME)) { + bool isObjName = (tok == JTOK_OBJ_CLOSE || tok == JTOK_STRING); + if (!isObjName) + return false; + + } else if (expect(COLON)) { + if (tok != JTOK_COLON) + return false; + clearExpect(COLON); + + } else if (!expect(COLON) && (tok == JTOK_COLON)) { + return false; + } + + if (expect(NOT_VALUE)) { + if (isValueOpen) + return false; + clearExpect(NOT_VALUE); + } + switch (tok) { case JTOK_OBJ_OPEN: @@ -277,13 +328,15 @@ bool UniValue::read(const char *raw) } if (utyp == VOBJ) - expectName = true; + setExpect(OBJ_NAME); + else + setExpect(ARR_VALUE); break; } case JTOK_OBJ_CLOSE: case JTOK_ARR_CLOSE: { - if (!stack.size() || expectColon || (last_tok == JTOK_COMMA)) + if (!stack.size() || (last_tok == JTOK_COMMA)) return false; VType utyp = (tok == JTOK_OBJ_CLOSE ? VOBJ : VARR); @@ -292,37 +345,40 @@ bool UniValue::read(const char *raw) return false; stack.pop_back(); - expectName = false; + clearExpect(OBJ_NAME); + setExpect(NOT_VALUE); break; } case JTOK_COLON: { - if (!stack.size() || expectName || !expectColon) + if (!stack.size()) return false; UniValue *top = stack.back(); if (top->getType() != VOBJ) return false; - expectColon = false; + setExpect(VALUE); break; } case JTOK_COMMA: { - if (!stack.size() || expectName || expectColon || + if (!stack.size() || (last_tok == JTOK_COMMA) || (last_tok == JTOK_ARR_OPEN)) return false; UniValue *top = stack.back(); if (top->getType() == VOBJ) - expectName = true; + setExpect(OBJ_NAME); + else + setExpect(ARR_VALUE); break; } case JTOK_KW_NULL: case JTOK_KW_TRUE: case JTOK_KW_FALSE: { - if (!stack.size() || expectName || expectColon) + if (!stack.size()) return false; UniValue tmpVal; @@ -342,17 +398,19 @@ bool UniValue::read(const char *raw) UniValue *top = stack.back(); top->values.push_back(tmpVal); + setExpect(NOT_VALUE); break; } case JTOK_NUMBER: { - if (!stack.size() || expectName || expectColon) + if (!stack.size()) return false; UniValue tmpVal(VNUM, tokenVal); UniValue *top = stack.back(); top->values.push_back(tmpVal); + setExpect(NOT_VALUE); break; } @@ -362,15 +420,16 @@ bool UniValue::read(const char *raw) UniValue *top = stack.back(); - if (expectName) { + if (expect(OBJ_NAME)) { top->keys.push_back(tokenVal); - expectName = false; - expectColon = true; + clearExpect(OBJ_NAME); + setExpect(COLON); } else { UniValue tmpVal(VSTR, tokenVal); top->values.push_back(tmpVal); } + setExpect(NOT_VALUE); break; } diff --git a/src/univalue/lib/univalue_write.cpp b/src/univalue/lib/univalue_write.cpp index bce3997af7..ceb4cc9166 100644 --- a/src/univalue/lib/univalue_write.cpp +++ b/src/univalue/lib/univalue_write.cpp @@ -2,7 +2,6 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include <ctype.h> #include <iomanip> #include <sstream> #include <stdio.h> @@ -25,10 +24,10 @@ static string json_escape(const string& inS) if (escStr) outS += escStr; - else if (isprint(ch)) + else if (ch < 0x80) outS += ch; - else { + else { // TODO handle UTF-8 properly char tmpesc[16]; sprintf(tmpesc, "\\u%04x", ch); outS += tmpesc; @@ -113,7 +112,7 @@ void UniValue::writeObject(unsigned int prettyIndent, unsigned int indentLevel, s += "\"" + json_escape(keys[i]) + "\":"; if (prettyIndent) s += " "; - s += values[i].write(prettyIndent, indentLevel + 1); + s += values.at(i).write(prettyIndent, indentLevel + 1); if (i != (values.size() - 1)) s += ","; if (prettyIndent) diff --git a/src/univalue/test/.gitignore b/src/univalue/test/.gitignore index 4afa094b10..3d9347fe7e 100644 --- a/src/univalue/test/.gitignore +++ b/src/univalue/test/.gitignore @@ -1 +1,4 @@ unitester + +*.trs +*.log diff --git a/src/univalue/test/fail35.json b/src/univalue/test/fail35.json new file mode 100644 index 0000000000..de30ca5c47 --- /dev/null +++ b/src/univalue/test/fail35.json @@ -0,0 +1 @@ +[ true true true [] [] [] ] diff --git a/src/univalue/test/fail36.json b/src/univalue/test/fail36.json new file mode 100644 index 0000000000..f82eb8e1f0 --- /dev/null +++ b/src/univalue/test/fail36.json @@ -0,0 +1 @@ +{"a":} diff --git a/src/univalue/test/fail37.json b/src/univalue/test/fail37.json new file mode 100644 index 0000000000..3294dc3a42 --- /dev/null +++ b/src/univalue/test/fail37.json @@ -0,0 +1 @@ +{"a":1 "b":2} diff --git a/src/univalue/test/round1.json b/src/univalue/test/round1.json new file mode 100644 index 0000000000..a711e7308b --- /dev/null +++ b/src/univalue/test/round1.json @@ -0,0 +1 @@ +["\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007f"] diff --git a/src/univalue/test/unitester.cpp b/src/univalue/test/unitester.cpp index 835556e031..5a052fe92c 100644 --- a/src/univalue/test/unitester.cpp +++ b/src/univalue/test/unitester.cpp @@ -19,24 +19,37 @@ using namespace std; string srcdir(JSON_TEST_SRC); +static bool test_failed = false; -static void runtest(string filename, const string& jdata) +#define d_assert(expr) { if (!(expr)) { test_failed = true; fprintf(stderr, "%s failed\n", filename.c_str()); } } + +static std::string rtrim(std::string s) { - fprintf(stderr, "test %s\n", filename.c_str()); + s.erase(s.find_last_not_of(" \n\r\t")+1); + return s; +} +static void runtest(string filename, const string& jdata) +{ string prefix = filename.substr(0, 4); - bool wantPass = (prefix == "pass"); + bool wantPass = (prefix == "pass") || (prefix == "roun"); bool wantFail = (prefix == "fail"); + bool wantRoundTrip = (prefix == "roun"); assert(wantPass || wantFail); UniValue val; bool testResult = val.read(jdata); if (wantPass) { - assert(testResult == true); + d_assert(testResult == true); } else { - assert(testResult == false); + d_assert(testResult == false); + } + + if (wantRoundTrip) { + std::string odata = val.write(0, 0); + assert(odata == rtrim(jdata)); } } @@ -92,6 +105,9 @@ static const char *filenames[] = { "fail32.json", "fail33.json", "fail34.json", + "fail35.json", + "fail36.json", + "fail37.json", "fail3.json", "fail4.json", // extra comma "fail5.json", @@ -102,6 +118,7 @@ static const char *filenames[] = { "pass1.json", "pass2.json", "pass3.json", + "round1.json", // round-trip test }; int main (int argc, char *argv[]) @@ -110,6 +127,6 @@ int main (int argc, char *argv[]) runtest_file(filenames[fidx]); } - return 0; + return test_failed ? 1 : 0; } diff --git a/src/utiltime.cpp b/src/utiltime.cpp index 3202c47f1d..7d9f6210eb 100644 --- a/src/utiltime.cpp +++ b/src/utiltime.cpp @@ -20,7 +20,9 @@ int64_t GetTime() { if (nMockTime) return nMockTime; - return time(NULL); + time_t now = time(NULL); + assert(now > 0); + return now; } void SetMockTime(int64_t nMockTimeIn) @@ -30,14 +32,18 @@ void SetMockTime(int64_t nMockTimeIn) int64_t GetTimeMillis() { - return (boost::posix_time::microsec_clock::universal_time() - - boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds(); + int64_t now = (boost::posix_time::microsec_clock::universal_time() - + boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds(); + assert(now > 0); + return now; } int64_t GetTimeMicros() { - return (boost::posix_time::microsec_clock::universal_time() - - boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds(); + int64_t now = (boost::posix_time::microsec_clock::universal_time() - + boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds(); + assert(now > 0); + return now; } /** Return a time useful for the debug log */ diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index b6eaca80b3..db60e498dd 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -65,6 +65,8 @@ void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry) entry.push_back(Pair("blockhash", wtx.hashBlock.GetHex())); entry.push_back(Pair("blockindex", wtx.nIndex)); entry.push_back(Pair("blocktime", mapBlockIndex[wtx.hashBlock]->GetBlockTime())); + } else { + entry.push_back(Pair("trusted", wtx.IsTrusted())); } uint256 hash = wtx.GetHash(); entry.push_back(Pair("txid", hash.GetHex())); @@ -1421,7 +1423,9 @@ UniValue listtransactions(const UniValue& params, bool fHelp) " \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the \n" " 'send' category of transactions.\n" " \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and \n" - " 'receive' category of transactions.\n" + " 'receive' category of transactions. Negative confirmations indicate the\n" + " transation conflicts with the block chain\n" + " \"trusted\": xxx (bool) Whether we consider the outputs of this unconfirmed transaction safe to spend.\n" " \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction. Available for 'send' and 'receive'\n" " category of transactions.\n" " \"blockindex\": n, (numeric) The block index containing the transaction. Available for 'send' and 'receive'\n" @@ -2174,7 +2178,7 @@ UniValue settxfee(const UniValue& params, bool fHelp) if (fHelp || params.size() < 1 || params.size() > 1) throw runtime_error( "settxfee amount\n" - "\nSet the transaction fee per kB.\n" + "\nSet the transaction fee per kB. Overwrites the paytxfee parameter.\n" "\nArguments:\n" "1. amount (numeric, required) The transaction fee in " + CURRENCY_UNIT + "/kB rounded to the nearest 0.00000001\n" "\nResult\n" diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index b062226dd9..d23d54e678 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -41,7 +41,6 @@ CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE; unsigned int nTxConfirmTarget = DEFAULT_TX_CONFIRM_TARGET; bool bSpendZeroConfChange = DEFAULT_SPEND_ZEROCONF_CHANGE; bool fSendFreeTransactions = DEFAULT_SEND_FREE_TRANSACTIONS; -bool fPayAtLeastCustomFee = false; /** * Fees smaller than this (in satoshi) are considered zero fee (for transaction creation) @@ -608,6 +607,14 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet, CWalletD wtx.BindWallet(this); wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0))); AddToSpends(hash); + BOOST_FOREACH(const CTxIn& txin, wtx.vin) { + if (mapWallet.count(txin.prevout.hash)) { + CWalletTx& prevtx = mapWallet[txin.prevout.hash]; + if (prevtx.nIndex == -1 && !prevtx.hashBlock.IsNull()) { + MarkConflicted(prevtx.hashBlock, wtx.GetHash()); + } + } + } } else { @@ -727,6 +734,20 @@ bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pbl { { AssertLockHeld(cs_wallet); + + if (pblock) { + BOOST_FOREACH(const CTxIn& txin, tx.vin) { + std::pair<TxSpends::const_iterator, TxSpends::const_iterator> range = mapTxSpends.equal_range(txin.prevout); + while (range.first != range.second) { + if (range.first->second != tx.GetHash()) { + LogPrintf("Transaction %s (in block %s) conflicts with wallet transaction %s (both spend %s:%i)\n", tx.GetHash().ToString(), pblock->GetHash().ToString(), range.first->second.ToString(), range.first->first.hash.ToString(), range.first->first.n); + MarkConflicted(pblock->GetHash(), range.first->second); + } + range.first++; + } + } + } + bool fExisted = mapWallet.count(tx.GetHash()) != 0; if (fExisted && !fUpdate) return false; if (fExisted || IsMine(tx) || IsFromMe(tx)) @@ -747,9 +768,57 @@ bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pbl return false; } +void CWallet::MarkConflicted(const uint256& hashBlock, const uint256& hashTx) +{ + LOCK2(cs_main, cs_wallet); + + CBlockIndex* pindex; + assert(mapBlockIndex.count(hashBlock)); + pindex = mapBlockIndex[hashBlock]; + int conflictconfirms = 0; + if (chainActive.Contains(pindex)) { + conflictconfirms = -(chainActive.Height() - pindex->nHeight + 1); + } + assert(conflictconfirms < 0); + + // Do not flush the wallet here for performance reasons + CWalletDB walletdb(strWalletFile, "r+", false); + + std::deque<uint256> todo; + std::set<uint256> done; + + todo.push_back(hashTx); + + while (!todo.empty()) { + uint256 now = todo.front(); + todo.pop_front(); + done.insert(now); + assert(mapWallet.count(now)); + CWalletTx& wtx = mapWallet[now]; + int currentconfirm = wtx.GetDepthInMainChain(); + if (conflictconfirms < currentconfirm) { + // Block is 'more conflicted' than current confirm; update. + // Mark transaction as conflicted with this block. + wtx.nIndex = -1; + wtx.hashBlock = hashBlock; + wtx.MarkDirty(); + wtx.WriteToDisk(&walletdb); + // Iterate over all its outputs, and mark transactions in the wallet that spend them conflicted too + TxSpends::const_iterator iter = mapTxSpends.lower_bound(COutPoint(now, 0)); + while (iter != mapTxSpends.end() && iter->first.hash == now) { + if (!done.count(iter->second)) { + todo.push_back(iter->second); + } + iter++; + } + } + } +} + void CWallet::SyncTransaction(const CTransaction& tx, const CBlock* pblock) { LOCK2(cs_main, cs_wallet); + if (!AddToWalletIfInvolvingMe(tx, pblock, true)) return; // Not one of ours @@ -1089,7 +1158,7 @@ void CWallet::ReacceptWalletTransactions() int nDepth = wtx.GetDepthInMainChain(); - if (!wtx.IsCoinBase() && nDepth < 0) { + if (!wtx.IsCoinBase() && nDepth == 0) { mapSorted.insert(std::make_pair(wtx.nOrderPos, &wtx)); } } @@ -1303,6 +1372,14 @@ bool CWalletTx::IsTrusted() const if (!bSpendZeroConfChange || !IsFromMe(ISMINE_ALL)) // using wtx's cached debit return false; + // Don't trust unconfirmed transactions from us unless they are in the mempool. + { + LOCK(mempool.cs); + if (!mempool.exists(GetHash())) { + return false; + } + } + // Trusted if all inputs are from us and are in the mempool: BOOST_FOREACH(const CTxIn& txin, vin) { @@ -1794,15 +1871,25 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt // Discourage fee sniping. // - // However because of a off-by-one-error in previous versions we need to - // neuter it by setting nLockTime to at least one less than nBestHeight. - // Secondly currently propagation of transactions created for block heights - // corresponding to blocks that were just mined may be iffy - transactions - // aren't re-accepted into the mempool - we additionally neuter the code by - // going ten blocks back. Doesn't yet do anything for sniping, but does act - // to shake out wallet bugs like not showing nLockTime'd transactions at - // all. - txNew.nLockTime = std::max(0, chainActive.Height() - 10); + // For a large miner the value of the transactions in the best block and + // the mempool can exceed the cost of deliberately attempting to mine two + // blocks to orphan the current best block. By setting nLockTime such that + // only the next block can include the transaction, we discourage this + // practice as the height restricted and limited blocksize gives miners + // considering fee sniping fewer options for pulling off this attack. + // + // A simple way to think about this is from the wallet's point of view we + // always want the blockchain to move forward. By setting nLockTime this + // way we're basically making the statement that we only want this + // transaction to appear in the next block; we don't want to potentially + // encourage reorgs by allowing transactions to appear at lower heights + // than the next block in forks of the best chain. + // + // Of course, the subsidy is high enough, and transaction volume low + // enough, that fee sniping isn't a problem yet, but by implementing a fix + // now we ensure code won't be written that makes assumptions about + // nLockTime that preclude a fix later. + txNew.nLockTime = chainActive.Height(); // Secondly occasionally randomly pick a nLockTime even further back, so // that transactions that are delayed after signing for whatever reason, @@ -1879,6 +1966,7 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt //a chance at a free transaction. //But mempool inputs might still be in the mempool, so their age stays 0 int age = pcoin.first->GetDepthInMainChain(); + assert(age >= 0); if (age != 0) age += 1; dPriority += (double)nCredit * age; @@ -2017,6 +2105,9 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt } CAmount nFeeNeeded = GetMinimumFee(nBytes, nTxConfirmTarget, mempool); + if (coinControl && nFeeNeeded > 0 && coinControl->nMinimumTotalFee > nFeeNeeded) { + nFeeNeeded = coinControl->nMinimumTotalFee; + } // If we made it here and we aren't even able to meet the relay fee on the next pass, give up // because we must be at the maximum allowed fee. @@ -2112,9 +2203,6 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge { // payTxFee is user-set "I want to pay this much" CAmount nFeeNeeded = payTxFee.GetFee(nTxBytes); - // user selected total at least (default=true) - if (fPayAtLeastCustomFee && nFeeNeeded > 0 && nFeeNeeded < payTxFee.GetFeePerK()) - nFeeNeeded = payTxFee.GetFeePerK(); // User didn't set: use -txconfirmtarget to estimate... if (nFeeNeeded == 0) { int estimateFoundTarget = nConfirmTarget; @@ -2814,9 +2902,9 @@ int CMerkleTx::SetMerkleBranch(const CBlock& block) return chainActive.Height() - pindex->nHeight + 1; } -int CMerkleTx::GetDepthInMainChainINTERNAL(const CBlockIndex* &pindexRet) const +int CMerkleTx::GetDepthInMainChain(const CBlockIndex* &pindexRet) const { - if (hashBlock.IsNull() || nIndex == -1) + if (hashBlock.IsNull()) return 0; AssertLockHeld(cs_main); @@ -2829,17 +2917,7 @@ int CMerkleTx::GetDepthInMainChainINTERNAL(const CBlockIndex* &pindexRet) const return 0; pindexRet = pindex; - return chainActive.Height() - pindex->nHeight + 1; -} - -int CMerkleTx::GetDepthInMainChain(const CBlockIndex* &pindexRet) const -{ - AssertLockHeld(cs_main); - int nResult = GetDepthInMainChainINTERNAL(pindexRet); - if (nResult == 0 && !mempool.exists(GetHash())) - return -1; // Not in chain, not in mempool - - return nResult; + return ((nIndex == -1) ? (-1) : 1) * (chainActive.Height() - pindex->nHeight + 1); } int CMerkleTx::GetBlocksToMaturity() const diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index a4199488fc..859788893c 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -35,7 +35,6 @@ extern CAmount maxTxFee; extern unsigned int nTxConfirmTarget; extern bool bSpendZeroConfChange; extern bool fSendFreeTransactions; -extern bool fPayAtLeastCustomFee; static const unsigned int DEFAULT_KEYPOOL_SIZE = 100; //! -paytxfee default @@ -156,11 +155,14 @@ struct COutputEntry /** A transaction with a merkle branch linking it to the block chain. */ class CMerkleTx : public CTransaction { -private: - int GetDepthInMainChainINTERNAL(const CBlockIndex* &pindexRet) const; - public: uint256 hashBlock; + + /* An nIndex == -1 means that hashBlock (in nonzero) refers to the earliest + * block in the chain we know this or any in-wallet dependency conflicts + * with. Older clients interpret nIndex == -1 as unconfirmed for backward + * compatibility. + */ int nIndex; CMerkleTx() @@ -193,16 +195,15 @@ public: int SetMerkleBranch(const CBlock& block); - /** * Return depth of transaction in blockchain: - * -1 : not in blockchain, and not in memory pool (conflicted transaction) + * <0 : conflicts with a transaction this deep in the blockchain * 0 : in memory pool, waiting to be included in a block * >=1 : this many blocks deep in the main chain */ int GetDepthInMainChain(const CBlockIndex* &pindexRet) const; int GetDepthInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); } - bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChainINTERNAL(pindexRet) > 0; } + bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet) > 0; } int GetBlocksToMaturity() const; bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectAbsurdFee=true); }; @@ -481,6 +482,10 @@ private: void AddToSpends(const COutPoint& outpoint, const uint256& wtxid); void AddToSpends(const uint256& wtxid); + /* Mark a transaction (and its in-wallet descendants) as conflicting with a particular block. */ + void MarkConflicted(const uint256& hashBlock, const uint256& hashTx); + + void SyncMetaData(std::pair<TxSpends::iterator, TxSpends::iterator>); public: diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index 5c08ee6d6c..e2e827d816 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -113,19 +113,19 @@ bool CWalletDB::WriteMasterKey(unsigned int nID, const CMasterKey& kMasterKey) bool CWalletDB::WriteCScript(const uint160& hash, const CScript& redeemScript) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("cscript"), hash), redeemScript, false); + return Write(std::make_pair(std::string("cscript"), hash), *(const CScriptBase*)(&redeemScript), false); } bool CWalletDB::WriteWatchOnly(const CScript &dest) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("watchs"), dest), '1'); + return Write(std::make_pair(std::string("watchs"), *(const CScriptBase*)(&dest)), '1'); } bool CWalletDB::EraseWatchOnly(const CScript &dest) { nWalletDBUpdated++; - return Erase(std::make_pair(std::string("watchs"), dest)); + return Erase(std::make_pair(std::string("watchs"), *(const CScriptBase*)(&dest))); } bool CWalletDB::WriteBestBlock(const CBlockLocator& locator) @@ -421,7 +421,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, else if (strType == "watchs") { CScript script; - ssKey >> script; + ssKey >> *(CScriptBase*)(&script); char fYes; ssValue >> fYes; if (fYes == '1') @@ -575,7 +575,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, uint160 hash; ssKey >> hash; CScript script; - ssValue >> script; + ssValue >> *(CScriptBase*)(&script); if (!pwallet->LoadCScript(script)) { strErr = "Error reading wallet database: LoadCScript failed"; |