From: Luke Dashjr Date: Wed, 4 Apr 2012 19:43:29 +0000 (-0400) Subject: Merge branch '0.5.x' into 0.6.0.x X-Git-Tag: v0.4.0-unstable~129^2~1^2~18^2~28 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=fe1725a141334dab82ca007fb6fc983c358e35b2;hp=658cf0b1be93e08eee400b0bd1e9d3485313475d Merge branch '0.5.x' into 0.6.0.x Conflicts: src/bitcoinrpc.cpp --- diff --git a/bitcoin-qt.pro b/bitcoin-qt.pro index 60f1de8..d9206b3 100644 --- a/bitcoin-qt.pro +++ b/bitcoin-qt.pro @@ -1,6 +1,6 @@ TEMPLATE = app TARGET = -VERSION = 0.5.4 +VERSION = 0.6.0 INCLUDEPATH += src src/json src/qt DEFINES += QT_GUI BOOST_THREAD_USE_LIB CONFIG += no_include_pwd @@ -30,6 +30,14 @@ contains(RELEASE, 1) { } } +# use: qmake "USE_QRCODE=1" +# libqrencode (http://fukuchi.org/works/qrencode/index.en.html) must be installed for support +contains(USE_QRCODE, 1) { + message(Building with QRCode support) + DEFINES += USE_QRCODE + LIBS += -lqrencode +} + # use: qmake "USE_UPNP=1" ( enabled by default; default) # or: qmake "USE_UPNP=0" (disabled by default) # or: qmake "USE_UPNP=-" (not supported) @@ -60,6 +68,12 @@ contains(USE_SSL, 1) { DEFINES += USE_SSL } +# use: qmake "FIRST_CLASS_MESSAGING=1" +contains(FIRST_CLASS_MESSAGING, 1) { + message(Building with first-class messaging) + DEFINES += FIRST_CLASS_MESSAGING +} + contains(BITCOIN_NEED_QT_PLUGINS, 1) { DEFINES += BITCOIN_NEED_QT_PLUGINS QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets @@ -83,12 +97,15 @@ HEADERS += src/qt/bitcoingui.h \ src/qt/optionsdialog.h \ src/qt/sendcoinsdialog.h \ src/qt/addressbookpage.h \ + src/qt/messagepage.h \ src/qt/aboutdialog.h \ src/qt/editaddressdialog.h \ src/qt/bitcoinaddressvalidator.h \ + src/addrman.h \ src/base58.h \ src/bignum.h \ src/checkpoints.h \ + src/compat.h \ src/util.h \ src/uint256.h \ src/serialize.h \ @@ -102,6 +119,7 @@ HEADERS += src/qt/bitcoingui.h \ src/init.h \ src/headers.h \ src/irc.h \ + src/mruset.h \ src/json/json_spirit_writer_template.h \ src/json/json_spirit_writer.h \ src/json/json_spirit_value.h \ @@ -136,7 +154,8 @@ HEADERS += src/qt/bitcoingui.h \ src/qt/qvaluecombobox.h \ src/qt/askpassphrasedialog.h \ src/protocol.h \ - src/qt/notificator.h + src/qt/notificator.h \ + src/qt/qtipcserver.h SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/transactiontablemodel.cpp \ @@ -144,16 +163,20 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/optionsdialog.cpp \ src/qt/sendcoinsdialog.cpp \ src/qt/addressbookpage.cpp \ + src/qt/messagepage.cpp \ src/qt/aboutdialog.cpp \ src/qt/editaddressdialog.cpp \ src/qt/bitcoinaddressvalidator.cpp \ src/util.cpp \ + src/netbase.cpp \ + src/key.cpp \ src/script.cpp \ src/main.cpp \ src/init.cpp \ src/net.cpp \ src/irc.cpp \ src/checkpoints.cpp \ + src/addrman.cpp \ src/db.cpp \ src/json/json_spirit_writer.cpp \ src/json/json_spirit_value.cpp \ @@ -173,6 +196,7 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/transactionview.cpp \ src/qt/walletmodel.cpp \ src/bitcoinrpc.cpp \ + src/rpcdump.cpp \ src/qt/overviewpage.cpp \ src/qt/csvmodelwriter.cpp \ src/crypter.cpp \ @@ -182,7 +206,8 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/qvaluecombobox.cpp \ src/qt/askpassphrasedialog.cpp \ src/protocol.cpp \ - src/qt/notificator.cpp + src/qt/notificator.cpp \ + src/qt/qtipcserver.cpp RESOURCES += \ src/qt/bitcoin.qrc @@ -190,6 +215,7 @@ RESOURCES += \ FORMS += \ src/qt/forms/sendcoinsdialog.ui \ src/qt/forms/addressbookpage.ui \ + src/qt/forms/messagepage.ui \ src/qt/forms/aboutdialog.ui \ src/qt/forms/editaddressdialog.ui \ src/qt/forms/transactiondescdialog.ui \ @@ -197,6 +223,22 @@ FORMS += \ src/qt/forms/sendcoinsentry.ui \ src/qt/forms/askpassphrasedialog.ui +contains(USE_QRCODE, 1) { +HEADERS += src/qt/qrcodedialog.h +SOURCES += src/qt/qrcodedialog.cpp +FORMS += src/qt/forms/qrcodedialog.ui +} + +contains(BITCOIN_QT_TEST, 1) { +SOURCES += src/qt/test/test_main.cpp \ + src/qt/test/urltests.cpp +HEADERS += src/qt/test/urltests.h +DEPENDPATH += src/qt/test +QT += testlib +TARGET = bitcoin-qt_test +DEFINES += BITCOIN_QT_TEST +} + CODECFORTR = UTF-8 # for lrelease/lupdate @@ -251,7 +293,7 @@ isEmpty(BOOST_INCLUDE_PATH) { macx:BOOST_INCLUDE_PATH = /opt/local/include } -windows:LIBS += -lws2_32 +windows:LIBS += -lws2_32 -lshlwapi windows:DEFINES += WIN32 windows:RC_FILE = src/qt/res/bitcoin-qt.rc @@ -266,6 +308,11 @@ windows:!contains(MINGW_THREAD_BUGFIX, 0) { QMAKE_LIBS_QT_ENTRY = -lmingwthrd $$QMAKE_LIBS_QT_ENTRY } +!windows:!mac { + DEFINES += LINUX + LIBS += -lrt +} + macx:HEADERS += src/qt/macdockiconhandler.h macx:OBJECTIVE_SOURCES += src/qt/macdockiconhandler.mm macx:LIBS += -framework Foundation -framework ApplicationServices -framework AppKit @@ -274,11 +321,11 @@ macx:ICON = src/qt/res/icons/bitcoin.icns macx:TARGET = "Bitcoin-Qt" # Set libraries and includes at end, to use platform-defined defaults if not overridden -INCLUDEPATH += $$BOOST_INCLUDE_PATH $$BDB_INCLUDE_PATH $$OPENSSL_INCLUDE_PATH -LIBS += $$join(BOOST_LIB_PATH,,-L,) $$join(BDB_LIB_PATH,,-L,) $$join(OPENSSL_LIB_PATH,,-L,) +INCLUDEPATH += $$BOOST_INCLUDE_PATH $$BDB_INCLUDE_PATH $$OPENSSL_INCLUDE_PATH $$QRENCODE_INCLUDE_PATH +LIBS += $$join(BOOST_LIB_PATH,,-L,) $$join(BDB_LIB_PATH,,-L,) $$join(OPENSSL_LIB_PATH,,-L,) $$join(QRENCODE_LIB_PATH,,-L,) LIBS += -lssl -lcrypto -ldb_cxx$$BDB_LIB_SUFFIX # -lgdi32 has to happen after -lcrypto (see #681) -windows:LIBS += -lgdi32 +windows:LIBS += -lole32 -luuid -lgdi32 LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX contains(RELEASE, 1) { diff --git a/contrib/debian/bitcoin-qt.desktop b/contrib/debian/bitcoin-qt.desktop index d65cc35..ea5a6e4 100644 --- a/contrib/debian/bitcoin-qt.desktop +++ b/contrib/debian/bitcoin-qt.desktop @@ -6,6 +6,5 @@ Exec=/usr/bin/bitcoin-qt Terminal=false Type=Application Icon=/usr/share/pixmaps/bitcoin80.xpm -#For when bitcoin (finally) properly handles bitcoin: URLs -#MimeType=x-scheme-handler/bitcoin; +MimeType=x-scheme-handler/bitcoin; Categories=Office; diff --git a/contrib/debian/bitcoin-qt.install b/contrib/debian/bitcoin-qt.install index 7ddc8c1..6a566f5 100644 --- a/contrib/debian/bitcoin-qt.install +++ b/contrib/debian/bitcoin-qt.install @@ -3,3 +3,4 @@ bitcoin-qt usr/lib/bitcoin share/pixmaps/bitcoin32.xpm usr/share/pixmaps share/pixmaps/bitcoin80.xpm usr/share/pixmaps debian/bitcoin-qt.desktop usr/share/applications +debian/bitcoin-qt.protocol usr/share/kde4/services/ diff --git a/contrib/debian/bitcoin-qt.protocol b/contrib/debian/bitcoin-qt.protocol new file mode 100644 index 0000000..014588d --- /dev/null +++ b/contrib/debian/bitcoin-qt.protocol @@ -0,0 +1,11 @@ +[Protocol] +exec=bitcoin-qt '%u' +protocol=bitcoin +input=none +output=none +helper=true +listing= +reading=false +writing=false +makedir=false +deleting=false diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 0720acc..db5e268 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,23 +1,13 @@ -bitcoin (0.5.3-natty0) natty; urgency=low - - * New upstream release. - - -- Luke Dashjr Tue, 10 Jan 2012 15:57:00 -0500 - -bitcoin (0.5.2-natty1) natty; urgency=low +bitcoin (0.5.1-natty1) natty; urgency=low * Remove mentions on anonymity in package descriptions and manpage. These should never have been there, bitcoin isnt anonymous without a ton of work that virtually no users will ever be willing and capable of doing + * Add GNOME/KDE support for bitcoin-qt's bitcoin: URI support. + Thanks to luke-jr for the KDE .protocol file. - -- Matt Corallo Sat, 7 Jan 2012 13:37:00 -0500 - -bitcoin (0.5.2-natty0) natty; urgency=low - - * New upstream release. - - -- Luke Dashjr Fri, 16 Dec 2011 17:57:00 -0500 + -- Matt Corallo Fri, 23 Dec 2011 20:25:00 -0500 bitcoin (0.5.1-natty0) natty; urgency=low diff --git a/contrib/debian/control b/contrib/debian/control index c41664c..745fd71 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -15,7 +15,8 @@ Build-Depends: debhelper, libboost-thread-dev (>> 1.35) | libboost-thread1.35-dev, libboost-test-dev (>> 1.35) | libboost-test1.35-dev, qt4-qmake, - libqt4-dev + libqt4-dev, + libqrencode-dev Standards-Version: 3.9.2 Homepage: http://www.bitcoin.org/ Vcs-Git: git://github.com/bitcoin/bitcoin.git diff --git a/contrib/debian/copyright b/contrib/debian/copyright index 5db418d..71fa77c 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -37,7 +37,7 @@ Files: src/qt/res/icons/address-book.png, src/qt/res/icons/export.png, src/qt/res/icons/history.png, src/qt/res/icons/key.png, src/qt/res/icons/lock_*.png, src/qt/res/icons/overview.png, src/qt/res/icons/receive.png, src/qt/res/icons/send.png, - src/qt/res/icons/synced.png + src/qt/res/icons/synced.png, src/qt/res/icons/filesave.png Copyright: David Vignoni (david@icon-king.com) ICON KING - www.icon-king.com License: LGPL diff --git a/contrib/debian/rules b/contrib/debian/rules index a1d6565..6d6f119 100755 --- a/contrib/debian/rules +++ b/contrib/debian/rules @@ -20,7 +20,7 @@ override_dh_auto_clean: cd src; $(MAKE) -f makefile.unix clean override_dh_auto_configure: - qmake bitcoin-qt.pro + qmake bitcoin-qt.pro USE_SSL=1 USE_QRCODE=1 override_dh_auto_test: cd src; $(MAKE) -f makefile.unix test_bitcoin diff --git a/contrib/gitian-descriptors/deps-win32.yml b/contrib/gitian-descriptors/deps-win32.yml new file mode 100644 index 0000000..776a8da --- /dev/null +++ b/contrib/gitian-descriptors/deps-win32.yml @@ -0,0 +1,71 @@ +--- +name: "bitcoin-deps" +suites: +- "lucid" +architectures: +- "i386" +packages: +- "mingw32" +- "git-core" +- "zip" +- "faketime" +- "wine" +reference_datetime: "2011-01-30 00:00:00" +remotes: [] +files: +- "openssl-1.0.0e.tar.gz" +- "db-4.8.30.NC.tar.gz" +- "miniupnpc-1.6.tar.gz" +- "zlib-1.2.6.tar.gz" +- "libpng-1.5.9.tar.gz" +- "qrencode-3.2.0.tar.bz2" +script: | + # + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + export TZ=UTC + # + tar xzf openssl-1.0.0e.tar.gz + cd openssl-1.0.0e + ./Configure --cross-compile-prefix=i586-mingw32msvc- mingw + make + cd .. + # + tar xzf db-4.8.30.NC.tar.gz + cd db-4.8.30.NC/build_unix + ../dist/configure --enable-mingw --enable-cxx --host=i586-mingw32msvc CFLAGS="-I/usr/i586-mingw32msvc/include" + make $MAKEOPTS + cd ../.. + # + tar xzf miniupnpc-1.6.tar.gz + cd miniupnpc-1.6 + sed 's/dllwrap -k --driver-name gcc/$(DLLWRAP) -k --driver-name $(CC)/' -i Makefile.mingw + sed 's|wingenminiupnpcstrings $< $@|./wingenminiupnpcstrings $< $@|' -i Makefile.mingw + make -f Makefile.mingw DLLWRAP=i586-mingw32msvc-dllwrap CC=i586-mingw32msvc-gcc AR=i586-mingw32msvc-ar + cd .. + mv miniupnpc-1.6 miniupnpc + # + tar xzf zlib-1.2.6.tar.gz + cd zlib-1.2.6 + make -f win32/Makefile.gcc PREFIX=i586-mingw32msvc- $MAKEOPTS + cd .. + # + tar xzf libpng-1.5.9.tar.gz + cd libpng-1.5.9 + ./configure -disable-shared CC=i586-mingw32msvc-cc AR=i586-mingw32msvc-ar STRIP=i586-mingw32msvc-strip RANLIB=i586-mingw32msvc-ranlib OBJDUMP=i586-mingw32msvc-objdump LD=i586-mingw32msvc-ld LDFLAGS="-L../zlib-1.2.6/" CFLAGS="-I../zlib-1.2.6/" + make $MAKEOPTS + cd .. + # + tar xjf qrencode-3.2.0.tar.bz2 + cd qrencode-3.2.0 + ./configure CC=i586-mingw32msvc-cc AR=i586-mingw32msvc-ar STRIP=i586-mingw32msvc-strip RANLIB=i586-mingw32msvc-ranlib OBJDUMP=i586-mingw32msvc-objdump LD=i586-mingw32msvc-ld png_LIBS="../libpng-1.5.9/.libs/libpng15.a ../zlib-1.2.6/libz.a" png_CFLAGS="-I../libpng-1.5.9" + make $MAKEOPTS + cd .. + # + zip -r $OUTDIR/bitcoin-deps-0.0.3.zip \ + $(ls qrencode-*/{qrencode.h,.libs/libqrencode.{,l}a} | sort) \ + $(ls db-*/build_unix/{libdb_cxx.a,db.h,db_cxx.h,libdb.a,.libs/libdb_cxx-?.?.a} | sort) \ + $(find openssl-* -name '*.a' -o -name '*.h' | sort) \ + $(find miniupnpc -name '*.h' -o -name 'libminiupnpc.a' | sort) + # Kill wine processes as gitian won't figure out we are done otherwise + killall wineserver services.exe explorer.exe winedevice.exe diff --git a/contrib/gitian-descriptors/gitian-win32.yml b/contrib/gitian-descriptors/gitian-win32.yml index 0f46709..4f299c4 100644 --- a/contrib/gitian-descriptors/gitian-win32.yml +++ b/contrib/gitian-descriptors/gitian-win32.yml @@ -10,7 +10,6 @@ packages: - "unzip" - "nsis" - "faketime" -- "wine" reference_datetime: "2011-01-30 00:00:00" remotes: - "url": "https://git.gitorious.org/+bitcoin-stable-developers/bitcoin/bitcoind-stable.git" @@ -18,9 +17,7 @@ remotes: files: - "qt-win32-4.7.4-gitian.zip" - "boost-win32-1.47.0-gitian.zip" -- "openssl-1.0.0e.tar.gz" -- "db-4.8.30.NC.tar.gz" -- "miniupnpc-1.6.tar.gz" +- "bitcoin-deps-0.0.3.zip" script: | # mkdir $HOME/qt @@ -42,25 +39,9 @@ script: | mv include/boost . cd .. # - tar xzf openssl-1.0.0e.tar.gz - cd openssl-1.0.0e - ./Configure --cross-compile-prefix=i586-mingw32msvc- mingw - make - cd .. + unzip bitcoin-deps-0.0.3.zip # - tar xzf db-4.8.30.NC.tar.gz - cd db-4.8.30.NC/build_unix - ../dist/configure --enable-mingw --enable-cxx --host=i586-mingw32msvc CFLAGS="-I/usr/i586-mingw32msvc/include" - make $MAKEOPTS - cd ../.. - # - tar xzf miniupnpc-1.6.tar.gz - cd miniupnpc-1.6 - sed 's/dllwrap -k --driver-name gcc/$(DLLWRAP) -k --driver-name $(CC)/' -i Makefile.mingw - sed 's|wingenminiupnpcstrings $< $@|./wingenminiupnpcstrings $< $@|' -i Makefile.mingw - make -f Makefile.mingw DLLWRAP=i586-mingw32msvc-dllwrap CC=i586-mingw32msvc-gcc AR=i586-mingw32msvc-ar - cd .. - mv miniupnpc-1.6 miniupnpc + find -type f | xargs touch --date="$REFERENCE_DATETIME" # cd bitcoin mkdir -p $OUTDIR/src @@ -71,7 +52,7 @@ script: | export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 export FAKETIME=$REFERENCE_DATETIME export TZ=UTC - $HOME/qt/src/bin/qmake -spec unsupported/win32-g++-cross USE_SSL=1 MINIUPNPC_LIB_PATH=$HOME/build/miniupnpc MINIUPNPC_INCLUDE_PATH=$HOME/build/ BDB_LIB_PATH=$HOME/build/db-4.8.30.NC/build_unix BDB_INCLUDE_PATH=$HOME/build/db-4.8.30.NC/build_unix BOOST_LIB_PATH=$HOME/build/boost_1_47_0/stage/lib BOOST_INCLUDE_PATH=$HOME/build/boost_1_47_0 BOOST_LIB_SUFFIX=-mt-s BOOST_THREAD_LIB_SUFFIX=_win32-mt-s OPENSSL_LIB_PATH=$HOME/build/openssl-1.0.0e OPENSSL_INCLUDE_PATH=$HOME/build/openssl-1.0.0e/include INCLUDEPATH=$HOME/build DEFINES=BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 QMAKE_LRELEASE=lrelease QMAKE_CXXFLAGS=-frandom-seed=bitcoin QMAKE_LFLAGS=-frandom-seed=bitcoin + $HOME/qt/src/bin/qmake -spec unsupported/win32-g++-cross USE_SSL=1 MINIUPNPC_LIB_PATH=$HOME/build/miniupnpc MINIUPNPC_INCLUDE_PATH=$HOME/build/ BDB_LIB_PATH=$HOME/build/db-4.8.30.NC/build_unix BDB_INCLUDE_PATH=$HOME/build/db-4.8.30.NC/build_unix BOOST_LIB_PATH=$HOME/build/boost_1_47_0/stage/lib BOOST_INCLUDE_PATH=$HOME/build/boost_1_47_0 BOOST_LIB_SUFFIX=-mt-s BOOST_THREAD_LIB_SUFFIX=_win32-mt-s OPENSSL_LIB_PATH=$HOME/build/openssl-1.0.0e OPENSSL_INCLUDE_PATH=$HOME/build/openssl-1.0.0e/include QRENCODE_LIB_PATH=$HOME/build/qrencode-3.2.0/.libs QRENCODE_INCLUDE_PATH=$HOME/build/qrencode-3.2.0 USE_QRCODE=1 INCLUDEPATH=$HOME/build DEFINES=BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 QMAKE_LRELEASE=lrelease QMAKE_CXXFLAGS=-frandom-seed=bitcoin QMAKE_LFLAGS=-frandom-seed=bitcoin make $MAKEOPTS cp release/bitcoin-qt.exe $OUTDIR/ # diff --git a/contrib/gitian-descriptors/gitian.yml b/contrib/gitian-descriptors/gitian.yml index 11ee4dc..52056b3 100644 --- a/contrib/gitian-descriptors/gitian.yml +++ b/contrib/gitian-descriptors/gitian.yml @@ -16,12 +16,15 @@ packages: - "libssl-dev" - "git-core" - "unzip" +- "pkg-config" +- "libpng12-dev" reference_datetime: "2011-01-30 00:00:00" remotes: - "url": "https://git.gitorious.org/+bitcoin-stable-developers/bitcoin/bitcoind-stable.git" "dir": "bitcoin" files: - "miniupnpc-1.6.tar.gz" +- "qrencode-3.2.0.tar.bz2" script: | INSTDIR="$HOME/install" export LIBRARY_PATH="$INSTDIR/lib" @@ -31,6 +34,12 @@ script: | INSTALLPREFIX=$INSTDIR make $MAKEOPTS install cd .. # + tar xjf qrencode-3.2.0.tar.bz2 + cd qrencode-3.2.0 + ./configure --prefix=$INSTDIR --enable-static --disable-shared + make $MAKEOPTS install + cd .. + # cd bitcoin mkdir -p $OUTDIR/src cp -a . $OUTDIR/src @@ -43,6 +52,6 @@ script: | mkdir -p $OUTDIR/bin/$GBUILD_BITS install -s bitcoind $OUTDIR/bin/$GBUILD_BITS cd .. - qmake INCLUDEPATH="$INSTDIR/include" LIBS="-L$INSTDIR/lib" RELEASE=1 USE_SSL=1 + qmake INCLUDEPATH="$INSTDIR/include" LIBS="-L$INSTDIR/lib" RELEASE=1 USE_SSL=1 USE_QRCODE=1 make $MAKEOPTS install bitcoin-qt $OUTDIR/bin/$GBUILD_BITS diff --git a/contrib/gitian-downloader/laanwj-key.pgp b/contrib/gitian-downloader/laanwj-key.pgp new file mode 100644 index 0000000..5592951 --- /dev/null +++ b/contrib/gitian-downloader/laanwj-key.pgp @@ -0,0 +1,28 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.0 + +mQENBE5UtMEBCADOUz2i9l/D8xYINCmfUDnxi+DXvX5LmZ39ZdvsoE+ugO0SRRGdIHEFO2is +0xezX50wXu9aneb+tEqM0BuiLo6VxaXpxrkxHpr6c4jf37SkE/H0qsi/txEUp7337y3+4HMG +lUjiuh802I72p1qusjsKBnmnnR0rwNouTcoDmGUDh7jpKCtzFv+2TR2dRthJn7vmmjq3+bG6 +PYfqoFY1yHrAGT1lrDBULZsQ/NBLI2+J4oo2LYv3GCq8GNnzrovqvTvui50VSROhLrOe58o2 +shE+sjQShAy5wYkPt1R1fQnpfx+5vf+TPnkxVwRb3h5GhCp0YL8XC/BXsd5vM4KlVH2rABEB +AAG0K1dsYWRpbWlyIEouIHZhbiBkZXIgTGFhbiA8bGFhbndqQGdtYWlsLmNvbT6JATgEEwEC +ACIFAk5UtMECGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHSBCwEjRsmmy6YIAK09 +buNXyYQrJBsX16sXxEhx5QPKyF3uHJDFJv66SdnpvIkNoznsaPiRJkbTANop93FZmaGa6wVn +zGDiz7jPA8Dpxx5aAYPhIT+zPJAdXWM3wJ/Gio9besRNzniai8Lwi5MZ9R/5yFGBobm6/AcN +4sUoqA3NSV2U3I29R0Vwlzo8GVtmyi9ENSi6Oo7AcXNTRt69cxW4nAHkB+amwwDJlcAb31ex +bogYXPhScwqQZixRr+JBkKxBjkTXXnQypT4KI5SegYwQVYfyiZmDP7UHKe/u6pSKKbVphLg8 +xLB5spcXse8/a2+onrbNlw6y8TXiJ++Z54PE7zztWTXf2huakeG5AQ0ETlS0wQEIAMNO3OkP +xoPRKWzBLcI7JRITAW+HNaLTq3uN2+4WxA57DEjbL9EDoAv+7wTkDAL40f0T+xiu6GJcLFjw +GJZu/tYu7+mErHjrdo+K4suCQt7w5EXCBvOLjhW4tyYMzNx8hP+oqzOW9iEC+6VV91+DYeqt +EkJuyVXOI4vzBlTw8uGow8aMMsCq8XVvKUZFTPsjGl197Q5B3A+ZOFCR8xqiqdPjuz6MglVV +oFdDNu3EZn8zkGsQlovXoE9ndVeVzx/XMNmsxFaMYsReUs253RIf1FEfgExID0fg2OnyLCjS +2iFW1RgajS+/saIkKl+N1iuMzJA7wMAM0plhRueOG0MtZSsAEQEAAYkBHwQYAQIACQUCTlS0 +wQIbDAAKCRB0gQsBI0bJpmsDB/4waenn2CvSHXyomykfpwf5lMte1V5LvH3z5R2LY+1NopRv +LSz3iC39x69XWiTbhywDfgafnGPW4pWBOff2/bu5/A6z1Hnan1vyrRRD/hx1uMJ7S6q+bIvZ +iVIg1p0jH6tdIIhwX3cydhdRZHo7e9oSMgOUWsr6Ar59NRo9CENwGPE4U61HXfOnxWdrFWoA +XdwZczBeLxmUy6Vo6sKqv+gE4bqrtAM0sY/MsQ9cU95x+52ox/sq44lQMwd3ZBYUP7B1qbHI +hZSZuch6MLi5scLPeau0ZvCaljiaMeivP5+x0gWPRs0kI+9sZxInbqvrsJ6oOBJM3xYGhtn1 +zZ7qmZR7 +=si/k +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/linux-download-config b/contrib/gitian-downloader/linux-download-config index 347670e..88e48e2 100644 --- a/contrib/gitian-downloader/linux-download-config +++ b/contrib/gitian-downloader/linux-download-config @@ -31,4 +31,8 @@ signers: weight: 40 name: "Gavin Andresen" key: gavinandresen + 71A3B16735405025D447E8F274810B012346C9A6 + weight: 40 + name: "Wladimir J. van der Laan" + key: laanwj minimum_weight: 120 diff --git a/contrib/gitian-downloader/win32-download-config b/contrib/gitian-downloader/win32-download-config index 84ad989..595626f 100644 --- a/contrib/gitian-downloader/win32-download-config +++ b/contrib/gitian-downloader/win32-download-config @@ -31,4 +31,8 @@ signers: weight: 40 name: "Gavin Andresen" key: gavinandresen + 71A3B16735405025D447E8F274810B012346C9A6 + weight: 40 + name: "Wladimir J. van der Laan" + key: laanwj minimum_weight: 120 diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index a43e710..e159f9b 100755 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -17,16 +17,405 @@ # along with this program. If not, see . # -import subprocess, sys, re, os, shutil, os.path +import subprocess, sys, re, os, shutil, stat, os.path from time import sleep from argparse import ArgumentParser +# This is ported from the original macdeployqt with modifications + +class FrameworkInfo(object): + def __init__(self): + self.frameworkDirectory = "" + self.frameworkName = "" + self.frameworkPath = "" + self.binaryDirectory = "" + self.binaryName = "" + self.binaryPath = "" + self.version = "" + self.installName = "" + self.deployedInstallName = "" + self.sourceFilePath = "" + self.destinationDirectory = "" + self.sourceResourcesDirectory = "" + self.destinationResourcesDirectory = "" + + def __eq__(self, other): + if self.__class__ == other.__class__: + return self.__dict__ == other.__dict__ + else: + return False + + def __str__(self): + return """ Framework name: %s + Framework directory: %s + Framework path: %s + Binary name: %s + Binary directory: %s + Binary path: %s + Version: %s + Install name: %s + Deployed install name: %s + Source file Path: %s + Deployed Directory (relative to bundle): %s +""" % (self.frameworkName, + self.frameworkDirectory, + self.frameworkPath, + self.binaryName, + self.binaryDirectory, + self.binaryPath, + self.version, + self.installName, + self.deployedInstallName, + self.sourceFilePath, + self.destinationDirectory) + + def isDylib(self): + return self.frameworkName.endswith(".dylib") + + def isQtFramework(self): + if self.isDylib(): + return self.frameworkName.startswith("libQt") + else: + return self.frameworkName.startswith("Qt") + + reOLine = re.compile(r'^(.+) \(compatibility version [0-9.]+, current version [0-9.]+\)$') + bundleFrameworkDirectory = "Contents/Frameworks" + bundleBinaryDirectory = "Contents/MacOS" + + @classmethod + def fromOtoolLibraryLine(cls, line): + # Note: line must be trimmed + if line == "": + return None + + # Don't deploy system libraries (exception for libQtuitools and libQtlucene). + if line.startswith("/System/Library/") or line.startswith("@executable_path") or (line.startswith("/usr/lib/") and "libQt" not in line): + return None + + m = cls.reOLine.match(line) + if m is None: + raise RuntimeError("otool line could not be parsed: " + line) + + path = m.group(1) + + info = cls() + info.sourceFilePath = path + info.installName = path + + if path.endswith(".dylib"): + dirname, filename = os.path.split(path) + info.frameworkName = filename + info.frameworkDirectory = dirname + info.frameworkPath = path + + info.binaryDirectory = dirname + info.binaryName = filename + info.binaryPath = path + info.version = "-" + + info.installName = path + info.deployedInstallName = "@executable_path/../Frameworks/" + info.binaryName + info.sourceFilePath = path + info.destinationDirectory = cls.bundleFrameworkDirectory + else: + parts = path.split("/") + i = 0 + # Search for the .framework directory + for part in parts: + if part.endswith(".framework"): + break + i += 1 + if i == len(parts): + raise RuntimeError("Could not find .framework or .dylib in otool line: " + line) + + info.frameworkName = parts[i] + info.frameworkDirectory = "/".join(parts[:i]) + info.frameworkPath = os.path.join(info.frameworkDirectory, info.frameworkName) + + info.binaryName = parts[i+3] + info.binaryDirectory = "/".join(parts[i+1:i+3]) + info.binaryPath = os.path.join(info.binaryDirectory, info.binaryName) + info.version = parts[i+2] + + info.deployedInstallName = "@executable_path/../Frameworks/" + os.path.join(info.frameworkName, info.binaryPath) + info.destinationDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, info.binaryDirectory) + + info.sourceResourcesDirectory = os.path.join(info.frameworkPath, "Resources") + info.destinationResourcesDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Resources") + + return info + +class ApplicationBundleInfo(object): + def __init__(self, path): + self.path = path + appName = os.path.splitext(os.path.basename(path))[0] + self.binaryPath = os.path.join(path, "Contents", "MacOS", appName) + if not os.path.exists(self.binaryPath): + raise RuntimeError("Could not find bundle binary for " + path) + self.resourcesPath = os.path.join(path, "Contents", "Resources") + self.pluginPath = os.path.join(path, "Contents", "PlugIns") + +class DeploymentInfo(object): + def __init__(self): + self.qtPath = None + self.pluginPath = None + self.deployedFrameworks = [] + + def detectQtPath(self, frameworkDirectory): + parentDir = os.path.dirname(frameworkDirectory) + if os.path.exists(os.path.join(parentDir, "translations")): + # Classic layout, e.g. "/usr/local/Trolltech/Qt-4.x.x" + self.qtPath = parentDir + elif os.path.exists(os.path.join(parentDir, "share", "qt4", "translations")): + # MacPorts layout, e.g. "/opt/local/share/qt4" + self.qtPath = os.path.join(parentDir, "share", "qt4") + + if self.qtPath is not None: + pluginPath = os.path.join(self.qtPath, "plugins") + if os.path.exists(pluginPath): + self.pluginPath = pluginPath + + def usesFramework(self, name): + nameDot = "%s." % name + libNameDot = "lib%s." % name + for framework in self.deployedFrameworks: + if framework.endswith(".framework"): + if framework.startswith(nameDot): + return True + elif framework.endswith(".dylib"): + if framework.startswith(libNameDot): + return True + return False + +def getFrameworks(binaryPath, verbose): + if verbose >= 3: + print "Inspecting with otool: " + binaryPath + otool = subprocess.Popen(["otool", "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + o_stdout, o_stderr = otool.communicate() + if otool.returncode != 0: + if verbose >= 1: + sys.stderr.write(o_stderr) + sys.stderr.flush() + raise RuntimeError("otool failed with return code %d" % otool.returncode) + + otoolLines = o_stdout.split("\n") + otoolLines.pop(0) # First line is the inspected binary + if ".framework" in binaryPath or binaryPath.endswith(".dylib"): + otoolLines.pop(0) # Frameworks and dylibs list themselves as a dependency. + + libraries = [] + for line in otoolLines: + info = FrameworkInfo.fromOtoolLibraryLine(line.strip()) + if info is not None: + if verbose >= 3: + print "Found framework:" + print info + libraries.append(info) + + return libraries + +def runInstallNameTool(action, *args): + subprocess.check_call(["install_name_tool", "-"+action] + list(args)) + +def changeInstallName(oldName, newName, binaryPath, verbose): + if verbose >= 3: + print "Using install_name_tool:" + print " in", binaryPath + print " change reference", oldName + print " to", newName + runInstallNameTool("change", oldName, newName, binaryPath) + +def changeIdentification(id, binaryPath, verbose): + if verbose >= 3: + print "Using install_name_tool:" + print " change identification in", binaryPath + print " to", id + runInstallNameTool("id", id, binaryPath) + +def runStrip(binaryPath, verbose): + if verbose >= 3: + print "Using strip:" + print " stripped", binaryPath + subprocess.check_call(["strip", "-x", binaryPath]) + +def copyFramework(framework, path, verbose): + fromPath = framework.sourceFilePath + toDir = os.path.join(path, framework.destinationDirectory) + toPath = os.path.join(toDir, framework.binaryName) + + if not os.path.exists(fromPath): + raise RuntimeError("No file at " + fromPath) + + if os.path.exists(toPath): + return None # Already there + + if not os.path.exists(toDir): + os.makedirs(toDir) + + shutil.copy2(fromPath, toPath) + if verbose >= 3: + print "Copied:", fromPath + print " to:", toPath + + permissions = os.stat(toPath) + if not permissions.st_mode & stat.S_IWRITE: + os.chmod(toPath, permissions.st_mode | stat.S_IWRITE) + + if not framework.isDylib(): # Copy resources for real frameworks + fromResourcesDir = framework.sourceResourcesDirectory + if os.path.exists(fromResourcesDir): + toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory) + shutil.copytree(fromResourcesDir, toResourcesDir) + if verbose >= 3: + print "Copied resources:", fromResourcesDir + print " to:", toResourcesDir + elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout) + qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "Resources", "qt_menu.nib") + qtMenuNibDestinationPath = os.path.join(path, "Contents", "Resources", "qt_menu.nib") + if os.path.exists(qtMenuNibSourcePath) and not os.path.exists(qtMenuNibDestinationPath): + shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath) + if verbose >= 3: + print "Copied for libQtGui:", qtMenuNibSourcePath + print " to:", qtMenuNibDestinationPath + + return toPath + +def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploymentInfo=None): + if deploymentInfo is None: + deploymentInfo = DeploymentInfo() + + while len(frameworks) > 0: + framework = frameworks.pop(0) + deploymentInfo.deployedFrameworks.append(framework.frameworkName) + + if verbose >= 2: + print "Processing", framework.frameworkName, "..." + + # Get the Qt path from one of the Qt frameworks + if deploymentInfo.qtPath is None and framework.isQtFramework(): + deploymentInfo.detectQtPath(framework.frameworkDirectory) + + if framework.installName.startswith("@executable_path"): + if verbose >= 2: + print framework.frameworkName, "already deployed, skipping." + continue + + # install_name_tool the new id into the binary + changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose) + + # Copy farmework to app bundle. + deployedBinaryPath = copyFramework(framework, bundlePath, verbose) + # Skip the rest if already was deployed. + if deployedBinaryPath is None: + continue + + if strip: + runStrip(deployedBinaryPath, verbose) + + # install_name_tool it a new id. + changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose) + # Check for framework dependencies + dependencies = getFrameworks(deployedBinaryPath, verbose) + + for dependency in dependencies: + changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose) + + # Deploy framework if necessary. + if dependency.frameworkName not in deploymentInfo.deployedFrameworks and dependency not in frameworks: + frameworks.append(dependency) + + return deploymentInfo + +def deployFrameworksForAppBundle(applicationBundle, strip, verbose): + frameworks = getFrameworks(applicationBundle.binaryPath, verbose) + if len(frameworks) == 0 and verbose >= 1: + print "Warning: Could not find any external frameworks to deploy in %s." % (applicationBundle.path) + return DeploymentInfo() + else: + return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose) + +def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): + # Lookup available plugins, exclude unneeded + plugins = [] + for dirpath, dirnames, filenames in os.walk(deploymentInfo.pluginPath): + pluginDirectory = os.path.relpath(dirpath, deploymentInfo.pluginPath) + if pluginDirectory == "designer": + # Skip designer plugins + continue + elif pluginDirectory == "phonon": + # Deploy the phonon plugins only if phonon is in use + if not deploymentInfo.usesFramework("phonon"): + continue + elif pluginDirectory == "sqldrivers": + # Deploy the sql plugins only if QtSql is in use + if not deploymentInfo.usesFramework("QtSql"): + continue + elif pluginDirectory == "script": + # Deploy the script plugins only if QtScript is in use + if not deploymentInfo.usesFramework("QtScript"): + continue + elif pluginDirectory == "qmltooling": + # Deploy the qml plugins only if QtDeclarative is in use + if not deploymentInfo.usesFramework("QtDeclarative"): + continue + elif pluginDirectory == "bearer": + # Deploy the bearer plugins only if QtNetwork is in use + if not deploymentInfo.usesFramework("QtNetwork"): + continue + + for pluginName in filenames: + pluginPath = os.path.join(pluginDirectory, pluginName) + if pluginName.endswith("_debug.dylib"): + # Skip debug plugins + continue + elif pluginPath == "imageformats/libqsvg.dylib" or pluginPath == "iconengines/libqsvgicon.dylib": + # Deploy the svg plugins only if QtSvg is in use + if not deploymentInfo.usesFramework("QtSvg"): + continue + elif pluginPath == "accessible/libqtaccessiblecompatwidgets.dylib": + # Deploy accessibility for Qt3Support only if the Qt3Support is in use + if not deploymentInfo.usesFramework("Qt3Support"): + continue + elif pluginPath == "graphicssystems/libqglgraphicssystem.dylib": + # Deploy the opengl graphicssystem plugin only if QtOpenGL is in use + if not deploymentInfo.usesFramework("QtOpenGL"): + continue + + plugins.append((pluginDirectory, pluginName)) + + for pluginDirectory, pluginName in plugins: + if verbose >= 2: + print "Processing plugin", os.path.join(pluginDirectory, pluginName), "..." + + sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName) + destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory) + if not os.path.exists(destinationDirectory): + os.makedirs(destinationDirectory) + + destinationPath = os.path.join(destinationDirectory, pluginName) + shutil.copy2(sourcePath, destinationPath) + if verbose >= 3: + print "Copied:", sourcePath + print " to:", destinationPath + + if strip: + runStrip(destinationPath, verbose) + + dependencies = getFrameworks(destinationPath, verbose) + + for dependency in dependencies: + changeInstallName(dependency.installName, dependency.deployedInstallName, destinationPath, verbose) + + # Deploy framework if necessary. + if dependency.frameworkName not in deploymentInfo.deployedFrameworks: + deployFrameworks([dependency], appBundleInfo.path, destinationPath, strip, verbose, deploymentInfo) + qt_conf="""[Paths] translations=Resources plugins=PlugIns """ -ap = ArgumentParser(description="""Front-end to macdeployqt with some additional functions. +ap = ArgumentParser(description="""Improved version of macdeployqt. Outputs a ready-to-deploy app in a folder "dist" and optionally wraps it in a .dmg file. Note, that the "dist" folder will be deleted before deploying on each run. @@ -69,22 +458,6 @@ for p in config.add_resources: # ------------------------------------------------ -if len(config.add_qt_tr) == 0: - add_qt_tr = [] -else: - qt_tr_dir = os.path.join(os.getenv("QTDIR", ""), "translations") - add_qt_tr = ["qt_%s.qm" % lng for lng in config.add_qt_tr[0].split(",")] - for lng_file in add_qt_tr: - p = os.path.join(qt_tr_dir, lng_file) - if verbose >= 3: - print "Checking for \"%s\"..." % p - if not os.path.exists(p): - if verbose >= 1: - sys.stderr.write("Error: Could not find Qt translation file \"%s\"\n" % (lng_file)) - sys.exit(1) - -# ------------------------------------------------ - if len(config.fancy) == 1: if verbose >= 3: print "Fancy: Importing plistlib..." @@ -160,7 +533,6 @@ if os.path.exists("dist"): # ------------------------------------------------ target = os.path.join("dist", app_bundle) -target_res = os.path.join(target, "Contents", "Resources") if verbose >= 2: print "+ Copying source bundle +" @@ -170,27 +542,61 @@ if verbose >= 3: os.mkdir("dist") shutil.copytree(app_bundle, target) -# ------------------------------------------------ +applicationBundle = ApplicationBundleInfo(target) -macdeployqt_args = ["macdeployqt", target, "-verbose=%d" % verbose] -if not config.plugins: - macdeployqt_args.append("-no-plugins") -if not config.strip: - macdeployqt_args.append("-no-strip") +# ------------------------------------------------ if verbose >= 2: - print "+ Running macdeployqt +" + print "+ Deploying frameworks +" -ret = subprocess.call(macdeployqt_args) -if ret != 0: +try: + deploymentInfo = deployFrameworksForAppBundle(applicationBundle, config.strip, verbose) + if deploymentInfo.qtPath is None: + deploymentInfo.qtPath = os.getenv("QTDIR", None) + if deploymentInfo.qtPath is None: + if verbose >= 1: + sys.stderr.write("Warning: Could not detect Qt's path, skipping plugin deployment!\n") + config.plugins = False +except RuntimeError as e: + if verbose >= 1: + sys.stderr.write("Error: %s\n" % str(e)) sys.exit(ret) # ------------------------------------------------ +if config.plugins: + if verbose >= 2: + print "+ Deploying plugins +" + + try: + deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose) + except RuntimeError as e: + if verbose >= 1: + sys.stderr.write("Error: %s\n" % str(e)) + sys.exit(ret) + +# ------------------------------------------------ + +if len(config.add_qt_tr) == 0: + add_qt_tr = [] +else: + qt_tr_dir = os.path.join(deploymentInfo.qtPath, "translations") + add_qt_tr = ["qt_%s.qm" % lng for lng in config.add_qt_tr[0].split(",")] + for lng_file in add_qt_tr: + p = os.path.join(qt_tr_dir, lng_file) + if verbose >= 3: + print "Checking for \"%s\"..." % p + if not os.path.exists(p): + if verbose >= 1: + sys.stderr.write("Error: Could not find Qt translation file \"%s\"\n" % (lng_file)) + sys.exit(1) + +# ------------------------------------------------ + if verbose >= 2: print "+ Installing qt.conf +" -f = open(os.path.join(target_res, "qt.conf"), "wb") +f = open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") f.write(qt_conf) f.close() @@ -201,8 +607,8 @@ if len(add_qt_tr) > 0 and verbose >= 2: for lng_file in add_qt_tr: if verbose >= 3: - print os.path.join(qt_tr_dir, lng_file), "->", os.path.join(target_res, lng_file) - shutil.copy2(os.path.join(qt_tr_dir, lng_file), os.path.join(target_res, lng_file)) + print os.path.join(qt_tr_dir, lng_file), "->", os.path.join(applicationBundle.resourcesPath, lng_file) + shutil.copy2(os.path.join(qt_tr_dir, lng_file), os.path.join(applicationBundle.resourcesPath, lng_file)) # ------------------------------------------------ @@ -210,7 +616,7 @@ if len(config.add_resources) > 0 and verbose >= 2: print "+ Adding additional resources +" for p in config.add_resources: - t = os.path.join(target_res, os.path.basename(p)) + t = os.path.join(applicationBundle.resourcesPath, os.path.basename(p)) if verbose >= 3: print p, "->", t if os.path.isdir(p): diff --git a/contrib/macdeploy/notes.txt b/contrib/macdeploy/notes.txt index 0654ff7..a3f0b54 100644 --- a/contrib/macdeploy/notes.txt +++ b/contrib/macdeploy/notes.txt @@ -6,7 +6,7 @@ You will need the appscript package for the fancy disk image creation to work. Install it by invoking "sudo easy_install appscript". Ths script should be invoked in the target directory like this: -$source_dir/contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr de,es,ru -dmg -fancy $source_dir/contrib/macdeploy/fancy.plist +$source_dir/contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr da,de,es,hu,ru,uk,zh_CN,zh_TW -dmg -fancy $source_dir/contrib/macdeploy/fancy.plist -verbose 2 During the process, the disk image window will pop up briefly where the fancy settings are applied. This is normal, please do not interfere. @@ -19,7 +19,7 @@ Fill in the following. Enable custom process step: [x] Command: %{sourceDir}/contrib/macdeploy/macdeployqtplus Working directory: %{buildDir} -Command arguments: Bitcoin-Qt.app -add-qt-tr de,ru -dmg -fancy %{sourceDir}/contrib/macdeploy/fancy.plist +Command arguments: Bitcoin-Qt.app -add-qt-tr da,de,es,hu,ru,uk,zh_CN,zh_TW -dmg -fancy %{sourceDir}/contrib/macdeploy/fancy.plist -verbose 2 After that you can start the deployment process through the menu with Build -> Deploy Project "bitcoin-qt" diff --git a/contrib/miniupnpc/Portfile b/contrib/miniupnpc/Portfile deleted file mode 100644 index 133aee5..0000000 --- a/contrib/miniupnpc/Portfile +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4 -# $Id$ - -PortSystem 1.0 - -name miniupnpc -epoch 2 -version 1.6 -revision 2 -categories net -platforms darwin -license BSD -maintainers singingwolfboy openmaintainer -description Lightweight client for UPnP protocol -long_description \ - ${description} - -homepage http://miniupnp.free.fr/ -master_sites http://miniupnp.free.fr/files/download.php?file=${distname}${extract.suffix}&dummy= -checksums md5 88055f2d4a061cfd4cfe25a9eae22f67 \ - sha1 ef8f2edb17f2e7c5b8dc67ee80a65c199d823e0a \ - rmd160 d86b75b331a3fb5525c71708548f311977c0598f - -use_configure no - -variant universal {} -if {[variant_isset universal]} { - set archflags ${configure.universal_cflags} -} else { - set archflags ${configure.cc_archflags} -} - -build.args-append CC="${configure.cc} ${archflags}" - -post-patch { - reinplace "s|-Wl,-install_name,|-Wl,-install_name,${prefix}/lib/|" ${worksrcpath}/Makefile -} - -destroot.destdir PREFIX=${prefix} INSTALLPREFIX=${destroot}${prefix} - -livecheck.type regex -livecheck.url http://miniupnp.free.fr/files/ -livecheck.regex ${name}-(\\d+(\\.\\d{1,4})+)${extract.suffix} diff --git a/doc/README b/doc/README index 3d8c63a..00694e2 100644 --- a/doc/README +++ b/doc/README @@ -1,4 +1,4 @@ -Bitcoin 0.5.4 BETA +Bitcoin 0.6.0 BETA Copyright (c) 2009-2012 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying diff --git a/doc/README_windows.txt b/doc/README_windows.txt index b4ad595..9aa5aa7 100644 --- a/doc/README_windows.txt +++ b/doc/README_windows.txt @@ -1,4 +1,4 @@ -Bitcoin 0.5.4 BETA +Bitcoin 0.6.0 BETA Copyright (c) 2009-2012 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying diff --git a/doc/assets-attribution.txt b/doc/assets-attribution.txt index 5cf0a73..fabcdee 100644 --- a/doc/assets-attribution.txt +++ b/doc/assets-attribution.txt @@ -7,7 +7,7 @@ Icon: src/qt/res/icons/address-book.png, src/qt/res/icons/export.png, src/qt/res/icons/history.png, src/qt/res/icons/key.png, src/qt/res/icons/lock_*.png, src/qt/res/icons/overview.png, src/qt/res/icons/receive.png, src/qt/res/icons/send.png, - src/qt/res/icons/synced.png + src/qt/res/icons/synced.png, src/qt/res/icons/filesave.png Icon Pack: NUVOLA ICON THEME for KDE 3.x Designer: David Vignoni (david@icon-king.com) ICON KING - www.icon-king.com diff --git a/doc/build-msw.txt b/doc/build-msw.txt index 346be75..7e3d1a7 100644 --- a/doc/build-msw.txt +++ b/doc/build-msw.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009-2011 Bitcoin Developers +Copyright (c) 2009-2012 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in diff --git a/doc/build-osx.txt b/doc/build-osx.txt index 8002441..2ae7706 100644 --- a/doc/build-osx.txt +++ b/doc/build-osx.txt @@ -1,4 +1,4 @@ -Copyright (c) 2011 Bitcoin Developers +Copyright (c) 2009-2012 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the @@ -36,12 +36,10 @@ git clone git@github.com:bitcoin/bitcoin.git bitcoin 3. Install dependencies from MacPorts -sudo port install boost db48 openssl +sudo port install boost db48 openssl miniupnpc -Install the right version of miniupnpc: -pushd bitcoin/contrib/minipupnpc; sudo port install; popd -(this will be unnecessary soon, you will just port install miniupnpc -along with the rest of the dependencies). +Optionally install qrencode (and set USE_QRCODE=1): +sudo port install qrencode 4. Now you should be able to build bitcoind: diff --git a/doc/build-unix.txt b/doc/build-unix.txt index f4178ca..c5b4205 100644 --- a/doc/build-unix.txt +++ b/doc/build-unix.txt @@ -1,5 +1,4 @@ -Copyright (c) 2009-2010 Satoshi Nakamoto -Copyright (c) 2011 Bitcoin Developers +Copyright (c) 2009-2012 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in @@ -23,12 +22,13 @@ the graphical bitcoin. Dependencies ------------ - Library Purpose Description - ------- ------- ----------- - libssl SSL Support Secure communications - libdb4.8 Berkeley DB Blockchain & wallet storage - libboost Boost C++ Library - miniupnpc UPnP Support Optional firewall-jumping support + Library Purpose Description + ------- ------- ----------- + libssl SSL Support Secure communications + libdb4.8 Berkeley DB Blockchain & wallet storage + libboost Boost C++ Library + miniupnpc UPnP Support Optional firewall-jumping support + libqrencode QRCode generation Optional QRCode generation miniupnpc may be used for UPnP port mapping. It can be downloaded from http://miniupnp.tuxfamily.org/files/. UPnP support is compiled in and @@ -37,6 +37,12 @@ turned off by default. Set USE_UPNP to a different value to control this: USE_UPNP=0 (the default) UPnP support turned off by default at runtime USE_UPNP=1 UPnP support turned on by default at runtime +libqrencode may be used for QRCode image generation. It can be downloaded +from http://fukuchi.org/works/qrencode/index.html.en, or installed via +your package manager. Set USE_QRCODE to control this: + USE_QRCODE=0 (the default) No QRCode support - libarcode not required + USE_QRCODE=1 QRCode support enabled + Licenses of statically linked libraries: Berkeley DB New BSD license with additional requirement that linked software must be free open source @@ -50,7 +56,6 @@ Versions used in this release: Boost 1.37 miniupnpc 1.6 - Dependency Build Instructions: Ubuntu & Debian ---------------------------------------------- sudo apt-get install build-essential @@ -59,6 +64,7 @@ sudo apt-get install libdb4.8-dev sudo apt-get install libdb4.8++-dev Boost 1.40+: sudo apt-get install libboost-all-dev or Boost 1.37: sudo apt-get install libboost1.37-dev +sudo apt-get install libqrencode-dev If using Boost 1.37, append -mt to the boost libraries in the makefile. diff --git a/doc/readme-qt.rst b/doc/readme-qt.rst index 0901773..294f31a 100644 --- a/doc/readme-qt.rst +++ b/doc/readme-qt.rst @@ -1,39 +1,6 @@ Bitcoin-qt: Qt4 GUI for Bitcoin =============================== -Features -======== - -- All functionality of the Wx GUI, including wallet encryption - -- Compatibility with Linux (both GNOME and KDE), MacOSX and Windows - -- Notification on incoming / outgoing transactions (compatible with FreeDesktop and other desktop notification schemes) - -- General interface improvements: Splash screen, tabbed interface - -- Overview page with current balance, unconfirmed balance, and such - -- Better transaction list with status icons, real-time filtering and a context menu - -- Asks for confirmation before sending coins, for your own safety - -- CSV export of transactions and address book (for Excel bookkeeping) - -- Shows alternative icon when connected to testnet, so you never accidentally send real coins during testing - -- Shows a progress bar on initial block download, so that you don't have to wonder how many blocks it needs to download to be up to date - -- Sendmany support, send to multiple recipients at the same time - -- Multiple unit support, can show subdivided bitcoins (uBTC, mBTC) for users that like large numbers - -- Support for English, German, Russian and Dutch languages - -- Address books and transaction table can be sorted by any column - -- Accepts "bitcoin:" URLs from browsers and other sources through drag and drop - Build instructions =================== @@ -92,7 +59,7 @@ Mac OS X :: sudo port selfupdate - sudo port install boost db48 + sudo port install boost db48 miniupnpc - Open the .pro file in Qt Creator and build as normal (cmd-B) @@ -127,14 +94,6 @@ Set USE_UPNP to a different value to control this: | USE_UPNP=1 | build with UPnP support turned on by default at runtime. | +------------+--------------------------------------------------------------------------+ -Mac OS X users: miniupnpc is currently outdated on MacPorts. An updated Portfile is provided in contrib/miniupnpc within this project. -You can execute the following commands in a terminal to install it: - -:: - - cd /contrib/miniupnpc - sudo port install - Notification support for recent (k)ubuntu versions --------------------------------------------------- @@ -145,6 +104,20 @@ FreeDesktop notification interface through DBUS using the following qmake option qmake "USE_DBUS=1" +Generation of QR codes +----------------------- + +libqrencode may be used to generate QRCode images for payment requests. +It can be downloaded from http://fukuchi.org/works/qrencode/index.html.en, or installed via your package manager. Pass the USE_QRCODE +flag to qmake to control this: + ++--------------+--------------------------------------------------------------------------+ +| USE_QRCODE=0 | (the default) No QRCode support - libarcode not required | ++--------------+--------------------------------------------------------------------------+ +| USE_QRCODE=1 | QRCode support enabled | ++--------------+--------------------------------------------------------------------------+ + + Berkely DB version warning ========================== diff --git a/doc/release-process.txt b/doc/release-process.txt index 9be6b78..977780c 100644 --- a/doc/release-process.txt +++ b/doc/release-process.txt @@ -2,7 +2,7 @@ * update (commit) version in sources bitcoin-qt.pro - src/serialize.h + src/main.h (CLIENT_VERSION : PROTOCOL_VERSION in serialize.h is updated only on protocol changes) share/setup.nsi doc/README* @@ -26,6 +26,9 @@ wget 'http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.6.tar.gz' -O miniupnpc-1.6.tar.gz wget 'http://www.openssl.org/source/openssl-1.0.0e.tar.gz' wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz' + wget 'http://zlib.net/zlib-1.2.6.tar.gz' + wget 'ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.5.9.tar.gz' + wget 'http://fukuchi.org/works/qrencode/qrencode-3.2.0.tar.bz2' wget 'http://downloads.sourceforge.net/project/boost/boost/1.47.0/boost_1_47_0.tar.bz2' wget 'http://download.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.4.tar.gz' cd .. @@ -33,6 +36,8 @@ cp build/out/boost-win32-1.47.0-gitian.zip inputs/ ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-win32.yml cp build/out/qt-win32-4.7.4-gitian.zip inputs/ + ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-win32.yml + cp build/out/bitcoin-deps-0.0.3.zip inputs/ * Build bitcoind and bitcoin-qt on Linux32, Linux64, and Win32: ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian.yml @@ -67,14 +72,18 @@ rm -rf bitcoin-${VERSION}-win32 * perform Mac build - See this blog post for how Gavin set up his build environment and - patched macdeployqt to build the OSX release: + See this blog post for how Gavin set up his build environment to build the OSX + release; note that a patched version of macdeployqt is not needed anymore, as + the required functionality and fixes are implemented directly in macdeployqtplus: http://gavintech.blogspot.com/2011/11/deploying-bitcoin-qt-on-osx.html - qmake USE_SSL=1 USE_UPNP=1 bitcoin-qt.pro + Gavin also had trouble with the macports py27-appscript package; he + ended up installing a version that worked with: /usr/bin/easy_install-2.7 appscript + + qmake RELEASE=1 USE_SSL=1 USE_UPNP=1 USE_QRCODE=1 bitcoin-qt.pro make export QTDIR=/opt/local/share/qt4 # needed to find translations/qt_*.qm files T=$(contrib/qt_translations.py $QTDIR/translations src/qt/locale) - contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist + python2.7 contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist Build output expected: Bitcoin-Qt.dmg diff --git a/doc/translation_process.md b/doc/translation_process.md index 603d557..3ddfc0c 100644 --- a/doc/translation_process.md +++ b/doc/translation_process.md @@ -33,7 +33,11 @@ This directory contains all translations. Filenames must adhere to this format: `src/qt/locale/bitcoin_en.ts` is treated in a special way. It is used as the source for all other translations. Whenever a string in the code is changed this file must be updated to reflect those changes. Usually, this can be -accomplished by running `lupdate`. +accomplished by running `lupdate` (included in the Qt SDK). + +An updated source file should be merged to github and transifex will pick it +up from there. Afterwards the new strings show up as "Remaining" in transifex +and can be translated. Syncing with transifex ---------------------- @@ -55,9 +59,22 @@ config to be able to connect with the client. file_filter = src/qt/locale/bitcoin_.ts source_file = src/qt/locale/bitcoin_en.ts source_lang = en + +### .tx/config (for Windows) + + [main] + host = https://www.transifex.net + + [bitcoin.tx] + file_filter = src\qt\locale\bitcoin_.ts + source_file = src\qt\locale\bitcoin_en.ts + source_lang = en + +It is also possible to directly download new translations one by one from transifex. ### Fetching new translations 1. `tx pull -a` -2. update `src/qt/bitcoin.qrc` +2. update `src/qt/bitcoin.qrc` manually or via + `ls src/qt/locale/*ts|xargs -n1 basename|sed 's/\(bitcoin_\(.*\)\).ts/locale/\1.qm<\/file>/'` 3. `git add` new translations from `src/qt/locale/` diff --git a/share/setup.nsi b/share/setup.nsi index e231436..cc19daf 100644 --- a/share/setup.nsi +++ b/share/setup.nsi @@ -5,7 +5,7 @@ SetCompressor /SOLID lzma # General Symbol Definitions !define REGKEY "SOFTWARE\$(^Name)" -!define VERSION 0.5.4 +!define VERSION 0.6.0 !define COMPANY "Bitcoin project" !define URL http://www.bitcoin.org/ @@ -45,13 +45,13 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile bitcoin-0.5.4-win32-setup.exe +OutFile bitcoin-0.6.0-win32-setup.exe InstallDir $PROGRAMFILES\Bitcoin CRCCheck on XPStyle on BrandingText " " ShowInstDetails show -VIProductVersion 0.5.4.0 +VIProductVersion 0.6.0.6 VIAddVersionKey ProductName Bitcoin VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" @@ -98,6 +98,12 @@ Section -post SEC0001 WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1 WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1 + + # bitcoin: URI handling disabled for 0.6.0 + # WriteRegStr HKCR "bitcoin" "URL Protocol" "" + # WriteRegStr HKCR "bitcoin" "" "URL:Bitcoin" + # WriteRegStr HKCR "bitcoin\DefaultIcon" "" $INSTDIR\bitcoin-qt.exe + # WriteRegStr HKCR "bitcoin\shell\open\command" "" '"$INSTDIR\bitcoin-qt.exe" "$$1"' SectionEnd # Macro for selecting uninstaller sections @@ -135,6 +141,7 @@ Section -un.post UNSEC0001 DeleteRegValue HKCU "${REGKEY}" Path DeleteRegKey /IfEmpty HKCU "${REGKEY}\Components" DeleteRegKey /IfEmpty HKCU "${REGKEY}" + DeleteRegKey HKCR "bitcoin" RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup RmDir /REBOOTOK $INSTDIR Push $R0 diff --git a/src/addrman.cpp b/src/addrman.cpp new file mode 100644 index 0000000..2ef666c --- /dev/null +++ b/src/addrman.cpp @@ -0,0 +1,506 @@ +// Copyright (c) 2012 Pieter Wuille +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. + +#include "addrman.h" + +using namespace std; + +int CAddrInfo::GetTriedBucket(const std::vector &nKey) const +{ + CDataStream ss1(SER_GETHASH); + std::vector vchKey = GetKey(); + ss1 << nKey << vchKey; + uint64 hash1 = Hash(ss1.begin(), ss1.end()).Get64(); + + CDataStream ss2(SER_GETHASH); + std::vector vchGroupKey = GetGroup(); + ss2 << nKey << vchGroupKey << (hash1 % ADDRMAN_TRIED_BUCKETS_PER_GROUP); + uint64 hash2 = Hash(ss2.begin(), ss2.end()).Get64(); + return hash2 % ADDRMAN_TRIED_BUCKET_COUNT; +} + +int CAddrInfo::GetNewBucket(const std::vector &nKey, const CNetAddr& src) const +{ + CDataStream ss1(SER_GETHASH); + std::vector vchGroupKey = GetGroup(); + std::vector vchSourceGroupKey = src.GetGroup(); + ss1 << nKey << vchGroupKey << vchSourceGroupKey; + uint64 hash1 = Hash(ss1.begin(), ss1.end()).Get64(); + + CDataStream ss2(SER_GETHASH); + ss2 << nKey << vchSourceGroupKey << (hash1 % ADDRMAN_NEW_BUCKETS_PER_SOURCE_GROUP); + uint64 hash2 = Hash(ss2.begin(), ss2.end()).Get64(); + return hash2 % ADDRMAN_NEW_BUCKET_COUNT; +} + +bool CAddrInfo::IsTerrible(int64 nNow) const +{ + if (nLastTry && nLastTry >= nNow-60) // never remove things tried the last minute + return false; + + if (nTime > nNow + 10*60) // came in a flying DeLorean + return true; + + if (nTime==0 || nNow-nTime > ADDRMAN_HORIZON_DAYS*86400) // not seen in over a month + return true; + + if (nLastSuccess==0 && nAttempts>=ADDRMAN_RETRIES) // tried three times and never a success + return true; + + if (nNow-nLastSuccess > ADDRMAN_MIN_FAIL_DAYS*86400 && nAttempts>=ADDRMAN_MAX_FAILURES) // 10 successive failures in the last week + return true; + + return false; +} + +double CAddrInfo::GetChance(int64 nNow) const +{ + double fChance = 1.0; + + int64 nSinceLastSeen = nNow - nTime; + int64 nSinceLastTry = nNow - nLastTry; + + if (nSinceLastSeen < 0) nSinceLastSeen = 0; + if (nSinceLastTry < 0) nSinceLastTry = 0; + + fChance *= 600.0 / (600.0 + nSinceLastSeen); + + // deprioritize very recent attempts away + if (nSinceLastTry < 60*10) + fChance *= 0.01; + + // deprioritize 50% after each failed attempt + for (int n=0; n::iterator it = mapAddr.find(addr); + if (it == mapAddr.end()) + return NULL; + if (pnId) + *pnId = (*it).second; + std::map::iterator it2 = mapInfo.find((*it).second); + if (it2 != mapInfo.end()) + return &(*it2).second; + return NULL; +} + +CAddrInfo* CAddrMan::Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId) +{ + int nId = nIdCount++; + mapInfo[nId] = CAddrInfo(addr, addrSource); + mapAddr[addr] = nId; + mapInfo[nId].nRandomPos = vRandom.size(); + vRandom.push_back(nId); + if (pnId) + *pnId = nId; + return &mapInfo[nId]; +} + +void CAddrMan::SwapRandom(int nRndPos1, int nRndPos2) +{ + if (nRndPos1 == nRndPos2) + return; + + int nId1 = vRandom[nRndPos1]; + int nId2 = vRandom[nRndPos2]; + + mapInfo[nId1].nRandomPos = nRndPos2; + mapInfo[nId2].nRandomPos = nRndPos1; + + vRandom[nRndPos1] = nId2; + vRandom[nRndPos2] = nId1; +} + +int CAddrMan::SelectTried(int nKBucket) +{ + std::vector &vTried = vvTried[nKBucket]; + + // random shuffle the first few elements (using the entire list) + // find the least recently tried among them + int64 nOldest = -1; + for (int i=0; i &vNew = vvNew[nUBucket]; + + // first look for deletable items + for (std::set::iterator it = vNew.begin(); it != vNew.end(); it++) + { + CAddrInfo &info = mapInfo[*it]; + if (info.IsTerrible()) + { + if (--info.nRefCount == 0) + { + SwapRandom(info.nRandomPos, vRandom.size()-1); + vRandom.pop_back(); + mapAddr.erase(info); + mapInfo.erase(*it); + nNew--; + } + vNew.erase(it); + return 0; + } + } + + // otherwise, select four randomly, and pick the oldest of those to replace + int n[4] = {GetRandInt(vNew.size()), GetRandInt(vNew.size()), GetRandInt(vNew.size()), GetRandInt(vNew.size())}; + int nI = 0; + int nOldest = -1; + for (std::set::iterator it = vNew.begin(); it != vNew.end(); it++) + { + if (nI == n[0] || nI == n[1] || nI == n[2] || nI == n[3]) + { + if (nOldest == -1 || mapInfo[*it].nTime < mapInfo[nOldest].nTime) + nOldest = *it; + } + nI++; + } + CAddrInfo &info = mapInfo[nOldest]; + if (--info.nRefCount == 0) + { + SwapRandom(info.nRandomPos, vRandom.size()-1); + vRandom.pop_back(); + mapAddr.erase(info); + mapInfo.erase(nOldest); + nNew--; + } + vNew.erase(nOldest); + + return 1; +} + +void CAddrMan::MakeTried(CAddrInfo& info, int nId, int nOrigin) +{ + // remove the entry from all new buckets + for (std::vector >::iterator it = vvNew.begin(); it != vvNew.end(); it++) + { + if ((*it).erase(nId)) + info.nRefCount--; + } + nNew--; + + // what tried bucket to move the entry to + int nKBucket = info.GetTriedBucket(nKey); + std::vector &vTried = vvTried[nKBucket]; + + // first check whether there is place to just add it + if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE) + { + vTried.push_back(nId); + nTried++; + info.fInTried = true; + return; + } + + // otherwise, find an item to evict + int nPos = SelectTried(nKBucket); + + // find which new bucket it belongs to + int nUBucket = mapInfo[vTried[nPos]].GetNewBucket(nKey); + std::set &vNew = vvNew[nUBucket]; + + // remove the to-be-replaced tried entry from the tried set + CAddrInfo& infoOld = mapInfo[vTried[nPos]]; + infoOld.fInTried = false; + infoOld.nRefCount = 1; + // do not update nTried, as we are going to move something else there immediately + + // check whether there is place in that one, + if (vNew.size() < ADDRMAN_NEW_BUCKET_SIZE) + { + // if so, move it back there + vNew.insert(vTried[nPos]); + } else { + // otherwise, move it to the new bucket nId came from (there is certainly place there) + vvNew[nOrigin].insert(vTried[nPos]); + } + nNew++; + + vTried[nPos] = nId; + // we just overwrote an entry in vTried; no need to update nTried + info.fInTried = true; + return; +} + +void CAddrMan::Good_(const CService &addr, int64 nTime) +{ +// printf("Good: addr=%s\n", addr.ToString().c_str()); + + int nId; + CAddrInfo *pinfo = Find(addr, &nId); + + // if not found, bail out + if (!pinfo) + return; + + CAddrInfo &info = *pinfo; + + // check whether we are talking about the exact same CService (including same port) + if (info != addr) + return; + + // update info + info.nLastSuccess = nTime; + info.nLastTry = nTime; + info.nTime = nTime; + info.nAttempts = 0; + + // if it is already in the tried set, don't do anything else + if (info.fInTried) + return; + + // find a bucket it is in now + int nRnd = GetRandInt(vvNew.size()); + int nUBucket = -1; + for (int n = 0; n < vvNew.size(); n++) + { + int nB = (n+nRnd) % vvNew.size(); + std::set &vNew = vvNew[nB]; + if (vNew.count(nId)) + { + nUBucket = nB; + break; + } + } + + // if no bucket is found, something bad happened; + // TODO: maybe re-add the node, but for now, just bail out + if (nUBucket == -1) return; + + printf("Moving %s to tried\n", addr.ToString().c_str()); + + // move nId to the tried tables + MakeTried(info, nId, nUBucket); +} + +bool CAddrMan::Add_(const CAddress &addr, const CNetAddr& source, int64 nTimePenalty) +{ + if (!addr.IsRoutable()) + return false; + + bool fNew = false; + int nId; + CAddrInfo *pinfo = Find(addr, &nId); + + if (pinfo) + { + // periodically update nTime + bool fCurrentlyOnline = (GetAdjustedTime() - addr.nTime < 24 * 60 * 60); + int64 nUpdateInterval = (fCurrentlyOnline ? 60 * 60 : 24 * 60 * 60); + if (addr.nTime && (!pinfo->nTime || pinfo->nTime < addr.nTime - nUpdateInterval - nTimePenalty)) + pinfo->nTime = max((int64)0, addr.nTime - nTimePenalty); + + // add services + pinfo->nServices |= addr.nServices; + + // do not update if no new information is present + if (!addr.nTime || pinfo->nTime && addr.nTime <= pinfo->nTime) + return false; + + // do not update if the entry was already in the "tried" table + if (pinfo->fInTried) + return false; + + // do not update if the max reference count is reached + if (pinfo->nRefCount == ADDRMAN_NEW_BUCKETS_PER_ADDRESS) + return false; + + // stochastic test: previous nRefCount == N: 2^N times harder to increase it + int nFactor = 1; + for (int n=0; nnRefCount; n++) + nFactor *= 2; + if (nFactor > 1 && (GetRandInt(nFactor) != 0)) + return false; + } else { + pinfo = Create(addr, source, &nId); + pinfo->nTime = max((int64)0, (int64)pinfo->nTime - nTimePenalty); +// printf("Added %s [nTime=%fhr]\n", pinfo->ToString().c_str(), (GetAdjustedTime() - pinfo->nTime) / 3600.0); + nNew++; + fNew = true; + } + + int nUBucket = pinfo->GetNewBucket(nKey, source); + std::set &vNew = vvNew[nUBucket]; + if (!vNew.count(nId)) + { + pinfo->nRefCount++; + if (vNew.size() == ADDRMAN_NEW_BUCKET_SIZE) + ShrinkNew(nUBucket); + vvNew[nUBucket].insert(nId); + } + return fNew; +} + +void CAddrMan::Attempt_(const CService &addr, int64 nTime) +{ + CAddrInfo *pinfo = Find(addr); + + // if not found, bail out + if (!pinfo) + return; + + CAddrInfo &info = *pinfo; + + // check whether we are talking about the exact same CService (including same port) + if (info != addr) + return; + + // update info + info.nLastTry = nTime; + info.nAttempts++; +} + +CAddress CAddrMan::Select_(int nUnkBias) +{ + if (size() == 0) + return CAddress(); + + double nCorTried = sqrt(nTried) * (100.0 - nUnkBias); + double nCorNew = sqrt(nNew) * nUnkBias; + if ((nCorTried + nCorNew)*GetRandInt(1<<30)/(1<<30) < nCorTried) + { + // use a tried node + double fChanceFactor = 1.0; + while(1) + { + int nKBucket = GetRandInt(vvTried.size()); + std::vector &vTried = vvTried[nKBucket]; + if (vTried.size() == 0) continue; + int nPos = GetRandInt(vTried.size()); + CAddrInfo &info = mapInfo[vTried[nPos]]; + if (GetRandInt(1<<30) < fChanceFactor*info.GetChance()*(1<<30)) + return info; + fChanceFactor *= 1.2; + } + } else { + // use an new node + double fChanceFactor = 1.0; + while(1) + { + int nUBucket = GetRandInt(vvNew.size()); + std::set &vNew = vvNew[nUBucket]; + if (vNew.size() == 0) continue; + int nPos = GetRandInt(vNew.size()); + std::set::iterator it = vNew.begin(); + while (nPos--) + it++; + CAddrInfo &info = mapInfo[*it]; + if (GetRandInt(1<<30) < fChanceFactor*info.GetChance()*(1<<30)) + return info; + fChanceFactor *= 1.2; + } + } +} + +#ifdef DEBUG_ADDRMAN +int CAddrMan::Check_() +{ + std::set setTried; + std::map mapNew; + + if (vRandom.size() != nTried + nNew) return -7; + + for (std::map::iterator it = mapInfo.begin(); it != mapInfo.end(); it++) + { + int n = (*it).first; + CAddrInfo &info = (*it).second; + if (info.fInTried) + { + + if (!info.nLastSuccess) return -1; + if (info.nRefCount) return -2; + setTried.insert(n); + } else { + if (info.nRefCount < 0 || info.nRefCount > ADDRMAN_NEW_BUCKETS_PER_ADDRESS) return -3; + if (!info.nRefCount) return -4; + mapNew[n] = info.nRefCount; + } + if (mapAddr[info] != n) return -5; + if (info.nRandomPos<0 || info.nRandomPos>=vRandom.size() || vRandom[info.nRandomPos] != n) return -14; + if (info.nLastTry < 0) return -6; + if (info.nLastSuccess < 0) return -8; + } + + if (setTried.size() != nTried) return -9; + if (mapNew.size() != nNew) return -10; + + for (int n=0; n &vTried = vvTried[n]; + for (std::vector::iterator it = vTried.begin(); it != vTried.end(); it++) + { + if (!setTried.count(*it)) return -11; + setTried.erase(*it); + } + } + + for (int n=0; n &vNew = vvNew[n]; + for (std::set::iterator it = vNew.begin(); it != vNew.end(); it++) + { + if (!mapNew.count(*it)) return -12; + if (--mapNew[*it] == 0) + mapNew.erase(*it); + } + } + + if (setTried.size()) return -13; + if (mapNew.size()) return -15; + + return 0; +} +#endif + +void CAddrMan::GetAddr_(std::vector &vAddr) +{ + int nNodes = ADDRMAN_GETADDR_MAX_PCT*vRandom.size()/100; + if (nNodes > ADDRMAN_GETADDR_MAX) + nNodes = ADDRMAN_GETADDR_MAX; + + // perform a random shuffle over the first nNodes elements of vRandom (selecting from all) + for (int n = 0; n nUpdateInterval) + info.nTime = nTime; +} diff --git a/src/addrman.h b/src/addrman.h new file mode 100644 index 0000000..91e1f87 --- /dev/null +++ b/src/addrman.h @@ -0,0 +1,500 @@ +// Copyright (c) 2012 Pieter Wuille +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. +#ifndef _BITCOIN_ADDRMAN +#define _BITCOIN_ADDRMAN 1 + +#include "netbase.h" +#include "protocol.h" +#include "util.h" + + +#include +#include + +#include + + +/** Extended statistics about a CAddress */ +class CAddrInfo : public CAddress +{ +private: + // where knowledge about this address first came from + CNetAddr source; + + // last succesfull connection by us + int64 nLastSuccess; + + // last try whatsoever by us: + // int64 CAddress::nLastTry + + // connection attempts since last succesful attempt + int nAttempts; + + // reference count in new sets (memory only) + int nRefCount; + + // in tried set? (memory only) + bool fInTried; + + // position in vRandom + int nRandomPos; + + friend class CAddrMan; + +public: + + IMPLEMENT_SERIALIZE( + CAddress* pthis = (CAddress*)(this); + READWRITE(*pthis); + READWRITE(source); + READWRITE(nLastSuccess); + READWRITE(nAttempts); + ) + + void Init() + { + nLastSuccess = 0; + nLastTry = 0; + nAttempts = 0; + nRefCount = 0; + fInTried = false; + nRandomPos = -1; + } + + CAddrInfo(const CAddress &addrIn, const CNetAddr &addrSource) : CAddress(addrIn) + { + Init(); + } + + CAddrInfo() : CAddress(), source() + { + Init(); + } + + // Calculate in which "tried" bucket this entry belongs + int GetTriedBucket(const std::vector &nKey) const; + + // Calculate in which "new" bucket this entry belongs, given a certain source + int GetNewBucket(const std::vector &nKey, const CNetAddr& src) const; + + // Calculate in which "new" bucket this entry belongs, using its default source + int GetNewBucket(const std::vector &nKey) const + { + return GetNewBucket(nKey, source); + } + + // Determine whether the statistics about this entry are bad enough so that it can just be deleted + bool IsTerrible(int64 nNow = GetAdjustedTime()) const; + + // Calculate the relative chance this entry should be given when selecting nodes to connect to + double GetChance(int64 nNow = GetAdjustedTime()) const; + +}; + +// Stochastic address manager +// +// Design goals: +// * Only keep a limited number of addresses around, so that addr.dat and memory requirements do not grow without bound. +// * Keep the address tables in-memory, and asynchronously dump the entire to able in addr.dat. +// * Make sure no (localized) attacker can fill the entire table with his nodes/addresses. +// +// To that end: +// * Addresses are organized into buckets. +// * Address that have not yet been tried go into 256 "new" buckets. +// * Based on the address range (/16 for IPv4) of source of the information, 32 buckets are selected at random +// * The actual bucket is chosen from one of these, based on the range the address itself is located. +// * One single address can occur in up to 4 different buckets, to increase selection chances for addresses that +// are seen frequently. The chance for increasing this multiplicity decreases exponentially. +// * When adding a new address to a full bucket, a randomly chosen entry (with a bias favoring less recently seen +// ones) is removed from it first. +// * Addresses of nodes that are known to be accessible go into 64 "tried" buckets. +// * Each address range selects at random 4 of these buckets. +// * The actual bucket is chosen from one of these, based on the full address. +// * When adding a new good address to a full bucket, a randomly chosen entry (with a bias favoring less recently +// tried ones) is evicted from it, back to the "new" buckets. +// * Bucket selection is based on cryptographic hashing, using a randomly-generated 256-bit key, which should not +// be observable by adversaries. +// * Several indexes are kept for high performance. Defining DEBUG_ADDRMAN will introduce frequent (and expensive) +// consistency checks for the entire datastructure. + +// total number of buckets for tried addresses +#define ADDRMAN_TRIED_BUCKET_COUNT 64 + +// maximum allowed number of entries in buckets for tried addresses +#define ADDRMAN_TRIED_BUCKET_SIZE 64 + +// total number of buckets for new addresses +#define ADDRMAN_NEW_BUCKET_COUNT 256 + +// maximum allowed number of entries in buckets for new addresses +#define ADDRMAN_NEW_BUCKET_SIZE 64 + +// over how many buckets entries with tried addresses from a single group (/16 for IPv4) are spread +#define ADDRMAN_TRIED_BUCKETS_PER_GROUP 4 + +// over how many buckets entries with new addresses originating from a single group are spread +#define ADDRMAN_NEW_BUCKETS_PER_SOURCE_GROUP 32 + +// in how many buckets for entries with new addresses a single address may occur +#define ADDRMAN_NEW_BUCKETS_PER_ADDRESS 4 + +// how many entries in a bucket with tried addresses are inspected, when selecting one to replace +#define ADDRMAN_TRIED_ENTRIES_INSPECT_ON_EVICT 4 + +// how old addresses can maximally be +#define ADDRMAN_HORIZON_DAYS 30 + +// after how many failed attempts we give up on a new node +#define ADDRMAN_RETRIES 3 + +// how many successive failures are allowed ... +#define ADDRMAN_MAX_FAILURES 10 + +// ... in at least this many days +#define ADDRMAN_MIN_FAIL_DAYS 7 + +// the maximum percentage of nodes to return in a getaddr call +#define ADDRMAN_GETADDR_MAX_PCT 23 + +// the maximum number of nodes to return in a getaddr call +#define ADDRMAN_GETADDR_MAX 2500 + +/** Stochastical (IP) address manager */ +class CAddrMan +{ +private: + // critical section to protect the inner data structures + mutable CCriticalSection cs; + + // secret key to randomize bucket select with + std::vector nKey; + + // last used nId + int nIdCount; + + // table with information about all nId's + std::map mapInfo; + + // find an nId based on its network address + std::map mapAddr; + + // randomly-ordered vector of all nId's + std::vector vRandom; + + // number of "tried" entries + int nTried; + + // list of "tried" buckets + std::vector > vvTried; + + // number of (unique) "new" entries + int nNew; + + // list of "new" buckets + std::vector > vvNew; + +protected: + + // Find an entry. + CAddrInfo* Find(const CNetAddr& addr, int *pnId = NULL); + + // find an entry, creating it if necessary. + // nTime and nServices of found node is updated, if necessary. + CAddrInfo* Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId = NULL); + + // Swap two elements in vRandom. + void SwapRandom(int nRandomPos1, int nRandomPos2); + + // Return position in given bucket to replace. + int SelectTried(int nKBucket); + + // Remove an element from a "new" bucket. + // This is the only place where actual deletes occur. + // They are never deleted while in the "tried" table, only possibly evicted back to the "new" table. + int ShrinkNew(int nUBucket); + + // Move an entry from the "new" table(s) to the "tried" table + // @pre vvUnkown[nOrigin].count(nId) != 0 + void MakeTried(CAddrInfo& info, int nId, int nOrigin); + + // Mark an entry "good", possibly moving it from "new" to "tried". + void Good_(const CService &addr, int64 nTime); + + // Add an entry to the "new" table. + bool Add_(const CAddress &addr, const CNetAddr& source, int64 nTimePenalty); + + // Mark an entry as attempted to connect. + void Attempt_(const CService &addr, int64 nTime); + + // Select an address to connect to. + // nUnkBias determines how much to favor new addresses over tried ones (min=0, max=100) + CAddress Select_(int nUnkBias); + +#ifdef DEBUG_ADDRMAN + // Perform consistency check. Returns an error code or zero. + int Check_(); +#endif + + // Select several addresses at once. + void GetAddr_(std::vector &vAddr); + + // Mark an entry as currently-connected-to. + void Connected_(const CService &addr, int64 nTime); + +public: + + IMPLEMENT_SERIALIZE + (({ + // serialized format: + // * version byte (currently 0) + // * nKey + // * nNew + // * nTried + // * number of "new" buckets + // * all nNew addrinfo's in vvNew + // * all nTried addrinfo's in vvTried + // * for each bucket: + // * number of elements + // * for each element: index + // + // Notice that vvTried, mapAddr and vVector are never encoded explicitly; + // they are instead reconstructed from the other information. + // + // vvNew is serialized, but only used if ADDRMAN_UNKOWN_BUCKET_COUNT didn't change, + // otherwise it is reconstructed as well. + // + // This format is more complex, but significantly smaller (at most 1.5 MiB), and supports + // changes to the ADDRMAN_ parameters without breaking the on-disk structure. + CRITICAL_BLOCK(cs) + { + unsigned char nVersion = 0; + READWRITE(nVersion); + READWRITE(nKey); + READWRITE(nNew); + READWRITE(nTried); + + CAddrMan *am = const_cast(this); + if (fWrite) + { + int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT; + READWRITE(nUBuckets); + std::map mapUnkIds; + int nIds = 0; + for (std::map::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++) + { + if (nIds == nNew) break; // this means nNew was wrong, oh ow + mapUnkIds[(*it).first] = nIds; + CAddrInfo &info = (*it).second; + if (info.nRefCount) + { + READWRITE(info); + nIds++; + } + } + nIds = 0; + for (std::map::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++) + { + if (nIds == nTried) break; // this means nTried was wrong, oh ow + CAddrInfo &info = (*it).second; + if (info.fInTried) + { + READWRITE(info); + nIds++; + } + } + for (std::vector >::iterator it = am->vvNew.begin(); it != am->vvNew.end(); it++) + { + const std::set &vNew = (*it); + int nSize = vNew.size(); + READWRITE(nSize); + for (std::set::iterator it2 = vNew.begin(); it2 != vNew.end(); it2++) + { + int nIndex = mapUnkIds[*it2]; + READWRITE(nIndex); + } + } + } else { + int nUBuckets = 0; + READWRITE(nUBuckets); + am->nIdCount = 0; + am->mapInfo.clear(); + am->mapAddr.clear(); + am->vRandom.clear(); + am->vvTried = std::vector >(ADDRMAN_TRIED_BUCKET_COUNT, std::vector(0)); + am->vvNew = std::vector >(ADDRMAN_NEW_BUCKET_COUNT, std::set()); + for (int n = 0; n < am->nNew; n++) + { + CAddrInfo &info = am->mapInfo[n]; + READWRITE(info); + am->mapAddr[info] = n; + info.nRandomPos = vRandom.size(); + am->vRandom.push_back(n); + if (nUBuckets != ADDRMAN_NEW_BUCKET_COUNT) + { + am->vvNew[info.GetNewBucket(am->nKey)].insert(n); + info.nRefCount++; + } + } + am->nIdCount = am->nNew; + int nLost = 0; + for (int n = 0; n < am->nTried; n++) + { + CAddrInfo info; + READWRITE(info); + std::vector &vTried = am->vvTried[info.GetTriedBucket(am->nKey)]; + if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE) + { + info.nRandomPos = vRandom.size(); + info.fInTried = true; + am->vRandom.push_back(am->nIdCount); + am->mapInfo[am->nIdCount] = info; + am->mapAddr[info] = am->nIdCount; + vTried.push_back(am->nIdCount); + am->nIdCount++; + } else { + nLost++; + } + } + am->nTried -= nLost; + for (int b = 0; b < nUBuckets; b++) + { + std::set &vNew = am->vvNew[b]; + int nSize = 0; + READWRITE(nSize); + for (int n = 0; n < nSize; n++) + { + int nIndex = 0; + READWRITE(nIndex); + CAddrInfo &info = am->mapInfo[nIndex]; + if (nUBuckets == ADDRMAN_NEW_BUCKET_COUNT && info.nRefCount < ADDRMAN_NEW_BUCKETS_PER_ADDRESS) + { + info.nRefCount++; + vNew.insert(nIndex); + } + } + } + } + } + });) + + CAddrMan() : vRandom(0), vvTried(ADDRMAN_TRIED_BUCKET_COUNT, std::vector(0)), vvNew(ADDRMAN_NEW_BUCKET_COUNT, std::set()) + { + nKey.resize(32); + RAND_bytes(&nKey[0], 32); + + nIdCount = 0; + nTried = 0; + nNew = 0; + } + + // Return the number of (unique) addresses in all tables. + int size() + { + return vRandom.size(); + } + + // Consistency check + void Check() + { +#ifdef DEBUG_ADDRMAN + CRITICAL_BLOCK(cs) + { + int err; + if ((err=Check_())) + printf("ADDRMAN CONSISTENCY CHECK FAILED!!! err=%i\n", err); + } +#endif + } + + // Add a single address. + bool Add(const CAddress &addr, const CNetAddr& source, int64 nTimePenalty = 0) + { + bool fRet = false; + CRITICAL_BLOCK(cs) + { + Check(); + fRet |= Add_(addr, source, nTimePenalty); + Check(); + } + if (fRet) + printf("Added %s from %s: %i tried, %i new\n", addr.ToStringIPPort().c_str(), source.ToString().c_str(), nTried, nNew); + return fRet; + } + + // Add multiple addresses. + bool Add(const std::vector &vAddr, const CNetAddr& source, int64 nTimePenalty = 0) + { + int nAdd = 0; + CRITICAL_BLOCK(cs) + { + Check(); + for (std::vector::const_iterator it = vAddr.begin(); it != vAddr.end(); it++) + nAdd += Add_(*it, source, nTimePenalty) ? 1 : 0; + Check(); + } + if (nAdd) + printf("Added %i addresses from %s: %i tried, %i new\n", nAdd, source.ToString().c_str(), nTried, nNew); + return nAdd > 0; + } + + // Mark an entry as accessible. + void Good(const CService &addr, int64 nTime = GetAdjustedTime()) + { + CRITICAL_BLOCK(cs) + { + Check(); + Good_(addr, nTime); + Check(); + } + } + + // Mark an entry as connection attempted to. + void Attempt(const CService &addr, int64 nTime = GetAdjustedTime()) + { + CRITICAL_BLOCK(cs) + { + Check(); + Attempt_(addr, nTime); + Check(); + } + } + + // Choose an address to connect to. + // nUnkBias determines how much "new" entries are favored over "tried" ones (0-100). + CAddress Select(int nUnkBias = 50) + { + CAddress addrRet; + CRITICAL_BLOCK(cs) + { + Check(); + addrRet = Select_(nUnkBias); + Check(); + } + return addrRet; + } + + // Return a bunch of addresses, selected at random. + std::vector GetAddr() + { + Check(); + std::vector vAddr; + CRITICAL_BLOCK(cs) + GetAddr_(vAddr); + Check(); + return vAddr; + } + + // Mark an entry as currently-connected-to. + void Connected(const CService &addr, int64 nTime = GetAdjustedTime()) + { + CRITICAL_BLOCK(cs) + { + Check(); + Connected_(addr, nTime); + Check(); + } + } +}; + +#endif diff --git a/src/base58.h b/src/base58.h index cace423..755e34c 100644 --- a/src/base58.h +++ b/src/base58.h @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin Developers +// Copyright (c) 2009-2012 The Bitcoin Developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. @@ -18,6 +18,7 @@ #include #include #include "bignum.h" +#include "key.h" static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; @@ -168,7 +169,7 @@ inline bool DecodeBase58Check(const std::string& str, std::vector -// Base class for all base58-encoded data +/** Base class for all base58-encoded data */ class CBase58Data { protected: @@ -251,21 +252,38 @@ public: bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; } }; -// base58-encoded bitcoin addresses -// Addresses have version 0 or 111 (testnet) -// The data vector contains RIPEMD160(SHA256(pubkey)), where pubkey is the serialized public key +/** base58-encoded bitcoin addresses. + * Public-key-hash-addresses have version 0 (or 111 testnet). + * The data vector contains RIPEMD160(SHA256(pubkey)), where pubkey is the serialized public key. + * Script-hash-addresses have version 5 (or 196 testnet). + * The data vector contains RIPEMD160(SHA256(cscript)), where cscript is the serialized redemption script. + */ class CBitcoinAddress : public CBase58Data { public: + enum + { + PUBKEY_ADDRESS = 0, + SCRIPT_ADDRESS = 5, + PUBKEY_ADDRESS_TEST = 111, + SCRIPT_ADDRESS_TEST = 196, + }; + bool SetHash160(const uint160& hash160) { - SetData(fTestNet ? 111 : 0, &hash160, 20); + SetData(fTestNet ? PUBKEY_ADDRESS_TEST : PUBKEY_ADDRESS, &hash160, 20); return true; } - bool SetPubKey(const std::vector& vchPubKey) + void SetPubKey(const std::vector& vchPubKey) + { + SetHash160(Hash160(vchPubKey)); + } + + bool SetScriptHash160(const uint160& hash160) { - return SetHash160(Hash160(vchPubKey)); + SetData(fTestNet ? SCRIPT_ADDRESS_TEST : SCRIPT_ADDRESS, &hash160, 20); + return true; } bool IsValid() const @@ -274,10 +292,21 @@ public: bool fExpectTestNet = false; switch(nVersion) { - case 0: + case PUBKEY_ADDRESS: + nExpectedSize = 20; // Hash of public key + fExpectTestNet = false; + break; + case SCRIPT_ADDRESS: + nExpectedSize = 20; // Hash of CScript + fExpectTestNet = false; break; - case 111: + case PUBKEY_ADDRESS_TEST: + nExpectedSize = 20; + fExpectTestNet = true; + break; + case SCRIPT_ADDRESS_TEST: + nExpectedSize = 20; fExpectTestNet = true; break; @@ -286,6 +315,14 @@ public: } return fExpectTestNet == fTestNet && vchData.size() == nExpectedSize; } + bool IsScript() const + { + if (!IsValid()) + return false; + if (fTestNet) + return nVersion == SCRIPT_ADDRESS_TEST; + return nVersion == SCRIPT_ADDRESS; + } CBitcoinAddress() { @@ -320,4 +357,53 @@ public: } }; +/** A base58-encoded secret key */ +class CBitcoinSecret : public CBase58Data +{ +public: + void SetSecret(const CSecret& vchSecret, bool fCompressed) + { + assert(vchSecret.size() == 32); + SetData(fTestNet ? 239 : 128, &vchSecret[0], vchSecret.size()); + if (fCompressed) + vchData.push_back(1); + } + + CSecret GetSecret(bool &fCompressedOut) + { + CSecret vchSecret; + vchSecret.resize(32); + memcpy(&vchSecret[0], &vchData[0], 32); + fCompressedOut = vchData.size() == 33; + return vchSecret; + } + + bool IsValid() const + { + bool fExpectTestNet = false; + switch(nVersion) + { + case 128: + break; + + case 239: + fExpectTestNet = true; + break; + + default: + return false; + } + return fExpectTestNet == fTestNet && (vchData.size() == 32 || (vchData.size() == 33 && vchData[32] == 1)); + } + + CBitcoinSecret(const CSecret& vchSecret, bool fCompressed) + { + SetSecret(vchSecret, fCompressed); + } + + CBitcoinSecret() + { + } +}; + #endif diff --git a/src/bignum.h b/src/bignum.h index 6e8d3cb..c7c2ff1 100644 --- a/src/bignum.h +++ b/src/bignum.h @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_BIGNUM_H @@ -11,6 +11,7 @@ #include "util.h" +/** Errors thrown by the bignum class */ class bignum_error : public std::runtime_error { public: @@ -18,7 +19,7 @@ public: }; - +/** RAII encapsulated BN_CTX (OpenSSL bignum context) */ class CAutoBN_CTX { protected: @@ -46,7 +47,7 @@ public: }; - +/** C++ wrapper for BIGNUM (OpenSSl bignum) */ class CBigNum : public BIGNUM { public: @@ -115,9 +116,9 @@ public: { unsigned long n = BN_get_word(this); if (!BN_is_negative(this)) - return (n > INT_MAX ? INT_MAX : n); + return (n > std::numeric_limits::max() ? std::numeric_limits::max() : n); else - return (n > INT_MAX ? INT_MIN : -(int)n); + return (n > std::numeric_limits::max() ? std::numeric_limits::min() : -(int)n); } void setint64(int64 n) @@ -338,19 +339,19 @@ public: return ToString(16); } - unsigned int GetSerializeSize(int nType=0, int nVersion=VERSION) const + unsigned int GetSerializeSize(int nType=0, int nVersion=PROTOCOL_VERSION) const { return ::GetSerializeSize(getvch(), nType, nVersion); } template - void Serialize(Stream& s, int nType=0, int nVersion=VERSION) const + void Serialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) const { ::Serialize(s, getvch(), nType, nVersion); } template - void Unserialize(Stream& s, int nType=0, int nVersion=VERSION) + void Unserialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) { std::vector vch; ::Unserialize(s, vch, nType, nVersion); diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index f10de69..a246677 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -9,9 +9,11 @@ #include "init.h" #undef printf #include +#include #include #include #include +#include #ifdef USE_SSL #include #include @@ -41,6 +43,8 @@ static std::string strRPCUserColonPass; static int64 nWalletUnlockTime; static CCriticalSection cs_nWalletUnlockTime; +extern Value dumpprivkey(const Array& params, bool fHelp); +extern Value importprivkey(const Array& params, bool fHelp); Object JSONRPCError(int code, const string& message) { @@ -50,22 +54,35 @@ Object JSONRPCError(int code, const string& message) return error; } - -void PrintConsole(const std::string &format, ...) +double GetDifficulty(const CBlockIndex* blockindex = NULL) { - char buffer[50000]; - int limit = sizeof(buffer); - va_list arg_ptr; - va_start(arg_ptr, format); - int ret = _vsnprintf(buffer, limit, format.c_str(), arg_ptr); - va_end(arg_ptr); - if (ret < 0 || ret >= limit) + // Floating point number that is a multiple of the minimum difficulty, + // minimum difficulty = 1.0. + if (blockindex == NULL) + { + if (pindexBest == NULL) + return 1.0; + else + blockindex = pindexBest; + } + + int nShift = (blockindex->nBits >> 24) & 0xff; + + double dDiff = + (double)0x0000ffff / (double)(blockindex->nBits & 0x00ffffff); + + while (nShift < 29) { - ret = limit - 1; - buffer[limit-1] = 0; + dDiff *= 256.0; + nShift++; } - printf("%s", buffer); - fprintf(stdout, "%s", buffer); + while (nShift > 29) + { + dDiff /= 256.0; + nShift--; + } + + return dDiff; } @@ -85,9 +102,26 @@ Value ValueFromAmount(int64 amount) return (double)amount / (double)COIN; } +std::string +HexBits(unsigned int nBits) +{ + union { + int32_t nBits; + char cBits[4]; + } uBits; + uBits.nBits = htonl((int32_t)nBits); + return HexStr(BEGIN(uBits.cBits), END(uBits.cBits)); +} + void WalletTxToJSON(const CWalletTx& wtx, Object& entry) { - entry.push_back(Pair("confirmations", wtx.GetDepthInMainChain())); + int confirms = wtx.GetDepthInMainChain(); + entry.push_back(Pair("confirmations", confirms)); + if (confirms) + { + entry.push_back(Pair("blockhash", wtx.hashBlock.GetHex())); + entry.push_back(Pair("blockindex", wtx.nIndex)); + } entry.push_back(Pair("txid", wtx.GetHash().GetHex())); entry.push_back(Pair("time", (boost::int64_t)wtx.GetTxTime())); BOOST_FOREACH(const PAIRTYPE(string,string)& item, wtx.mapValue) @@ -102,6 +136,30 @@ string AccountFromValue(const Value& value) return strAccount; } +Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex) +{ + Object result; + result.push_back(Pair("hash", block.GetHash().GetHex())); + result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK))); + result.push_back(Pair("height", blockindex->nHeight)); + result.push_back(Pair("version", block.nVersion)); + result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex())); + result.push_back(Pair("time", (boost::int64_t)block.GetBlockTime())); + result.push_back(Pair("nonce", (boost::uint64_t)block.nNonce)); + result.push_back(Pair("bits", HexBits(block.nBits))); + result.push_back(Pair("difficulty", GetDifficulty(blockindex))); + Array txhashes; + BOOST_FOREACH (const CTransaction&tx, block.vtx) + txhashes.push_back(tx.GetHash().GetHex()); + result.push_back(Pair("tx", txhashes)); + + if (blockindex->pprev) + result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex())); + if (blockindex->pnext) + result.push_back(Pair("nextblockhash", blockindex->pnext->GetBlockHash().GetHex())); + return result; +} + /// @@ -207,32 +265,6 @@ Value getconnectioncount(const Array& params, bool fHelp) } -double GetDifficulty() -{ - // Floating point number that is a multiple of the minimum difficulty, - // minimum difficulty = 1.0. - - if (pindexBest == NULL) - return 1.0; - int nShift = (pindexBest->nBits >> 24) & 0xff; - - double dDiff = - (double)0x0000ffff / (double)(pindexBest->nBits & 0x00ffffff); - - while (nShift < 29) - { - dDiff *= 256.0; - nShift++; - } - while (nShift > 29) - { - dDiff /= 256.0; - nShift--; - } - - return dDiff; -} - Value getdifficulty(const Array& params, bool fHelp) { if (fHelp || params.size() != 0) @@ -251,7 +283,7 @@ Value getgenerate(const Array& params, bool fHelp) "getgenerate\n" "Returns true or false."); - return (bool)fGenerateBitcoins; + return GetBoolArg("-gen"); } @@ -270,13 +302,11 @@ Value setgenerate(const Array& params, bool fHelp) if (params.size() > 1) { int nGenProcLimit = params[1].get_int(); - fLimitProcessors = (nGenProcLimit != -1); - WriteSetting("fLimitProcessors", fLimitProcessors); - if (nGenProcLimit != -1) - WriteSetting("nLimitProcessors", nLimitProcessors = nGenProcLimit); + mapArgs["-genproclimit"] = itostr(nGenProcLimit); if (nGenProcLimit == 0) fGenerate = false; } + mapArgs["-gen"] = (fGenerate ? "1" : "0"); GenerateBitcoins(fGenerate, pwalletMain); return Value::null; @@ -304,15 +334,14 @@ Value getinfo(const Array& params, bool fHelp) "Returns an object containing various state info."); Object obj; - obj.push_back(Pair("version", (int)VERSION)); + obj.push_back(Pair("version", (int)CLIENT_VERSION)); + obj.push_back(Pair("protocolversion",(int)PROTOCOL_VERSION)); + obj.push_back(Pair("walletversion", pwalletMain->GetVersion())); obj.push_back(Pair("balance", ValueFromAmount(pwalletMain->GetBalance()))); obj.push_back(Pair("blocks", (int)nBestHeight)); obj.push_back(Pair("connections", (int)vNodes.size())); obj.push_back(Pair("proxy", (fUseProxy ? addrProxy.ToStringIPPort() : string()))); - obj.push_back(Pair("generate", (bool)fGenerateBitcoins)); - obj.push_back(Pair("genproclimit", (int)(fLimitProcessors ? nLimitProcessors : -1))); obj.push_back(Pair("difficulty", (double)GetDifficulty())); - obj.push_back(Pair("hashespersec", gethashespersec(params, false))); obj.push_back(Pair("testnet", fTestNet)); obj.push_back(Pair("keypoololdest", (boost::int64_t)pwalletMain->GetOldestKeyPoolTime())); obj.push_back(Pair("keypoolsize", pwalletMain->GetKeyPoolSize())); @@ -324,6 +353,28 @@ Value getinfo(const Array& params, bool fHelp) } +Value getmininginfo(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 0) + throw runtime_error( + "getmininginfo\n" + "Returns an object containing mining-related information."); + + Object obj; + obj.push_back(Pair("blocks", (int)nBestHeight)); + obj.push_back(Pair("currentblocksize",(uint64_t)nLastBlockSize)); + obj.push_back(Pair("currentblocktx",(uint64_t)nLastBlockTx)); + obj.push_back(Pair("difficulty", (double)GetDifficulty())); + obj.push_back(Pair("errors", GetWarnings("statusbar"))); + obj.push_back(Pair("generate", GetBoolArg("-gen"))); + obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1))); + obj.push_back(Pair("hashespersec", gethashespersec(params, false))); + obj.push_back(Pair("pooledtx", (uint64_t)nPooledTx)); + obj.push_back(Pair("testnet", fTestNet)); + return obj; +} + + Value getnewaddress(const Array& params, bool fHelp) { if (fHelp || params.size() > 1) @@ -532,8 +583,6 @@ Value sendtoaddress(const Array& params, bool fHelp) return wtx.GetHash().GetHex(); } -static const string strMessageMagic = "Bitcoin Signed Message:\n"; - Value signmessage(const Array& params, bool fHelp) { if (fHelp || params.size() != 2) @@ -595,7 +644,7 @@ Value verifymessage(const Array& params, bool fHelp) if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig)) return false; - return (key.GetAddress() == addr); + return (CBitcoinAddress(key.GetPubKey()) == addr); } @@ -662,7 +711,7 @@ Value getreceivedbyaccount(const Array& params, bool fHelp) if (params.size() > 1) nMinDepth = params[1].get_int(); - // Get the set of pub keys that have the label + // Get the set of pub keys assigned to account string strAccount = AccountFromValue(params[0]); set setAddress; GetAccountAddresses(strAccount, setAddress); @@ -678,7 +727,7 @@ Value getreceivedbyaccount(const Array& params, bool fHelp) BOOST_FOREACH(const CTxOut& txout, wtx.vout) { CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, pwalletMain, address) && setAddress.count(address)) + if (ExtractAddress(txout.scriptPubKey, address) && pwalletMain->HaveKey(address) && setAddress.count(address)) if (wtx.GetDepthInMainChain() >= nMinDepth) nAmount += txout.nValue; } @@ -931,6 +980,79 @@ Value sendmany(const Array& params, bool fHelp) return wtx.GetHash().GetHex(); } +Value addmultisigaddress(const Array& params, bool fHelp) +{ + if (fHelp || params.size() < 2 || params.size() > 3) + { + string msg = "addmultisigaddress <'[\"key\",\"key\"]'> [account]\n" + "Add a nrequired-to-sign multisignature address to the wallet\"\n" + "each key is a bitcoin address or hex-encoded public key\n" + "If [account] is specified, assign address to [account]."; + throw runtime_error(msg); + } + if (!fTestNet) + throw runtime_error("addmultisigaddress available only when running -testnet\n"); + + int nRequired = params[0].get_int(); + const Array& keys = params[1].get_array(); + string strAccount; + if (params.size() > 2) + strAccount = AccountFromValue(params[2]); + + // Gather public keys + if (nRequired < 1 || keys.size() < nRequired) + throw runtime_error( + strprintf("wrong number of keys" + "(got %d, need at least %d)", keys.size(), nRequired)); + std::vector pubkeys; + pubkeys.resize(keys.size()); + for (int i = 0; i < keys.size(); i++) + { + const std::string& ks = keys[i].get_str(); + + // Case 1: bitcoin address and we have full public key: + CBitcoinAddress address(ks); + if (address.IsValid()) + { + if (address.IsScript()) + throw runtime_error( + strprintf("%s is a pay-to-script address",ks.c_str())); + std::vector vchPubKey; + if (!pwalletMain->GetPubKey(address, vchPubKey)) + throw runtime_error( + strprintf("no full public key for address %s",ks.c_str())); + if (vchPubKey.empty() || !pubkeys[i].SetPubKey(vchPubKey)) + throw runtime_error(" Invalid public key: "+ks); + } + + // Case 2: hex public key + else if (IsHex(ks)) + { + vector vchPubKey = ParseHex(ks); + if (vchPubKey.empty() || !pubkeys[i].SetPubKey(vchPubKey)) + throw runtime_error(" Invalid public key: "+ks); + } + else + { + throw runtime_error(" Invalid public key: "+ks); + } + } + + // Construct using pay-to-script-hash: + CScript inner; + inner.SetMultisig(nRequired, pubkeys); + + uint160 scriptHash = Hash160(inner); + CScript scriptPubKey; + scriptPubKey.SetPayToScriptHash(inner); + pwalletMain->AddCScript(inner); + CBitcoinAddress address; + address.SetScriptHash160(scriptHash); + + pwalletMain->SetAddressBookName(address, strAccount); + return address.ToString(); +} + struct tallyitem { @@ -939,7 +1061,7 @@ struct tallyitem tallyitem() { nAmount = 0; - nConf = INT_MAX; + nConf = std::numeric_limits::max(); } }; @@ -960,6 +1082,7 @@ Value ListReceived(const Array& params, bool fByAccounts) for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; + if (wtx.IsCoinBase() || !wtx.IsFinal()) continue; @@ -970,7 +1093,7 @@ Value ListReceived(const Array& params, bool fByAccounts) BOOST_FOREACH(const CTxOut& txout, wtx.vout) { CBitcoinAddress address; - if (!ExtractAddress(txout.scriptPubKey, pwalletMain, address) || !address.IsValid()) + if (!ExtractAddress(txout.scriptPubKey, address) || !pwalletMain->HaveKey(address) || !address.IsValid()) continue; tallyitem& item = mapTally[address]; @@ -991,7 +1114,7 @@ Value ListReceived(const Array& params, bool fByAccounts) continue; int64 nAmount = 0; - int nConf = INT_MAX; + int nConf = std::numeric_limits::max(); if (it != mapTally.end()) { nAmount = (*it).second.nAmount; @@ -1010,7 +1133,7 @@ Value ListReceived(const Array& params, bool fByAccounts) obj.push_back(Pair("address", address.ToString())); obj.push_back(Pair("account", strAccount)); obj.push_back(Pair("amount", ValueFromAmount(nAmount))); - obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf))); + obj.push_back(Pair("confirmations", (nConf == std::numeric_limits::max() ? 0 : nConf))); ret.push_back(obj); } } @@ -1024,7 +1147,7 @@ Value ListReceived(const Array& params, bool fByAccounts) Object obj; obj.push_back(Pair("account", (*it).first)); obj.push_back(Pair("amount", ValueFromAmount(nAmount))); - obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf))); + obj.push_back(Pair("confirmations", (nConf == std::numeric_limits::max() ? 0 : nConf))); ret.push_back(obj); } } @@ -1069,6 +1192,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe string strSentAccount; list > listReceived; list > listSent; + wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount); bool fAllAccounts = (strAccount == string("*")); @@ -1597,14 +1721,42 @@ Value validateaddress(const Array& params, bool fHelp) // version of the address: string currentAddress = address.ToString(); ret.push_back(Pair("address", currentAddress)); - ret.push_back(Pair("ismine", (pwalletMain->HaveKey(address) > 0))); + if (pwalletMain->HaveKey(address)) + { + ret.push_back(Pair("ismine", true)); + std::vector vchPubKey; + pwalletMain->GetPubKey(address, vchPubKey); + ret.push_back(Pair("pubkey", HexStr(vchPubKey))); + CKey key; + key.SetPubKey(vchPubKey); + ret.push_back(Pair("iscompressed", key.IsCompressed())); + } + else if (pwalletMain->HaveCScript(address.GetHash160())) + { + ret.push_back(Pair("isscript", true)); + CScript subscript; + pwalletMain->GetCScript(address.GetHash160(), subscript); + ret.push_back(Pair("ismine", ::IsMine(*pwalletMain, subscript))); + std::vector addresses; + txnouttype whichType; + int nRequired; + ExtractAddresses(subscript, whichType, addresses, nRequired); + ret.push_back(Pair("script", GetTxnOutputType(whichType))); + Array a; + BOOST_FOREACH(const CBitcoinAddress& addr, addresses) + a.push_back(addr.ToString()); + ret.push_back(Pair("addresses", a)); + if (whichType == TX_MULTISIG) + ret.push_back(Pair("sigsrequired", nRequired)); + } + else + ret.push_back(Pair("ismine", false)); if (pwalletMain->mapAddressBook.count(address)) ret.push_back(Pair("account", pwalletMain->mapAddressBook[address])); } return ret; } - Value getwork(const Array& params, bool fHelp) { if (fHelp || params.size() > 1) @@ -1720,7 +1872,10 @@ Value getmemorypool(const Array& params, bool fHelp) " \"previousblockhash\" : hash of current highest block\n" " \"transactions\" : contents of non-coinbase transactions that should be included in the next block\n" " \"coinbasevalue\" : maximum allowable input to coinbase transaction, including the generation award and transaction fees\n" + " \"coinbaseflags\" : data that should be included in coinbase so support for new features can be judged\n" " \"time\" : timestamp appropriate for next block\n" + " \"mintime\" : minimum timestamp appropriate for next block\n" + " \"curtime\" : current timestamp\n" " \"bits\" : compressed target of next block\n" "If [data] is specified, tries to solve the block and returns true if it was successful."); @@ -1774,14 +1929,11 @@ Value getmemorypool(const Array& params, bool fHelp) result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex())); result.push_back(Pair("transactions", transactions)); result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue)); + result.push_back(Pair("coinbaseflags", HexStr(COINBASE_FLAGS.begin(), COINBASE_FLAGS.end()))); result.push_back(Pair("time", (int64_t)pblock->nTime)); - - union { - int32_t nBits; - char cBits[4]; - } uBits; - uBits.nBits = htonl((int32_t)pblock->nBits); - result.push_back(Pair("bits", HexStr(BEGIN(uBits.cBits), END(uBits.cBits)))); + result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1)); + result.push_back(Pair("curtime", (int64_t)GetAdjustedTime())); + result.push_back(Pair("bits", HexBits(pblock->nBits))); return result; } @@ -1796,6 +1948,44 @@ Value getmemorypool(const Array& params, bool fHelp) } } +Value getblockhash(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "getblockhash \n" + "Returns hash of block in best-block-chain at ."); + + int nHeight = params[0].get_int(); + if (nHeight < 0 || nHeight > nBestHeight) + throw runtime_error("Block number out of range."); + + CBlock block; + CBlockIndex* pblockindex = mapBlockIndex[hashBestChain]; + while (pblockindex->nHeight > nHeight) + pblockindex = pblockindex->pprev; + return pblockindex->phashBlock->GetHex(); +} + +Value getblock(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "getblock \n" + "Returns details of a block with given block-hash."); + + std::string strHash = params[0].get_str(); + uint256 hash(strHash); + + if (mapBlockIndex.count(hash) == 0) + throw JSONRPCError(-5, "Block not found"); + + CBlock block; + CBlockIndex* pblockindex = mapBlockIndex[hash]; + block.ReadFromDisk(pblockindex, true); + + return blockToJSON(block, pblockindex); +} + @@ -1822,6 +2012,7 @@ pair pCallTable[] = make_pair("setgenerate", &setgenerate), make_pair("gethashespersec", &gethashespersec), make_pair("getinfo", &getinfo), + make_pair("getmininginfo", &getmininginfo), make_pair("getnewaddress", &getnewaddress), make_pair("getaccountaddress", &getaccountaddress), make_pair("setaccount", &setaccount), @@ -1843,15 +2034,20 @@ pair pCallTable[] = make_pair("move", &movecmd), make_pair("sendfrom", &sendfrom), make_pair("sendmany", &sendmany), + make_pair("addmultisigaddress", &addmultisigaddress), + make_pair("getblock", &getblock), + make_pair("getblockhash", &getblockhash), make_pair("gettransaction", &gettransaction), make_pair("listtransactions", &listtransactions), - make_pair("signmessage", &signmessage), - make_pair("verifymessage", &verifymessage), + make_pair("signmessage", &signmessage), + make_pair("verifymessage", &verifymessage), make_pair("getwork", &getwork), make_pair("listaccounts", &listaccounts), make_pair("settxfee", &settxfee), make_pair("getmemorypool", &getmemorypool), - make_pair("listsinceblock", &listsinceblock), + make_pair("listsinceblock", &listsinceblock), + make_pair("dumpprivkey", &dumpprivkey), + make_pair("importprivkey", &importprivkey) }; map mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0])); @@ -1867,6 +2063,7 @@ string pAllowInSafeMode[] = "setgenerate", "gethashespersec", "getinfo", + "getmininginfo", "getnewaddress", "getaccountaddress", "getaccount", @@ -2146,15 +2343,15 @@ void ThreadRPCServer(void* parg) IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer(parg)); try { - vnThreadsRunning[4]++; + vnThreadsRunning[THREAD_RPCSERVER]++; ThreadRPCServer2(parg); - vnThreadsRunning[4]--; + vnThreadsRunning[THREAD_RPCSERVER]--; } catch (std::exception& e) { - vnThreadsRunning[4]--; + vnThreadsRunning[THREAD_RPCSERVER]--; PrintException(&e, "ThreadRPCServer()"); } catch (...) { - vnThreadsRunning[4]--; + vnThreadsRunning[THREAD_RPCSERVER]--; PrintException(NULL, "ThreadRPCServer()"); } printf("ThreadRPCServer exiting\n"); @@ -2165,7 +2362,7 @@ void ThreadRPCServer2(void* parg) printf("ThreadRPCServer started\n"); strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; - if (strRPCUserColonPass == ":") + if (mapArgs["-rpcpassword"] == "") { unsigned char rand_pwd[32]; RAND_bytes(rand_pwd, 32); @@ -2175,7 +2372,7 @@ void ThreadRPCServer2(void* parg) else if (mapArgs.count("-daemon")) strWhatAmI = strprintf(_("To use the %s option"), "\"-daemon\""); ThreadSafeMessageBox(strprintf( - _("Error: %s, you must set a rpcpassword in the configuration file:\n %s\n" + _("%s, you must set a rpcpassword in the configuration file:\n %s\n" "It is recommended you use the following random password:\n" "rpcuser=bitcoinrpc\n" "rpcpassword=%s\n" @@ -2235,7 +2432,7 @@ void ThreadRPCServer2(void* parg) #endif ip::tcp::endpoint peer; - vnThreadsRunning[4]--; + vnThreadsRunning[THREAD_RPCSERVER]--; #ifdef USE_SSL acceptor.accept(sslStream.lowest_layer(), peer); #else @@ -2476,6 +2673,7 @@ int CommandLineRPC(int argc, char *argv[]) if (strMethod == "listreceivedbyaccount" && n > 0) ConvertTo(params[0]); if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo(params[1]); if (strMethod == "getbalance" && n > 1) ConvertTo(params[1]); + if (strMethod == "getblockhash" && n > 0) ConvertTo(params[0]); if (strMethod == "move" && n > 2) ConvertTo(params[2]); if (strMethod == "move" && n > 3) ConvertTo(params[3]); if (strMethod == "sendfrom" && n > 2) ConvertTo(params[2]); @@ -2494,6 +2692,15 @@ int CommandLineRPC(int argc, char *argv[]) params[1] = v.get_obj(); } if (strMethod == "sendmany" && n > 2) ConvertTo(params[2]); + if (strMethod == "addmultisigaddress" && n > 0) ConvertTo(params[0]); + if (strMethod == "addmultisigaddress" && n > 1) + { + string s = params[1].get_str(); + Value v; + if (!read_string(s, v) || v.type() != array_type) + throw runtime_error("type mismatch "+s); + params[1] = v.get_array(); + } // Execute Object reply = CallRPC(strMethod, params); diff --git a/src/bitcoinrpc.h b/src/bitcoinrpc.h index f267400..a9cf329 100644 --- a/src/bitcoinrpc.h +++ b/src/bitcoinrpc.h @@ -1,5 +1,5 @@ // Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. diff --git a/src/checkpoints.h b/src/checkpoints.h index 9d52da4..38902ac 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_CHECKPOINT_H @@ -10,10 +10,9 @@ class uint256; class CBlockIndex; -// -// Block-chain checkpoints are compiled-in sanity checks. -// They are updated every release or three. -// +/** Block-chain checkpoints are compiled-in sanity checks. + * They are updated every release or three. + */ namespace Checkpoints { // Returns true if block passes checkpoint checks diff --git a/src/compat.h b/src/compat.h new file mode 100644 index 0000000..8826100 --- /dev/null +++ b/src/compat.h @@ -0,0 +1,42 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2012 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. +#ifndef _BITCOIN_COMPAT_H +#define _BITCOIN_COMPAT_H 1 + +typedef u_int SOCKET; +#ifdef WIN32 +#define MSG_NOSIGNAL 0 +#define MSG_DONTWAIT 0 +typedef int socklen_t; +#else +#include "errno.h" +#define WSAGetLastError() errno +#define WSAEINVAL EINVAL +#define WSAEALREADY EALREADY +#define WSAEWOULDBLOCK EWOULDBLOCK +#define WSAEMSGSIZE EMSGSIZE +#define WSAEINTR EINTR +#define WSAEINPROGRESS EINPROGRESS +#define WSAEADDRINUSE EADDRINUSE +#define WSAENOTSOCK EBADF +#define INVALID_SOCKET (SOCKET)(~0) +#define SOCKET_ERROR -1 +#endif + +inline int myclosesocket(SOCKET& hSocket) +{ + if (hSocket == INVALID_SOCKET) + return WSAENOTSOCK; +#ifdef WIN32 + int ret = closesocket(hSocket); +#else + int ret = close(hSocket); +#endif + hSocket = INVALID_SOCKET; + return ret; +} +#define closesocket(s) myclosesocket(s) + +#endif diff --git a/src/crypter.cpp b/src/crypter.cpp index 7f53e22..6643bcd 100644 --- a/src/crypter.cpp +++ b/src/crypter.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Bitcoin Developers +// Copyright (c) 2009-2012 The Bitcoin Developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. diff --git a/src/crypter.h b/src/crypter.h index d7f8a39..0f9ea02 100644 --- a/src/crypter.h +++ b/src/crypter.h @@ -1,9 +1,10 @@ -// Copyright (c) 2011 The Bitcoin Developers +// Copyright (c) 2009-2012 The Bitcoin Developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef __CRYPTER_H__ #define __CRYPTER_H__ +#include "util.h" /* for SecureString */ #include "key.h" const unsigned int WALLET_CRYPTO_KEY_SIZE = 32; @@ -24,6 +25,7 @@ with the double-sha256 of the public key as the IV, and the master key's key as the encryption key (see keystore.[ch]). */ +/** Master key for wallet encryption */ class CMasterKey { public: @@ -57,6 +59,7 @@ public: typedef std::vector > CKeyingMaterial; +/** Encryption/decryption context with key information */ class CCrypter { private: diff --git a/src/db.cpp b/src/db.cpp index 9b67ab6..2a09e2e 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -6,6 +6,7 @@ #include "headers.h" #include "db.h" #include "net.h" +#include #include #include @@ -27,6 +28,7 @@ static bool fDbEnvInit = false; DbEnv dbenv(0); static map mapFileUseCount; static map mapDb; +static int64 nTxn = 0; static void EnvShutdown() { @@ -83,12 +85,16 @@ CDB::CDB(const char* pszFile, const char* pszMode) : pdb(NULL) string strErrorFile = strDataDir + "/db.log"; printf("dbenv.open strLogDir=%s strErrorFile=%s\n", strLogDir.c_str(), strErrorFile.c_str()); + int nDbCache = GetArg("-dbcache", 25); dbenv.set_lg_dir(strLogDir.c_str()); - dbenv.set_lg_max(10000000); + dbenv.set_cachesize(nDbCache / 1024, (nDbCache % 1024)*1048576, 1); + dbenv.set_lg_bsize(1048576); + dbenv.set_lg_max(10485760); dbenv.set_lk_max_locks(10000); dbenv.set_lk_max_objects(10000); dbenv.set_errfile(fopen(strErrorFile.c_str(), "a")); /// debug dbenv.set_flags(DB_AUTO_COMMIT, 1); + dbenv.log_set_config(DB_LOG_AUTO_REMOVE, 1); ret = dbenv.open(strDataDir.c_str(), DB_CREATE | DB_INIT_LOCK | @@ -131,7 +137,7 @@ CDB::CDB(const char* pszFile, const char* pszMode) : pdb(NULL) { bool fTmp = fReadOnly; fReadOnly = false; - WriteVersion(VERSION); + WriteVersion(CLIENT_VERSION); fReadOnly = fTmp; } @@ -155,8 +161,15 @@ void CDB::Close() nMinutes = 1; if (strFile == "addr.dat") nMinutes = 2; - if (strFile == "blkindex.dat" && IsInitialBlockDownload() && nBestHeight % 500 != 0) - nMinutes = 1; + if (strFile == "blkindex.dat" && IsInitialBlockDownload()) + nMinutes = 5; + + if (nMinutes == 0 || nTxn > 200000) + { + nTxn = 0; + nMinutes = 0; + } + dbenv.txn_checkpoint(0, nMinutes, 0); CRITICAL_BLOCK(cs_db) @@ -236,7 +249,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip) { // Update version: ssValue.clear(); - ssValue << VERSION; + ssValue << CLIENT_VERSION; } Dbt datKey(&ssKey[0], ssKey.size()); Dbt datValue(&ssValue[0], ssValue.size()); @@ -331,6 +344,7 @@ bool CTxDB::ReadTxIndex(uint256 hash, CTxIndex& txindex) bool CTxDB::UpdateTxIndex(uint256 hash, const CTxIndex& txindex) { assert(!fClient); + nTxn++; return Write(make_pair(string("tx"), hash), txindex); } @@ -341,6 +355,7 @@ bool CTxDB::AddTxIndex(const CTransaction& tx, const CDiskTxPos& pos, int nHeigh // Add to tx index uint256 hash = tx.GetHash(); CTxIndex txindex(pos, tx.vout.size()); + nTxn++; return Write(make_pair(string("tx"), hash), txindex); } @@ -579,19 +594,114 @@ bool CTxDB::LoadBlockIndex() ReadBestInvalidWork(bnBestInvalidWork); // Verify blocks in the best chain + int nCheckLevel = GetArg("-checklevel", 1); + int nCheckDepth = GetArg( "-checkblocks", 2500); + if (nCheckDepth == 0) + nCheckDepth = 1000000000; // suffices until the year 19000 + if (nCheckDepth > nBestHeight) + nCheckDepth = nBestHeight; + printf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel); CBlockIndex* pindexFork = NULL; + map, CBlockIndex*> mapBlockPos; for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev) { - if (pindex->nHeight < nBestHeight-2500 && !mapArgs.count("-checkblocks")) + if (pindex->nHeight < nBestHeight-nCheckDepth) break; CBlock block; if (!block.ReadFromDisk(pindex)) return error("LoadBlockIndex() : block.ReadFromDisk failed"); - if (!block.CheckBlock()) + // check level 1: verify block validity + if (nCheckLevel>0 && !block.CheckBlock()) { printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str()); pindexFork = pindex->pprev; } + // check level 2: verify transaction index validity + if (nCheckLevel>1) + { + pair pos = make_pair(pindex->nFile, pindex->nBlockPos); + mapBlockPos[pos] = pindex; + BOOST_FOREACH(const CTransaction &tx, block.vtx) + { + uint256 hashTx = tx.GetHash(); + CTxIndex txindex; + if (ReadTxIndex(hashTx, txindex)) + { + // check level 3: checker transaction hashes + if (nCheckLevel>2 || pindex->nFile != txindex.pos.nFile || pindex->nBlockPos != txindex.pos.nBlockPos) + { + // either an error or a duplicate transaction + CTransaction txFound; + if (!txFound.ReadFromDisk(txindex.pos)) + { + printf("LoadBlockIndex() : *** cannot read mislocated transaction %s\n", hashTx.ToString().c_str()); + pindexFork = pindex->pprev; + } + else + if (txFound.GetHash() != hashTx) // not a duplicate tx + { + printf("LoadBlockIndex(): *** invalid tx position for %s\n", hashTx.ToString().c_str()); + pindexFork = pindex->pprev; + } + } + // check level 4: check whether spent txouts were spent within the main chain + int nOutput = 0; + if (nCheckLevel>3) + BOOST_FOREACH(const CDiskTxPos &txpos, txindex.vSpent) + { + if (!txpos.IsNull()) + { + pair posFind = make_pair(txpos.nFile, txpos.nBlockPos); + if (!mapBlockPos.count(posFind)) + { + printf("LoadBlockIndex(): *** found bad spend at %d, hashBlock=%s, hashTx=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str(), hashTx.ToString().c_str()); + pindexFork = pindex->pprev; + } + // check level 6: check whether spent txouts were spent by a valid transaction that consume them + if (nCheckLevel>5) + { + CTransaction txSpend; + if (!txSpend.ReadFromDisk(txpos)) + { + printf("LoadBlockIndex(): *** cannot read spending transaction of %s:%i from disk\n", hashTx.ToString().c_str(), nOutput); + pindexFork = pindex->pprev; + } + else if (!txSpend.CheckTransaction()) + { + printf("LoadBlockIndex(): *** spending transaction of %s:%i is invalid\n", hashTx.ToString().c_str(), nOutput); + pindexFork = pindex->pprev; + } + else + { + bool fFound = false; + BOOST_FOREACH(const CTxIn &txin, txSpend.vin) + if (txin.prevout.hash == hashTx && txin.prevout.n == nOutput) + fFound = true; + if (!fFound) + { + printf("LoadBlockIndex(): *** spending transaction of %s:%i does not spend it\n", hashTx.ToString().c_str(), nOutput); + pindexFork = pindex->pprev; + } + } + } + } + nOutput++; + } + } + // check level 5: check whether all prevouts are marked spent + if (nCheckLevel>4) + BOOST_FOREACH(const CTxIn &txin, tx.vin) + { + CTxIndex txindex; + if (ReadTxIndex(txin.prevout.hash, txindex)) + if (txindex.vSpent.size()-1 < txin.prevout.n || txindex.vSpent[txin.prevout.n].IsNull()) + { + printf("LoadBlockIndex(): *** found unspent prevout %s:%i in %s\n", txin.prevout.hash.ToString().c_str(), txin.prevout.n, hashTx.ToString().c_str()); + pindexFork = pindex->pprev; + } + } + } + } } if (pindexFork) { @@ -615,50 +725,58 @@ bool CTxDB::LoadBlockIndex() // CAddrDB // -bool CAddrDB::WriteAddress(const CAddress& addr) +bool CAddrDB::WriteAddrman(const CAddrMan& addrman) { - return Write(make_pair(string("addr"), addr.GetKey()), addr); -} - -bool CAddrDB::EraseAddress(const CAddress& addr) -{ - return Erase(make_pair(string("addr"), addr.GetKey())); + return Write(string("addrman"), addrman); } bool CAddrDB::LoadAddresses() { - CRITICAL_BLOCK(cs_mapAddresses) + if (Read(string("addrman"), addrman)) { - // Get cursor - Dbc* pcursor = GetCursor(); - if (!pcursor) + printf("Loaded %i addresses\n", addrman.size()); + return true; + } + + // Read pre-0.6 addr records + + vector vAddr; + vector > vDelete; + + // Get cursor + Dbc* pcursor = GetCursor(); + if (!pcursor) + return false; + + loop + { + // Read next record + CDataStream ssKey; + CDataStream ssValue; + int ret = ReadAtCursor(pcursor, ssKey, ssValue); + if (ret == DB_NOTFOUND) + break; + else if (ret != 0) return false; - loop + // Unserialize + string strType; + ssKey >> strType; + if (strType == "addr") { - // Read next record - CDataStream ssKey; - CDataStream ssValue; - int ret = ReadAtCursor(pcursor, ssKey, ssValue); - if (ret == DB_NOTFOUND) - break; - else if (ret != 0) - return false; - - // Unserialize - string strType; - ssKey >> strType; - if (strType == "addr") - { - CAddress addr; - ssValue >> addr; - mapAddresses.insert(make_pair(addr.GetKey(), addr)); - } + CAddress addr; + ssValue >> addr; + vAddr.push_back(addr); } - pcursor->close(); - - printf("Loaded %d addresses\n", mapAddresses.size()); } + pcursor->close(); + + addrman.Add(vAddr, CNetAddr("0.0.0.0")); + printf("Loaded %i addresses\n", addrman.size()); + + // Note: old records left; we ran into hangs-on-startup + // bugs for some users who (we think) were running after + // an unclean shutdown. return true; } @@ -767,21 +885,15 @@ int CWalletDB::LoadWallet(CWallet* pwallet) vector vWalletUpgrade; bool fIsEncrypted = false; - // Modify defaults -#ifndef WIN32 - // Tray icon sometimes disappears on 9.10 karmic koala 64-bit, leaving no way to access the program - fMinimizeToTray = false; - fMinimizeOnClose = false; -#endif - //// todo: shouldn't we catch exceptions and try to recover and continue? CRITICAL_BLOCK(pwallet->cs_wallet) { int nMinVersion = 0; if (Read((string)"minversion", nMinVersion)) { - if (nMinVersion > VERSION) + if (nMinVersion > CLIENT_VERSION) return DB_TOO_NEW; + pwallet->LoadMinVersion(nMinVersion); } // Get cursor @@ -823,7 +935,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet) ssKey >> hash; CWalletTx& wtx = pwallet->mapWallet[hash]; ssValue >> wtx; - wtx.pwallet = pwallet; + wtx.BindWallet(pwallet); if (wtx.GetHash() != hash) printf("Error in wallet.dat, hash mismatch\n"); @@ -873,6 +985,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet) { CPrivKey pkey; ssValue >> pkey; + key.SetPubKey(vchPubKey); key.SetPrivKey(pkey); if (key.GetPubKey() != vchPubKey) { @@ -889,6 +1002,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet) { CWalletKey wkey; ssValue >> wkey; + key.SetPubKey(vchPubKey); key.SetPrivKey(wkey.vchPrivKey); if (key.GetPubKey() != vchPubKey) { @@ -951,23 +1065,17 @@ int CWalletDB::LoadWallet(CWallet* pwallet) if (nFileVersion == 10300) nFileVersion = 300; } - else if (strType == "setting") + else if (strType == "cscript") { - string strKey; - ssKey >> strKey; - - // Options -#ifndef QT_GUI - if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins; -#endif - if (strKey == "nTransactionFee") ssValue >> nTransactionFee; - if (strKey == "fLimitProcessors") ssValue >> fLimitProcessors; - if (strKey == "nLimitProcessors") ssValue >> nLimitProcessors; - if (strKey == "fMinimizeToTray") ssValue >> fMinimizeToTray; - if (strKey == "fMinimizeOnClose") ssValue >> fMinimizeOnClose; - if (strKey == "fUseProxy") ssValue >> fUseProxy; - if (strKey == "addrProxy") ssValue >> addrProxy; - if (fHaveUPnP && strKey == "fUseUPnP") ssValue >> fUseUPnP; + uint160 hash; + ssKey >> hash; + CScript script; + ssValue >> script; + if (!pwallet->LoadCScript(script)) + { + printf("Error reading wallet database: LoadCScript failed\n"); + return DB_CORRUPT; + } } } pcursor->close(); @@ -977,27 +1085,19 @@ int CWalletDB::LoadWallet(CWallet* pwallet) WriteTx(hash, pwallet->mapWallet[hash]); printf("nFileVersion = %d\n", nFileVersion); - printf("fGenerateBitcoins = %d\n", fGenerateBitcoins); - printf("nTransactionFee = %"PRI64d"\n", nTransactionFee); - printf("fMinimizeToTray = %d\n", fMinimizeToTray); - printf("fMinimizeOnClose = %d\n", fMinimizeOnClose); - printf("fUseProxy = %d\n", fUseProxy); - printf("addrProxy = %s\n", addrProxy.ToString().c_str()); - if (fHaveUPnP) - printf("fUseUPnP = %d\n", fUseUPnP); // Rewrite encrypted wallets of versions 0.4.0 and 0.5.0rc: if (fIsEncrypted && (nFileVersion == 40000 || nFileVersion == 50000)) return DB_NEED_REWRITE; - if (nFileVersion < VERSION) // Update + if (nFileVersion < CLIENT_VERSION) // Update { // Get rid of old debug.log file in current directory if (nFileVersion <= 105 && !pszSetDataDir[0]) unlink("debug.log"); - WriteVersion(VERSION); + WriteVersion(CLIENT_VERSION); } return DB_LOAD_OK; @@ -1010,7 +1110,7 @@ void ThreadFlushWalletDB(void* parg) if (fOneThread) return; fOneThread = true; - if (mapArgs.count("-noflushwallet")) + if (!GetBoolArg("-flushwallet", true)) return; unsigned int nLastSeen = nWalletDBUpdated; @@ -1084,14 +1184,19 @@ bool BackupWallet(const CWallet& wallet, const string& strDest) filesystem::path pathDest(strDest); if (filesystem::is_directory(pathDest)) pathDest = pathDest / wallet.strWalletFile; + + try { #if BOOST_VERSION >= 104000 - filesystem::copy_file(pathSrc, pathDest, filesystem::copy_option::overwrite_if_exists); + filesystem::copy_file(pathSrc, pathDest, filesystem::copy_option::overwrite_if_exists); #else - filesystem::copy_file(pathSrc, pathDest); + filesystem::copy_file(pathSrc, pathDest); #endif - printf("copied wallet.dat to %s\n", pathDest.string().c_str()); - - return true; + printf("copied wallet.dat to %s\n", pathDest.string().c_str()); + return true; + } catch(const filesystem::filesystem_error &e) { + printf("error copying wallet.dat to %s - %s\n", pathDest.string().c_str(), e.what()); + return false; + } } } Sleep(100); diff --git a/src/db.h b/src/db.h index 15bfb29..47fa402 100644 --- a/src/db.h +++ b/src/db.h @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_DB_H @@ -13,17 +13,18 @@ #include -class CTxIndex; +class CAccount; +class CAccountingEntry; +class CAddress; +class CAddrMan; +class CBlockLocator; class CDiskBlockIndex; class CDiskTxPos; +class CMasterKey; class COutPoint; -class CAddress; -class CWalletTx; +class CTxIndex; class CWallet; -class CAccount; -class CAccountingEntry; -class CBlockLocator; - +class CWalletTx; extern unsigned int nWalletDBUpdated; extern DbEnv dbenv; @@ -33,7 +34,7 @@ void ThreadFlushWalletDB(void* parg); bool BackupWallet(const CWallet& wallet, const std::string& strDest); - +/** RAII class that provides access to a Berkeley database */ class CDB { protected: @@ -265,7 +266,7 @@ public: - +/** Access to the transaction database (blkindex.dat) */ class CTxDB : public CDB { public: @@ -296,7 +297,7 @@ public: - +/** Access to the (IP) address database (addr.dat) */ class CAddrDB : public CDB { public: @@ -305,15 +306,14 @@ private: CAddrDB(const CAddrDB&); void operator=(const CAddrDB&); public: - bool WriteAddress(const CAddress& addr); - bool EraseAddress(const CAddress& addr); + bool WriteAddrman(const CAddrMan& addr); bool LoadAddresses(); }; bool LoadAddresses(); - +/** A key pool entry */ class CKeyPool { public: @@ -342,7 +342,7 @@ public: - +/** Error statuses for the wallet database */ enum DBErrors { DB_LOAD_OK, @@ -352,6 +352,7 @@ enum DBErrors DB_NEED_REWRITE }; +/** Access to the wallet database (wallet.dat) */ class CWalletDB : public CDB { public: @@ -420,6 +421,19 @@ public: return Write(std::make_pair(std::string("mkey"), nID), kMasterKey, true); } + // Support for BIP 0013 : see https://en.bitcoin.it/wiki/BIP_0013 + bool ReadCScript(const uint160 &hash, CScript& redeemScript) + { + redeemScript.clear(); + return Read(std::make_pair(std::string("cscript"), hash), redeemScript); + } + + bool WriteCScript(const uint160& hash, const CScript& redeemScript) + { + nWalletDBUpdated++; + return Write(std::make_pair(std::string("cscript"), hash), redeemScript, false); + } + bool WriteBestBlock(const CBlockLocator& locator) { nWalletDBUpdated++; @@ -460,18 +474,29 @@ public: return Erase(std::make_pair(std::string("pool"), nPool)); } + // Settings are no longer stored in wallet.dat; these are + // used only for backwards compatibility: template bool ReadSetting(const std::string& strKey, T& value) { return Read(std::make_pair(std::string("setting"), strKey), value); } - template bool WriteSetting(const std::string& strKey, const T& value) { nWalletDBUpdated++; return Write(std::make_pair(std::string("setting"), strKey), value); } + bool EraseSetting(const std::string& strKey) + { + nWalletDBUpdated++; + return Erase(std::make_pair(std::string("setting"), strKey)); + } + + bool WriteMinVersion(int nVersion) + { + return Write(std::string("minversion"), nVersion); + } bool ReadAccount(const std::string& strAccount, CAccount& account); bool WriteAccount(const std::string& strAccount, const CAccount& account); diff --git a/src/headers.h b/src/headers.h index ea011c5..88f5476 100644 --- a/src/headers.h +++ b/src/headers.h @@ -12,7 +12,7 @@ #ifdef _WIN32_WINNT #undef _WIN32_WINNT #endif -#define _WIN32_WINNT 0x0500 +#define _WIN32_WINNT 0x0501 #ifdef _WIN32_IE #undef _WIN32_IE #endif @@ -21,9 +21,6 @@ // Include boost/foreach here as it defines __STDC_LIMIT_MACROS on some systems. #include -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS // to enable UINT64_MAX from stdint.h -#endif #if (defined(__unix__) || defined(unix)) && !defined(USG) #include // to get BSD define @@ -44,7 +41,6 @@ #include #include #include -#include #include #include #include diff --git a/src/init.cpp b/src/init.cpp index 168ebee..4078b7e 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -10,6 +10,7 @@ #include "strlcpy.h" #include #include +#include #include #if defined(BITCOIN_NEED_QT_PLUGINS) && !defined(_BITCOIN_QT_PLUGINS_INCLUDED) @@ -149,24 +150,15 @@ bool AppInit2(int argc, char* argv[]) // // Parameters // + // If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main() +#if !defined(QT_GUI) ParseParameters(argc, argv); - - if (mapArgs.count("-datadir")) + if (!ReadConfigFile(mapArgs, mapMultiArgs)) { - if (filesystem::is_directory(filesystem::system_complete(mapArgs["-datadir"]))) - { - filesystem::path pathDataDir = filesystem::system_complete(mapArgs["-datadir"]); - strlcpy(pszSetDataDir, pathDataDir.string().c_str(), sizeof(pszSetDataDir)); - } - else - { - fprintf(stderr, "Error: Specified directory does not exist\n"); - Shutdown(NULL); - } + fprintf(stderr, "Error: Specified directory does not exist\n"); + Shutdown(NULL); } - - - ReadConfigFile(mapArgs, mapMultiArgs); // Must be done after processing datadir +#endif if (mapArgs.count("-?") || mapArgs.count("--help")) { @@ -174,70 +166,79 @@ bool AppInit2(int argc, char* argv[]) _("Bitcoin version") + " " + FormatFullVersion() + "\n\n" + _("Usage:") + "\t\t\t\t\t\t\t\t\t\t\n" + " bitcoind [options] \t " + "\n" + - " bitcoind [options] [params]\t " + _("Send command to -server or bitcoind\n") + - " bitcoind [options] help \t\t " + _("List commands\n") + - " bitcoind [options] help \t\t " + _("Get help for a command\n") + - _("Options:\n") + - " -conf= \t\t " + _("Specify configuration file (default: bitcoin.conf)\n") + - " -pid= \t\t " + _("Specify pid file (default: bitcoind.pid)\n") + - " -gen \t\t " + _("Generate coins\n") + - " -gen=0 \t\t " + _("Don't generate coins\n") + - " -min \t\t " + _("Start minimized\n") + - " -datadir= \t\t " + _("Specify data directory\n") + - " -timeout= \t " + _("Specify connection timeout (in milliseconds)\n") + - " -proxy= \t " + _("Connect through socks4 proxy\n") + - " -dns \t " + _("Allow DNS lookups for addnode and connect\n") + - " -port= \t\t " + _("Listen for connections on (default: 8333 or testnet: 18333)\n") + - " -maxconnections=\t " + _("Maintain at most connections to peers (default: 125)\n") + - " -addnode= \t " + _("Add a node to connect to\n") + - " -connect= \t\t " + _("Connect only to the specified node\n") + - " -noirc \t " + _("Don't find peers using internet relay chat\n") + - " -nolisten \t " + _("Don't accept connections from outside\n") + - " -nodnsseed \t " + _("Don't bootstrap list of peers using DNS\n") + - " -banscore= \t " + _("Threshold for disconnecting misbehaving peers (default: 100)\n") + - " -bantime= \t " + _("Number of seconds to keep misbehaving peers from reconnecting (default: 86400)\n") + - " -maxreceivebuffer=\t " + _("Maximum per-connection receive buffer, *1000 bytes (default: 10000)\n") + - " -maxsendbuffer=\t " + _("Maximum per-connection send buffer, *1000 bytes (default: 10000)\n") + + " bitcoind [options] [params]\t " + _("Send command to -server or bitcoind") + "\n" + + " bitcoind [options] help \t\t " + _("List commands") + "\n" + + " bitcoind [options] help \t\t " + _("Get help for a command") + "\n" + + _("Options:") + "\n" + + " -conf= \t\t " + _("Specify configuration file (default: bitcoin.conf)") + "\n" + + " -pid= \t\t " + _("Specify pid file (default: bitcoind.pid)") + "\n" + + " -gen \t\t " + _("Generate coins") + "\n" + + " -gen=0 \t\t " + _("Don't generate coins") + "\n" + + " -min \t\t " + _("Start minimized") + "\n" + + " -splash \t\t " + _("Show splash screen on startup (default: 1)") + "\n" + + " -datadir= \t\t " + _("Specify data directory") + "\n" + + " -dbcache= \t\t " + _("Set database cache size in megabytes (default: 25)") + "\n" + + " -timeout= \t " + _("Specify connection timeout (in milliseconds)") + "\n" + + " -proxy= \t " + _("Connect through socks4 proxy") + "\n" + + " -dns \t " + _("Allow DNS lookups for addnode and connect") + "\n" + + " -port= \t\t " + _("Listen for connections on (default: 8333 or testnet: 18333)") + "\n" + + " -maxconnections=\t " + _("Maintain at most connections to peers (default: 125)") + "\n" + + " -addnode= \t " + _("Add a node to connect to and attempt to keep the connection open") + "\n" + + " -connect= \t\t " + _("Connect only to the specified node") + "\n" + + " -irc \t " + _("Find peers using internet relay chat (default: 0)") + "\n" + + " -listen \t " + _("Accept connections from outside (default: 1)") + "\n" + +#ifdef QT_GUI + " -lang= \t\t " + _("Set language, for example \"de_DE\" (default: system locale)") + "\n" + +#endif + " -dnsseed \t " + _("Find peers using DNS lookup (default: 1)") + "\n" + + " -banscore= \t " + _("Threshold for disconnecting misbehaving peers (default: 100)") + "\n" + + " -bantime= \t " + _("Number of seconds to keep misbehaving peers from reconnecting (default: 86400)") + "\n" + + " -maxreceivebuffer=\t " + _("Maximum per-connection receive buffer, *1000 bytes (default: 10000)") + "\n" + + " -maxsendbuffer=\t " + _("Maximum per-connection send buffer, *1000 bytes (default: 10000)") + "\n" + #ifdef USE_UPNP #if USE_UPNP - " -noupnp \t " + _("Don't attempt to use UPnP to map the listening port\n") + + " -upnp \t " + _("Use Universal Plug and Play to map the listening port (default: 1)") + "\n" + #else - " -upnp \t " + _("Attempt to use UPnP to map the listening port\n") + + " -upnp \t " + _("Use Universal Plug and Play to map the listening port (default: 0)") + "\n" + #endif #endif - " -paytxfee= \t " + _("Fee per kB to add to transactions you send\n") + + " -paytxfee= \t " + _("Fee per KB to add to transactions you send") + "\n" + #ifdef QT_GUI - " -server \t\t " + _("Accept command line and JSON-RPC commands\n") + + " -server \t\t " + _("Accept command line and JSON-RPC commands") + "\n" + #endif #if !defined(WIN32) && !defined(QT_GUI) - " -daemon \t\t " + _("Run in the background as a daemon and accept commands\n") + + " -daemon \t\t " + _("Run in the background as a daemon and accept commands") + "\n" + #endif - " -testnet \t\t " + _("Use the test network\n") + - " -debug \t\t " + _("Output extra debugging information\n") + - " -logtimestamps \t " + _("Prepend debug output with timestamp\n") + - " -printtoconsole \t " + _("Send trace/debug info to console instead of debug.log file\n") + + " -testnet \t\t " + _("Use the test network") + "\n" + + " -debug \t\t " + _("Output extra debugging information") + "\n" + + " -logtimestamps \t " + _("Prepend debug output with timestamp") + "\n" + + " -printtoconsole \t " + _("Send trace/debug info to console instead of debug.log file") + "\n" + #ifdef WIN32 - " -printtodebugger \t " + _("Send trace/debug info to debugger\n") + + " -printtodebugger \t " + _("Send trace/debug info to debugger") + "\n" + #endif - " -rpcuser= \t " + _("Username for JSON-RPC connections\n") + - " -rpcpassword=\t " + _("Password for JSON-RPC connections\n") + - " -rpcport= \t\t " + _("Listen for JSON-RPC connections on (default: 8332)\n") + - " -rpcallowip= \t\t " + _("Allow JSON-RPC connections from specified IP address\n") + - " -rpcconnect= \t " + _("Send commands to node running on (default: 127.0.0.1)\n") + - " -keypool= \t " + _("Set key pool size to (default: 100)\n") + - " -rescan \t " + _("Rescan the block chain for missing wallet transactions\n"); + " -rpcuser= \t " + _("Username for JSON-RPC connections") + "\n" + + " -rpcpassword=\t " + _("Password for JSON-RPC connections") + "\n" + + " -rpcport= \t\t " + _("Listen for JSON-RPC connections on (default: 8332)") + "\n" + + " -rpcallowip= \t\t " + _("Allow JSON-RPC connections from specified IP address") + "\n" + + " -rpcconnect= \t " + _("Send commands to node running on (default: 127.0.0.1)") + "\n" + + " -blocknotify= " + _("Execute command when the best block changes (%s in cmd is replaced by block hash)") + "\n" + + " -upgradewallet \t " + _("Upgrade wallet to latest format") + "\n" + + " -keypool= \t " + _("Set key pool size to (default: 100)") + "\n" + + " -rescan \t " + _("Rescan the block chain for missing wallet transactions") + "\n" + + " -checkblocks= \t\t " + _("How many blocks to check at startup (default: 2500, 0 = all)") + "\n" + + " -checklevel= \t\t " + _("How thorough the block verification is (0-6, default: 1)") + "\n"; #ifdef USE_SSL strUsage += string() + - _("\nSSL options: (see the Bitcoin Wiki for SSL setup instructions)\n") + - " -rpcssl \t " + _("Use OpenSSL (https) for JSON-RPC connections\n") + - " -rpcsslcertificatechainfile=\t " + _("Server certificate file (default: server.cert)\n") + - " -rpcsslprivatekeyfile= \t " + _("Server private key (default: server.pem)\n") + - " -rpcsslciphers= \t " + _("Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)\n"); + _("\nSSL options: (see the Bitcoin Wiki for SSL setup instructions)") + "\n" + + " -rpcssl \t " + _("Use OpenSSL (https) for JSON-RPC connections") + "\n" + + " -rpcsslcertificatechainfile=\t " + _("Server certificate file (default: server.cert)") + "\n" + + " -rpcsslprivatekeyfile= \t " + _("Server private key (default: server.pem)") + "\n" + + " -rpcsslciphers= \t " + _("Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)") + "\n"; #endif strUsage += string() + - " -? \t\t " + _("This help message\n"); + " -? \t\t " + _("This help message") + "\n"; // Remove tabs strUsage.erase(std::remove(strUsage.begin(), strUsage.end(), '\t'), strUsage.end()); @@ -251,6 +252,11 @@ bool AppInit2(int argc, char* argv[]) } fTestNet = GetBoolArg("-testnet"); + if (fTestNet) + { + SoftSetBoolArg("-irc", true); + } + fDebug = GetBoolArg("-debug"); #if !defined(WIN32) && !defined(QT_GUI) @@ -274,7 +280,7 @@ bool AppInit2(int argc, char* argv[]) #ifndef QT_GUI for (int i = 1; i < argc; i++) - if (!IsSwitchChar(argv[i][0])) + if (!IsSwitchChar(argv[i][0]) && !(strlen(argv[i]) > 7 && strncasecmp(argv[i], "bitcoin:", 8) == 0)) fCommandLine = true; if (fCommandLine) @@ -331,28 +337,26 @@ bool AppInit2(int argc, char* argv[]) return false; } - string strErrors; - + std::ostringstream strErrors; // // Load data files // if (fDaemon) fprintf(stdout, "bitcoin server starting\n"); - strErrors = ""; int64 nStart; InitMessage(_("Loading addresses...")); printf("Loading addresses...\n"); nStart = GetTimeMillis(); if (!LoadAddresses()) - strErrors += _("Error loading addr.dat \n"); + strErrors << _("Error loading addr.dat") << "\n"; printf(" addresses %15"PRI64d"ms\n", GetTimeMillis() - nStart); InitMessage(_("Loading block index...")); printf("Loading block index...\n"); nStart = GetTimeMillis(); if (!LoadBlockIndex()) - strErrors += _("Error loading blkindex.dat \n"); + strErrors << _("Error loading blkindex.dat") << "\n"; printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart); InitMessage(_("Loading wallet...")); @@ -364,20 +368,50 @@ bool AppInit2(int argc, char* argv[]) if (nLoadWalletRet != DB_LOAD_OK) { if (nLoadWalletRet == DB_CORRUPT) - strErrors += _("Error loading wallet.dat: Wallet corrupted \n"); + strErrors << _("Error loading wallet.dat: Wallet corrupted") << "\n"; else if (nLoadWalletRet == DB_TOO_NEW) - strErrors += _("Error loading wallet.dat: Wallet requires newer version of Bitcoin \n"); + strErrors << _("Error loading wallet.dat: Wallet requires newer version of Bitcoin") << "\n"; else if (nLoadWalletRet == DB_NEED_REWRITE) { - strErrors += _("Wallet needed to be rewritten: restart Bitcoin to complete \n"); - printf("%s", strErrors.c_str()); - wxMessageBox(strErrors, "Bitcoin", wxOK | wxICON_ERROR); + strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n"; + printf("%s", strErrors.str().c_str()); + wxMessageBox(strErrors.str(), "Bitcoin", wxOK | wxICON_ERROR); return false; } else - strErrors += _("Error loading wallet.dat \n"); + strErrors << _("Error loading wallet.dat") << "\n"; + } + + if (GetBoolArg("-upgradewallet", fFirstRun)) + { + int nMaxVersion = GetArg("-upgradewallet", 0); + if (nMaxVersion == 0) // the -walletupgrade without argument case + { + printf("Performing wallet upgrade to %i\n", FEATURE_LATEST); + nMaxVersion = CLIENT_VERSION; + pwalletMain->SetMinVersion(FEATURE_LATEST); // permanently upgrade the wallet immediately + } + else + printf("Allowing wallet upgrade up to %i\n", nMaxVersion); + if (nMaxVersion < pwalletMain->GetVersion()) + strErrors << _("Cannot downgrade wallet") << "\n"; + pwalletMain->SetMaxVersion(nMaxVersion); } - printf("%s", strErrors.c_str()); + + if (fFirstRun) + { + // Create new keyUser and set as default key + RandAddSeedPerfmon(); + + std::vector newDefaultKey; + if (!pwalletMain->GetKeyFromPool(newDefaultKey, false)) + strErrors << _("Cannot initialize keypool") << "\n"; + pwalletMain->SetDefaultKey(newDefaultKey); + if (!pwalletMain->SetAddressBookName(CBitcoinAddress(pwalletMain->vchDefaultKey), "")) + strErrors << _("Cannot write default address") << "\n"; + } + + printf("%s", strErrors.str().c_str()); printf(" wallet %15"PRI64d"ms\n", GetTimeMillis() - nStart); RegisterWallet(pwalletMain); @@ -404,16 +438,16 @@ bool AppInit2(int argc, char* argv[]) InitMessage(_("Done loading")); printf("Done loading\n"); - //// debug print - printf("mapBlockIndex.size() = %d\n", mapBlockIndex.size()); - printf("nBestHeight = %d\n", nBestHeight); - printf("setKeyPool.size() = %d\n", pwalletMain->setKeyPool.size()); - printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size()); - printf("mapAddressBook.size() = %d\n", pwalletMain->mapAddressBook.size()); + //// debug print + printf("mapBlockIndex.size() = %d\n", mapBlockIndex.size()); + printf("nBestHeight = %d\n", nBestHeight); + printf("setKeyPool.size() = %d\n", pwalletMain->setKeyPool.size()); + printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size()); + printf("mapAddressBook.size() = %d\n", pwalletMain->mapAddressBook.size()); - if (!strErrors.empty()) + if (!strErrors.str().empty()) { - wxMessageBox(strErrors, "Bitcoin", wxOK | wxICON_ERROR); + wxMessageBox(strErrors.str(), "Bitcoin", wxOK | wxICON_ERROR); return false; } @@ -463,12 +497,10 @@ bool AppInit2(int argc, char* argv[]) return false; } - fGenerateBitcoins = GetBoolArg("-gen"); - if (mapArgs.count("-proxy")) { fUseProxy = true; - addrProxy = CAddress(mapArgs["-proxy"]); + addrProxy = CService(mapArgs["-proxy"], 9050); if (!addrProxy.IsValid()) { wxMessageBox(_("Invalid -proxy address"), "Bitcoin"); @@ -476,33 +508,33 @@ bool AppInit2(int argc, char* argv[]) } } - bool fTor = (fUseProxy && addrProxy.port == htons(9050)); + bool fTor = (fUseProxy && addrProxy.GetPort() == 9050); if (fTor) { - // Use SoftSetArg here so user can override any of these if they wish. + // Use SoftSetBoolArg here so user can override any of these if they wish. // Note: the GetBoolArg() calls for all of these must happen later. - SoftSetArg("-nolisten", true); - SoftSetArg("-noirc", true); - SoftSetArg("-nodnsseed", true); - SoftSetArg("-noupnp", true); - SoftSetArg("-upnp", false); - SoftSetArg("-dns", false); + SoftSetBoolArg("-listen", false); + SoftSetBoolArg("-irc", false); + SoftSetBoolArg("-dnsseed", false); + SoftSetBoolArg("-upnp", false); + SoftSetBoolArg("-dns", false); } fAllowDNS = GetBoolArg("-dns"); - fNoListen = GetBoolArg("-nolisten"); + fNoListen = !GetBoolArg("-listen", true); - // Command-line args override in-wallet settings: - if (mapArgs.count("-upnp")) - fUseUPnP = GetBoolArg("-upnp"); - else if (mapArgs.count("-noupnp")) - fUseUPnP = !GetBoolArg("-noupnp"); + // Continue to put "/P2SH/" in the coinbase to monitor + // BIP16 support. + // This can be removed eventually... + const char* pszP2SH = "/P2SH/"; + COINBASE_FLAGS << std::vector(pszP2SH, pszP2SH+strlen(pszP2SH)); if (!fNoListen) { - if (!BindListenPort(strErrors)) + std::string strError; + if (!BindListenPort(strError)) { - wxMessageBox(strErrors, "Bitcoin"); + wxMessageBox(strError, "Bitcoin"); return false; } } @@ -511,10 +543,10 @@ bool AppInit2(int argc, char* argv[]) { BOOST_FOREACH(string strAddr, mapMultiArgs["-addnode"]) { - CAddress addr(strAddr, fAllowDNS); + CAddress addr(CService(strAddr, GetDefaultPort(), fAllowDNS)); addr.nTime = 0; // so it won't relay unless successfully connected if (addr.IsValid()) - AddAddress(addr); + addrman.Add(addr, CNetAddr("127.0.0.1")); } } @@ -543,6 +575,11 @@ bool AppInit2(int argc, char* argv[]) if (fServer) CreateThread(ThreadRPCServer, NULL); +#ifdef QT_GUI + if(GetStartOnSystemStartup()) + SetStartOnSystemStartup(true); // Remove startup links to bitcoin-wx +#endif + #if !defined(QT_GUI) while (1) Sleep(5000); @@ -550,3 +587,152 @@ bool AppInit2(int argc, char* argv[]) return true; } + +#ifdef WIN32 +string StartupShortcutPath() +{ + return MyGetSpecialFolderPath(CSIDL_STARTUP, true) + "\\Bitcoin.lnk"; +} + +bool GetStartOnSystemStartup() +{ + return filesystem::exists(StartupShortcutPath().c_str()); +} + +bool SetStartOnSystemStartup(bool fAutoStart) +{ + // If the shortcut exists already, remove it for updating + remove(StartupShortcutPath().c_str()); + + if (fAutoStart) + { + CoInitialize(NULL); + + // Get a pointer to the IShellLink interface. + IShellLink* psl = NULL; + HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, + CLSCTX_INPROC_SERVER, IID_IShellLink, + reinterpret_cast(&psl)); + + if (SUCCEEDED(hres)) + { + // Get the current executable path + TCHAR pszExePath[MAX_PATH]; + GetModuleFileName(NULL, pszExePath, sizeof(pszExePath)); + + TCHAR pszArgs[5] = TEXT("-min"); + + // Set the path to the shortcut target + psl->SetPath(pszExePath); + PathRemoveFileSpec(pszExePath); + psl->SetWorkingDirectory(pszExePath); + psl->SetShowCmd(SW_SHOWMINNOACTIVE); + psl->SetArguments(pszArgs); + + // Query IShellLink for the IPersistFile interface for + // saving the shortcut in persistent storage. + IPersistFile* ppf = NULL; + hres = psl->QueryInterface(IID_IPersistFile, + reinterpret_cast(&ppf)); + if (SUCCEEDED(hres)) + { + WCHAR pwsz[MAX_PATH]; + // Ensure that the string is ANSI. + MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().c_str(), -1, pwsz, MAX_PATH); + // Save the link by calling IPersistFile::Save. + hres = ppf->Save(pwsz, TRUE); + ppf->Release(); + psl->Release(); + CoUninitialize(); + return true; + } + psl->Release(); + } + CoUninitialize(); + return false; + } + return true; +} + +#elif defined(LINUX) + +// Follow the Desktop Application Autostart Spec: +// http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html + +boost::filesystem::path GetAutostartDir() +{ + namespace fs = boost::filesystem; + + char* pszConfigHome = getenv("XDG_CONFIG_HOME"); + if (pszConfigHome) return fs::path(pszConfigHome) / fs::path("autostart"); + char* pszHome = getenv("HOME"); + if (pszHome) return fs::path(pszHome) / fs::path(".config/autostart"); + return fs::path(); +} + +boost::filesystem::path GetAutostartFilePath() +{ + return GetAutostartDir() / boost::filesystem::path("bitcoin.desktop"); +} + +bool GetStartOnSystemStartup() +{ + boost::filesystem::ifstream optionFile(GetAutostartFilePath()); + if (!optionFile.good()) + return false; + // Scan through file for "Hidden=true": + string line; + while (!optionFile.eof()) + { + getline(optionFile, line); + if (line.find("Hidden") != string::npos && + line.find("true") != string::npos) + return false; + } + optionFile.close(); + + return true; +} + +bool SetStartOnSystemStartup(bool fAutoStart) +{ + if (!fAutoStart) + { +#if defined(BOOST_FILESYSTEM_VERSION) && BOOST_FILESYSTEM_VERSION >= 3 + unlink(GetAutostartFilePath().string().c_str()); +#else + unlink(GetAutostartFilePath().native_file_string().c_str()); +#endif + } + else + { + char pszExePath[MAX_PATH+1]; + memset(pszExePath, 0, sizeof(pszExePath)); + if (readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1) == -1) + return false; + + boost::filesystem::create_directories(GetAutostartDir()); + + boost::filesystem::ofstream optionFile(GetAutostartFilePath(), ios_base::out|ios_base::trunc); + if (!optionFile.good()) + return false; + // Write a bitcoin.desktop file to the autostart directory: + optionFile << "[Desktop Entry]\n"; + optionFile << "Type=Application\n"; + optionFile << "Name=Bitcoin\n"; + optionFile << "Exec=" << pszExePath << " -min\n"; + optionFile << "Terminal=false\n"; + optionFile << "Hidden=false\n"; + optionFile.close(); + } + return true; +} +#else + +// TODO: OSX startup stuff; see: +// http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html + +bool GetStartOnSystemStartup() { return false; } +bool SetStartOnSystemStartup(bool fAutoStart) { return false; } + +#endif diff --git a/src/init.h b/src/init.h index 4017f25..0d60e75 100644 --- a/src/init.h +++ b/src/init.h @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_INIT_H @@ -11,4 +11,7 @@ void Shutdown(void* parg); bool AppInit(int argc, char* argv[]); bool AppInit2(int argc, char* argv[]); +bool GetStartOnSystemStartup(); +bool SetStartOnSystemStartup(bool fAutoStart); + #endif diff --git a/src/irc.cpp b/src/irc.cpp index 5dfab06..09bacc1 100644 --- a/src/irc.cpp +++ b/src/irc.cpp @@ -22,22 +22,25 @@ void ThreadIRCSeed2(void* parg); #pragma pack(push, 1) struct ircaddr { - int ip; + struct in_addr ip; short port; }; #pragma pack(pop) -string EncodeAddress(const CAddress& addr) +string EncodeAddress(const CService& addr) { struct ircaddr tmp; - tmp.ip = addr.ip; - tmp.port = addr.port; + if (addr.GetInAddr(&tmp.ip)) + { + tmp.port = htons(addr.GetPort()); - vector vch(UBEGIN(tmp), UEND(tmp)); - return string("u") + EncodeBase58Check(vch); + vector vch(UBEGIN(tmp), UEND(tmp)); + return string("u") + EncodeBase58Check(vch); + } + return ""; } -bool DecodeAddress(string str, CAddress& addr) +bool DecodeAddress(string str, CService& addr) { vector vch; if (!DecodeBase58Check(str.substr(1), vch)) @@ -48,7 +51,7 @@ bool DecodeAddress(string str, CAddress& addr) return false; memcpy(&tmp, &vch[0], sizeof(tmp)); - addr = CAddress(tmp.ip, ntohs(tmp.port), NODE_NETWORK); + addr = CService(tmp.ip, ntohs(tmp.port)); return true; } @@ -73,57 +76,6 @@ static bool Send(SOCKET hSocket, const char* pszSend) return true; } -bool RecvLine(SOCKET hSocket, string& strLine) -{ - strLine = ""; - loop - { - char c; - int nBytes = recv(hSocket, &c, 1, 0); - if (nBytes > 0) - { - if (c == '\n') - continue; - if (c == '\r') - return true; - strLine += c; - if (strLine.size() >= 9000) - return true; - } - else if (nBytes <= 0) - { - if (fShutdown) - return false; - if (nBytes < 0) - { - int nErr = WSAGetLastError(); - if (nErr == WSAEMSGSIZE) - continue; - if (nErr == WSAEWOULDBLOCK || nErr == WSAEINTR || nErr == WSAEINPROGRESS) - { - Sleep(10); - continue; - } - } - if (!strLine.empty()) - return true; - if (nBytes == 0) - { - // socket closed - printf("socket closed\n"); - return false; - } - else - { - // socket error - int nErr = WSAGetLastError(); - printf("recv failed: %d\n", nErr); - return false; - } - } - } -} - bool RecvLineIRC(SOCKET hSocket, string& strLine) { loop @@ -204,7 +156,7 @@ bool RecvCodeLine(SOCKET hSocket, const char* psz1, string& strRet) } } -bool GetIPFromIRC(SOCKET hSocket, string strMyName, unsigned int& ipRet) +bool GetIPFromIRC(SOCKET hSocket, string strMyName, CNetAddr& ipRet) { Send(hSocket, strprintf("USERHOST %s\r", strMyName.c_str()).c_str()); @@ -227,10 +179,10 @@ bool GetIPFromIRC(SOCKET hSocket, string strMyName, unsigned int& ipRet) printf("GetIPFromIRC() got userhost %s\n", strHost.c_str()); if (fUseProxy) return false; - CAddress addr(strHost, 0, true); + CNetAddr addr(strHost, true); if (!addr.IsValid()) return false; - ipRet = addr.ip; + ipRet = addr; return true; } @@ -258,8 +210,9 @@ void ThreadIRCSeed2(void* parg) if (mapArgs.count("-connect") || fNoListen) return; - if (GetBoolArg("-noirc")) + if (!GetBoolArg("-irc", false)) return; + printf("ThreadIRCSeed started\n"); int nErrorWait = 10; int nRetryWait = 10; @@ -267,9 +220,9 @@ void ThreadIRCSeed2(void* parg) while (!fShutdown) { - CAddress addrConnect("92.243.23.21", 6667); // irc.lfnet.org + CService addrConnect("92.243.23.21", 6667); // irc.lfnet.org - CAddress addrIRC("irc.lfnet.org", 6667, true); + CService addrIRC("irc.lfnet.org", 6667, true); if (addrIRC.IsValid()) addrConnect = addrIRC; @@ -325,15 +278,15 @@ void ThreadIRCSeed2(void* parg) Sleep(500); // Get our external IP from the IRC server and re-nick before joining the channel - CAddress addrFromIRC; - if (GetIPFromIRC(hSocket, strMyName, addrFromIRC.ip)) + CNetAddr addrFromIRC; + if (GetIPFromIRC(hSocket, strMyName, addrFromIRC)) { - printf("GetIPFromIRC() returned %s\n", addrFromIRC.ToStringIP().c_str()); + printf("GetIPFromIRC() returned %s\n", addrFromIRC.ToString().c_str()); if (!fUseProxy && addrFromIRC.IsRoutable()) { // IRC lets you to re-nick fGotExternalIP = true; - addrLocalHost.ip = addrFromIRC.ip; + addrLocalHost.SetIP(addrFromIRC); strMyName = EncodeAddress(addrLocalHost); Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str()); } @@ -388,7 +341,7 @@ void ThreadIRCSeed2(void* parg) if (DecodeAddress(pszName, addr)) { addr.nTime = GetAdjustedTime(); - if (AddAddress(addr, 51 * 60)) + if (addrman.Add(addr, addrConnect, 51 * 60)) printf("IRC got new address: %s\n", addr.ToString().c_str()); nGotIRCAddresses++; } diff --git a/src/irc.h b/src/irc.h index 6945b2c..08d62b8 100644 --- a/src/irc.h +++ b/src/irc.h @@ -1,11 +1,10 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_IRC_H #define BITCOIN_IRC_H -bool RecvLine(SOCKET hSocket, std::string& strLine); void ThreadIRCSeed(void* parg); extern int nGotIRCAddresses; diff --git a/src/key.cpp b/src/key.cpp new file mode 100644 index 0000000..e084441 --- /dev/null +++ b/src/key.cpp @@ -0,0 +1,117 @@ +// Copyright (c) 2009-2012 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. + +#include +#include + +// Generate a private key from just the secret parameter +int EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key) +{ + int ok = 0; + BN_CTX *ctx = NULL; + EC_POINT *pub_key = NULL; + + if (!eckey) return 0; + + const EC_GROUP *group = EC_KEY_get0_group(eckey); + + if ((ctx = BN_CTX_new()) == NULL) + goto err; + + pub_key = EC_POINT_new(group); + + if (pub_key == NULL) + goto err; + + if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx)) + goto err; + + EC_KEY_set_private_key(eckey,priv_key); + EC_KEY_set_public_key(eckey,pub_key); + + ok = 1; + +err: + + if (pub_key) + EC_POINT_free(pub_key); + if (ctx != NULL) + BN_CTX_free(ctx); + + return(ok); +} + +// Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields +// recid selects which key is recovered +// if check is nonzero, additional checks are performed +int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check) +{ + if (!eckey) return 0; + + int ret = 0; + BN_CTX *ctx = NULL; + + BIGNUM *x = NULL; + BIGNUM *e = NULL; + BIGNUM *order = NULL; + BIGNUM *sor = NULL; + BIGNUM *eor = NULL; + BIGNUM *field = NULL; + EC_POINT *R = NULL; + EC_POINT *O = NULL; + EC_POINT *Q = NULL; + BIGNUM *rr = NULL; + BIGNUM *zero = NULL; + int n = 0; + int i = recid / 2; + + const EC_GROUP *group = EC_KEY_get0_group(eckey); + if ((ctx = BN_CTX_new()) == NULL) { ret = -1; goto err; } + BN_CTX_start(ctx); + order = BN_CTX_get(ctx); + if (!EC_GROUP_get_order(group, order, ctx)) { ret = -2; goto err; } + x = BN_CTX_get(ctx); + if (!BN_copy(x, order)) { ret=-1; goto err; } + if (!BN_mul_word(x, i)) { ret=-1; goto err; } + if (!BN_add(x, x, ecsig->r)) { ret=-1; goto err; } + field = BN_CTX_get(ctx); + if (!EC_GROUP_get_curve_GFp(group, field, NULL, NULL, ctx)) { ret=-2; goto err; } + if (BN_cmp(x, field) >= 0) { ret=0; goto err; } + if ((R = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } + if (!EC_POINT_set_compressed_coordinates_GFp(group, R, x, recid % 2, ctx)) { ret=0; goto err; } + if (check) + { + if ((O = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } + if (!EC_POINT_mul(group, O, NULL, R, order, ctx)) { ret=-2; goto err; } + if (!EC_POINT_is_at_infinity(group, O)) { ret = 0; goto err; } + } + if ((Q = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } + n = EC_GROUP_get_degree(group); + e = BN_CTX_get(ctx); + if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; } + if (8*msglen > n) BN_rshift(e, e, 8-(n & 7)); + zero = BN_CTX_get(ctx); + if (!BN_zero(zero)) { ret=-1; goto err; } + if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; } + rr = BN_CTX_get(ctx); + if (!BN_mod_inverse(rr, ecsig->r, order, ctx)) { ret=-1; goto err; } + sor = BN_CTX_get(ctx); + if (!BN_mod_mul(sor, ecsig->s, rr, order, ctx)) { ret=-1; goto err; } + eor = BN_CTX_get(ctx); + if (!BN_mod_mul(eor, e, rr, order, ctx)) { ret=-1; goto err; } + if (!EC_POINT_mul(group, Q, eor, R, sor, ctx)) { ret=-2; goto err; } + if (!EC_KEY_set_public_key(eckey, Q)) { ret=-2; goto err; } + + ret = 1; + +err: + if (ctx) { + BN_CTX_end(ctx); + BN_CTX_free(ctx); + } + if (R != NULL) EC_POINT_free(R); + if (O != NULL) EC_POINT_free(O); + if (Q != NULL) EC_POINT_free(Q); + return ret; +} diff --git a/src/key.h b/src/key.h index 8c06a45..b8fc0cd 100644 --- a/src/key.h +++ b/src/key.h @@ -14,7 +14,6 @@ #include "serialize.h" #include "uint256.h" -#include "base58.h" // secp160k1 // const unsigned int PRIVATE_KEY_SIZE = 192; @@ -39,116 +38,8 @@ // see www.keylength.com // script supports up to 75 for single byte push -// Generate a private key from just the secret parameter -int static inline EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key) -{ - int ok = 0; - BN_CTX *ctx = NULL; - EC_POINT *pub_key = NULL; - - if (!eckey) return 0; - - const EC_GROUP *group = EC_KEY_get0_group(eckey); - - if ((ctx = BN_CTX_new()) == NULL) - goto err; - - pub_key = EC_POINT_new(group); - - if (pub_key == NULL) - goto err; - - if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx)) - goto err; - - EC_KEY_set_private_key(eckey,priv_key); - EC_KEY_set_public_key(eckey,pub_key); - - ok = 1; - -err: - - if (pub_key) - EC_POINT_free(pub_key); - if (ctx != NULL) - BN_CTX_free(ctx); - - return(ok); -} - -// Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields -// recid selects which key is recovered -// if check is nonzero, additional checks are performed -int static inline ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check) -{ - if (!eckey) return 0; - - int ret = 0; - BN_CTX *ctx = NULL; - - BIGNUM *x = NULL; - BIGNUM *e = NULL; - BIGNUM *order = NULL; - BIGNUM *sor = NULL; - BIGNUM *eor = NULL; - BIGNUM *field = NULL; - EC_POINT *R = NULL; - EC_POINT *O = NULL; - EC_POINT *Q = NULL; - BIGNUM *rr = NULL; - BIGNUM *zero = NULL; - int n = 0; - int i = recid / 2; - - const EC_GROUP *group = EC_KEY_get0_group(eckey); - if ((ctx = BN_CTX_new()) == NULL) { ret = -1; goto err; } - BN_CTX_start(ctx); - order = BN_CTX_get(ctx); - if (!EC_GROUP_get_order(group, order, ctx)) { ret = -2; goto err; } - x = BN_CTX_get(ctx); - if (!BN_copy(x, order)) { ret=-1; goto err; } - if (!BN_mul_word(x, i)) { ret=-1; goto err; } - if (!BN_add(x, x, ecsig->r)) { ret=-1; goto err; } - field = BN_CTX_get(ctx); - if (!EC_GROUP_get_curve_GFp(group, field, NULL, NULL, ctx)) { ret=-2; goto err; } - if (BN_cmp(x, field) >= 0) { ret=0; goto err; } - if ((R = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } - if (!EC_POINT_set_compressed_coordinates_GFp(group, R, x, recid % 2, ctx)) { ret=0; goto err; } - if (check) - { - if ((O = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } - if (!EC_POINT_mul(group, O, NULL, R, order, ctx)) { ret=-2; goto err; } - if (!EC_POINT_is_at_infinity(group, O)) { ret = 0; goto err; } - } - if ((Q = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } - n = EC_GROUP_get_degree(group); - e = BN_CTX_get(ctx); - if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; } - if (8*msglen > n) BN_rshift(e, e, 8-(n & 7)); - zero = BN_CTX_get(ctx); - if (!BN_zero(zero)) { ret=-1; goto err; } - if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; } - rr = BN_CTX_get(ctx); - if (!BN_mod_inverse(rr, ecsig->r, order, ctx)) { ret=-1; goto err; } - sor = BN_CTX_get(ctx); - if (!BN_mod_mul(sor, ecsig->s, rr, order, ctx)) { ret=-1; goto err; } - eor = BN_CTX_get(ctx); - if (!BN_mod_mul(eor, e, rr, order, ctx)) { ret=-1; goto err; } - if (!EC_POINT_mul(group, Q, eor, R, sor, ctx)) { ret=-2; goto err; } - if (!EC_KEY_set_public_key(eckey, Q)) { ret=-2; goto err; } - - ret = 1; - -err: - if (ctx) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - if (R != NULL) EC_POINT_free(R); - if (O != NULL) EC_POINT_free(O); - if (Q != NULL) EC_POINT_free(Q); - return ret; -} +int extern EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key); +int extern ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check); class key_error : public std::runtime_error { @@ -163,26 +54,36 @@ typedef std::vector > CPrivKey; // CSecret is a serialization of just the secret parameter (32 bytes) typedef std::vector > CSecret; +/** An encapsulated OpenSSL Elliptic Curve key (public and/or private) */ class CKey { protected: EC_KEY* pkey; bool fSet; + bool fCompressedPubKey; void SetCompressedPubKey() { EC_KEY_set_conv_form(pkey, POINT_CONVERSION_COMPRESSED); + fCompressedPubKey = true; } public: - CKey() + + void Reset() { + fCompressedPubKey = false; pkey = EC_KEY_new_by_curve_name(NID_secp256k1); if (pkey == NULL) throw key_error("CKey::CKey() : EC_KEY_new_by_curve_name failed"); fSet = false; } + CKey() + { + Reset(); + } + CKey(const CKey& b) { pkey = EC_KEY_dup(b.pkey); @@ -209,10 +110,17 @@ public: return !fSet; } - void MakeNewKey() + bool IsCompressed() const + { + return fCompressedPubKey; + } + + void MakeNewKey(bool fCompressed) { if (!EC_KEY_generate_key(pkey)) throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed"); + if (fCompressed) + SetCompressedPubKey(); fSet = true; } @@ -225,7 +133,7 @@ public: return true; } - bool SetSecret(const CSecret& vchSecret) + bool SetSecret(const CSecret& vchSecret, bool fCompressed = false) { EC_KEY_free(pkey); pkey = EC_KEY_new_by_curve_name(NID_secp256k1); @@ -243,10 +151,12 @@ public: } BN_clear_free(bn); fSet = true; + if (fCompressed || fCompressedPubKey) + SetCompressedPubKey(); return true; } - CSecret GetSecret() const + CSecret GetSecret(bool &fCompressed) const { CSecret vchRet; vchRet.resize(32); @@ -257,6 +167,7 @@ public: int n=BN_bn2bin(bn,&vchRet[32 - nBytes]); if (n != nBytes) throw key_error("CKey::GetSecret(): BN_bn2bin failed"); + fCompressed = fCompressedPubKey; return vchRet; } @@ -278,6 +189,8 @@ public: if (!o2i_ECPublicKey(&pkey, &pbegin, vchPubKey.size())) return false; fSet = true; + if (vchPubKey.size() == 33) + SetCompressedPubKey(); return true; } @@ -327,6 +240,8 @@ public: { CKey keyRec; keyRec.fSet = true; + if (fCompressedPubKey) + keyRec.SetCompressedPubKey(); if (ECDSA_SIG_recover_key_GFp(keyRec.pkey, sig, (unsigned char*)&hash, sizeof(hash), i, 1) == 1) if (keyRec.GetPubKey() == this->GetPubKey()) { @@ -338,7 +253,7 @@ public: if (nRecId == -1) throw key_error("CKey::SignCompact() : unable to construct recoverable key"); - vchSig[0] = nRecId+27; + vchSig[0] = nRecId+27+(fCompressedPubKey ? 4 : 0); BN_bn2bin(sig->r,&vchSig[33-(nBitsR+7)/8]); BN_bn2bin(sig->s,&vchSig[65-(nBitsS+7)/8]); fOk = true; @@ -397,20 +312,15 @@ public: return true; } - // Get the address corresponding to this key - CBitcoinAddress GetAddress() const - { - return CBitcoinAddress(GetPubKey()); - } - bool IsValid() { if (!fSet) return false; - CSecret secret = GetSecret(); + bool fCompr; + CSecret secret = GetSecret(fCompr); CKey key2; - key2.SetSecret(secret); + key2.SetSecret(secret, fCompr); return GetPubKey() == key2.GetPubKey(); } }; diff --git a/src/keystore.cpp b/src/keystore.cpp index 68f57e7..e76f779 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -1,21 +1,12 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #include "headers.h" -#include "db.h" #include "crypter.h" - -std::vector CKeyStore::GenerateNewKey() -{ - RandAddSeedPerfmon(); - CKey key; - key.MakeNewKey(); - if (!AddKey(key)) - throw std::runtime_error("CKeyStore::GenerateNewKey() : AddKey failed"); - return key.GetPubKey(); -} +#include "db.h" +#include "script.h" bool CKeyStore::GetPubKey(const CBitcoinAddress &address, std::vector &vchPubKeyOut) const { @@ -28,11 +19,43 @@ bool CKeyStore::GetPubKey(const CBitcoinAddress &address, std::vector 0); + return result; +} + + +bool CBasicKeyStore::GetCScript(const uint160 &hash, CScript& redeemScriptOut) const +{ + CRITICAL_BLOCK(cs_KeyStore) + { + ScriptMap::const_iterator mi = mapScripts.find(hash); + if (mi != mapScripts.end()) + { + redeemScriptOut = (*mi).second; + return true; + } + } + return false; +} + bool CCryptoKeyStore::SetCrypted() { CRITICAL_BLOCK(cs_KeyStore) @@ -46,16 +69,6 @@ bool CCryptoKeyStore::SetCrypted() return true; } -std::vector CCryptoKeyStore::GenerateNewKey() -{ - RandAddSeedPerfmon(); - CKey key; - key.MakeNewKey(); - if (!AddKey(key)) - throw std::runtime_error("CCryptoKeyStore::GenerateNewKey() : AddKey failed"); - return key.GetPubKey(); -} - bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn) { CRITICAL_BLOCK(cs_KeyStore) @@ -72,6 +85,7 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn) if(!DecryptSecret(vMasterKeyIn, vchCryptedSecret, Hash(vchPubKey.begin(), vchPubKey.end()), vchSecret)) return false; CKey key; + key.SetPubKey(vchPubKey); key.SetSecret(vchSecret); if (key.GetPubKey() == vchPubKey) break; @@ -94,7 +108,8 @@ bool CCryptoKeyStore::AddKey(const CKey& key) std::vector vchCryptedSecret; std::vector vchPubKey = key.GetPubKey(); - if (!EncryptSecret(vMasterKey, key.GetSecret(), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret)) + bool fCompressed; + if (!EncryptSecret(vMasterKey, key.GetSecret(fCompressed), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret)) return false; if (!AddCryptedKey(key.GetPubKey(), vchCryptedSecret)) @@ -131,6 +146,7 @@ bool CCryptoKeyStore::GetKey(const CBitcoinAddress &address, CKey& keyOut) const CSecret vchSecret; if (!DecryptSecret(vMasterKey, vchCryptedSecret, Hash(vchPubKey.begin(), vchPubKey.end()), vchSecret)) return false; + keyOut.SetPubKey(vchPubKey); keyOut.SetSecret(vchSecret); return true; } @@ -163,14 +179,15 @@ bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn) return false; fUseCrypto = true; - CKey key; BOOST_FOREACH(KeyMap::value_type& mKey, mapKeys) { - if (!key.SetSecret(mKey.second)) + CKey key; + if (!key.SetSecret(mKey.second.first, mKey.second.second)) return false; const std::vector vchPubKey = key.GetPubKey(); std::vector vchCryptedSecret; - if (!EncryptSecret(vMasterKeyIn, key.GetSecret(), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret)) + bool fCompressed; + if (!EncryptSecret(vMasterKeyIn, key.GetSecret(fCompressed), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret)) return false; if (!AddCryptedKey(vchPubKey, vchCryptedSecret)) return false; diff --git a/src/keystore.h b/src/keystore.h index 4d88914..c32db26 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -1,13 +1,14 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_KEYSTORE_H #define BITCOIN_KEYSTORE_H #include "crypter.h" +#include "script.h" -// A virtual base class for key stores +/** A virtual base class for key stores */ class CKeyStore { protected: @@ -19,26 +20,34 @@ public: // Check whether a key corresponding to a given address is present in the store. virtual bool HaveKey(const CBitcoinAddress &address) const =0; - - // Retrieve a key corresponding to a given address from the store. - // Return true if succesful. virtual bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const =0; - - // Retrieve only the public key corresponding to a given address. - // This may succeed even if GetKey fails (e.g., encrypted wallets) + virtual void GetKeys(std::set &setAddress) const =0; virtual bool GetPubKey(const CBitcoinAddress &address, std::vector& vchPubKeyOut) const; - // Generate a new key, and add it to the store - virtual std::vector GenerateNewKey(); + // Support for BIP 0013 : see https://en.bitcoin.it/wiki/BIP_0013 + virtual bool AddCScript(const CScript& redeemScript) =0; + virtual bool HaveCScript(const uint160 &hash) const =0; + virtual bool GetCScript(const uint160 &hash, CScript& redeemScriptOut) const =0; + + virtual bool GetSecret(const CBitcoinAddress &address, CSecret& vchSecret, bool &fCompressed) const + { + CKey key; + if (!GetKey(address, key)) + return false; + vchSecret = key.GetSecret(fCompressed); + return true; + } }; -typedef std::map KeyMap; +typedef std::map > KeyMap; +typedef std::map ScriptMap; -// Basic key store, that keeps keys in an address->secret map +/** Basic key store, that keeps keys in an address->secret map */ class CBasicKeyStore : public CKeyStore { protected: KeyMap mapKeys; + ScriptMap mapScripts; public: bool AddKey(const CKey& key); @@ -49,25 +58,43 @@ public: result = (mapKeys.count(address) > 0); return result; } - bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const + void GetKeys(std::set &setAddress) const + { + setAddress.clear(); + CRITICAL_BLOCK(cs_KeyStore) + { + KeyMap::const_iterator mi = mapKeys.begin(); + while (mi != mapKeys.end()) + { + setAddress.insert((*mi).first); + mi++; + } + } + } + bool GetKey(const CBitcoinAddress &address, CKey &keyOut) const { CRITICAL_BLOCK(cs_KeyStore) { KeyMap::const_iterator mi = mapKeys.find(address); if (mi != mapKeys.end()) { - keyOut.SetSecret((*mi).second); + keyOut.Reset(); + keyOut.SetSecret((*mi).second.first, (*mi).second.second); return true; } } return false; } + virtual bool AddCScript(const CScript& redeemScript); + virtual bool HaveCScript(const uint160 &hash) const; + virtual bool GetCScript(const uint160 &hash, CScript& redeemScriptOut) const; }; typedef std::map, std::vector > > CryptedKeyMap; -// Keystore which keeps the private keys encrypted -// It derives from the basic key store, which is used if no encryption is active. +/** Keystore which keeps the private keys encrypted. + * It derives from the basic key store, which is used if no encryption is active. + */ class CCryptoKeyStore : public CBasicKeyStore { private: @@ -119,7 +146,6 @@ public: } virtual bool AddCryptedKey(const std::vector &vchPubKey, const std::vector &vchCryptedSecret); - std::vector GenerateNewKey(); bool AddKey(const CKey& key); bool HaveKey(const CBitcoinAddress &address) const { @@ -133,6 +159,21 @@ public: } bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const; bool GetPubKey(const CBitcoinAddress &address, std::vector& vchPubKeyOut) const; + void GetKeys(std::set &setAddress) const + { + if (!IsCrypted()) + { + CBasicKeyStore::GetKeys(setAddress); + return; + } + setAddress.clear(); + CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin(); + while (mi != mapCryptedKeys.end()) + { + setAddress.insert((*mi).first); + mi++; + } + } }; #endif diff --git a/src/main.cpp b/src/main.cpp index 3c5fef2..d795ca1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,6 +7,7 @@ #include "db.h" #include "net.h" #include "init.h" +#include #include #include @@ -17,6 +18,11 @@ using namespace boost; // Global state // +// Name of client reported in the 'version' message. Report the same name +// for both bitcoind and bitcoin-qt, to make it harder for attackers to +// target servers or GUI users specifically. +const std::string CLIENT_NAME("Satoshi"); + CCriticalSection cs_setpwalletRegistered; set setpwalletRegistered; @@ -46,22 +52,17 @@ multimap mapOrphanBlocksByPrev; map mapOrphanTransactions; multimap mapOrphanTransactionsByPrev; +// Constant stuff for coinbase transactions we create: +CScript COINBASE_FLAGS; + +const string strMessageMagic = "Bitcoin Signed Message:\n"; double dHashesPerSec; int64 nHPSTimerStart; // Settings -int fGenerateBitcoins = false; int64 nTransactionFee = 0; -int fLimitProcessors = false; -int nLimitProcessors = 1; -int fMinimizeToTray = true; -int fMinimizeOnClose = true; -#if USE_UPNP -int fUseUPnP = true; -#else -int fUseUPnP = false; -#endif + ////////////////////////////////////////////////////////////////////////////// @@ -258,6 +259,96 @@ bool CTransaction::ReadFromDisk(COutPoint prevout) return ReadFromDisk(txdb, prevout, txindex); } +bool CTransaction::IsStandard() const +{ + BOOST_FOREACH(const CTxIn& txin, vin) + { + // Biggest 'standard' txin is a 3-signature 3-of-3 CHECKMULTISIG + // pay-to-script-hash, which is 3 ~80-byte signatures, 3 + // ~65-byte public keys, plus a few script ops. + if (txin.scriptSig.size() > 500) + return false; + if (!txin.scriptSig.IsPushOnly()) + return false; + } + BOOST_FOREACH(const CTxOut& txout, vout) + if (!::IsStandard(txout.scriptPubKey)) + return false; + return true; +} + +// +// Check transaction inputs, and make sure any +// pay-to-script-hash transactions are evaluating IsStandard scripts +// +// Why bother? To avoid denial-of-service attacks; an attacker +// can submit a standard HASH... OP_EQUAL transaction, +// which will get accepted into blocks. The redemption +// script can be anything; an attacker could use a very +// expensive-to-check-upon-redemption script like: +// DUP CHECKSIG DROP ... repeated 100 times... OP_1 +// +bool CTransaction::AreInputsStandard(const MapPrevTx& mapInputs) const +{ + if (IsCoinBase()) + return true; // Coinbases don't use vin normally + + for (int i = 0; i < vin.size(); i++) + { + const CTxOut& prev = GetOutputFor(vin[i], mapInputs); + + vector > vSolutions; + txnouttype whichType; + // get the scriptPubKey corresponding to this input: + const CScript& prevScript = prev.scriptPubKey; + if (!Solver(prevScript, whichType, vSolutions)) + return false; + int nArgsExpected = ScriptSigArgsExpected(whichType, vSolutions); + + // Transactions with extra stuff in their scriptSigs are + // non-standard. Note that this EvalScript() call will + // be quick, because if there are any operations + // beside "push data" in the scriptSig the + // IsStandard() call returns false + vector > stack; + if (!EvalScript(stack, vin[i].scriptSig, *this, i, 0)) + return false; + + if (whichType == TX_SCRIPTHASH) + { + if (stack.empty()) + return false; + CScript subscript(stack.back().begin(), stack.back().end()); + vector > vSolutions2; + txnouttype whichType2; + if (!Solver(subscript, whichType2, vSolutions2)) + return false; + if (whichType2 == TX_SCRIPTHASH) + return false; + nArgsExpected += ScriptSigArgsExpected(whichType2, vSolutions2); + } + + if (stack.size() != nArgsExpected) + return false; + } + + return true; +} + +int +CTransaction::GetLegacySigOpCount() const +{ + int nSigOps = 0; + BOOST_FOREACH(const CTxIn& txin, vin) + { + nSigOps += txin.scriptSig.GetSigOpCount(false); + } + BOOST_FOREACH(const CTxOut& txout, vout) + { + nSigOps += txout.scriptPubKey.GetSigOpCount(false); + } + return nSigOps; +} int CMerkleTx::SetMerkleBranch(const CBlock* pblock) @@ -378,7 +469,7 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi return DoS(100, error("AcceptToMemoryPool() : coinbase as individual tx")); // To help v0.1.5 clients who would see it as a negative number - if ((int64)nLockTime > INT_MAX) + if ((int64)nLockTime > std::numeric_limits::max()) return error("AcceptToMemoryPool() : not accepting nLockTime beyond 2038 yet"); // Rather not work on nonstandard transactions (unless -testnet) @@ -436,19 +527,19 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi return error("AcceptToMemoryPool() : FetchInputs failed %s", hash.ToString().substr(0,10).c_str()); } - // Safety limits - unsigned int nSize = ::GetSerializeSize(*this, SER_NETWORK); - // Checking ECDSA signatures is a CPU bottleneck, so to avoid denial-of-service - // attacks disallow transactions with more than one SigOp per 34 bytes. - // 34 bytes because a TxOut is: - // 20-byte address + 8 byte bitcoin amount + 5 bytes of ops + 1 byte script length - if (GetSigOpCount() > nSize / 34 || nSize < 100) - return error("AcceptToMemoryPool() : transaction with out-of-bounds SigOpCount"); + // Check for non-standard pay-to-script-hash in inputs + if (!AreInputsStandard(mapInputs) && !fTestNet) + return error("AcceptToMemoryPool() : nonstandard transaction input"); + + // Note: if you modify this code to accept non-standard transactions, then + // you should add code here to check that the transaction does a + // reasonable number of ECDSA signature verifications. int64 nFees = GetValueIn(mapInputs)-GetValueOut(); + unsigned int nSize = ::GetSerializeSize(*this, SER_NETWORK); // Don't accept it if it can't get into a block - if (nFees < GetMinFee(1000, true, true)) + if (nFees < GetMinFee(1000, true, GMF_RELAY)) return error("AcceptToMemoryPool() : not enough fees"); // Continuously rate-limit free transactions @@ -510,8 +601,11 @@ bool CTransaction::AcceptToMemoryPool(bool fCheckInputs, bool* pfMissingInputs) return AcceptToMemoryPool(txdb, fCheckInputs, pfMissingInputs); } +uint64 nPooledTx = 0; + bool CTransaction::AddToMemoryPoolUnchecked() { + printf("AcceptToMemoryPoolUnchecked(): size %lu\n", mapTransactions.size()); // Add to memory pool without checking anything. Don't call this directly, // call AcceptToMemoryPool to properly check the transaction first. CRITICAL_BLOCK(cs_mapTransactions) @@ -521,6 +615,7 @@ bool CTransaction::AddToMemoryPoolUnchecked() for (int i = 0; i < vin.size(); i++) mapNextTx[vin[i].prevout] = CInPoint(&mapTransactions[hash], i); nTransactionsUpdated++; + ++nPooledTx; } return true; } @@ -531,10 +626,15 @@ bool CTransaction::RemoveFromMemoryPool() // Remove transaction from memory pool CRITICAL_BLOCK(cs_mapTransactions) { - BOOST_FOREACH(const CTxIn& txin, vin) - mapNextTx.erase(txin.prevout); - mapTransactions.erase(GetHash()); - nTransactionsUpdated++; + uint256 hash = GetHash(); + if (mapTransactions.count(hash)) + { + BOOST_FOREACH(const CTxIn& txin, vin) + mapNextTx.erase(txin.prevout); + mapTransactions.erase(hash); + nTransactionsUpdated++; + --nPooledTx; + } } return true; } @@ -544,7 +644,7 @@ bool CTransaction::RemoveFromMemoryPool() -int CMerkleTx::GetDepthInMainChain(int& nHeightRet) const +int CMerkleTx::GetDepthInMainChain(CBlockIndex* &pindexRet) const { if (hashBlock == 0 || nIndex == -1) return 0; @@ -565,7 +665,7 @@ int CMerkleTx::GetDepthInMainChain(int& nHeightRet) const fMerkleVerified = true; } - nHeightRet = pindex->nHeight; + pindexRet = pindex; return pindexBest->nHeight - pindex->nHeight + 1; } @@ -1178,9 +1278,9 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex) return false; } - // P2SH didn't become active until Apr 1 2012 (Feb 15 on testnet) - int64 nEvalSwitchTime = fTestNet ? 1329264000 : 1333238400; - bool fStrictPayToScriptHash = (pindex->nTime >= nEvalSwitchTime); + // BIP16 didn't become active until Apr 1 2012 (Feb 15 on testnet) + int64 nBIP16SwitchTime = fTestNet ? 1329264000 : 1333238400; + bool fStrictPayToScriptHash = (pindex->nTime >= nBIP16SwitchTime); //// issue here: it doesn't know the version unsigned int nTxPos = pindex->nBlockPos + ::GetSerializeSize(CBlock(), SER_DISK) - 1 + GetSizeOfCompactSize(vtx.size()); @@ -1190,17 +1290,17 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex) int nSigOps = 0; BOOST_FOREACH(CTransaction& tx, vtx) { - nSigOps += tx.GetSigOpCount(); + nSigOps += tx.GetLegacySigOpCount(); if (nSigOps > MAX_BLOCK_SIGOPS) return DoS(100, error("ConnectBlock() : too many sigops")); CDiskTxPos posThisTx(pindex->nFile, pindex->nBlockPos, nTxPos); nTxPos += ::GetSerializeSize(tx, SER_DISK); - bool fInvalid; MapPrevTx mapInputs; if (!tx.IsCoinBase()) { + bool fInvalid; if (!tx.FetchInputs(txdb, mapQueuedChanges, true, false, mapInputs, fInvalid)) return false; @@ -1348,6 +1448,39 @@ bool static Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) } +static void +runCommand(std::string strCommand) +{ + int nErr = ::system(strCommand.c_str()); + if (nErr) + printf("runCommand error: system(%s) returned %d\n", strCommand.c_str(), nErr); +} + +// Called from inside SetBestChain: attaches a block to the new best chain being built +bool CBlock::SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew) +{ + uint256 hash = GetHash(); + + // Adding to current best branch + if (!ConnectBlock(txdb, pindexNew) || !txdb.WriteHashBestChain(hash)) + { + txdb.TxnAbort(); + InvalidChainFound(pindexNew); + return false; + } + if (!txdb.TxnCommit()) + return error("SetBestChain() : TxnCommit failed"); + + // Add to current best branch + pindexNew->pprev->pnext = pindexNew; + + // Delete redundant memory transactions + BOOST_FOREACH(CTransaction& tx, vtx) + tx.RemoveFromMemoryPool(); + + return true; +} + bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) { uint256 hash = GetHash(); @@ -1362,36 +1495,55 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) } else if (hashPrevBlock == hashBestChain) { - // Adding to current best branch - if (!ConnectBlock(txdb, pindexNew) || !txdb.WriteHashBestChain(hash)) + if (!SetBestChainInner(txdb, pindexNew)) + return error("SetBestChain() : SetBestChainInner failed"); + } + else + { + // the first block in the new chain that will cause it to become the new best chain + CBlockIndex *pindexIntermediate = pindexNew; + + // list of blocks that need to be connected afterwards + std::vector vpindexSecondary; + + // Reorganize is costly in terms of db load, as it works in a single db transaction. + // Try to limit how much needs to be done inside + while (pindexIntermediate->pprev && pindexIntermediate->pprev->bnChainWork > pindexBest->bnChainWork) { - txdb.TxnAbort(); - InvalidChainFound(pindexNew); - return error("SetBestChain() : ConnectBlock failed"); + vpindexSecondary.push_back(pindexIntermediate); + pindexIntermediate = pindexIntermediate->pprev; } - if (!txdb.TxnCommit()) - return error("SetBestChain() : TxnCommit failed"); - // Add to current best branch - pindexNew->pprev->pnext = pindexNew; + if (!vpindexSecondary.empty()) + printf("Postponing %i reconnects\n", vpindexSecondary.size()); - // Delete redundant memory transactions - BOOST_FOREACH(CTransaction& tx, vtx) - tx.RemoveFromMemoryPool(); - } - else - { - // New best branch - if (!Reorganize(txdb, pindexNew)) + // Switch to new best branch + if (!Reorganize(txdb, pindexIntermediate)) { txdb.TxnAbort(); InvalidChainFound(pindexNew); return error("SetBestChain() : Reorganize failed"); } + + // Connect futher blocks + BOOST_REVERSE_FOREACH(CBlockIndex *pindex, vpindexSecondary) + { + CBlock block; + if (!block.ReadFromDisk(pindex)) + { + printf("SetBestChain() : ReadFromDisk failed\n"); + break; + } + txdb.TxnBegin(); + // errors now are not fatal, we still did a reorganisation to a new chain in a valid way + if (!block.SetBestChainInner(txdb, pindex)) + break; + } } // Update best block in wallet (so we can detect restored wallets) - if (!IsInitialBlockDownload()) + bool fIsInitialDownload = IsInitialBlockDownload(); + if (!fIsInitialDownload) { const CBlockLocator locator(pindexNew); ::SetBestChain(locator); @@ -1406,6 +1558,14 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) nTransactionsUpdated++; printf("SetBestChain: new best=%s height=%d work=%s\n", hashBestChain.ToString().substr(0,20).c_str(), nBestHeight, bnBestChainWork.ToString().c_str()); + std::string strCmd = GetArg("-blocknotify", ""); + + if (!fIsInitialDownload && !strCmd.empty()) + { + boost::replace_all(strCmd, "%s", hashBestChain.GetHex()); + boost::thread t(runCommand, strCmd); // thread runs free + } + return true; } @@ -1488,8 +1648,12 @@ bool CBlock::CheckBlock() const if (!tx.CheckTransaction()) return DoS(tx.nDoS, error("CheckBlock() : CheckTransaction failed")); - // Check that it's not full of nonstandard transactions - if (GetSigOpCount() > MAX_BLOCK_SIGOPS) + int nSigOps = 0; + BOOST_FOREACH(const CTransaction& tx, vtx) + { + nSigOps += tx.GetLegacySigOpCount(); + } + if (nSigOps > MAX_BLOCK_SIGOPS) return DoS(100, error("CheckBlock() : out-of-bounds SigOpCount")); // Check merkleroot @@ -1991,7 +2155,7 @@ unsigned char pchMessageStart[4] = { 0xf9, 0xbe, 0xb4, 0xd9 }; bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) { - static map > mapReuseKey; + static map > mapReuseKey; RandAddSeedPerfmon(); if (fDebug) { printf("%s ", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str()); @@ -2021,18 +2185,24 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) CAddress addrFrom; uint64 nNonce = 1; vRecv >> pfrom->nVersion >> pfrom->nServices >> nTime >> addrMe; + if (pfrom->nVersion < 209) + { + // Since February 20, 2012, the protocol is initiated at version 209, + // and earlier versions are no longer supported + printf("partner %s using obsolete version %i; disconnecting\n", pfrom->addr.ToString().c_str(), pfrom->nVersion); + pfrom->fDisconnect = true; + return false; + } + if (pfrom->nVersion == 10300) pfrom->nVersion = 300; - if (pfrom->nVersion >= 106 && !vRecv.empty()) + if (!vRecv.empty()) vRecv >> addrFrom >> nNonce; - if (pfrom->nVersion >= 106 && !vRecv.empty()) + if (!vRecv.empty()) vRecv >> pfrom->strSubVer; - if (pfrom->nVersion >= 209 && !vRecv.empty()) + if (!vRecv.empty()) vRecv >> pfrom->nStartingHeight; - if (pfrom->nVersion == 0) - return false; - // Disconnect if we connected to ourself if (nNonce == nLocalHostNonce && nNonce > 1) { @@ -2047,19 +2217,17 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) pfrom->fClient = !(pfrom->nServices & NODE_NETWORK); - AddTimeData(pfrom->addr.ip, nTime); + AddTimeData(pfrom->addr, nTime); // Change version - if (pfrom->nVersion >= 209) - pfrom->PushMessage("verack"); - pfrom->vSend.SetVersion(min(pfrom->nVersion, VERSION)); - if (pfrom->nVersion < 209) - pfrom->vRecv.SetVersion(min(pfrom->nVersion, VERSION)); + pfrom->PushMessage("verack"); + pfrom->vSend.SetVersion(min(pfrom->nVersion, PROTOCOL_VERSION)); if (!pfrom->fInbound) { // Advertise our address - if (addrLocalHost.IsRoutable() && !fUseProxy) + if (!fNoListen && !fUseProxy && addrLocalHost.IsRoutable() && + !IsInitialBlockDownload()) { CAddress addr(addrLocalHost); addr.nTime = GetAdjustedTime(); @@ -2067,11 +2235,18 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) } // Get recent addresses - if (pfrom->nVersion >= 31402 || mapAddresses.size() < 1000) + if (pfrom->nVersion >= 31402 || addrman.size() < 1000) { pfrom->PushMessage("getaddr"); pfrom->fGetAddr = true; } + addrman.Good(pfrom->addr); + } else { + if (((CNetAddr)pfrom->addr) == (CNetAddr)addrFrom) + { + addrman.Add(addrFrom, addrFrom); + addrman.Good(addrFrom); + } } // Ask the first connected node for block updates @@ -2107,7 +2282,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) else if (strCommand == "verack") { - pfrom->vRecv.SetVersion(min(pfrom->nVersion, VERSION)); + pfrom->vRecv.SetVersion(min(pfrom->nVersion, PROTOCOL_VERSION)); } @@ -2117,9 +2292,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) vRecv >> vAddr; // Don't want addr from older versions unless seeding - if (pfrom->nVersion < 209) - return true; - if (pfrom->nVersion < 31402 && mapAddresses.size() > 1000) + if (pfrom->nVersion < 31402 && addrman.size() > 1000) return true; if (vAddr.size() > 1000) { @@ -2128,8 +2301,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) } // Store the new addresses - CAddrDB addrDB; - addrDB.TxnBegin(); int64 nNow = GetAdjustedTime(); int64 nSince = nNow - 10 * 60; BOOST_FOREACH(CAddress& addr, vAddr) @@ -2141,7 +2312,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) continue; if (addr.nTime <= 100000000 || addr.nTime > nNow + 10 * 60) addr.nTime = nNow - 5 * 24 * 60 * 60; - AddAddress(addr, 2 * 60 * 60, &addrDB); pfrom->AddAddressKnown(addr); if (addr.nTime > nSince && !pfrom->fGetAddr && vAddr.size() <= 10 && addr.IsRoutable()) { @@ -2153,7 +2323,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) static uint256 hashSalt; if (hashSalt == 0) RAND_bytes((unsigned char*)&hashSalt, sizeof(hashSalt)); - uint256 hashRand = hashSalt ^ (((int64)addr.ip)<<32) ^ ((GetTime()+addr.ip)/(24*60*60)); + int64 hashAddr = addr.GetHash(); + uint256 hashRand = hashSalt ^ (hashAddr<<32) ^ ((GetTime()+hashAddr)/(24*60*60)); hashRand = Hash(BEGIN(hashRand), END(hashRand)); multimap mapMix; BOOST_FOREACH(CNode* pnode, vNodes) @@ -2172,7 +2343,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) } } } - addrDB.TxnCommit(); // Save addresses (it's ok if this fails) + addrman.Add(vAddr, pfrom->addr, 2 * 60 * 60); if (vAddr.size() < 1000) pfrom->fGetAddr = false; } @@ -2189,8 +2360,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) } CTxDB txdb("r"); - BOOST_FOREACH(const CInv& inv, vInv) + for (int nInv = 0; nInv < vInv.size(); nInv++) { + const CInv &inv = vInv[nInv]; + if (fShutdown) return true; pfrom->AddInventoryKnown(inv); @@ -2199,9 +2372,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (fDebug) printf(" got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new"); - if (!fAlreadyHave) + // Always request the last block in an inv bundle (even if we already have it), as it is the + // trigger for the other side to send further invs. If we are stuck on a (very long) side chain, + // this is necessary to connect earlier received orphan blocks to the chain again. + if (!fAlreadyHave || (inv.type == MSG_BLOCK && nInv==vInv.size()-1)) pfrom->AskFor(inv); - else if (inv.type == MSG_BLOCK && mapOrphanBlocks.count(inv.hash)) + if (inv.type == MSG_BLOCK && mapOrphanBlocks.count(inv.hash)) pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(mapOrphanBlocks[inv.hash])); // Track requests for our stuff @@ -2418,25 +2594,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) else if (strCommand == "getaddr") { - // Nodes rebroadcast an addr every 24 hours pfrom->vAddrToSend.clear(); - int64 nSince = GetAdjustedTime() - 3 * 60 * 60; // in the last 3 hours - CRITICAL_BLOCK(cs_mapAddresses) - { - unsigned int nCount = 0; - BOOST_FOREACH(const PAIRTYPE(vector, CAddress)& item, mapAddresses) - { - const CAddress& addr = item.second; - if (addr.nTime > nSince) - nCount++; - } - BOOST_FOREACH(const PAIRTYPE(vector, CAddress)& item, mapAddresses) - { - const CAddress& addr = item.second; - if (addr.nTime > nSince && GetRand(nCount) < 2500) - pfrom->PushAddress(addr); - } - } + vector vAddr = addrman.GetAddr(); + BOOST_FOREACH(const CAddress &addr, vAddr) + pfrom->PushAddress(addr); } @@ -2457,12 +2618,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) /// we have a chance to check the order here // Keep giving the same key to the same ip until they use it - if (!mapReuseKey.count(pfrom->addr.ip)) - pwalletMain->GetKeyFromPool(mapReuseKey[pfrom->addr.ip], true); + if (!mapReuseKey.count(pfrom->addr)) + pwalletMain->GetKeyFromPool(mapReuseKey[pfrom->addr], true); // Send back approval of order and pubkey to use CScript scriptPubKey; - scriptPubKey << mapReuseKey[pfrom->addr.ip] << OP_CHECKSIG; + scriptPubKey << mapReuseKey[pfrom->addr] << OP_CHECKSIG; pfrom->PushMessage("reply", hashReply, (int)0, scriptPubKey); } @@ -2584,17 +2745,14 @@ bool ProcessMessages(CNode* pfrom) } // Checksum - if (vRecv.GetVersion() >= 209) + uint256 hash = Hash(vRecv.begin(), vRecv.begin() + nMessageSize); + unsigned int nChecksum = 0; + memcpy(&nChecksum, &hash, sizeof(nChecksum)); + if (nChecksum != hdr.nChecksum) { - uint256 hash = Hash(vRecv.begin(), vRecv.begin() + nMessageSize); - unsigned int nChecksum = 0; - memcpy(&nChecksum, &hash, sizeof(nChecksum)); - if (nChecksum != hdr.nChecksum) - { - printf("ProcessMessage(%s, %u bytes) : CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n", - strCommand.c_str(), nMessageSize, nChecksum, hdr.nChecksum); - continue; - } + printf("ProcessMessage(%s, %u bytes) : CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n", + strCommand.c_str(), nMessageSize, nChecksum, hdr.nChecksum); + continue; } // Copy message to its own buffer @@ -2659,18 +2817,18 @@ bool SendMessages(CNode* pto, bool fSendTrickle) // Address refresh broadcast static int64 nLastRebroadcast; - if (GetTime() - nLastRebroadcast > 24 * 60 * 60) + if (!IsInitialBlockDownload() && (GetTime() - nLastRebroadcast > 24 * 60 * 60)) { - nLastRebroadcast = GetTime(); CRITICAL_BLOCK(cs_vNodes) { BOOST_FOREACH(CNode* pnode, vNodes) { // Periodically clear setAddrKnown to allow refresh broadcasts - pnode->setAddrKnown.clear(); + if (nLastRebroadcast) + pnode->setAddrKnown.clear(); // Rebroadcast our address - if (addrLocalHost.IsRoutable() && !fUseProxy) + if (!fNoListen && !fUseProxy && addrLocalHost.IsRoutable()) { CAddress addr(addrLocalHost); addr.nTime = GetAdjustedTime(); @@ -2678,37 +2836,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } } } + nLastRebroadcast = GetTime(); } - // Clear out old addresses periodically so it's not too much work at once - static int64 nLastClear; - if (nLastClear == 0) - nLastClear = GetTime(); - if (GetTime() - nLastClear > 10 * 60 && vNodes.size() >= 3) - { - nLastClear = GetTime(); - CRITICAL_BLOCK(cs_mapAddresses) - { - CAddrDB addrdb; - int64 nSince = GetAdjustedTime() - 14 * 24 * 60 * 60; - for (map, CAddress>::iterator mi = mapAddresses.begin(); - mi != mapAddresses.end();) - { - const CAddress& addr = (*mi).second; - if (addr.nTime < nSince) - { - if (mapAddresses.size() < 1000 || GetTime() > nLastClear + 20) - break; - addrdb.EraseAddress(addr); - mapAddresses.erase(mi++); - } - else - mi++; - } - } - } - - // // Message: addr // @@ -2933,6 +3063,9 @@ public: }; +uint64 nLastBlockTx = 0; +uint64 nLastBlockSize = 0; + CBlock* CreateNewBlock(CReserveKey& reservekey) { CBlockIndex* pindexPrev = pindexBest; @@ -3020,6 +3153,7 @@ CBlock* CreateNewBlock(CReserveKey& reservekey) // Collect transactions into block map mapTestPool; uint64 nBlockSize = 1000; + uint64 nBlockTx = 0; int nBlockSigOps = 100; while (!mapPriority.empty()) { @@ -3034,19 +3168,19 @@ CBlock* CreateNewBlock(CReserveKey& reservekey) continue; // Legacy limits on sigOps: - int nTxSigOps = tx.GetSigOpCount(); + int nTxSigOps = tx.GetLegacySigOpCount(); if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) continue; // Transaction fee required depends on block size bool fAllowFree = (nBlockSize + nTxSize < 4000 || CTransaction::AllowFree(dPriority)); - int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree); + int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree, GMF_BLOCK); // Connecting shouldn't fail due to dependency on other memory pool transactions // because we're already processing them in order of dependency map mapTestPoolTmp(mapTestPool); - bool fInvalid; MapPrevTx mapInputs; + bool fInvalid; if (!tx.FetchInputs(txdb, mapTestPoolTmp, false, true, mapInputs, fInvalid)) continue; @@ -3066,6 +3200,7 @@ CBlock* CreateNewBlock(CReserveKey& reservekey) // Added pblock->vtx.push_back(tx); nBlockSize += nTxSize; + ++nBlockTx; nBlockSigOps += nTxSigOps; nFees += nTxFees; @@ -3084,6 +3219,11 @@ CBlock* CreateNewBlock(CReserveKey& reservekey) } } } + + nLastBlockTx = nBlockTx; + nLastBlockSize = nBlockSize; + printf("CreateNewBlock(): total size %lu\n", nBlockSize); + } pblock->vtx[0].vout[0].nValue = GetBlockValue(pindexPrev->nHeight+1, nFees); @@ -3108,7 +3248,9 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& hashPrevBlock = pblock->hashPrevBlock; } ++nExtraNonce; - pblock->vtx[0].vin[0].scriptSig = CScript() << pblock->nTime << CBigNum(nExtraNonce); + pblock->vtx[0].vin[0].scriptSig = (CScript() << pblock->nTime << CBigNum(nExtraNonce)) + COINBASE_FLAGS; + assert(pblock->vtx[0].vin[0].scriptSig.size() <= 100); + pblock->hashMerkleRoot = pblock->BuildMerkleTree(); } @@ -3197,6 +3339,10 @@ bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey) void static ThreadBitcoinMiner(void* parg); +static bool fGenerateBitcoins = false; +static bool fLimitProcessors = false; +static int nLimitProcessors = -1; + void static BitcoinMiner(CWallet *pwallet) { printf("BitcoinMiner started\n"); @@ -3311,7 +3457,7 @@ void static BitcoinMiner(CWallet *pwallet) { nLogTime = GetTime(); printf("%s ", DateTimeStrFormat("%x %H:%M", GetTime()).c_str()); - printf("hashmeter %3d CPUs %6.0f khash/s\n", vnThreadsRunning[3], dHashesPerSec/1000.0); + printf("hashmeter %3d CPUs %6.0f khash/s\n", vnThreadsRunning[THREAD_MINER], dHashesPerSec/1000.0); } } } @@ -3322,7 +3468,7 @@ void static BitcoinMiner(CWallet *pwallet) return; if (!fGenerateBitcoins) return; - if (fLimitProcessors && vnThreadsRunning[3] > nLimitProcessors) + if (fLimitProcessors && vnThreadsRunning[THREAD_MINER] > nLimitProcessors) return; if (vNodes.empty()) break; @@ -3351,34 +3497,34 @@ void static ThreadBitcoinMiner(void* parg) CWallet* pwallet = (CWallet*)parg; try { - vnThreadsRunning[3]++; + vnThreadsRunning[THREAD_MINER]++; BitcoinMiner(pwallet); - vnThreadsRunning[3]--; + vnThreadsRunning[THREAD_MINER]--; } catch (std::exception& e) { - vnThreadsRunning[3]--; + vnThreadsRunning[THREAD_MINER]--; PrintException(&e, "ThreadBitcoinMiner()"); } catch (...) { - vnThreadsRunning[3]--; + vnThreadsRunning[THREAD_MINER]--; PrintException(NULL, "ThreadBitcoinMiner()"); } UIThreadCall(boost::bind(CalledSetStatusBar, "", 0)); nHPSTimerStart = 0; - if (vnThreadsRunning[3] == 0) + if (vnThreadsRunning[THREAD_MINER] == 0) dHashesPerSec = 0; - printf("ThreadBitcoinMiner exiting, %d threads remaining\n", vnThreadsRunning[3]); + printf("ThreadBitcoinMiner exiting, %d threads remaining\n", vnThreadsRunning[THREAD_MINER]); } void GenerateBitcoins(bool fGenerate, CWallet* pwallet) { - if (fGenerateBitcoins != fGenerate) - { - fGenerateBitcoins = fGenerate; - WriteSetting("fGenerateBitcoins", fGenerateBitcoins); - MainFrameRepaint(); - } - if (fGenerateBitcoins) + fGenerateBitcoins = fGenerate; + nLimitProcessors = GetArg("-genproclimit", -1); + if (nLimitProcessors == 0) + fGenerateBitcoins = false; + fLimitProcessors = (nLimitProcessors != -1); + + if (fGenerate) { int nProcessors = boost::thread::hardware_concurrency(); printf("%d processors\n", nProcessors); @@ -3386,7 +3532,7 @@ void GenerateBitcoins(bool fGenerate, CWallet* pwallet) nProcessors = 1; if (fLimitProcessors && nProcessors > nLimitProcessors) nProcessors = nLimitProcessors; - int nAddThreads = nProcessors - vnThreadsRunning[3]; + int nAddThreads = nProcessors - vnThreadsRunning[THREAD_MINER]; printf("Starting %d BitcoinMiner threads\n", nAddThreads); for (int i = 0; i < nAddThreads; i++) { diff --git a/src/main.h b/src/main.h index e400bd9..18d5dbd 100644 --- a/src/main.h +++ b/src/main.h @@ -25,7 +25,10 @@ class CAddress; class CInv; class CRequestTracker; class CNode; -class CBlockIndex; + +static const int CLIENT_VERSION = 60006; +static const bool VERSION_IS_BETA = true; +extern const std::string CLIENT_NAME; static const unsigned int MAX_BLOCK_SIZE = 1000000; static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2; @@ -47,6 +50,9 @@ static const int fHaveUPnP = false; #endif +extern CScript COINBASE_FLAGS; + + @@ -60,7 +66,11 @@ extern CBigNum bnBestChainWork; extern CBigNum bnBestInvalidWork; extern uint256 hashBestChain; extern CBlockIndex* pindexBest; +extern uint64 nPooledTx; extern unsigned int nTransactionsUpdated; +extern uint64 nLastBlockTx; +extern uint64 nLastBlockSize; +extern const std::string strMessageMagic; extern double dHashesPerSec; extern int64 nHPSTimerStart; extern int64 nTimeBestReceived; @@ -68,13 +78,7 @@ extern CCriticalSection cs_setpwalletRegistered; extern std::set setpwalletRegistered; // Settings -extern int fGenerateBitcoins; extern int64 nTransactionFee; -extern int fLimitProcessors; -extern int nLimitProcessors; -extern int fMinimizeToTray; -extern int fMinimizeOnClose; -extern int fUseUPnP; @@ -118,21 +122,7 @@ std::string GetWarnings(std::string strFor); bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut); -template -bool WriteSetting(const std::string& strKey, const T& value) -{ - bool fOk = false; - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) - { - std::string strWalletFile; - if (!GetWalletFile(pwallet, strWalletFile)) - continue; - fOk |= CWalletDB(strWalletFile).WriteSetting(strKey, value); - } - return fOk; -} - - +/** Position on disk for a particular transaction. */ class CDiskTxPos { public: @@ -184,7 +174,7 @@ public: - +/** An inpoint - a combination of a transaction and an index n into its vin */ class CInPoint { public: @@ -199,7 +189,7 @@ public: - +/** An outpoint - a combination of a transaction hash and an index n into its vout */ class COutPoint { public: @@ -241,11 +231,10 @@ public: -// -// An input of a transaction. It contains the location of the previous -// transaction's output that it claims and a signature that matches the -// output's public key. -// +/** An input of a transaction. It contains the location of the previous + * transaction's output that it claims and a signature that matches the + * output's public key. + */ class CTxIn { public: @@ -255,17 +244,17 @@ public: CTxIn() { - nSequence = UINT_MAX; + nSequence = std::numeric_limits::max(); } - explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=UINT_MAX) + explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits::max()) { prevout = prevoutIn; scriptSig = scriptSigIn; nSequence = nSequenceIn; } - CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=UINT_MAX) + CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits::max()) { prevout = COutPoint(hashPrevTx, nOut); scriptSig = scriptSigIn; @@ -281,7 +270,7 @@ public: bool IsFinal() const { - return (nSequence == UINT_MAX); + return (nSequence == std::numeric_limits::max()); } friend bool operator==(const CTxIn& a, const CTxIn& b) @@ -305,7 +294,7 @@ public: str += strprintf(", coinbase %s", HexStr(scriptSig).c_str()); else str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str()); - if (nSequence != UINT_MAX) + if (nSequence != std::numeric_limits::max()) str += strprintf(", nSequence=%u", nSequence); str += ")"; return str; @@ -320,10 +309,9 @@ public: -// -// An output of a transaction. It contains the public key that the next input -// must be able to sign with to claim it. -// +/** An output of a transaction. It contains the public key that the next input + * must be able to sign with to claim it. + */ class CTxOut { public: @@ -388,13 +376,20 @@ public: }; -typedef std::map > MapPrevTx; -// -// The basic transaction that is broadcasted on the network and contained in -// blocks. A transaction can contain multiple inputs and outputs. -// +enum GetMinFee_mode +{ + GMF_BLOCK, + GMF_RELAY, + GMF_SEND, +}; + +typedef std::map > MapPrevTx; + +/** The basic transaction that is broadcasted on the network and contained in + * blocks. A transaction can contain multiple inputs and outputs. + */ class CTransaction { public: @@ -466,7 +461,7 @@ public: return false; bool fNewer = false; - unsigned int nLowest = UINT_MAX; + unsigned int nLowest = std::numeric_limits::max(); for (int i = 0; i < vin.size(); i++) { if (vin[i].nSequence != old.vin[i].nSequence) @@ -491,36 +486,35 @@ public: return (vin.size() == 1 && vin[0].prevout.IsNull()); } - int GetSigOpCount() const - { - int n = 0; - BOOST_FOREACH(const CTxIn& txin, vin) - n += txin.scriptSig.GetSigOpCount(); - BOOST_FOREACH(const CTxOut& txout, vout) - n += txout.scriptPubKey.GetSigOpCount(); - return n; - } + /** Check for standard transaction types + @return True if all outputs (scriptPubKeys) use only standard transaction forms + */ + bool IsStandard() const; + + /** Check for standard transaction types + @param[in] mapInputs Map of previous transactions that have outputs we're spending + @return True if all inputs (scriptSigs) use only standard transaction forms + @see CTransaction::FetchInputs + */ + bool AreInputsStandard(const MapPrevTx& mapInputs) const; + + /** Count ECDSA signature operations the old-fashioned (pre-0.6) way + @return number of sigops this transaction's outputs will produce when spent + @see CTransaction::FetchInputs + */ + int GetLegacySigOpCount() const; /** Count ECDSA signature operations in pay-to-script-hash inputs. - This is a better measure of how expensive it is to process this transaction. - @param[in] mapInputsMap of previous transactions that have outputs we're spending + @param[in] mapInputs Map of previous transactions that have outputs we're spending @return maximum number of sigops required to validate this transaction's inputs @see CTransaction::FetchInputs - */ + */ int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const; - bool IsStandard() const - { - BOOST_FOREACH(const CTxIn& txin, vin) - if (!txin.scriptSig.IsPushOnly()) - return error("nonstandard txin: %s", txin.scriptSig.ToString().c_str()); - BOOST_FOREACH(const CTxOut& txout, vout) - if (!::IsStandard(txout.scriptPubKey)) - return error("nonstandard txout: %s", txout.scriptPubKey.ToString().c_str()); - return true; - } - + /** Amount of bitcoins spent by this transaction. + @return sum of all outputs (note: does not include fees) + */ int64 GetValueOut() const { int64 nValueOut = 0; @@ -537,10 +531,10 @@ public: Note that lightweight clients may not know anything besides the hash of previous transactions, so may not be able to calculate this. - @param[in] mapInputsMap of previous transactions that have outputs we're spending - @returnSum of value of all inputs (scriptSigs) + @param[in] mapInputs Map of previous transactions that have outputs we're spending + @return Sum of value of all inputs (scriptSigs) @see CTransaction::FetchInputs - */ + */ int64 GetValueIn(const MapPrevTx& mapInputs) const; static bool AllowFree(double dPriority) @@ -550,10 +544,10 @@ public: return dPriority > COIN * 144 / 250; } - int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=true, bool fForRelay=false) const + int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=true, enum GetMinFee_mode mode=GMF_BLOCK) const { // Base fee is either MIN_TX_FEE or MIN_RELAY_TX_FEE - int64 nBaseFee = fForRelay ? MIN_RELAY_TX_FEE : MIN_TX_FEE; + int64 nBaseFee = (mode == GMF_RELAY) ? MIN_RELAY_TX_FEE : MIN_TX_FEE; unsigned int nBytes = ::GetSerializeSize(*this, SER_NETWORK); unsigned int nNewBlockSize = nBlockSize + nBytes; @@ -674,15 +668,15 @@ public: /** Sanity check previous transactions, then, if all checks succeed, mark them as spent by this transaction. - @param[in] inputsPrevious transactions (from FetchInputs) - @param[out] mapTestPoolKeeps track of inputs that need to be updated on disk - @param[in] posThisTxPosition of this transaction on disk + @param[in] inputs Previous transactions (from FetchInputs) + @param[out] mapTestPool Keeps track of inputs that need to be updated on disk + @param[in] posThisTx Position of this transaction on disk @param[in] pindexBlock - @param[in] fBlock true if called from ConnectBlock - @param[in] fMiner true if called from CreateNewBlock - @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions + @param[in] fBlock true if called from ConnectBlock + @param[in] fMiner true if called from CreateNewBlock + @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions @return Returns true if all checks succeed - */ + */ bool ConnectInputs(MapPrevTx inputs, std::map& mapTestPool, const CDiskTxPos& posThisTx, const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true); @@ -690,6 +684,7 @@ public: bool CheckTransaction() const; bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL); bool AcceptToMemoryPool(bool fCheckInputs=true, bool* pfMissingInputs=NULL); + protected: const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const; bool AddToMemoryPoolUnchecked(); @@ -701,9 +696,7 @@ public: -// -// A transaction with a merkle branch linking it to the block chain -// +/** A transaction with a merkle branch linking it to the block chain. */ class CMerkleTx : public CTransaction { public: @@ -744,8 +737,8 @@ public: int SetMerkleBranch(const CBlock* pblock=NULL); - int GetDepthInMainChain(int& nHeightRet) const; - int GetDepthInMainChain() const { int nHeight; return GetDepthInMainChain(nHeight); } + int GetDepthInMainChain(CBlockIndex* &pindexRet) const; + int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); } bool IsInMainChain() const { return GetDepthInMainChain() > 0; } int GetBlocksToMaturity() const; bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true); @@ -755,11 +748,10 @@ public: -// -// A txdb record that contains the disk location of a transaction and the -// locations of transactions that spend its outputs. vSpent is really only -// used as a flag, but having the location is very helpful for debugging. -// +/** A txdb record that contains the disk location of a transaction and the + * locations of transactions that spend its outputs. vSpent is really only + * used as a flag, but having the location is very helpful for debugging. + */ class CTxIndex { public: @@ -807,23 +799,23 @@ public: return !(a == b); } int GetDepthInMainChain() const; + }; -// -// Nodes collect new transactions into a block, hash them into a hash tree, -// and scan through nonce values to make the block's hash satisfy proof-of-work -// requirements. When they solve the proof-of-work, they broadcast the block -// to everyone and the block is added to the block chain. The first transaction -// in the block is a special one that creates a new coin owned by the creator -// of the block. -// -// Blocks are appended to blk0001.dat files on disk. Their location on disk -// is indexed by CBlockIndex objects in memory. -// +/** Nodes collect new transactions into a block, hash them into a hash tree, + * and scan through nonce values to make the block's hash satisfy proof-of-work + * requirements. When they solve the proof-of-work, they broadcast the block + * to everyone and the block is added to the block chain. The first transaction + * in the block is a special one that creates a new coin owned by the creator + * of the block. + * + * Blocks are appended to blk0001.dat files on disk. Their location on disk + * is indexed by CBlockIndex objects in memory. + */ class CBlock { public: @@ -895,14 +887,6 @@ public: return (int64)nTime; } - int GetSigOpCount() const - { - int n = 0; - BOOST_FOREACH(const CTransaction& tx, vtx) - n += tx.GetSigOpCount(); - return n; - } - void UpdateTime(const CBlockIndex* pindexPrev); @@ -1039,6 +1023,9 @@ public: bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos); bool CheckBlock() const; bool AcceptBlock(); + +private: + bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew); }; @@ -1046,14 +1033,13 @@ public: -// -// The block chain is a tree shaped structure starting with the -// genesis block at the root, with each block potentially having multiple -// candidates to be the next block. pprev and pnext link a path through the -// main/longest chain. A blockindex may have multiple pprev pointing back -// to it, but pnext will only point forward to the longest branch, or will -// be null if the block is not part of the longest chain. -// +/** The block chain is a tree shaped structure starting with the + * genesis block at the root, with each block potentially having multiple + * candidates to be the next block. pprev and pnext link a path through the + * main/longest chain. A blockindex may have multiple pprev pointing back + * to it, but pnext will only point forward to the longest branch, or will + * be null if the block is not part of the longest chain. + */ class CBlockIndex { public: @@ -1210,9 +1196,7 @@ public: -// -// Used to marshal pointers into hashes for db storage. -// +/** Used to marshal pointers into hashes for db storage. */ class CDiskBlockIndex : public CBlockIndex { public: @@ -1287,11 +1271,10 @@ public: -// -// Describes a place in the block chain to another node such that if the -// other node doesn't have the same branch, it can find a recent common trunk. -// The further back it is, the further before the fork it may be. -// +/** Describes a place in the block chain to another node such that if the + * other node doesn't have the same branch, it can find a recent common trunk. + * The further back it is, the further before the fork it may be. + */ class CBlockLocator { protected: @@ -1314,6 +1297,11 @@ public: Set((*mi).second); } + CBlockLocator(const std::vector& vHaveIn) + { + vHave = vHaveIn; + } + IMPLEMENT_SERIALIZE ( if (!(nType & SER_GETHASH)) @@ -1418,13 +1406,12 @@ public: -// -// Alerts are for notifying old versions if they become too obsolete and -// need to upgrade. The message is displayed in the status bar. -// Alert messages are broadcast as a vector of signed data. Unserializing may -// not read the entire buffer if the alert is for a newer version, but older -// versions can still relay the original data. -// +/** Alerts are for notifying old versions if they become too obsolete and + * need to upgrade. The message is displayed in the status bar. + * Alert messages are broadcast as a vector of signed data. Unserializing may + * not read the entire buffer if the alert is for a newer version, but older + * versions can still relay the original data. + */ class CUnsignedAlert { public: @@ -1524,6 +1511,7 @@ public: } }; +/** An alert is a combination of a serialized CUnsignedAlert and a signature. */ class CAlert : public CUnsignedAlert { public: @@ -1572,6 +1560,7 @@ public: bool AppliesTo(int nVersion, std::string strSubVerIn) const { + // TODO: rework for client-version-embedded-in-strSubVer ? return (IsInEffect() && nMinVer <= nVersion && nVersion <= nMaxVer && (setSubVer.empty() || setSubVer.count(strSubVerIn))); @@ -1579,7 +1568,7 @@ public: bool AppliesToMe() const { - return AppliesTo(VERSION, ::pszSubVer); + return AppliesTo(PROTOCOL_VERSION, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector())); } bool RelayTo(CNode* pnode) const diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw index 61f8d48..40ce1dc 100644 --- a/src/makefile.linux-mingw +++ b/src/makefile.linux-mingw @@ -29,28 +29,6 @@ LIBS= \ DEFS=-D_MT -DWIN32 -D_WINDOWS -DNOPCH -DUSE_SSL -DBOOST_THREAD_USE_LIB DEBUGFLAGS=-g CFLAGS=-O2 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) -HEADERS = \ - base58.h \ - bignum.h \ - checkpoints.h \ - crypter.h \ - db.h \ - headers.h \ - init.h \ - irc.h \ - key.h \ - keystore.h \ - main.h \ - net.h \ - noui.h \ - protocol.h \ - bitcoinrpc.h \ - script.h \ - serialize.h \ - strlcpy.h \ - uint256.h \ - util.h \ - wallet.h ifdef USE_UPNP @@ -61,9 +39,15 @@ endif LIBS += -l mingwthrd -l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l winmm -l shell32 -l comctl32 -l ole32 -l oleaut32 -l uuid -l rpcrt4 -l advapi32 -l ws2_32 -l shlwapi +# TODO: make the mingw builds smarter about dependencies, like the linux/osx builds are +HEADERS = $(wildcard *.h) + OBJS= \ obj/checkpoints.o \ + obj/netbase.o \ + obj/addrman.o \ obj/crypter.o \ + obj/key.o \ obj/db.o \ obj/init.o \ obj/irc.o \ @@ -72,29 +56,29 @@ OBJS= \ obj/net.o \ obj/protocol.o \ obj/bitcoinrpc.o \ + obj/rpcdump.o \ obj/script.o \ obj/util.o \ obj/wallet.o all: bitcoind.exe -obj/nogui/%.o: %.cpp $(HEADERS) +obj/%.o: %.cpp $(HEADERS) i586-mingw32msvc-g++ -c $(CFLAGS) -o $@ $< -bitcoind.exe: $(OBJS:obj/%=obj/nogui/%) +bitcoind.exe: $(OBJS:obj/%=obj/%) i586-mingw32msvc-g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) obj/test/%.o: obj/test/%.cpp $(HEADERS) i586-mingw32msvc-g++ -c $(CFLAGS) -o $@ $< -test_bitcoin.exe: obj/test/test_bitcoin.o $(filter-out obj/nogui/init.o,$(OBJS:obj/%=obj/nogui/%)) +test_bitcoin.exe: obj/test/test_bitcoin.o $(filter-out obj/init.o,$(OBJS:obj/%=obj/%)) i586-mingw32msvc-g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) -lboost_unit_test_framework-mt-s clean: -rm -f obj/*.o - -rm -f obj/nogui/*.o -rm -f obj/test/*.o -rm -f test/*.o -rm -f headers.h.gch diff --git a/src/makefile.mingw b/src/makefile.mingw index 2cb78d9..f7dfcc7 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -26,28 +26,7 @@ LIBS= \ DEFS=-DWIN32 -D_WINDOWS -DNOPCH -DUSE_SSL -DBOOST_THREAD_USE_LIB DEBUGFLAGS=-g CFLAGS=-mthreads -O2 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) -HEADERS = \ - base58.h \ - bignum.h \ - checkpoints.h \ - crypter.h \ - db.h \ - headers.h \ - init.h \ - irc.h \ - key.h \ - keystore.h \ - main.h \ - net.h \ - noui.h \ - protocol.h \ - bitcoinrpc.h \ - script.h \ - serialize.h \ - strlcpy.h \ - uint256.h \ - util.h \ - wallet.h + ifdef USE_UPNP INCLUDEPATHS += -I"C:\miniupnpc-1.6-mgw" @@ -58,9 +37,15 @@ endif LIBS += -l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l winmm -l shell32 -l comctl32 -l ole32 -l oleaut32 -l uuid -l rpcrt4 -l advapi32 -l ws2_32 -l shlwapi +# TODO: make the mingw builds smarter about dependencies, like the linux/osx builds are +HEADERS = $(wildcard *.h) + OBJS= \ obj/checkpoints.o \ + obj/netbase.o \ + obj/addrman.o \ obj/crypter.o \ + obj/key.o \ obj/db.o \ obj/init.o \ obj/irc.o \ @@ -69,6 +54,7 @@ OBJS= \ obj/net.o \ obj/protocol.o \ obj/bitcoinrpc.o \ + obj/rpcdump.o \ obj/script.o \ obj/util.o \ obj/wallet.o @@ -76,16 +62,16 @@ OBJS= \ all: bitcoind.exe -obj/nogui/%.o: %.cpp $(HEADERS) +obj/%.o: %.cpp $(HEADERS) g++ -c $(CFLAGS) -o $@ $< -bitcoind.exe: $(OBJS:obj/%=obj/nogui/%) +bitcoind.exe: $(OBJS:obj/%=obj/%) g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) obj/test/test_bitcoin.o: $(wildcard test/*.cpp) $(HEADERS) g++ -c $(CFLAGS) -o $@ test/test_bitcoin.cpp -test_bitcoin.exe: obj/test/test_bitcoin.o $(filter-out obj/nogui/init.o,$(OBJS:obj/%=obj/nogui/%)) +test_bitcoin.exe: obj/test/test_bitcoin.o $(filter-out obj/init.o,$(OBJS:obj/%=obj/%)) g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) clean: diff --git a/src/makefile.osx b/src/makefile.osx index cbd51b0..8790d92 100644 --- a/src/makefile.osx +++ b/src/makefile.osx @@ -10,6 +10,7 @@ CXX=llvm-g++ DEPSDIR=/opt/local INCLUDEPATHS= \ + -I"$(CURDIR)" \ -I"$(DEPSDIR)/include" \ -I"$(DEPSDIR)/include/db48" @@ -52,33 +53,16 @@ DEFS=-DMAC_OSX -DMSG_NOSIGNAL=0 -DUSE_SSL DEBUGFLAGS=-g # ppc doesn't work because we don't support big-endian -CFLAGS=-mmacosx-version-min=10.5 -arch i386 -O3 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) -HEADERS = \ - base58.h \ - bignum.h \ - checkpoints.h \ - crypter.h \ - db.h \ - headers.h \ - init.h \ - irc.h \ - key.h \ - keystore.h \ - main.h \ - net.h \ - noui.h \ - protocol.h \ - bitcoinrpc.h \ - script.h \ - serialize.h \ - strlcpy.h \ - uint256.h \ - util.h \ - wallet.h +CFLAGS=-mmacosx-version-min=10.5 -arch i386 -O3 \ + -Wextra -Wno-sign-compare -Wno-char-subscripts -Wno-invalid-offsetof -Wformat-security \ + $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) OBJS= \ obj/checkpoints.o \ + obj/netbase.o \ + obj/addrman.o \ obj/crypter.o \ + obj/key.o \ obj/db.o \ obj/init.o \ obj/irc.o \ @@ -87,6 +71,7 @@ OBJS= \ obj/net.o \ obj/protocol.o \ obj/bitcoinrpc.o \ + obj/rpcdump.o \ obj/script.o \ obj/util.o \ obj/wallet.o @@ -100,38 +85,37 @@ else endif endif - all: bitcoind # auto-generated dependencies: --include obj/nogui/*.P +-include obj/*.P -include obj-test/*.P -obj/nogui/%.o: %.cpp +obj/%.o: %.cpp $(CXX) -c $(CFLAGS) -MMD -o $@ $< @cp $(@:%.o=%.d) $(@:%.o=%.P); \ sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ rm -f $(@:%.o=%.d) -bitcoind: $(OBJS:obj/%=obj/nogui/%) +bitcoind: $(OBJS:obj/%=obj/%) $(CXX) $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) -obj/test/%.o: test/%.cpp +TESTOBJS := $(patsubst test/%.cpp,obj-test/%.o,$(wildcard test/*.cpp)) + +obj-test/%.o: test/%.cpp $(CXX) -c $(TESTDEFS) $(CFLAGS) -MMD -o $@ $< @cp $(@:%.o=%.d) $(@:%.o=%.P); \ sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ rm -f $(@:%.o=%.d) -test_bitcoin: obj/test/test_bitcoin.o $(filter-out obj/nogui/init.o,$(OBJS:obj/%=obj/nogui/%)) +test_bitcoin: $(TESTOBJS) $(filter-out obj/init.o,$(OBJS:obj/%=obj/%)) $(CXX) $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) $(TESTLIBS) clean: -rm -f bitcoind test_bitcoin -rm -f obj/*.o - -rm -f obj/nogui/*.o -rm -f obj-test/*.o -rm -f obj/*.P - -rm -f obj/nogui/*.P -rm -f obj-test/*.P diff --git a/src/makefile.unix b/src/makefile.unix index e75dda5..92c1b97 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -6,7 +6,7 @@ USE_UPNP:=0 DEFS=-DNOPCH -DEFS += $(addprefix -I,$(BOOST_INCLUDE_PATH) $(BDB_INCLUDE_PATH) $(OPENSSL_INCLUDE_PATH)) +DEFS += $(addprefix -I,$(CURDIR) $(BOOST_INCLUDE_PATH) $(BDB_INCLUDE_PATH) $(OPENSSL_INCLUDE_PATH)) LIBS = $(addprefix -L,$(BOOST_LIB_PATH) $(BDB_LIB_PATH) $(OPENSSL_LIB_PATH)) LMODE = dynamic @@ -85,33 +85,15 @@ LIBS+= \ DEBUGFLAGS=-g CXXFLAGS=-O2 -xCXXFLAGS=-pthread -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(HARDENING) $(CXXFLAGS) -HEADERS = \ - base58.h \ - bignum.h \ - checkpoints.h \ - crypter.h \ - db.h \ - headers.h \ - init.h \ - irc.h \ - key.h \ - keystore.h \ - main.h \ - net.h \ - noui.h \ - protocol.h \ - bitcoinrpc.h \ - script.h \ - serialize.h \ - strlcpy.h \ - uint256.h \ - util.h \ - wallet.h +xCXXFLAGS=-pthread -Wextra -Wno-sign-compare -Wno-char-subscripts -Wno-invalid-offsetof -Wformat -Wformat-security \ + $(DEBUGFLAGS) $(DEFS) $(HARDENING) $(CXXFLAGS) OBJS= \ obj/checkpoints.o \ + obj/netbase.o \ + obj/addrman.o \ obj/crypter.o \ + obj/key.o \ obj/db.o \ obj/init.o \ obj/irc.o \ @@ -120,6 +102,7 @@ OBJS= \ obj/net.o \ obj/protocol.o \ obj/bitcoinrpc.o \ + obj/rpcdump.o \ obj/script.o \ obj/util.o \ obj/wallet.o @@ -128,19 +111,21 @@ OBJS= \ all: bitcoind # auto-generated dependencies: --include obj/nogui/*.P +-include obj/*.P -include obj-test/*.P -obj/nogui/%.o: %.cpp +obj/%.o: %.cpp $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< @cp $(@:%.o=%.d) $(@:%.o=%.P); \ sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ rm -f $(@:%.o=%.d) -bitcoind: $(OBJS:obj/%=obj/nogui/%) +bitcoind: $(OBJS:obj/%=obj/%) $(CXX) $(xCXXFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) +TESTOBJS := $(patsubst test/%.cpp,obj-test/%.o,$(wildcard test/*.cpp)) + obj-test/%.o: test/%.cpp $(CXX) -c $(TESTDEFS) $(xCXXFLAGS) -MMD -o $@ $< @cp $(@:%.o=%.d) $(@:%.o=%.P); \ @@ -148,14 +133,12 @@ obj-test/%.o: test/%.cpp -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ rm -f $(@:%.o=%.d) -test_bitcoin: obj-test/test_bitcoin.o $(filter-out obj/nogui/init.o,$(OBJS:obj/%=obj/nogui/%)) +test_bitcoin: $(TESTOBJS) $(filter-out obj/init.o,$(OBJS:obj/%=obj/%)) $(CXX) $(xCXXFLAGS) -o $@ $(LIBPATHS) $^ -Wl,-B$(LMODE) -lboost_unit_test_framework $(LDFLAGS) $(LIBS) clean: -rm -f bitcoind test_bitcoin -rm -f obj/*.o - -rm -f obj/nogui/*.o -rm -f obj-test/*.o -rm -f obj/*.P - -rm -f obj/nogui/*.P -rm -f obj-test/*.P diff --git a/src/makefile.vc b/src/makefile.vc deleted file mode 100644 index 60f1e09..0000000 --- a/src/makefile.vc +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (c) 2009-2010 Satoshi Nakamoto -# Distributed under the MIT/X11 software license, see the accompanying -# file license.txt or http://www.opensource.org/licenses/mit-license.php. - - -INCLUDEPATHS= \ - /I"/boost" \ - /I"/db/build_windows" \ - /I"/openssl/include" \ - /I"/miniupnpc" - -LIBPATHS= \ - /LIBPATH:"/boost/stage/lib" \ - /LIBPATH:"/db/build_windows/Release" \ - /LIBPATH:"/openssl/lib" \ - /LIBPATH:"/miniupnpc/msvc/Release" \ - /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib \ - /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib \ - /NODEFAULTLIB:msvcrtd.lib - -USE_UPNP=0 - -DEFS=/DWIN32 /D_WINDOWS /DNOPCH /DNOMINMAX - -LIBS= \ - libboost_system-vc100-mt.lib \ - libboost_filesystem-vc100-mt.lib \ - libboost_program_options-vc100-mt.lib \ - libboost_thread-vc100-mt.lib \ - libdb47s.lib \ - libeay32.lib - -!IFDEF USE_UPNP -LIBS=$(LIBS) miniupnpc.lib -DEFS=$(DEFS) /DUSE_UPNP=$(USE_UPNP) -!ENDIF - -LIBS=$(LIBS) \ - kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib ws2_32.lib shlwapi.lib iphlpapi.lib - -DEBUGFLAGS=/Os -CFLAGS=/MD /c /nologo /EHsc /GR /Zm300 $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) -HEADERS = \ - base58.h \ - bignum.h \ - checkpoints.h \ - crypter.h \ - db.h \ - headers.h \ - init.h \ - irc.h \ - key.h \ - keystore.h \ - main.h \ - net.h \ - noui.h \ - protocol.h \ - bitcoinrpc.h \ - script.h \ - serialize.h \ - strlcpy.h \ - ui.h \ - uibase.h \ - uint256.h \ - util.h \ - wallet.h - -OBJS= \ - obj\checkpoints.o \ - obj\crypter.o \ - obj\db.o \ - obj\init.o \ - obj\irc.o \ - obj\keystore.o \ - obj\main.o \ - obj\net.o \ - obj\rpc.o \ - obj\protocol.o \ - obj\script.o \ - obj\util.o \ - obj\wallet.o - -RC=../share - - -all: bitcoind.exe - - -.cpp{obj}.obj: - cl $(CFLAGS) /DGUI /Fo$@ %s - -obj\checkpoints.obj: $(HEADERS) - -obj\util.obj: $(HEADERS) - -obj\script.obj: $(HEADERS) - -obj\db.obj: $(HEADERS) - -obj\net.obj: $(HEADERS) - -obj\irc.obj: $(HEADERS) - -obj\keystore.obj: $(HEADERS) - -obj\main.obj: $(HEADERS) - -obj\wallet.obj: $(HEADERS) - -obj\rpc.obj: $(HEADERS) - -obj\init.obj: $(HEADERS) - -obj\crypter.obj: $(HEADERS) - -obj\ui.obj: $(HEADERS) - -obj\uibase.obj: $(HEADERS) - -.cpp{obj\nogui}.obj: - cl $(CFLAGS) /Fo$@ %s - -obj\nogui\checkpoints.obj: $(HEADERS) - -obj\nogui\util.obj: $(HEADERS) - -obj\nogui\script.obj: $(HEADERS) - -obj\nogui\db.obj: $(HEADERS) - -obj\nogui\net.obj: $(HEADERS) - -obj\nogui\irc.obj: $(HEADERS) - -obj\nogui\keystore.obj: $(HEADERS) - -obj\nogui\main.obj: $(HEADERS) - -obj\nogui\wallet.obj: $(HEADERS) - -obj\nogui\rpc.obj: $(HEADERS) - -obj\nogui\init.obj: $(HEADERS) - -bitcoind.exe: $(OBJS:obj\=obj\nogui\) obj\ui.res - link /nologo /OUT:$@ $(LIBPATHS) $** $(LIBS) - -clean: - -del /Q obj\* - -del /Q obj\nogui\* - -del /Q *.ilk - -del /Q *.pdb - -del /Q bitcoind.exe diff --git a/src/mruset.h b/src/mruset.h new file mode 100644 index 0000000..b21f185 --- /dev/null +++ b/src/mruset.h @@ -0,0 +1,64 @@ +// Copyright (c) 2012 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. +#ifndef BITCOIN_MRUSET_H +#define BITCOIN_MRUSET_H + +#include +#include + +/** STL-like set container that only keeps the most recent N elements. */ +template class mruset +{ +public: + typedef T key_type; + typedef T value_type; + typedef typename std::set::iterator iterator; + typedef typename std::set::const_iterator const_iterator; + typedef typename std::set::size_type size_type; + +protected: + std::set set; + std::deque queue; + size_type nMaxSize; + +public: + mruset(size_type nMaxSizeIn = 0) { nMaxSize = nMaxSizeIn; } + iterator begin() const { return set.begin(); } + iterator end() const { return set.end(); } + size_type size() const { return set.size(); } + bool empty() const { return set.empty(); } + iterator find(const key_type& k) const { return set.find(k); } + size_type count(const key_type& k) const { return set.count(k); } + bool inline friend operator==(const mruset& a, const mruset& b) { return a.set == b.set; } + bool inline friend operator==(const mruset& a, const std::set& b) { return a.set == b; } + bool inline friend operator<(const mruset& a, const mruset& b) { return a.set < b.set; } + std::pair insert(const key_type& x) + { + std::pair ret = set.insert(x); + if (ret.second) + { + if (nMaxSize && queue.size() == nMaxSize) + { + set.erase(queue.front()); + queue.pop_front(); + } + queue.push_back(x); + } + return ret; + } + size_type max_size() const { return nMaxSize; } + size_type max_size(size_type s) + { + if (s) + while (queue.size() >= s) + { + set.erase(queue.front()); + queue.pop_front(); + } + nMaxSize = s; + return nMaxSize; + } +}; + +#endif diff --git a/src/net.cpp b/src/net.cpp index 9a7bf78..37e73c4 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -9,6 +9,7 @@ #include "net.h" #include "init.h" #include "strlcpy.h" +#include "addrman.h" #ifdef WIN32 #include @@ -29,6 +30,7 @@ static const int MAX_OUTBOUND_CONNECTIONS = 8; void ThreadMessageHandler2(void* parg); void ThreadSocketHandler2(void* parg); void ThreadOpenConnections2(void* parg); +void ThreadOpenAddedConnections2(void* parg); #ifdef USE_UPNP void ThreadMapPort2(void* parg); #endif @@ -37,34 +39,30 @@ bool OpenNetworkConnection(const CAddress& addrConnect); - - // // Global state variables // bool fClient = false; bool fAllowDNS = false; +static bool fUseUPnP = false; uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK); -CAddress addrLocalHost("0.0.0.0", 0, false, nLocalServices); +CAddress addrLocalHost(CService("0.0.0.0", 0), nLocalServices); static CNode* pnodeLocalHost = NULL; uint64 nLocalHostNonce = 0; -array vnThreadsRunning; +array vnThreadsRunning; static SOCKET hListenSocket = INVALID_SOCKET; +CAddrMan addrman; vector vNodes; CCriticalSection cs_vNodes; -map, CAddress> mapAddresses; -CCriticalSection cs_mapAddresses; map mapRelay; deque > vRelayExpiration; CCriticalSection cs_mapRelay; map mapAlreadyAskedFor; -// Settings -int fUseProxy = false; -int nConnectTimeout = 5000; -CAddress addrProxy("127.0.0.1",9050); +set setservAddNodeAddresses; +CCriticalSection cs_setservAddNodeAddresses; @@ -86,215 +84,60 @@ void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) - - -bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet, int nTimeout) +bool RecvLine(SOCKET hSocket, string& strLine) { - hSocketRet = INVALID_SOCKET; - - SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (hSocket == INVALID_SOCKET) - return false; -#ifdef SO_NOSIGPIPE - int set = 1; - setsockopt(hSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int)); -#endif - - bool fProxy = (fUseProxy && addrConnect.IsRoutable()); - struct sockaddr_in sockaddr = (fProxy ? addrProxy.GetSockAddr() : addrConnect.GetSockAddr()); - -#ifdef WIN32 - u_long fNonblock = 1; - if (ioctlsocket(hSocket, FIONBIO, &fNonblock) == SOCKET_ERROR) -#else - int fFlags = fcntl(hSocket, F_GETFL, 0); - if (fcntl(hSocket, F_SETFL, fFlags | O_NONBLOCK) == -1) -#endif - { - closesocket(hSocket); - return false; - } - - - if (connect(hSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) + strLine = ""; + loop { - // WSAEINVAL is here because some legacy version of winsock uses it - if (WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAEINVAL) + char c; + int nBytes = recv(hSocket, &c, 1, 0); + if (nBytes > 0) { - struct timeval timeout; - timeout.tv_sec = nTimeout / 1000; - timeout.tv_usec = (nTimeout % 1000) * 1000; - - fd_set fdset; - FD_ZERO(&fdset); - FD_SET(hSocket, &fdset); - int nRet = select(hSocket + 1, NULL, &fdset, NULL, &timeout); - if (nRet == 0) - { - printf("connection timeout\n"); - closesocket(hSocket); + if (c == '\n') + continue; + if (c == '\r') + return true; + strLine += c; + if (strLine.size() >= 9000) + return true; + } + else if (nBytes <= 0) + { + if (fShutdown) return false; - } - if (nRet == SOCKET_ERROR) + if (nBytes < 0) { - printf("select() for connection failed: %i\n",WSAGetLastError()); - closesocket(hSocket); - return false; + int nErr = WSAGetLastError(); + if (nErr == WSAEMSGSIZE) + continue; + if (nErr == WSAEWOULDBLOCK || nErr == WSAEINTR || nErr == WSAEINPROGRESS) + { + Sleep(10); + continue; + } } - socklen_t nRetSize = sizeof(nRet); -#ifdef WIN32 - if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, (char*)(&nRet), &nRetSize) == SOCKET_ERROR) -#else - if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR) -#endif + if (!strLine.empty()) + return true; + if (nBytes == 0) { - printf("getsockopt() for connection failed: %i\n",WSAGetLastError()); - closesocket(hSocket); + // socket closed + printf("socket closed\n"); return false; } - if (nRet != 0) + else { - printf("connect() failed after select(): %s\n",strerror(nRet)); - closesocket(hSocket); + // socket error + int nErr = WSAGetLastError(); + printf("recv failed: %d\n", nErr); return false; } } -#ifdef WIN32 - else if (WSAGetLastError() != WSAEISCONN) -#else - else -#endif - { - printf("connect() failed: %i\n",WSAGetLastError()); - closesocket(hSocket); - return false; - } - } - - /* - this isn't even strictly necessary - CNode::ConnectNode immediately turns the socket back to non-blocking - but we'll turn it back to blocking just in case - */ -#ifdef WIN32 - fNonblock = 0; - if (ioctlsocket(hSocket, FIONBIO, &fNonblock) == SOCKET_ERROR) -#else - fFlags = fcntl(hSocket, F_GETFL, 0); - if (fcntl(hSocket, F_SETFL, fFlags & !O_NONBLOCK) == SOCKET_ERROR) -#endif - { - closesocket(hSocket); - return false; - } - - if (fProxy) - { - printf("proxy connecting %s\n", addrConnect.ToString().c_str()); - char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user"; - memcpy(pszSocks4IP + 2, &addrConnect.port, 2); - memcpy(pszSocks4IP + 4, &addrConnect.ip, 4); - char* pszSocks4 = pszSocks4IP; - int nSize = sizeof(pszSocks4IP); - - int ret = send(hSocket, pszSocks4, nSize, MSG_NOSIGNAL); - if (ret != nSize) - { - closesocket(hSocket); - return error("Error sending to proxy"); - } - char pchRet[8]; - if (recv(hSocket, pchRet, 8, 0) != 8) - { - closesocket(hSocket); - return error("Error reading proxy response"); - } - if (pchRet[1] != 0x5a) - { - closesocket(hSocket); - if (pchRet[1] != 0x5b) - printf("ERROR: Proxy returned error %d\n", pchRet[1]); - return false; - } - printf("proxy connected %s\n", addrConnect.ToString().c_str()); } - - hSocketRet = hSocket; - return true; } -// portDefault is in host order -bool Lookup(const char *pszName, vector& vaddr, int nServices, int nMaxSolutions, bool fAllowLookup, int portDefault, bool fAllowPort) -{ - vaddr.clear(); - if (pszName[0] == 0) - return false; - int port = portDefault; - char psz[256]; - char *pszHost = psz; - strlcpy(psz, pszName, sizeof(psz)); - if (fAllowPort) - { - char* pszColon = strrchr(psz+1,':'); - char *pszPortEnd = NULL; - int portParsed = pszColon ? strtoul(pszColon+1, &pszPortEnd, 10) : 0; - if (pszColon && pszPortEnd && pszPortEnd[0] == 0) - { - if (psz[0] == '[' && pszColon[-1] == ']') - { - // Future: enable IPv6 colon-notation inside [] - pszHost = psz+1; - pszColon[-1] = 0; - } - else - pszColon[0] = 0; - port = portParsed; - if (port < 0 || port > USHRT_MAX) - port = USHRT_MAX; - } - } - - unsigned int addrIP = inet_addr(pszHost); - if (addrIP != INADDR_NONE) - { - // valid IP address passed - vaddr.push_back(CAddress(addrIP, port, nServices)); - return true; - } - - if (!fAllowLookup) - return false; - - struct hostent* phostent = gethostbyname(pszHost); - if (!phostent) - return false; - - if (phostent->h_addrtype != AF_INET) - return false; - - char** ppAddr = phostent->h_addr_list; - while (*ppAddr != NULL && vaddr.size() != nMaxSolutions) - { - CAddress addr(((struct in_addr*)ppAddr[0])->s_addr, port, nServices); - if (addr.IsValid()) - vaddr.push_back(addr); - ppAddr++; - } - return (vaddr.size() > 0); -} -// portDefault is in host order -bool Lookup(const char *pszName, CAddress& addr, int nServices, bool fAllowLookup, int portDefault, bool fAllowPort) -{ - vector vaddr; - bool fRet = Lookup(pszName, vaddr, nServices, 1, fAllowLookup, portDefault, fAllowPort); - if (fRet) - addr = vaddr[0]; - return fRet; -} - -bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const char* pszKeyword, unsigned int& ipRet) +bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const char* pszKeyword, CNetAddr& ipRet) { SOCKET hSocket; if (!ConnectSocket(addrConnect, hSocket)) @@ -328,11 +171,11 @@ bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const cha strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r")); while (strLine.size() > 0 && isspace(strLine[strLine.size()-1])) strLine.resize(strLine.size()-1); - CAddress addr(strLine,0,true); + CService addr(strLine,0,true); printf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str()); - if (addr.ip == 0 || addr.ip == INADDR_NONE || !addr.IsRoutable()) + if (!addr.IsValid() || !addr.IsRoutable()) return false; - ipRet = addr.ip; + ipRet.SetIP(addr); return true; } } @@ -341,13 +184,13 @@ bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const cha } // We now get our external IP from the IRC server first and only use this as a backup -bool GetMyExternalIP(unsigned int& ipRet) +bool GetMyExternalIP(CNetAddr& ipRet) { - CAddress addrConnect; + CService addrConnect; const char* pszGet; const char* pszKeyword; - if (fUseProxy) + if (fNoListen||fUseProxy) return false; for (int nLookup = 0; nLookup <= 1; nLookup++) @@ -359,11 +202,11 @@ bool GetMyExternalIP(unsigned int& ipRet) // if (nHost == 1) { - addrConnect = CAddress("91.198.22.70",80); // checkip.dyndns.org + addrConnect = CService("91.198.22.70",80); // checkip.dyndns.org if (nLookup == 1) { - CAddress addrIP("checkip.dyndns.org", 80, true); + CService addrIP("checkip.dyndns.org", 80, true); if (addrIP.IsValid()) addrConnect = addrIP; } @@ -378,11 +221,11 @@ bool GetMyExternalIP(unsigned int& ipRet) } else if (nHost == 2) { - addrConnect = CAddress("74.208.43.192", 80); // www.showmyip.com + addrConnect = CService("74.208.43.192", 80); // www.showmyip.com if (nLookup == 1) { - CAddress addrIP("www.showmyip.com", 80, true); + CService addrIP("www.showmyip.com", 80, true); if (addrIP.IsValid()) addrConnect = addrIP; } @@ -406,7 +249,7 @@ bool GetMyExternalIP(unsigned int& ipRet) void ThreadGetMyExternalIP(void* parg) { // Wait for IRC to get it first - if (!GetBoolArg("-noirc")) + if (GetBoolArg("-irc", false)) { for (int i = 0; i < 2 * 60; i++) { @@ -417,7 +260,7 @@ void ThreadGetMyExternalIP(void* parg) } // Fallback in case IRC fails to get it - if (GetMyExternalIP(addrLocalHost.ip)) + if (GetMyExternalIP(addrLocalHost)) { printf("GetMyExternalIP() returned %s\n", addrLocalHost.ToStringIP().c_str()); if (addrLocalHost.IsRoutable()) @@ -437,86 +280,9 @@ void ThreadGetMyExternalIP(void* parg) -bool AddAddress(CAddress addr, int64 nTimePenalty, CAddrDB *pAddrDB) -{ - if (!addr.IsRoutable()) - return false; - if (addr.ip == addrLocalHost.ip) - return false; - addr.nTime = max((int64)0, (int64)addr.nTime - nTimePenalty); - bool fUpdated = false; - bool fNew = false; - CAddress addrFound = addr; - - CRITICAL_BLOCK(cs_mapAddresses) - { - map, CAddress>::iterator it = mapAddresses.find(addr.GetKey()); - if (it == mapAddresses.end()) - { - // New address - printf("AddAddress(%s)\n", addr.ToString().c_str()); - mapAddresses.insert(make_pair(addr.GetKey(), addr)); - fUpdated = true; - fNew = true; - } - else - { - addrFound = (*it).second; - if ((addrFound.nServices | addr.nServices) != addrFound.nServices) - { - // Services have been added - addrFound.nServices |= addr.nServices; - fUpdated = true; - } - bool fCurrentlyOnline = (GetAdjustedTime() - addr.nTime < 24 * 60 * 60); - int64 nUpdateInterval = (fCurrentlyOnline ? 60 * 60 : 24 * 60 * 60); - if (addrFound.nTime < addr.nTime - nUpdateInterval) - { - // Periodically update most recently seen time - addrFound.nTime = addr.nTime; - fUpdated = true; - } - } - } - // There is a nasty deadlock bug if this is done inside the cs_mapAddresses - // CRITICAL_BLOCK: - // Thread 1: begin db transaction (locks inside-db-mutex) - // then AddAddress (locks cs_mapAddresses) - // Thread 2: AddAddress (locks cs_mapAddresses) - // ... then db operation hangs waiting for inside-db-mutex - if (fUpdated) - { - if (pAddrDB) - pAddrDB->WriteAddress(addrFound); - else - CAddrDB().WriteAddress(addrFound); - } - return fNew; -} - -void AddressCurrentlyConnected(const CAddress& addr) +void AddressCurrentlyConnected(const CService& addr) { - CAddress *paddrFound = NULL; - - CRITICAL_BLOCK(cs_mapAddresses) - { - // Only if it's been published already - map, CAddress>::iterator it = mapAddresses.find(addr.GetKey()); - if (it != mapAddresses.end()) - paddrFound = &(*it).second; - } - - if (paddrFound) - { - int64 nUpdateInterval = 20 * 60; - if (paddrFound->nTime < GetAdjustedTime() - nUpdateInterval) - { - // Periodically update most recently seen time - paddrFound->nTime = GetAdjustedTime(); - CAddrDB addrdb; - addrdb.WriteAddress(*paddrFound); - } - } + addrman.Connected(addr); } @@ -624,23 +390,23 @@ void CNode::CancelSubscribe(unsigned int nChannel) -CNode* FindNode(unsigned int ip) +CNode* FindNode(const CNetAddr& ip) { CRITICAL_BLOCK(cs_vNodes) { BOOST_FOREACH(CNode* pnode, vNodes) - if (pnode->addr.ip == ip) + if ((CNetAddr)pnode->addr == ip) return (pnode); } return NULL; } -CNode* FindNode(CAddress addr) +CNode* FindNode(const CService& addr) { CRITICAL_BLOCK(cs_vNodes) { BOOST_FOREACH(CNode* pnode, vNodes) - if (pnode->addr == addr) + if ((CService)pnode->addr == addr) return (pnode); } return NULL; @@ -648,11 +414,11 @@ CNode* FindNode(CAddress addr) CNode* ConnectNode(CAddress addrConnect, int64 nTimeout) { - if (addrConnect.ip == addrLocalHost.ip) + if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost) return NULL; // Look for an existing connection - CNode* pnode = FindNode(addrConnect.ip); + CNode* pnode = FindNode((CService)addrConnect); if (pnode) { if (nTimeout != 0) @@ -663,13 +429,11 @@ CNode* ConnectNode(CAddress addrConnect, int64 nTimeout) } /// debug print - printf("trying connection %s lastseen=%.1fhrs lasttry=%.1fhrs\n", + printf("trying connection %s lastseen=%.1fhrs\n", addrConnect.ToString().c_str(), - (double)(addrConnect.nTime - GetAdjustedTime())/3600.0, - (double)(addrConnect.nLastTry - GetAdjustedTime())/3600.0); + (double)(addrConnect.nTime - GetAdjustedTime())/3600.0); - CRITICAL_BLOCK(cs_mapAddresses) - mapAddresses[addrConnect.GetKey()].nLastTry = GetAdjustedTime(); + addrman.Attempt(addrConnect); // Connect SOCKET hSocket; @@ -732,7 +496,22 @@ void CNode::Cleanup() } -std::map CNode::setBanned; +void CNode::PushVersion() +{ + /// when NTP implemented, change to just nTime = GetAdjustedTime() + int64 nTime = (fInbound ? GetAdjustedTime() : GetTime()); + CAddress addrYou = (fUseProxy ? CAddress(CService("0.0.0.0",0)) : addr); + CAddress addrMe = (fUseProxy || !addrLocalHost.IsRoutable() ? CAddress(CService("0.0.0.0",0)) : addrLocalHost); + RAND_bytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce)); + PushMessage("version", PROTOCOL_VERSION, nLocalServices, nTime, addrYou, addrMe, + nLocalHostNonce, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector()), nBestHeight); +} + + + + + +std::map CNode::setBanned; CCriticalSection CNode::cs_setBanned; void CNode::ClearBanned() @@ -740,12 +519,12 @@ void CNode::ClearBanned() setBanned.clear(); } -bool CNode::IsBanned(unsigned int ip) +bool CNode::IsBanned(CNetAddr ip) { bool fResult = false; CRITICAL_BLOCK(cs_setBanned) { - std::map::iterator i = setBanned.find(ip); + std::map::iterator i = setBanned.find(ip); if (i != setBanned.end()) { int64 t = (*i).second; @@ -769,8 +548,8 @@ bool CNode::Misbehaving(int howmuch) { int64 banTime = GetTime()+GetArg("-bantime", 60*60*24); // Default 24-hour ban CRITICAL_BLOCK(cs_setBanned) - if (setBanned[addr.ip] < banTime) - setBanned[addr.ip] = banTime; + if (setBanned[addr] < banTime) + setBanned[addr] = banTime; CloseSocketDisconnect(); printf("Disconnected %s for misbehavior (score=%d)\n", addr.ToString().c_str(), nMisbehavior); return true; @@ -794,15 +573,15 @@ void ThreadSocketHandler(void* parg) IMPLEMENT_RANDOMIZE_STACK(ThreadSocketHandler(parg)); try { - vnThreadsRunning[0]++; + vnThreadsRunning[THREAD_SOCKETHANDLER]++; ThreadSocketHandler2(parg); - vnThreadsRunning[0]--; + vnThreadsRunning[THREAD_SOCKETHANDLER]--; } catch (std::exception& e) { - vnThreadsRunning[0]--; + vnThreadsRunning[THREAD_SOCKETHANDLER]--; PrintException(&e, "ThreadSocketHandler()"); } catch (...) { - vnThreadsRunning[0]--; + vnThreadsRunning[THREAD_SOCKETHANDLER]--; throw; // support pthread_cancel() } printf("ThreadSocketHandler exiting\n"); @@ -904,9 +683,9 @@ void ThreadSocketHandler2(void* parg) } } - vnThreadsRunning[0]--; + vnThreadsRunning[THREAD_SOCKETHANDLER]--; int nSelect = select(hSocketMax + 1, &fdsetRecv, &fdsetSend, &fdsetError, &timeout); - vnThreadsRunning[0]++; + vnThreadsRunning[THREAD_SOCKETHANDLER]++; if (fShutdown) return; if (nSelect == SOCKET_ERROR) @@ -950,9 +729,11 @@ void ThreadSocketHandler2(void* parg) } else if (nInbound >= GetArg("-maxconnections", 125) - MAX_OUTBOUND_CONNECTIONS) { - closesocket(hSocket); + CRITICAL_BLOCK(cs_setservAddNodeAddresses) + if (!setservAddNodeAddresses.count(addr)) + closesocket(hSocket); } - else if (CNode::IsBanned(addr.ip)) + else if (CNode::IsBanned(addr)) { printf("connection from %s dropped (banned)\n", addr.ToString().c_str()); closesocket(hSocket); @@ -1117,15 +898,15 @@ void ThreadMapPort(void* parg) IMPLEMENT_RANDOMIZE_STACK(ThreadMapPort(parg)); try { - vnThreadsRunning[5]++; + vnThreadsRunning[THREAD_UPNP]++; ThreadMapPort2(parg); - vnThreadsRunning[5]--; + vnThreadsRunning[THREAD_UPNP]--; } catch (std::exception& e) { - vnThreadsRunning[5]--; + vnThreadsRunning[THREAD_UPNP]--; PrintException(&e, "ThreadMapPort()"); } catch (...) { - vnThreadsRunning[5]--; + vnThreadsRunning[THREAD_UPNP]--; PrintException(NULL, "ThreadMapPort()"); } printf("ThreadMapPort exiting\n"); @@ -1170,7 +951,7 @@ void ThreadMapPort2(void* parg) if(externalIPAddress[0]) { printf("UPnP: ExternalIPAddress = %s\n", externalIPAddress); - CAddress addrExternalFromUPnP(externalIPAddress, 0, false, nLocalServices); + CAddress addrExternalFromUPnP(CService(externalIPAddress, 0), nLocalServices); if (addrExternalFromUPnP.IsRoutable()) addrLocalHost = addrExternalFromUPnP; } @@ -1244,9 +1025,8 @@ void MapPort(bool fMapPort) if (fUseUPnP != fMapPort) { fUseUPnP = fMapPort; - WriteSetting("fUseUPnP", fUseUPnP); } - if (fUseUPnP && vnThreadsRunning[5] < 1) + if (fUseUPnP && vnThreadsRunning[THREAD_UPNP] < 1) { if (!CreateThread(ThreadMapPort, NULL)) printf("Error: ThreadMapPort(ThreadMapPort) failed\n"); @@ -1267,12 +1047,15 @@ void MapPort(bool /* unused fMapPort */) - -static const char *strDNSSeed[] = { - "bitseed.xf2.org", - "dnsseed.bluematt.me", - "seed.bitcoin.sipa.be", - "dnsseed.bitcoin.dashjr.org", +// DNS seeds +// Each pair gives a source name and a seed name. +// The first name is used as information source for addrman. +// The second name should resolve to a list of seed addresses. +static const char *strDNSSeed[][2] = { + {"xf2.org", "bitseed.xf2.org"}, + {"bluematt.me", "dnsseed.bluematt.me"}, + {"bitcoin.sipa.be", "seed.bitcoin.sipa.be"}, + {"dashjr.org", "dnsseed.bitcoin.dashjr.org"}, }; void ThreadDNSAddressSeed(void* parg) @@ -1280,15 +1063,15 @@ void ThreadDNSAddressSeed(void* parg) IMPLEMENT_RANDOMIZE_STACK(ThreadDNSAddressSeed(parg)); try { - vnThreadsRunning[6]++; + vnThreadsRunning[THREAD_DNSSEED]++; ThreadDNSAddressSeed2(parg); - vnThreadsRunning[6]--; + vnThreadsRunning[THREAD_DNSSEED]--; } catch (std::exception& e) { - vnThreadsRunning[6]--; + vnThreadsRunning[THREAD_DNSSEED]--; PrintException(&e, "ThreadDNSAddressSeed()"); } catch (...) { - vnThreadsRunning[6]--; + vnThreadsRunning[THREAD_DNSSEED]--; throw; // support pthread_cancel() } printf("ThreadDNSAddressSeed exiting\n"); @@ -1304,22 +1087,20 @@ void ThreadDNSAddressSeed2(void* parg) printf("Loading addresses from DNS seeds (could take a while)\n"); for (int seed_idx = 0; seed_idx < ARRAYLEN(strDNSSeed); seed_idx++) { - vector vaddr; - if (Lookup(strDNSSeed[seed_idx], vaddr, NODE_NETWORK, -1, true)) + vector vaddr; + vector vAdd; + if (LookupHost(strDNSSeed[seed_idx][1], vaddr)) { - CAddrDB addrDB; - addrDB.TxnBegin(); - BOOST_FOREACH (CAddress& addr, vaddr) + BOOST_FOREACH(CNetAddr& ip, vaddr) { - if (addr.GetByte(3) != 127) - { - addr.nTime = 0; - AddAddress(addr, 0, &addrDB); - found++; - } + int nOneDay = 24*3600; + CAddress addr = CAddress(CService(ip, GetDefaultPort())); + addr.nTime = GetTime() - 3*nOneDay - GetRand(4*nOneDay); // use a random age between 3 and 7 days old + vAdd.push_back(addr); + found++; } - addrDB.TxnCommit(); // Save addresses (it's ok if this fails) } + addrman.Add(vAdd, CNetAddr(strDNSSeed[seed_idx][0], true)); } } @@ -1418,22 +1199,52 @@ unsigned int pnSeed[] = 0xc461d84a, 0xb2dbe247, }; +void DumpAddresses() +{ + CAddrDB adb; + adb.WriteAddrman(addrman); +} + +void ThreadDumpAddress2(void* parg) +{ + vnThreadsRunning[THREAD_DUMPADDRESS]++; + while (!fShutdown) + { + DumpAddresses(); + vnThreadsRunning[THREAD_DUMPADDRESS]--; + Sleep(100000); + vnThreadsRunning[THREAD_DUMPADDRESS]++; + } + vnThreadsRunning[THREAD_DUMPADDRESS]--; +} +void ThreadDumpAddress(void* parg) +{ + IMPLEMENT_RANDOMIZE_STACK(ThreadDumpAddress(parg)); + try + { + ThreadDumpAddress2(parg); + } + catch (std::exception& e) { + PrintException(&e, "ThreadDumpAddress()"); + } + printf("ThreadDumpAddress exiting\n"); +} void ThreadOpenConnections(void* parg) { IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg)); try { - vnThreadsRunning[1]++; + vnThreadsRunning[THREAD_OPENCONNECTIONS]++; ThreadOpenConnections2(parg); - vnThreadsRunning[1]--; + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; } catch (std::exception& e) { - vnThreadsRunning[1]--; + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; PrintException(&e, "ThreadOpenConnections()"); } catch (...) { - vnThreadsRunning[1]--; + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; PrintException(NULL, "ThreadOpenConnections()"); } printf("ThreadOpenConnections exiting\n"); @@ -1450,7 +1261,7 @@ void ThreadOpenConnections2(void* parg) { BOOST_FOREACH(string strAddr, mapMultiArgs["-connect"]) { - CAddress addr(strAddr, fAllowDNS); + CAddress addr(CService(strAddr, GetDefaultPort(), fAllowDNS)); if (addr.IsValid()) OpenNetworkConnection(addr); for (int i = 0; i < 10 && i < nLoop; i++) @@ -1463,36 +1274,22 @@ void ThreadOpenConnections2(void* parg) } } - // Connect to manually added nodes first - if (mapArgs.count("-addnode")) - { - BOOST_FOREACH(string strAddr, mapMultiArgs["-addnode"]) - { - CAddress addr(strAddr, fAllowDNS); - if (addr.IsValid()) - { - OpenNetworkConnection(addr); - Sleep(500); - if (fShutdown) - return; - } - } - } - // Initiate network connections int64 nStart = GetTime(); loop { - vnThreadsRunning[1]--; + int nOutbound = 0; + + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; Sleep(500); - vnThreadsRunning[1]++; + vnThreadsRunning[THREAD_OPENCONNECTIONS]++; if (fShutdown) return; // Limit outbound connections loop { - int nOutbound = 0; + nOutbound = 0; CRITICAL_BLOCK(cs_vNodes) BOOST_FOREACH(CNode* pnode, vNodes) if (!pnode->fInbound) @@ -1501,25 +1298,20 @@ void ThreadOpenConnections2(void* parg) nMaxOutboundConnections = min(nMaxOutboundConnections, (int)GetArg("-maxconnections", 125)); if (nOutbound < nMaxOutboundConnections) break; - vnThreadsRunning[1]--; + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; Sleep(2000); - vnThreadsRunning[1]++; + vnThreadsRunning[THREAD_OPENCONNECTIONS]++; if (fShutdown) return; } bool fAddSeeds = false; - CRITICAL_BLOCK(cs_mapAddresses) - { - // Add seed nodes if IRC isn't working - bool fTOR = (fUseProxy && addrProxy.port == htons(9050)); - if (mapAddresses.empty() && (GetTime() - nStart > 60 || fUseProxy) && !fTestNet) - fAddSeeds = true; - } - - if (fAddSeeds) + // Add seed nodes if IRC isn't working + bool fTOR = (fUseProxy && addrProxy.GetPort() == 9050); + if (addrman.size()==0 && (GetTime() - nStart > 60 || fTOR) && !fTestNet) { + std::vector vAdd; for (int i = 0; i < ARRAYLEN(pnSeed); i++) { // It'll only connect to one or two seed nodes because once it connects, @@ -1527,81 +1319,52 @@ void ThreadOpenConnections2(void* parg) // Seed nodes are given a random 'last seen time' of between one and two // weeks ago. const int64 nOneWeek = 7*24*60*60; - CAddress addr; - addr.ip = pnSeed[i]; + struct in_addr ip; + memcpy(&ip, &pnSeed[i], sizeof(ip)); + CAddress addr(CService(ip, GetDefaultPort())); addr.nTime = GetTime()-GetRand(nOneWeek)-nOneWeek; - AddAddress(addr); + vAdd.push_back(addr); } + addrman.Add(vAdd, CNetAddr("127.0.0.1")); } // // Choose an address to connect to based on most recently seen // CAddress addrConnect; - int64 nBest = INT64_MIN; + int64 nBest = std::numeric_limits::min(); // Only connect to one address per a.b.?.? range. // Do this here so we don't have to critsect vNodes inside mapAddresses critsect. - set setConnected; + set > setConnected; CRITICAL_BLOCK(cs_vNodes) BOOST_FOREACH(CNode* pnode, vNodes) - setConnected.insert(pnode->addr.ip & 0x0000ffff); + setConnected.insert(pnode->addr.GetGroup()); int64 nANow = GetAdjustedTime(); - CRITICAL_BLOCK(cs_mapAddresses) + int nTries = 0; + loop { - BOOST_FOREACH(const PAIRTYPE(vector, CAddress)& item, mapAddresses) - { - const CAddress& addr = item.second; - if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.ip & 0x0000ffff)) - continue; - int64 nSinceLastSeen = nANow - addr.nTime; - int64 nSinceLastTry = nANow - addr.nLastTry; - - // Randomize the order in a deterministic way, putting the standard port first - int64 nRandomizer = (uint64)(nStart * 4951 + addr.nLastTry * 9567851 + addr.ip * 7789) % (2 * 60 * 60); - if (addr.port != htons(GetDefaultPort())) - nRandomizer += 2 * 60 * 60; - - // Last seen Base retry frequency - // <1 hour 10 min - // 1 hour 1 hour - // 4 hours 2 hours - // 24 hours 5 hours - // 48 hours 7 hours - // 7 days 13 hours - // 30 days 27 hours - // 90 days 46 hours - // 365 days 93 hours - int64 nDelay = (int64)(3600.0 * sqrt(fabs((double)nSinceLastSeen) / 3600.0) + nRandomizer); - - // Fast reconnect for one hour after last seen - if (nSinceLastSeen < 60 * 60) - nDelay = 10 * 60; - - // Limit retry frequency - if (nSinceLastTry < nDelay) - continue; + // use an nUnkBias between 10 (no outgoing connections) and 90 (8 outgoing connections) + CAddress addr = addrman.Select(10 + min(nOutbound,8)*10); - // If we have IRC, we'll be notified when they first come online, - // and again every 24 hours by the refresh broadcast. - if (nGotIRCAddresses > 0 && vNodes.size() >= 2 && nSinceLastSeen > 24 * 60 * 60) - continue; + // if we selected an invalid address, restart + if (!addr.IsIPv4() || !addr.IsValid() || setConnected.count(addr.GetGroup()) || addr == addrLocalHost) + break; - // Only try the old stuff if we don't have enough connections - if (vNodes.size() >= 8 && nSinceLastSeen > 24 * 60 * 60) - continue; + nTries++; - // If multiple addresses are ready, prioritize by time since - // last seen and time since last tried. - int64 nScore = min(nSinceLastTry, (int64)24 * 60 * 60) - nSinceLastSeen - nRandomizer; - if (nScore > nBest) - { - nBest = nScore; - addrConnect = addr; - } - } + // only consider very recently tried nodes after 30 failed attempts + if (nANow - addr.nLastTry < 600 && nTries < 30) + continue; + + // do not allow non-default ports, unless after 50 invalid addresses selected already + if (addr.GetPort() != GetDefaultPort() && nTries < 50) + continue; + + addrConnect = addr; + break; } if (addrConnect.IsValid()) @@ -1609,6 +1372,76 @@ void ThreadOpenConnections2(void* parg) } } +void ThreadOpenAddedConnections(void* parg) +{ + IMPLEMENT_RANDOMIZE_STACK(ThreadOpenAddedConnections(parg)); + try + { + vnThreadsRunning[THREAD_ADDEDCONNECTIONS]++; + ThreadOpenAddedConnections2(parg); + vnThreadsRunning[THREAD_ADDEDCONNECTIONS]--; + } + catch (std::exception& e) { + vnThreadsRunning[THREAD_ADDEDCONNECTIONS]--; + PrintException(&e, "ThreadOpenAddedConnections()"); + } catch (...) { + vnThreadsRunning[THREAD_ADDEDCONNECTIONS]--; + PrintException(NULL, "ThreadOpenAddedConnections()"); + } + printf("ThreadOpenAddedConnections exiting\n"); +} + +void ThreadOpenAddedConnections2(void* parg) +{ + printf("ThreadOpenAddedConnections started\n"); + + if (mapArgs.count("-addnode") == 0) + return; + + vector > vservAddressesToAdd(0); + BOOST_FOREACH(string& strAddNode, mapMultiArgs["-addnode"]) + { + vector vservNode(0); + if(Lookup(strAddNode.c_str(), vservNode, GetDefaultPort(), fAllowDNS, 0)) + { + vservAddressesToAdd.push_back(vservNode); + CRITICAL_BLOCK(cs_setservAddNodeAddresses) + BOOST_FOREACH(CService& serv, vservNode) + setservAddNodeAddresses.insert(serv); + } + } + loop + { + vector > vservConnectAddresses = vservAddressesToAdd; + // Attempt to connect to each IP for each addnode entry until at least one is successful per addnode entry + // (keeping in mind that addnode entries can have many IPs if fAllowDNS) + CRITICAL_BLOCK(cs_vNodes) + BOOST_FOREACH(CNode* pnode, vNodes) + for (vector >::iterator it = vservConnectAddresses.begin(); it != vservConnectAddresses.end(); it++) + BOOST_FOREACH(CService& addrNode, *(it)) + if (pnode->addr == addrNode) + { + it = vservConnectAddresses.erase(it); + it--; + break; + } + BOOST_FOREACH(vector& vserv, vservConnectAddresses) + { + OpenNetworkConnection(CAddress(*(vserv.begin()))); + Sleep(500); + if (fShutdown) + return; + } + if (fShutdown) + return; + vnThreadsRunning[THREAD_ADDEDCONNECTIONS]--; + Sleep(120000); // Retry every 2 minutes + vnThreadsRunning[THREAD_ADDEDCONNECTIONS]++; + if (fShutdown) + return; + } +} + bool OpenNetworkConnection(const CAddress& addrConnect) { // @@ -1616,13 +1449,13 @@ bool OpenNetworkConnection(const CAddress& addrConnect) // if (fShutdown) return false; - if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || - FindNode(addrConnect.ip) || CNode::IsBanned(addrConnect.ip)) + if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost || !addrConnect.IsIPv4() || + FindNode((CNetAddr)addrConnect) || CNode::IsBanned(addrConnect)) return false; - vnThreadsRunning[1]--; + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; CNode* pnode = ConnectNode(addrConnect); - vnThreadsRunning[1]++; + vnThreadsRunning[THREAD_OPENCONNECTIONS]++; if (fShutdown) return false; if (!pnode) @@ -1644,15 +1477,15 @@ void ThreadMessageHandler(void* parg) IMPLEMENT_RANDOMIZE_STACK(ThreadMessageHandler(parg)); try { - vnThreadsRunning[2]++; + vnThreadsRunning[THREAD_MESSAGEHANDLER]++; ThreadMessageHandler2(parg); - vnThreadsRunning[2]--; + vnThreadsRunning[THREAD_MESSAGEHANDLER]--; } catch (std::exception& e) { - vnThreadsRunning[2]--; + vnThreadsRunning[THREAD_MESSAGEHANDLER]--; PrintException(&e, "ThreadMessageHandler()"); } catch (...) { - vnThreadsRunning[2]--; + vnThreadsRunning[THREAD_MESSAGEHANDLER]--; PrintException(NULL, "ThreadMessageHandler()"); } printf("ThreadMessageHandler exiting\n"); @@ -1700,11 +1533,11 @@ void ThreadMessageHandler2(void* parg) // Wait and allow messages to bunch up. // Reduce vnThreadsRunning so StopNode has permission to exit while // we're sleeping, but we must always check fShutdown after doing this. - vnThreadsRunning[2]--; + vnThreadsRunning[THREAD_MESSAGEHANDLER]--; Sleep(100); if (fRequestShutdown) Shutdown(NULL); - vnThreadsRunning[2]++; + vnThreadsRunning[THREAD_MESSAGEHANDLER]++; if (fShutdown) return; } @@ -1719,7 +1552,7 @@ bool BindListenPort(string& strError) { strError = ""; int nOne = 1; - addrLocalHost.port = htons(GetListenPort()); + addrLocalHost.SetPort(GetListenPort()); #ifdef WIN32 // Initialize Windows Sockets @@ -1797,20 +1630,28 @@ bool BindListenPort(string& strError) void StartNode(void* parg) { +#ifdef USE_UPNP +#if USE_UPNP + fUseUPnP = GetBoolArg("-upnp", true); +#else + fUseUPnP = GetBoolArg("-upnp", false); +#endif +#endif + if (pnodeLocalHost == NULL) - pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress("127.0.0.1", 0, false, nLocalServices)); + pnodeLocalHost = new CNode(INVALID_SOCKET, CAddress(CService("127.0.0.1", 0), nLocalServices)); #ifdef WIN32 // Get local host ip char pszHostName[1000] = ""; if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR) { - vector vaddr; - if (Lookup(pszHostName, vaddr, nLocalServices, -1, true)) - BOOST_FOREACH (const CAddress &addr, vaddr) - if (addr.GetByte(3) != 127) + vector vaddr; + if (LookupHost(pszHostName, vaddr)) + BOOST_FOREACH (const CNetAddr &addr, vaddr) + if (!addr.IsLocal()) { - addrLocalHost = addr; + addrLocalHost.SetIP(addr); break; } } @@ -1833,8 +1674,8 @@ void StartNode(void* parg) printf("ipv4 %s: %s\n", ifa->ifa_name, pszIP); // Take the first IP that isn't loopback 127.x.x.x - CAddress addr(*(unsigned int*)&s4->sin_addr, GetListenPort(), nLocalServices); - if (addr.IsValid() && addr.GetByte(3) != 127) + CAddress addr(CService(s4->sin_addr, GetListenPort()), nLocalServices); + if (addr.IsValid() && !addr.IsLocal()) { addrLocalHost = addr; break; @@ -1855,7 +1696,7 @@ void StartNode(void* parg) if (fUseProxy || mapArgs.count("-connect") || fNoListen) { // Proxies can't take incoming connections - addrLocalHost.ip = CAddress("0.0.0.0").ip; + addrLocalHost.SetIP(CNetAddr("0.0.0.0")); printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str()); } else @@ -1867,7 +1708,7 @@ void StartNode(void* parg) // Start threads // - if (GetBoolArg("-nodnsseed")) + if (!GetBoolArg("-dnsseed", true)) printf("DNS seeding disabled\n"); else if (!CreateThread(ThreadDNSAddressSeed, NULL)) @@ -1885,6 +1726,10 @@ void StartNode(void* parg) if (!CreateThread(ThreadSocketHandler, NULL)) printf("Error: CreateThread(ThreadSocketHandler) failed\n"); + // Initiate outbound connections from -addnode + if (!CreateThread(ThreadOpenAddedConnections, NULL)) + printf("Error: CreateThread(ThreadOpenAddedConnections) failed\n"); + // Initiate outbound connections if (!CreateThread(ThreadOpenConnections, NULL)) printf("Error: CreateThread(ThreadOpenConnections) failed\n"); @@ -1893,8 +1738,12 @@ void StartNode(void* parg) if (!CreateThread(ThreadMessageHandler, NULL)) printf("Error: CreateThread(ThreadMessageHandler) failed\n"); + // Dump network addresses + if (!CreateThread(ThreadDumpAddress, NULL)) + printf("Error; CreateThread(ThreadDumpAddress) failed\n"); + // Generate coins in the background - GenerateBitcoins(fGenerateBitcoins, pwalletMain); + GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain); } bool StopNode() @@ -1903,27 +1752,30 @@ bool StopNode() fShutdown = true; nTransactionsUpdated++; int64 nStart = GetTime(); - while (vnThreadsRunning[0] > 0 || vnThreadsRunning[1] > 0 || vnThreadsRunning[2] > 0 || vnThreadsRunning[3] > 0 || vnThreadsRunning[4] > 0 -#ifdef USE_UPNP - || vnThreadsRunning[5] > 0 -#endif - ) + do { + int nThreadsRunning = 0; + for (int n = 0; n < THREAD_MAX; n++) + nThreadsRunning += vnThreadsRunning[n]; + if (nThreadsRunning == 0) + break; if (GetTime() - nStart > 20) break; Sleep(20); - } - if (vnThreadsRunning[0] > 0) printf("ThreadSocketHandler still running\n"); - if (vnThreadsRunning[1] > 0) printf("ThreadOpenConnections still running\n"); - if (vnThreadsRunning[2] > 0) printf("ThreadMessageHandler still running\n"); - if (vnThreadsRunning[3] > 0) printf("ThreadBitcoinMiner still running\n"); - if (vnThreadsRunning[4] > 0) printf("ThreadRPCServer still running\n"); - if (fHaveUPnP && vnThreadsRunning[5] > 0) printf("ThreadMapPort still running\n"); - if (vnThreadsRunning[6] > 0) printf("ThreadDNSAddressSeed still running\n"); - while (vnThreadsRunning[2] > 0 || vnThreadsRunning[4] > 0) + } while(true); + if (vnThreadsRunning[THREAD_SOCKETHANDLER] > 0) printf("ThreadSocketHandler still running\n"); + if (vnThreadsRunning[THREAD_OPENCONNECTIONS] > 0) printf("ThreadOpenConnections still running\n"); + if (vnThreadsRunning[THREAD_MESSAGEHANDLER] > 0) printf("ThreadMessageHandler still running\n"); + if (vnThreadsRunning[THREAD_MINER] > 0) printf("ThreadBitcoinMiner still running\n"); + if (vnThreadsRunning[THREAD_RPCSERVER] > 0) printf("ThreadRPCServer still running\n"); + if (fHaveUPnP && vnThreadsRunning[THREAD_UPNP] > 0) printf("ThreadMapPort still running\n"); + if (vnThreadsRunning[THREAD_DNSSEED] > 0) printf("ThreadDNSAddressSeed still running\n"); + if (vnThreadsRunning[THREAD_ADDEDCONNECTIONS] > 0) printf("ThreadOpenAddedConnections still running\n"); + if (vnThreadsRunning[THREAD_DUMPADDRESS] > 0) printf("ThreadDumpAddresses still running\n"); + while (vnThreadsRunning[THREAD_MESSAGEHANDLER] > 0 || vnThreadsRunning[THREAD_RPCSERVER] > 0) Sleep(20); Sleep(50); - + DumpAddresses(); return true; } diff --git a/src/net.h b/src/net.h index 55f4d74..ed9954b 100644 --- a/src/net.h +++ b/src/net.h @@ -14,14 +14,16 @@ #include #endif +#include "mruset.h" +#include "netbase.h" #include "protocol.h" +#include "addrman.h" class CAddrDB; class CRequestTracker; class CNode; class CBlockIndex; extern int nBestHeight; -extern int nConnectTimeout; @@ -29,13 +31,11 @@ inline unsigned int ReceiveBufferSize() { return 1000*GetArg("-maxreceivebuffer" inline unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", 10*1000); } static const unsigned int PUBLISH_HOPS = 5; -bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet, int nTimeout=nConnectTimeout); -bool Lookup(const char *pszName, std::vector& vaddr, int nServices, int nMaxSolutions, bool fAllowLookup = false, int portDefault = 0, bool fAllowPort = false); -bool Lookup(const char *pszName, CAddress& addr, int nServices, bool fAllowLookup = false, int portDefault = 0, bool fAllowPort = false); -bool GetMyExternalIP(unsigned int& ipRet); -bool AddAddress(CAddress addr, int64 nTimePenalty=0, CAddrDB *pAddrDB=NULL); -void AddressCurrentlyConnected(const CAddress& addr); -CNode* FindNode(unsigned int ip); +bool RecvLine(SOCKET hSocket, std::string& strLine); +bool GetMyExternalIP(CNetAddr& ipRet); +void AddressCurrentlyConnected(const CService& addr); +CNode* FindNode(const CNetAddr& ip); +CNode* FindNode(const CService& ip); CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0); void AbandonRequests(void (*fn)(void*, CDataStream&), void* param1); bool AnySubscribed(unsigned int nChannel); @@ -69,34 +69,43 @@ public: }; - - +/** Thread types */ +enum threadId +{ + THREAD_SOCKETHANDLER, + THREAD_OPENCONNECTIONS, + THREAD_MESSAGEHANDLER, + THREAD_MINER, + THREAD_RPCSERVER, + THREAD_UPNP, + THREAD_DNSSEED, + THREAD_ADDEDCONNECTIONS, + THREAD_DUMPADDRESS, + + THREAD_MAX +}; extern bool fClient; extern bool fAllowDNS; extern uint64 nLocalServices; extern CAddress addrLocalHost; extern uint64 nLocalHostNonce; -extern boost::array vnThreadsRunning; +extern boost::array vnThreadsRunning; +extern CAddrMan addrman; extern std::vector vNodes; extern CCriticalSection cs_vNodes; -extern std::map, CAddress> mapAddresses; -extern CCriticalSection cs_mapAddresses; extern std::map mapRelay; extern std::deque > vRelayExpiration; extern CCriticalSection cs_mapRelay; extern std::map mapAlreadyAskedFor; -// Settings -extern int fUseProxy; -extern CAddress addrProxy; - +/** Information about a peer */ class CNode { public: @@ -126,7 +135,7 @@ protected: // Denial-of-service detection/prevention // Key is ip address, value is banned-until-time - static std::map setBanned; + static std::map setBanned; static CCriticalSection cs_setBanned; int nMisbehavior; @@ -146,7 +155,7 @@ public: std::set setKnown; // inventory based relay - std::set setInventoryKnown; + mruset setInventoryKnown; std::vector vInventoryToSend; CCriticalSection cs_inventory; std::multimap mapAskFor; @@ -159,15 +168,9 @@ public: nServices = 0; hSocket = hSocketIn; vSend.SetType(SER_NETWORK); - vSend.SetVersion(0); vRecv.SetType(SER_NETWORK); - vRecv.SetVersion(0); - // Version 0.2 obsoletes 20 Feb 2012 - if (GetTime() > 1329696000) - { - vSend.SetVersion(209); - vRecv.SetVersion(209); - } + vSend.SetVersion(209); + vRecv.SetVersion(209); nLastSend = 0; nLastRecv = 0; nLastSendEmpty = GetTime(); @@ -191,6 +194,7 @@ public: fGetAddr = false; vfSubscribe.assign(256, false); nMisbehavior = 0; + setInventoryKnown.max_size(SendBufferSize() / 1000); // Be shy and don't send version until we hear if (!fInbound) @@ -326,14 +330,11 @@ public: memcpy((char*)&vSend[nHeaderStart] + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize)); // Set the checksum - if (vSend.GetVersion() >= 209) - { - uint256 hash = Hash(vSend.begin() + nMessageStart, vSend.end()); - unsigned int nChecksum = 0; - memcpy(&nChecksum, &hash, sizeof(nChecksum)); - assert(nMessageStart - nHeaderStart >= offsetof(CMessageHeader, nChecksum) + sizeof(nChecksum)); - memcpy((char*)&vSend[nHeaderStart] + offsetof(CMessageHeader, nChecksum), &nChecksum, sizeof(nChecksum)); - } + uint256 hash = Hash(vSend.begin() + nMessageStart, vSend.end()); + unsigned int nChecksum = 0; + memcpy(&nChecksum, &hash, sizeof(nChecksum)); + assert(nMessageStart - nHeaderStart >= offsetof(CMessageHeader, nChecksum) + sizeof(nChecksum)); + memcpy((char*)&vSend[nHeaderStart] + offsetof(CMessageHeader, nChecksum), &nChecksum, sizeof(nChecksum)); if (fDebug) { printf("(%d bytes)\n", nSize); @@ -357,18 +358,7 @@ public: - void PushVersion() - { - /// when NTP implemented, change to just nTime = GetAdjustedTime() - int64 nTime = (fInbound ? GetAdjustedTime() : GetTime()); - CAddress addrYou = (fUseProxy ? CAddress("0.0.0.0") : addr); - CAddress addrMe = (fUseProxy || !addrLocalHost.IsRoutable() ? CAddress("0.0.0.0") : addrLocalHost); - RAND_bytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce)); - PushMessage("version", VERSION, nLocalServices, nTime, addrYou, addrMe, - nLocalHostNonce, std::string(pszSubVer), nBestHeight); - } - - + void PushVersion(); void PushMessage(const char* pszCommand) @@ -593,7 +583,7 @@ public: // between nodes running old code and nodes running // new code. static void ClearBanned(); // needed for unit testing - static bool IsBanned(unsigned int ip); + static bool IsBanned(CNetAddr ip); bool Misbehaving(int howmuch); // 1 == a little, 100 == a lot }; diff --git a/src/netbase.cpp b/src/netbase.cpp new file mode 100644 index 0000000..baf7c41 --- /dev/null +++ b/src/netbase.cpp @@ -0,0 +1,738 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2012 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. + +#include "netbase.h" +#include "util.h" + +#ifndef WIN32 +#include +#endif + +#include "strlcpy.h" + +using namespace std; + +// Settings +int fUseProxy = false; +CService addrProxy("127.0.0.1",9050); +int nConnectTimeout = 5000; + + +static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }; + +bool static LookupIntern(const char *pszName, std::vector& vIP, int nMaxSolutions, bool fAllowLookup) +{ + vIP.clear(); + struct addrinfo aiHint; + memset(&aiHint, 0, sizeof(struct addrinfo)); + + aiHint.ai_socktype = SOCK_STREAM; + aiHint.ai_protocol = IPPROTO_TCP; +#ifdef WIN32 +# ifdef USE_IPV6 + aiHint.ai_family = AF_UNSPEC; + aiHint.ai_flags = fAllowLookup ? 0 : AI_NUMERICHOST; +# else + aiHint.ai_family = AF_INET; + aiHint.ai_flags = fAllowLookup ? 0 : AI_NUMERICHOST; +# endif +#else +# ifdef USE_IPV6 + aiHint.ai_family = AF_UNSPEC; + aiHint.ai_flags = AI_ADDRCONFIG | (fAllowLookup ? 0 : AI_NUMERICHOST); +# else + aiHint.ai_family = AF_INET; + aiHint.ai_flags = AI_ADDRCONFIG | (fAllowLookup ? 0 : AI_NUMERICHOST); +# endif +#endif + struct addrinfo *aiRes = NULL; + int nErr = getaddrinfo(pszName, NULL, &aiHint, &aiRes); + if (nErr) + return false; + + struct addrinfo *aiTrav = aiRes; + while (aiTrav != NULL && (nMaxSolutions == 0 || vIP.size() < nMaxSolutions)) + { + if (aiTrav->ai_family == AF_INET) + { + assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in)); + vIP.push_back(CNetAddr(((struct sockaddr_in*)(aiTrav->ai_addr))->sin_addr)); + } + +#ifdef USE_IPV6 + if (aiTrav->ai_family == AF_INET6) + { + assert(aiTrav->ai_addrlen >= sizeof(sockaddr_in6)); + vIP.push_back(CNetAddr(((struct sockaddr_in6*)(aiTrav->ai_addr))->sin6_addr)); + } +#endif + + aiTrav = aiTrav->ai_next; + } + + freeaddrinfo(aiRes); + + return (vIP.size() > 0); +} + +bool LookupHost(const char *pszName, std::vector& vIP, int nMaxSolutions, bool fAllowLookup) +{ + if (pszName[0] == 0) + return false; + char psz[256]; + char *pszHost = psz; + strlcpy(psz, pszName, sizeof(psz)); + if (psz[0] == '[' && psz[strlen(psz)-1] == ']') + { + pszHost = psz+1; + psz[strlen(psz)-1] = 0; + } + + return LookupIntern(pszHost, vIP, nMaxSolutions, fAllowLookup); +} + +bool LookupHostNumeric(const char *pszName, std::vector& vIP, int nMaxSolutions) +{ + return LookupHost(pszName, vIP, nMaxSolutions, false); +} + +bool Lookup(const char *pszName, std::vector& vAddr, int portDefault, bool fAllowLookup, int nMaxSolutions) +{ + if (pszName[0] == 0) + return false; + int port = portDefault; + char psz[256]; + char *pszHost = psz; + strlcpy(psz, pszName, sizeof(psz)); + char* pszColon = strrchr(psz+1,':'); + char *pszPortEnd = NULL; + int portParsed = pszColon ? strtoul(pszColon+1, &pszPortEnd, 10) : 0; + if (pszColon && pszPortEnd && pszPortEnd[0] == 0) + { + if (psz[0] == '[' && pszColon[-1] == ']') + { + pszHost = psz+1; + pszColon[-1] = 0; + } + else + pszColon[0] = 0; + if (port >= 0 && port <= USHRT_MAX) + port = portParsed; + } + else + { + if (psz[0] == '[' && psz[strlen(psz)-1] == ']') + { + pszHost = psz+1; + psz[strlen(psz)-1] = 0; + } + + } + + std::vector vIP; + bool fRet = LookupIntern(pszHost, vIP, nMaxSolutions, fAllowLookup); + if (!fRet) + return false; + vAddr.resize(vIP.size()); + for (int i = 0; i < vIP.size(); i++) + vAddr[i] = CService(vIP[i], port); + return true; +} + +bool Lookup(const char *pszName, CService& addr, int portDefault, bool fAllowLookup) +{ + std::vector vService; + bool fRet = Lookup(pszName, vService, portDefault, fAllowLookup, 1); + if (!fRet) + return false; + addr = vService[0]; + return true; +} + +bool LookupNumeric(const char *pszName, CService& addr, int portDefault) +{ + return Lookup(pszName, addr, portDefault, false); +} + +bool ConnectSocket(const CService &addrDest, SOCKET& hSocketRet, int nTimeout) +{ + hSocketRet = INVALID_SOCKET; + + SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (hSocket == INVALID_SOCKET) + return false; +#ifdef SO_NOSIGPIPE + int set = 1; + setsockopt(hSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int)); +#endif + + bool fProxy = (fUseProxy && addrDest.IsRoutable()); + struct sockaddr_in sockaddr; + if (fProxy) + addrProxy.GetSockAddr(&sockaddr); + else + addrDest.GetSockAddr(&sockaddr); + +#ifdef WIN32 + u_long fNonblock = 1; + if (ioctlsocket(hSocket, FIONBIO, &fNonblock) == SOCKET_ERROR) +#else + int fFlags = fcntl(hSocket, F_GETFL, 0); + if (fcntl(hSocket, F_SETFL, fFlags | O_NONBLOCK) == -1) +#endif + { + closesocket(hSocket); + return false; + } + + + if (connect(hSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) + { + // WSAEINVAL is here because some legacy version of winsock uses it + if (WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAEINVAL) + { + struct timeval timeout; + timeout.tv_sec = nTimeout / 1000; + timeout.tv_usec = (nTimeout % 1000) * 1000; + + fd_set fdset; + FD_ZERO(&fdset); + FD_SET(hSocket, &fdset); + int nRet = select(hSocket + 1, NULL, &fdset, NULL, &timeout); + if (nRet == 0) + { + printf("connection timeout\n"); + closesocket(hSocket); + return false; + } + if (nRet == SOCKET_ERROR) + { + printf("select() for connection failed: %i\n",WSAGetLastError()); + closesocket(hSocket); + return false; + } + socklen_t nRetSize = sizeof(nRet); +#ifdef WIN32 + if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, (char*)(&nRet), &nRetSize) == SOCKET_ERROR) +#else + if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR) +#endif + { + printf("getsockopt() for connection failed: %i\n",WSAGetLastError()); + closesocket(hSocket); + return false; + } + if (nRet != 0) + { + printf("connect() failed after select(): %s\n",strerror(nRet)); + closesocket(hSocket); + return false; + } + } +#ifdef WIN32 + else if (WSAGetLastError() != WSAEISCONN) +#else + else +#endif + { + printf("connect() failed: %i\n",WSAGetLastError()); + closesocket(hSocket); + return false; + } + } + + // this isn't even strictly necessary + // CNode::ConnectNode immediately turns the socket back to non-blocking + // but we'll turn it back to blocking just in case +#ifdef WIN32 + fNonblock = 0; + if (ioctlsocket(hSocket, FIONBIO, &fNonblock) == SOCKET_ERROR) +#else + fFlags = fcntl(hSocket, F_GETFL, 0); + if (fcntl(hSocket, F_SETFL, fFlags & !O_NONBLOCK) == SOCKET_ERROR) +#endif + { + closesocket(hSocket); + return false; + } + + if (fProxy) + { + printf("proxy connecting %s\n", addrDest.ToString().c_str()); + char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user"; + struct sockaddr_in addr; + addrDest.GetSockAddr(&addr); + memcpy(pszSocks4IP + 2, &addr.sin_port, 2); + memcpy(pszSocks4IP + 4, &addr.sin_addr, 4); + char* pszSocks4 = pszSocks4IP; + int nSize = sizeof(pszSocks4IP); + + int ret = send(hSocket, pszSocks4, nSize, MSG_NOSIGNAL); + if (ret != nSize) + { + closesocket(hSocket); + return error("Error sending to proxy"); + } + char pchRet[8]; + if (recv(hSocket, pchRet, 8, 0) != 8) + { + closesocket(hSocket); + return error("Error reading proxy response"); + } + if (pchRet[1] != 0x5a) + { + closesocket(hSocket); + if (pchRet[1] != 0x5b) + printf("ERROR: Proxy returned error %d\n", pchRet[1]); + return false; + } + printf("proxy connected %s\n", addrDest.ToString().c_str()); + } + + hSocketRet = hSocket; + return true; +} + +void CNetAddr::Init() +{ + memset(ip, 0, 16); +} + +void CNetAddr::SetIP(const CNetAddr& ipIn) +{ + memcpy(ip, ipIn.ip, sizeof(ip)); +} + +CNetAddr::CNetAddr() +{ + Init(); +} + +CNetAddr::CNetAddr(const struct in_addr& ipv4Addr) +{ + memcpy(ip, pchIPv4, 12); + memcpy(ip+12, &ipv4Addr, 4); +} + +#ifdef USE_IPV6 +CNetAddr::CNetAddr(const struct in6_addr& ipv6Addr) +{ + memcpy(ip, &ipv6Addr, 16); +} +#endif + +CNetAddr::CNetAddr(const char *pszIp, bool fAllowLookup) +{ + Init(); + std::vector vIP; + if (LookupHost(pszIp, vIP, 1, fAllowLookup)) + *this = vIP[0]; +} + +CNetAddr::CNetAddr(const std::string &strIp, bool fAllowLookup) +{ + Init(); + std::vector vIP; + if (LookupHost(strIp.c_str(), vIP, 1, fAllowLookup)) + *this = vIP[0]; +} + +int CNetAddr::GetByte(int n) const +{ + return ip[15-n]; +} + +bool CNetAddr::IsIPv4() const +{ + return (memcmp(ip, pchIPv4, sizeof(pchIPv4)) == 0); +} + +bool CNetAddr::IsRFC1918() const +{ + return IsIPv4() && ( + GetByte(3) == 10 || + (GetByte(3) == 192 && GetByte(2) == 168) || + (GetByte(3) == 172 && (GetByte(2) >= 16 && GetByte(2) <= 31))); +} + +bool CNetAddr::IsRFC3927() const +{ + return IsIPv4() && (GetByte(3) == 169 && GetByte(2) == 254); +} + +bool CNetAddr::IsRFC3849() const +{ + return GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x0D && GetByte(12) == 0xB8; +} + +bool CNetAddr::IsRFC3964() const +{ + return (GetByte(15) == 0x20 && GetByte(14) == 0x02); +} + +bool CNetAddr::IsRFC6052() const +{ + static const unsigned char pchRFC6052[] = {0,0x64,0xFF,0x9B,0,0,0,0,0,0,0,0}; + return (memcmp(ip, pchRFC6052, sizeof(pchRFC6052)) == 0); +} + +bool CNetAddr::IsRFC4380() const +{ + return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0 && GetByte(12) == 0); +} + +bool CNetAddr::IsRFC4862() const +{ + static const unsigned char pchRFC4862[] = {0xFE,0x80,0,0,0,0,0,0}; + return (memcmp(ip, pchRFC4862, sizeof(pchRFC4862)) == 0); +} + +bool CNetAddr::IsRFC4193() const +{ + return ((GetByte(15) & 0xFE) == 0xFC); +} + +bool CNetAddr::IsRFC6145() const +{ + static const unsigned char pchRFC6145[] = {0,0,0,0,0,0,0,0,0xFF,0xFF,0,0}; + return (memcmp(ip, pchRFC6145, sizeof(pchRFC6145)) == 0); +} + +bool CNetAddr::IsRFC4843() const +{ + return (GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x00 && (GetByte(12) & 0xF0) == 0x10); +} + +bool CNetAddr::IsLocal() const +{ + // IPv4 loopback + if (IsIPv4() && (GetByte(3) == 127 || GetByte(3) == 0)) + return true; + + // IPv6 loopback (::1/128) + static const unsigned char pchLocal[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; + if (memcmp(ip, pchLocal, 16) == 0) + return true; + + return false; +} + +bool CNetAddr::IsMulticast() const +{ + return (IsIPv4() && (GetByte(3) & 0xF0) == 0xE0) + || (GetByte(15) == 0xFF); +} + +bool CNetAddr::IsValid() const +{ + // Clean up 3-byte shifted addresses caused by garbage in size field + // of addr messages from versions before 0.2.9 checksum. + // Two consecutive addr messages look like this: + // header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26... + // so if the first length field is garbled, it reads the second batch + // of addr misaligned by 3 bytes. + if (memcmp(ip, pchIPv4+3, sizeof(pchIPv4)-3) == 0) + return false; + + // unspecified IPv6 address (::/128) + unsigned char ipNone[16] = {}; + if (memcmp(ip, ipNone, 16) == 0) + return false; + + // documentation IPv6 address + if (IsRFC3849()) + return false; + + if (IsIPv4()) + { + // INADDR_NONE + uint32_t ipNone = INADDR_NONE; + if (memcmp(ip+12, &ipNone, 4) == 0) + return false; + + // 0 + ipNone = 0; + if (memcmp(ip+12, &ipNone, 4) == 0) + return false; + } + + return true; +} + +bool CNetAddr::IsRoutable() const +{ + return IsValid() && !(IsRFC1918() || IsRFC3927() || IsRFC4862() || IsRFC4193() || IsRFC4843() || IsLocal()); +} + +std::string CNetAddr::ToStringIP() const +{ + if (IsIPv4()) + return strprintf("%u.%u.%u.%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0)); + else + return strprintf("%x:%x:%x:%x:%x:%x:%x:%x", + GetByte(15) << 8 | GetByte(14), GetByte(13) << 8 | GetByte(12), + GetByte(11) << 8 | GetByte(10), GetByte(9) << 8 | GetByte(8), + GetByte(7) << 8 | GetByte(6), GetByte(5) << 8 | GetByte(4), + GetByte(3) << 8 | GetByte(2), GetByte(1) << 8 | GetByte(0)); +} + +std::string CNetAddr::ToString() const +{ + return ToStringIP(); +} + +bool operator==(const CNetAddr& a, const CNetAddr& b) +{ + return (memcmp(a.ip, b.ip, 16) == 0); +} + +bool operator!=(const CNetAddr& a, const CNetAddr& b) +{ + return (memcmp(a.ip, b.ip, 16) != 0); +} + +bool operator<(const CNetAddr& a, const CNetAddr& b) +{ + return (memcmp(a.ip, b.ip, 16) < 0); +} + +bool CNetAddr::GetInAddr(struct in_addr* pipv4Addr) const +{ + if (!IsIPv4()) + return false; + memcpy(pipv4Addr, ip+12, 4); + return true; +} + +#ifdef USE_IPV6 +bool CNetAddr::GetIn6Addr(struct in6_addr* pipv6Addr) const +{ + memcpy(pipv6Addr, ip, 16); + return true; +} +#endif + +// get canonical identifier of an address' group +// no two connections will be attempted to addresses with the same group +std::vector CNetAddr::GetGroup() const +{ + std::vector vchRet; + int nClass = 0; // 0=IPv6, 1=IPv4, 254=local, 255=unroutable + int nStartByte = 0; + int nBits = 16; + + // all local addresses belong to the same group + if (IsLocal()) + { + nClass = 254; + nBits = 0; + } + + // all unroutable addresses belong to the same group + if (!IsRoutable()) + { + nClass = 255; + nBits = 0; + } + // for IPv4 addresses, '1' + the 16 higher-order bits of the IP + // includes mapped IPv4, SIIT translated IPv4, and the well-known prefix + else if (IsIPv4() || IsRFC6145() || IsRFC6052()) + { + nClass = 1; + nStartByte = 12; + } + // for 6to4 tunneled addresses, use the encapsulated IPv4 address + else if (IsRFC3964()) + { + nClass = 1; + nStartByte = 2; + } + // for Teredo-tunneled IPv6 addresses, use the encapsulated IPv4 address + else if (IsRFC4380()) + { + vchRet.push_back(1); + vchRet.push_back(GetByte(3) ^ 0xFF); + vchRet.push_back(GetByte(2) ^ 0xFF); + return vchRet; + } + // for he.net, use /36 groups + else if (GetByte(15) == 0x20 && GetByte(14) == 0x11 && GetByte(13) == 0x04 && GetByte(12) == 0x70) + nBits = 36; + // for the rest of the IPv6 network, use /32 groups + else + nBits = 32; + + vchRet.push_back(nClass); + while (nBits >= 8) + { + vchRet.push_back(GetByte(15 - nStartByte)); + nStartByte++; + nBits -= 8; + } + if (nBits > 0) + vchRet.push_back(GetByte(15 - nStartByte) | ((1 << nBits) - 1)); + + return vchRet; +} + +int64 CNetAddr::GetHash() const +{ + uint256 hash = Hash(&ip[0], &ip[16]); + int64 nRet; + memcpy(&nRet, &hash, sizeof(nRet)); + return nRet; +} + +void CNetAddr::print() const +{ + printf("CNetAddr(%s)\n", ToString().c_str()); +} + +void CService::Init() +{ + port = 0; +} + +CService::CService() +{ + Init(); +} + +CService::CService(const CNetAddr& cip, unsigned short portIn) : CNetAddr(cip), port(portIn) +{ +} + +CService::CService(const struct in_addr& ipv4Addr, unsigned short portIn) : CNetAddr(ipv4Addr), port(portIn) +{ +} + +#ifdef USE_IPV6 +CService::CService(const struct in6_addr& ipv6Addr, unsigned short portIn) : CNetAddr(ipv6Addr), port(portIn) +{ +} +#endif + +CService::CService(const struct sockaddr_in& addr) : CNetAddr(addr.sin_addr), port(ntohs(addr.sin_port)) +{ + assert(addr.sin_family == AF_INET); +} + +#ifdef USE_IPV6 +CService::CService(const struct sockaddr_in6 &addr) : CNetAddr(addr.sin6_addr), port(ntohs(addr.sin6_port)) +{ + assert(addr.sin6_family == AF_INET6); +} +#endif + +CService::CService(const char *pszIpPort, bool fAllowLookup) +{ + Init(); + CService ip; + if (Lookup(pszIpPort, ip, 0, fAllowLookup)) + *this = ip; +} + +CService::CService(const char *pszIpPort, int portDefault, bool fAllowLookup) +{ + Init(); + CService ip; + if (Lookup(pszIpPort, ip, portDefault, fAllowLookup)) + *this = ip; +} + +CService::CService(const std::string &strIpPort, bool fAllowLookup) +{ + Init(); + CService ip; + if (Lookup(strIpPort.c_str(), ip, 0, fAllowLookup)) + *this = ip; +} + +CService::CService(const std::string &strIpPort, int portDefault, bool fAllowLookup) +{ + Init(); + CService ip; + if (Lookup(strIpPort.c_str(), ip, portDefault, fAllowLookup)) + *this = ip; +} + +unsigned short CService::GetPort() const +{ + return port; +} + +bool operator==(const CService& a, const CService& b) +{ + return (CNetAddr)a == (CNetAddr)b && a.port == b.port; +} + +bool operator!=(const CService& a, const CService& b) +{ + return (CNetAddr)a != (CNetAddr)b || a.port != b.port; +} + +bool operator<(const CService& a, const CService& b) +{ + return (CNetAddr)a < (CNetAddr)b || ((CNetAddr)a == (CNetAddr)b && a.port < b.port); +} + +bool CService::GetSockAddr(struct sockaddr_in* paddr) const +{ + if (!IsIPv4()) + return false; + memset(paddr, 0, sizeof(struct sockaddr_in)); + if (!GetInAddr(&paddr->sin_addr)) + return false; + paddr->sin_family = AF_INET; + paddr->sin_port = htons(port); + return true; +} + +#ifdef USE_IPV6 +bool CService::GetSockAddr6(struct sockaddr_in6* paddr) const +{ + memset(paddr, 0, sizeof(struct sockaddr_in6)); + if (!GetIn6Addr(&paddr->sin6_addr)) + return false; + paddr->sin6_family = AF_INET6; + paddr->sin6_port = htons(port); + return true; +} +#endif + +std::vector CService::GetKey() const +{ + std::vector vKey; + vKey.resize(18); + memcpy(&vKey[0], ip, 16); + vKey[16] = port / 0x100; + vKey[17] = port & 0x0FF; + return vKey; +} + +std::string CService::ToStringPort() const +{ + return strprintf(":%i", port); +} + +std::string CService::ToStringIPPort() const +{ + return ToStringIP() + ToStringPort(); +} + +std::string CService::ToString() const +{ + return ToStringIPPort(); +} + +void CService::print() const +{ + printf("CService(%s)\n", ToString().c_str()); +} + +void CService::SetPort(unsigned short portIn) +{ + port = portIn; +} diff --git a/src/netbase.h b/src/netbase.h new file mode 100644 index 0000000..b5f9d5f --- /dev/null +++ b/src/netbase.h @@ -0,0 +1,140 @@ +// Copyright (c) 2009-2012 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. +#ifndef BITCOIN_NETBASE_H +#define BITCOIN_NETBASE_H + +#include +#include + +#ifdef WIN32 +#define _WIN32_WINNT 0x0501 +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#endif +#ifdef BSD +#include +#endif + +#include "serialize.h" +#include "compat.h" + +extern int nConnectTimeout; + + +/** IP address (IPv6, or IPv4 using mapped IPv6 range (::FFFF:0:0/96)) */ +class CNetAddr +{ + protected: + unsigned char ip[16]; // in network byte order + + public: + CNetAddr(); + CNetAddr(const struct in_addr& ipv4Addr); + explicit CNetAddr(const char *pszIp, bool fAllowLookup = false); + explicit CNetAddr(const std::string &strIp, bool fAllowLookup = false); + void Init(); + void SetIP(const CNetAddr& ip); + bool IsIPv4() const; // IPv4 mapped address (::FFFF:0:0/96, 0.0.0.0/0) + bool IsRFC1918() const; // IPv4 private networks (10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12) + bool IsRFC3849() const; // IPv6 documentation address (2001:0DB8::/32) + bool IsRFC3927() const; // IPv4 autoconfig (169.254.0.0/16) + bool IsRFC3964() const; // IPv6 6to4 tunneling (2002::/16) + bool IsRFC4193() const; // IPv6 unique local (FC00::/15) + bool IsRFC4380() const; // IPv6 Teredo tunneling (2001::/32) + bool IsRFC4843() const; // IPv6 ORCHID (2001:10::/28) + bool IsRFC4862() const; // IPv6 autoconfig (FE80::/64) + bool IsRFC6052() const; // IPv6 well-known prefix (64:FF9B::/96) + bool IsRFC6145() const; // IPv6 IPv4-translated address (::FFFF:0:0:0/96) + bool IsLocal() const; + bool IsRoutable() const; + bool IsValid() const; + bool IsMulticast() const; + std::string ToString() const; + std::string ToStringIP() const; + int GetByte(int n) const; + int64 GetHash() const; + bool GetInAddr(struct in_addr* pipv4Addr) const; + std::vector GetGroup() const; + void print() const; + +#ifdef USE_IPV6 + CNetAddr(const struct in6_addr& pipv6Addr); + bool GetIn6Addr(struct in6_addr* pipv6Addr) const; +#endif + + friend bool operator==(const CNetAddr& a, const CNetAddr& b); + friend bool operator!=(const CNetAddr& a, const CNetAddr& b); + friend bool operator<(const CNetAddr& a, const CNetAddr& b); + + IMPLEMENT_SERIALIZE + ( + READWRITE(FLATDATA(ip)); + ) +}; + +/** A combnation of a network address (CNetAddr) and a (TCP) port */ +class CService : public CNetAddr +{ + protected: + unsigned short port; // host order + + public: + CService(); + CService(const CNetAddr& ip, unsigned short port); + CService(const struct in_addr& ipv4Addr, unsigned short port); + CService(const struct sockaddr_in& addr); + explicit CService(const char *pszIpPort, int portDefault, bool fAllowLookup = false); + explicit CService(const char *pszIpPort, bool fAllowLookup = false); + explicit CService(const std::string& strIpPort, int portDefault, bool fAllowLookup = false); + explicit CService(const std::string& strIpPort, bool fAllowLookup = false); + void Init(); + void SetPort(unsigned short portIn); + unsigned short GetPort() const; + bool GetSockAddr(struct sockaddr_in* paddr) const; + friend bool operator==(const CService& a, const CService& b); + friend bool operator!=(const CService& a, const CService& b); + friend bool operator<(const CService& a, const CService& b); + std::vector GetKey() const; + std::string ToString() const; + std::string ToStringPort() const; + std::string ToStringIPPort() const; + void print() const; + +#ifdef USE_IPV6 + CService(const struct in6_addr& ipv6Addr, unsigned short port); + bool GetSockAddr6(struct sockaddr_in6* paddr) const; + CService(const struct sockaddr_in6& addr); +#endif + + IMPLEMENT_SERIALIZE + ( + CService* pthis = const_cast(this); + READWRITE(FLATDATA(ip)); + unsigned short portN = htons(port); + READWRITE(portN); + if (fRead) + pthis->port = ntohs(portN); + ) +}; + +bool LookupHost(const char *pszName, std::vector& vIP, int nMaxSolutions = 0, bool fAllowLookup = true); +bool LookupHostNumeric(const char *pszName, std::vector& vIP, int nMaxSolutions = 0); +bool Lookup(const char *pszName, CService& addr, int portDefault = 0, bool fAllowLookup = true); +bool Lookup(const char *pszName, std::vector& vAddr, int portDefault = 0, bool fAllowLookup = true, int nMaxSolutions = 0); +bool LookupNumeric(const char *pszName, CService& addr, int portDefault = 0); +bool ConnectSocket(const CService &addr, SOCKET& hSocketRet, int nTimeout = nConnectTimeout); + +// Settings +extern int fUseProxy; +extern CService addrProxy; + +#endif diff --git a/src/noui.h b/src/noui.h index 0bbf45a..8888db6 100644 --- a/src/noui.h +++ b/src/noui.h @@ -1,5 +1,5 @@ // Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_NOUI_H diff --git a/src/protocol.cpp b/src/protocol.cpp index f46570e..15fbf9f 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -1,20 +1,16 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #include "protocol.h" #include "util.h" +#include "netbase.h" #ifndef WIN32 # include #endif -// Prototypes from net.h, but that header (currently) stinks, can't #include it without breaking things -bool Lookup(const char *pszName, std::vector& vaddr, int nServices, int nMaxSolutions, bool fAllowLookup = false, int portDefault = 0, bool fAllowPort = false); -bool Lookup(const char *pszName, CAddress& addr, int nServices, bool fAllowLookup = false, int portDefault = 0, bool fAllowPort = false); - -static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }; static const char* ppszTypeName[] = { "ERROR", @@ -77,185 +73,26 @@ bool CMessageHeader::IsValid() const return true; } -CAddress::CAddress() -{ - Init(); -} - -CAddress::CAddress(unsigned int ipIn, unsigned short portIn, uint64 nServicesIn) -{ - Init(); - ip = ipIn; - port = htons(portIn == 0 ? GetDefaultPort() : portIn); - nServices = nServicesIn; -} - -CAddress::CAddress(const struct sockaddr_in& sockaddr, uint64 nServicesIn) -{ - Init(); - ip = sockaddr.sin_addr.s_addr; - port = sockaddr.sin_port; - nServices = nServicesIn; -} - -CAddress::CAddress(const char* pszIn, int portIn, bool fNameLookup, uint64 nServicesIn) -{ - Init(); - Lookup(pszIn, *this, nServicesIn, fNameLookup, portIn); -} -CAddress::CAddress(const char* pszIn, bool fNameLookup, uint64 nServicesIn) -{ - Init(); - Lookup(pszIn, *this, nServicesIn, fNameLookup, 0, true); -} -CAddress::CAddress(std::string strIn, int portIn, bool fNameLookup, uint64 nServicesIn) +CAddress::CAddress() : CService() { Init(); - Lookup(strIn.c_str(), *this, nServicesIn, fNameLookup, portIn); } -CAddress::CAddress(std::string strIn, bool fNameLookup, uint64 nServicesIn) +CAddress::CAddress(CService ipIn, uint64 nServicesIn) : CService(ipIn) { Init(); - Lookup(strIn.c_str(), *this, nServicesIn, fNameLookup, 0, true); + nServices = nServicesIn; } void CAddress::Init() { nServices = NODE_NETWORK; - memcpy(pchReserved, pchIPv4, sizeof(pchReserved)); - ip = INADDR_NONE; - port = htons(GetDefaultPort()); nTime = 100000000; nLastTry = 0; } -bool operator==(const CAddress& a, const CAddress& b) -{ - return (memcmp(a.pchReserved, b.pchReserved, sizeof(a.pchReserved)) == 0 && - a.ip == b.ip && - a.port == b.port); -} - -bool operator!=(const CAddress& a, const CAddress& b) -{ - return (!(a == b)); -} - -bool operator<(const CAddress& a, const CAddress& b) -{ - int ret = memcmp(a.pchReserved, b.pchReserved, sizeof(a.pchReserved)); - if (ret < 0) - return true; - else if (ret == 0) - { - if (ntohl(a.ip) < ntohl(b.ip)) - return true; - else if (a.ip == b.ip) - return ntohs(a.port) < ntohs(b.port); - } - return false; -} - -std::vector CAddress::GetKey() const -{ - CDataStream ss; - ss.reserve(18); - ss << FLATDATA(pchReserved) << ip << port; - - #if defined(_MSC_VER) && _MSC_VER < 1300 - return std::vector((unsigned char*)&ss.begin()[0], (unsigned char*)&ss.end()[0]); - #else - return std::vector(ss.begin(), ss.end()); - #endif -} - -struct sockaddr_in CAddress::GetSockAddr() const -{ - struct sockaddr_in sockaddr; - memset(&sockaddr, 0, sizeof(sockaddr)); - sockaddr.sin_family = AF_INET; - sockaddr.sin_addr.s_addr = ip; - sockaddr.sin_port = port; - return sockaddr; -} - -bool CAddress::IsIPv4() const -{ - return (memcmp(pchReserved, pchIPv4, sizeof(pchIPv4)) == 0); -} - -bool CAddress::IsRFC1918() const -{ - return IsIPv4() && (GetByte(3) == 10 || - (GetByte(3) == 192 && GetByte(2) == 168) || - (GetByte(3) == 172 && - (GetByte(2) >= 16 && GetByte(2) <= 31))); -} - -bool CAddress::IsRFC3927() const -{ - return IsIPv4() && (GetByte(3) == 169 && GetByte(2) == 254); -} - -bool CAddress::IsLocal() const -{ - return IsIPv4() && (GetByte(3) == 127 || - GetByte(3) == 0); -} - -bool CAddress::IsRoutable() const -{ - return IsValid() && - !(IsRFC1918() || IsRFC3927() || IsLocal()); -} - -bool CAddress::IsValid() const -{ - // Clean up 3-byte shifted addresses caused by garbage in size field - // of addr messages from versions before 0.2.9 checksum. - // Two consecutive addr messages look like this: - // header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26... - // so if the first length field is garbled, it reads the second batch - // of addr misaligned by 3 bytes. - if (memcmp(pchReserved, pchIPv4+3, sizeof(pchIPv4)-3) == 0) - return false; - - return (ip != 0 && ip != INADDR_NONE && port != htons(USHRT_MAX)); -} - -unsigned char CAddress::GetByte(int n) const -{ - return ((unsigned char*)&ip)[3-n]; -} - -std::string CAddress::ToStringIPPort() const -{ - return strprintf("%u.%u.%u.%u:%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0), ntohs(port)); -} - -std::string CAddress::ToStringIP() const -{ - return strprintf("%u.%u.%u.%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0)); -} - -std::string CAddress::ToStringPort() const -{ - return strprintf("%u", ntohs(port)); -} - -std::string CAddress::ToString() const -{ - return strprintf("%u.%u.%u.%u:%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0), ntohs(port)); -} - -void CAddress::print() const -{ - printf("CAddress(%s)\n", ToString().c_str()); -} - CInv::CInv() { type = 0; @@ -310,3 +147,4 @@ void CInv::print() const { printf("CInv(%s)\n", ToString().c_str()); } + diff --git a/src/protocol.h b/src/protocol.h index 53d3eef..e639127 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. @@ -11,6 +11,8 @@ #define __INCLUDED_PROTOCOL_H__ #include "serialize.h" +#include "netbase.h" +#include "util.h" #include #include "uint256.h" @@ -20,15 +22,15 @@ static inline unsigned short GetDefaultPort(const bool testnet = fTestNet) return testnet ? 18333 : 8333; } -// -// Message header -// (4) message start -// (12) command -// (4) size -// (4) checksum extern unsigned char pchMessageStart[4]; +/** Message header. + * (4) message start. + * (12) command. + * (4) size. + * (4) checksum. + */ class CMessageHeader { public: @@ -43,7 +45,6 @@ class CMessageHeader READWRITE(FLATDATA(pchMessageStart)); READWRITE(FLATDATA(pchCommand)); READWRITE(nMessageSize); - if (nVersion >= 209) READWRITE(nChecksum); ) @@ -56,71 +57,49 @@ class CMessageHeader unsigned int nChecksum; }; +/** nServices flags */ enum { NODE_NETWORK = (1 << 0), }; -class CAddress +/** A CService with information about it as peer */ +class CAddress : public CService { public: CAddress(); - CAddress(unsigned int ipIn, unsigned short portIn=0, uint64 nServicesIn=NODE_NETWORK); - explicit CAddress(const struct sockaddr_in& sockaddr, uint64 nServicesIn=NODE_NETWORK); - explicit CAddress(const char* pszIn, int portIn, bool fNameLookup = false, uint64 nServicesIn=NODE_NETWORK); - explicit CAddress(const char* pszIn, bool fNameLookup = false, uint64 nServicesIn=NODE_NETWORK); - explicit CAddress(std::string strIn, int portIn, bool fNameLookup = false, uint64 nServicesIn=NODE_NETWORK); - explicit CAddress(std::string strIn, bool fNameLookup = false, uint64 nServicesIn=NODE_NETWORK); + explicit CAddress(CService ipIn, uint64 nServicesIn=NODE_NETWORK); void Init(); IMPLEMENT_SERIALIZE ( + CAddress* pthis = const_cast(this); + CService* pip = (CService*)pthis; if (fRead) - const_cast(this)->Init(); + pthis->Init(); if (nType & SER_DISK) READWRITE(nVersion); if ((nType & SER_DISK) || (nVersion >= 31402 && !(nType & SER_GETHASH))) READWRITE(nTime); READWRITE(nServices); - READWRITE(FLATDATA(pchReserved)); // for IPv6 - READWRITE(ip); - READWRITE(port); + READWRITE(*pip); ) - friend bool operator==(const CAddress& a, const CAddress& b); - friend bool operator!=(const CAddress& a, const CAddress& b); - friend bool operator<(const CAddress& a, const CAddress& b); - - std::vector GetKey() const; - struct sockaddr_in GetSockAddr() const; - bool IsIPv4() const; - bool IsRFC1918() const; - bool IsRFC3927() const; - bool IsLocal() const; - bool IsRoutable() const; - bool IsValid() const; - unsigned char GetByte(int n) const; - std::string ToStringIPPort() const; - std::string ToStringIP() const; - std::string ToStringPort() const; - std::string ToString() const; void print() const; // TODO: make private (improves encapsulation) public: uint64 nServices; - unsigned char pchReserved[12]; - unsigned int ip; - unsigned short port; // disk and network only unsigned int nTime; // memory only - unsigned int nLastTry; + int64 nLastTry; }; +/** inv message data */ class CInv { public: diff --git a/src/qt/aboutdialog.cpp b/src/qt/aboutdialog.cpp index a3aa6de..08d7774 100644 --- a/src/qt/aboutdialog.cpp +++ b/src/qt/aboutdialog.cpp @@ -7,7 +7,6 @@ AboutDialog::AboutDialog(QWidget *parent) : ui(new Ui::AboutDialog) { ui->setupUi(this); - } void AboutDialog::setModel(ClientModel *model) diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp index 2c4407a..76aa87b 100644 --- a/src/qt/addressbookpage.cpp +++ b/src/qt/addressbookpage.cpp @@ -2,6 +2,7 @@ #include "ui_addressbookpage.h" #include "addresstablemodel.h" +#include "bitcoingui.h" #include "editaddressdialog.h" #include "csvmodelwriter.h" #include "guiutil.h" @@ -9,6 +10,11 @@ #include #include #include +#include + +#ifdef USE_QRCODE +#include "qrcodedialog.h" +#endif AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) : QDialog(parent), @@ -25,6 +31,10 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) : ui->deleteButton->setIcon(QIcon()); #endif +#ifndef USE_QRCODE + ui->showQRCode->setVisible(false); +#endif + switch(mode) { case ForSending: @@ -45,7 +55,28 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) : break; } ui->tableView->setTabKeyNavigation(false); + ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu); + + // Context menu actions + QAction *copyAddressAction = new QAction(tr("Copy address"), this); + QAction *copyLabelAction = new QAction(tr("Copy label"), this); + QAction *editAction = new QAction(tr("Edit"), this); + deleteAction = new QAction(tr("Delete"), this); + + contextMenu = new QMenu(); + contextMenu->addAction(copyAddressAction); + contextMenu->addAction(copyLabelAction); + contextMenu->addAction(editAction); + contextMenu->addAction(deleteAction); + connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(on_copyToClipboard_clicked())); + connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(onCopyLabelAction())); + connect(editAction, SIGNAL(triggered()), this, SLOT(onEditAction())); + connect(deleteAction, SIGNAL(triggered()), this, SLOT(on_deleteButton_clicked())); + + connect(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint))); + + // Pass through accept action from button box connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept())); } @@ -100,18 +131,47 @@ void AddressBookPage::setModel(AddressTableModel *model) void AddressBookPage::on_copyToClipboard_clicked() { - // Copy currently selected address to clipboard - // (or nothing, if nothing selected) - QTableView *table = ui->tableView; - if(!table->selectionModel()) + GUIUtil::copyEntryData(ui->tableView, AddressTableModel::Address); +} +void AddressBookPage::onCopyLabelAction() +{ + GUIUtil::copyEntryData(ui->tableView, AddressTableModel::Label); +} + +void AddressBookPage::onEditAction() +{ + if(!ui->tableView->selectionModel()) + return; + QModelIndexList indexes = ui->tableView->selectionModel()->selectedRows(); + if(indexes.isEmpty()) return; + + EditAddressDialog dlg( + tab == SendingTab ? + EditAddressDialog::EditSendingAddress : + EditAddressDialog::EditReceivingAddress); + dlg.setModel(model); + QModelIndex origIndex = proxyModel->mapToSource(indexes.at(0)); + dlg.loadRow(origIndex.row()); + dlg.exec(); +} + +void AddressBookPage::on_signMessage_clicked() +{ + QTableView *table = ui->tableView; QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address); + QString addr; foreach (QModelIndex index, indexes) { QVariant address = index.data(); - QApplication::clipboard()->setText(address.toString()); + addr = address.toString(); } + + QObject *qoGUI = parent()->parent(); + BitcoinGUI *gui = qobject_cast(qoGUI); + if (gui) + gui->gotoMessagePage(addr); } void AddressBookPage::on_newAddressButton_clicked() @@ -162,18 +222,27 @@ void AddressBookPage::selectionChanged() switch(tab) { case SendingTab: + // In sending tab, allow deletion of selection ui->deleteButton->setEnabled(true); + deleteAction->setEnabled(true); + ui->signMessage->setEnabled(false); break; case ReceivingTab: + // Deleting receiving addresses, however, is not allowed ui->deleteButton->setEnabled(false); + deleteAction->setEnabled(false); + ui->signMessage->setEnabled(true); break; } ui->copyToClipboard->setEnabled(true); + ui->showQRCode->setEnabled(true); } else { ui->deleteButton->setEnabled(false); + ui->showQRCode->setEnabled(false); ui->copyToClipboard->setEnabled(false); + ui->signMessage->setEnabled(false); } } @@ -197,6 +266,7 @@ void AddressBookPage::done(int retval) if(returnValue.isEmpty()) { + // If no address entry selected, return rejected retval = Rejected; } @@ -226,3 +296,32 @@ void AddressBookPage::exportClicked() QMessageBox::Abort, QMessageBox::Abort); } } + +void AddressBookPage::on_showQRCode_clicked() +{ +#ifdef USE_QRCODE + QTableView *table = ui->tableView; + QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address); + + + QRCodeDialog *d; + foreach (QModelIndex index, indexes) + { + QString address = index.data().toString(), + label = index.sibling(index.row(), 0).data().toString(), + title = QString("%1 << %2 >>").arg(label).arg(address); + + QRCodeDialog *d = new QRCodeDialog(title, address, label, tab == ReceivingTab, this); + d->show(); + } +#endif +} + +void AddressBookPage::contextualMenu(const QPoint &point) +{ + QModelIndex index = ui->tableView->indexAt(point); + if(index.isValid()) + { + contextMenu->exec(QCursor::pos()); + } +} diff --git a/src/qt/addressbookpage.h b/src/qt/addressbookpage.h index 1a97f3d..b2cf2db 100644 --- a/src/qt/addressbookpage.h +++ b/src/qt/addressbookpage.h @@ -12,6 +12,7 @@ QT_BEGIN_NAMESPACE class QTableView; class QItemSelection; class QSortFilterProxyModel; +class QMenu; QT_END_NAMESPACE /** Widget that shows a list of sending or receiving addresses. @@ -48,12 +49,24 @@ private: Tabs tab; QString returnValue; QSortFilterProxyModel *proxyModel; + QMenu *contextMenu; + QAction *deleteAction; private slots: void on_deleteButton_clicked(); void on_newAddressButton_clicked(); + /** Copy address of currently selected address entry to clipboard */ void on_copyToClipboard_clicked(); + void on_signMessage_clicked(); void selectionChanged(); + void on_showQRCode_clicked(); + /** Spawn contextual menu (right mouse menu) for address book entry */ + void contextualMenu(const QPoint &point); + + /** Copy label of currently selected address entry to clipboard */ + void onCopyLabelAction(); + /** Edit currently selected address entry */ + void onEditAction(); }; #endif // ADDRESSBOOKDIALOG_H diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 4fed781..3450bb4 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -1,5 +1,5 @@ /* - * W.J. van der Laan 2011 + * W.J. van der Laan 2011-2012 */ #include "bitcoingui.h" #include "clientmodel.h" @@ -8,6 +8,7 @@ #include "headers.h" #include "init.h" +#include "qtipcserver.h" #include #include @@ -18,24 +19,18 @@ #include #include +#include + // Need a global reference for the notifications to find the GUI BitcoinGUI *guiref; QSplashScreen *splashref; int MyMessageBox(const std::string& message, const std::string& caption, int style, wxWindow* parent, int x, int y) { - // Message from main thread - if(guiref) - { - guiref->error(QString::fromStdString(caption), - QString::fromStdString(message)); - } - else - { - QMessageBox::critical(0, QString::fromStdString(caption), - QString::fromStdString(message), - QMessageBox::Ok, QMessageBox::Ok); - } + // Message from AppInit2(), always in main thread before main window is constructed + QMessageBox::critical(0, QString::fromStdString(caption), + QString::fromStdString(message), + QMessageBox::Ok, QMessageBox::Ok); return 4; } @@ -86,6 +81,22 @@ bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindo return payFee; } +void ThreadSafeHandleURL(const std::string& strURL) +{ + if(!guiref) + return; + + // Call slot on GUI thread. + // If called from another thread, use a blocking QueuedConnection. + Qt::ConnectionType connectionType = Qt::DirectConnection; + if(QThread::currentThread() != QCoreApplication::instance()->thread()) + { + connectionType = Qt::BlockingQueuedConnection; + } + QMetaObject::invokeMethod(guiref, "handleURL", connectionType, + Q_ARG(QString, QString::fromStdString(strURL))); +} + void CalledSetStatusBar(const std::string& strText, int nField) { // Only used for built-in mining, which is disabled, simple ignore @@ -119,19 +130,68 @@ std::string _(const char* psz) return QCoreApplication::translate("bitcoin-core", psz).toStdString(); } +#ifndef BITCOIN_QT_TEST int main(int argc, char *argv[]) { +#if !defined(MAC_OSX) && !defined(WIN32) +// TODO: implement qtipcserver.cpp for Mac and Windows + + // Do this early as we don't want to bother initializing if we are just calling IPC + for (int i = 1; i < argc; i++) + { + if (strlen(argv[i]) > 7 && strncasecmp(argv[i], "bitcoin:", 8) == 0) + { + const char *strURL = argv[i]; + try { + boost::interprocess::message_queue mq(boost::interprocess::open_only, "BitcoinURL"); + if(mq.try_send(strURL, strlen(strURL), 0)) + exit(0); + else + break; + } + catch (boost::interprocess::interprocess_exception &ex) { + break; + } + } + } +#endif + + // Internal string conversion is all UTF-8 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForTr()); Q_INIT_RESOURCE(bitcoin); QApplication app(argc, argv); - // Load language files for system locale: + // Command-line options take precedence: + ParseParameters(argc, argv); + + // ... then bitcoin.conf: + if (!ReadConfigFile(mapArgs, mapMultiArgs)) + { + fprintf(stderr, "Error: Specified directory does not exist\n"); + return 1; + } + + // Application identification (must be set before OptionsModel is initialized, + // as it is used to locate QSettings) + app.setOrganizationName("Bitcoin"); + app.setOrganizationDomain("bitcoin.org"); + if(GetBoolArg("-testnet")) // Separate UI settings for testnet + app.setApplicationName("Bitcoin-Qt-testnet"); + else + app.setApplicationName("Bitcoin-Qt"); + + // ... then GUI settings: + OptionsModel optionsModel; + + // Get desired locale ("en_US") from command line or system locale + QString lang_territory = QString::fromStdString(GetArg("-lang", QLocale::system().name().toStdString())); + // Load language files for configured locale: // - First load the translator for the base language, without territory // - Then load the more specific locale translator - QString lang_territory = QLocale::system().name(); // "en_US" QString lang = lang_territory; + lang.truncate(lang_territory.lastIndexOf('_')); // "en" QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator; @@ -151,10 +211,8 @@ int main(int argc, char *argv[]) if (!translator.isEmpty()) app.installTranslator(&translator); - app.setApplicationName(QApplication::translate("main", "Bitcoin-Qt")); - QSplashScreen splash(QPixmap(":/images/splash"), 0); - if (!GetBoolArg("-min")) + if (GetBoolArg("-splash", true) && !GetBoolArg("-min")) { splash.show(); splash.setAutoFillBackground(true); @@ -172,10 +230,13 @@ int main(int argc, char *argv[]) { // Put this in a block, so that BitcoinGUI is cleaned up properly before // calling Shutdown() in case of exceptions. + + optionsModel.Upgrade(); // Must be done after AppInit2 + BitcoinGUI window; if (splashref) splash.finish(&window); - OptionsModel optionsModel(pwalletMain); + ClientModel clientModel(&optionsModel); WalletModel walletModel(pwalletMain, &optionsModel); @@ -193,6 +254,27 @@ int main(int argc, char *argv[]) window.show(); } + // Place this here as guiref has to be defined if we dont want to lose URLs + ipcInit(); + +#if !defined(MAC_OSX) && !defined(WIN32) +// TODO: implement qtipcserver.cpp for Mac and Windows + + // Check for URL in argv + for (int i = 1; i < argc; i++) + { + if (strlen(argv[i]) > 7 && strncasecmp(argv[i], "bitcoin:", 8) == 0) + { + const char *strURL = argv[i]; + try { + boost::interprocess::message_queue mq(boost::interprocess::open_only, "BitcoinURL"); + mq.try_send(strURL, strlen(strURL), 0); + } + catch (boost::interprocess::interprocess_exception &ex) { + } + } + } +#endif app.exec(); guiref = 0; @@ -210,3 +292,4 @@ int main(int argc, char *argv[]) } return 0; } +#endif // BITCOIN_QT_TEST diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index aea61d6..8f2bba2 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -37,26 +37,46 @@ res/icons/lock_closed.png res/icons/lock_open.png res/icons/key.png + res/icons/filesave.png res/images/about.png res/images/splash2.jpg + res/images/qrcode.png res/movies/update_spinner.mng + locale/bitcoin_ca_ES.qm + locale/bitcoin_cs.qm locale/bitcoin_da.qm locale/bitcoin_de.qm locale/bitcoin_en.qm - locale/bitcoin_es.qm locale/bitcoin_es_CL.qm + locale/bitcoin_es.qm + locale/bitcoin_et.qm + locale/bitcoin_eu_ES.qm + locale/bitcoin_fa_IR.qm + locale/bitcoin_fa.qm + locale/bitcoin_fi.qm + locale/bitcoin_fr_CA.qm + locale/bitcoin_fr_FR.qm + locale/bitcoin_he.qm + locale/bitcoin_hr.qm locale/bitcoin_hu.qm locale/bitcoin_it.qm + locale/bitcoin_lt.qm locale/bitcoin_nb.qm locale/bitcoin_nl.qm + locale/bitcoin_pl.qm locale/bitcoin_pt_BR.qm + locale/bitcoin_ro_RO.qm locale/bitcoin_ru.qm + locale/bitcoin_sk.qm + locale/bitcoin_sr.qm + locale/bitcoin_sv.qm + locale/bitcoin_tr.qm locale/bitcoin_uk.qm locale/bitcoin_zh_CN.qm locale/bitcoin_zh_TW.qm diff --git a/src/qt/bitcoinaddressvalidator.h b/src/qt/bitcoinaddressvalidator.h index 6ca3bd6..9710d12 100644 --- a/src/qt/bitcoinaddressvalidator.h +++ b/src/qt/bitcoinaddressvalidator.h @@ -14,7 +14,7 @@ public: State validate(QString &input, int &pos) const; - static const int MaxAddressLength = 34; + static const int MaxAddressLength = 35; signals: public slots: diff --git a/src/qt/bitcoinamountfield.cpp b/src/qt/bitcoinamountfield.cpp index 19cd565..9514ec8 100644 --- a/src/qt/bitcoinamountfield.cpp +++ b/src/qt/bitcoinamountfield.cpp @@ -22,6 +22,7 @@ BitcoinAmountField::BitcoinAmountField(QWidget *parent): amount->setDecimals(8); amount->installEventFilter(this); amount->setMaximumWidth(170); + amount->setSingleStep(0.001); QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(amount); diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index ed891f3..d735c14 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -1,13 +1,14 @@ /* * Qt4 bitcoin GUI. * - * W.J. van der Laan 2011 - * The Bitcoin Developers 2011 + * W.J. van der Laan 20011-2012 + * The Bitcoin Developers 20011-2012 */ #include "bitcoingui.h" #include "transactiontablemodel.h" #include "addressbookpage.h" #include "sendcoinsdialog.h" +#include "messagepage.h" #include "optionsdialog.h" #include "aboutdialog.h" #include "clientmodel.h" @@ -45,6 +46,8 @@ #include #include #include +#include +#include #include #include @@ -100,12 +103,17 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): sendCoinsPage = new SendCoinsDialog(this); + messagePage = new MessagePage(this); + centralWidget = new QStackedWidget(this); centralWidget->addWidget(overviewPage); centralWidget->addWidget(transactionsPage); centralWidget->addWidget(addressBookPage); centralWidget->addWidget(receiveCoinsPage); centralWidget->addWidget(sendCoinsPage); +#ifdef FIRST_CLASS_MESSAGING + centralWidget->addWidget(messagePage); +#endif setCentralWidget(centralWidget); // Create status bar @@ -113,7 +121,6 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): // Status bar notification icons QFrame *frameBlocks = new QFrame(); - //frameBlocks->setFrameStyle(QFrame::Panel | QFrame::Sunken); frameBlocks->setContentsMargins(0,0,0,0); frameBlocks->setMinimumWidth(56); frameBlocks->setMaximumWidth(56); @@ -155,6 +162,8 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): BitcoinGUI::~BitcoinGUI() { + if(trayIcon) // Hide tray icon, as deleting will let it linger until quit (on Ubuntu) + trayIcon->hide(); #ifdef Q_WS_MAC delete appMenuBar; #endif @@ -194,16 +203,25 @@ void BitcoinGUI::createActions() sendCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_2)); tabGroup->addAction(sendCoinsAction); - connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormal())); + messageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message"), this); + messageAction->setToolTip(tr("Prove you control an address")); +#ifdef FIRST_CLASS_MESSAGING + messageAction->setCheckable(true); +#endif + tabGroup->addAction(messageAction); + + connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage())); - connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormal())); + connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage())); - connect(addressBookAction, SIGNAL(triggered()), this, SLOT(showNormal())); + connect(addressBookAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(addressBookAction, SIGNAL(triggered()), this, SLOT(gotoAddressBookPage())); - connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(showNormal())); + connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage())); - connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormal())); + connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(gotoSendCoinsPage())); + connect(messageAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); + connect(messageAction, SIGNAL(triggered()), this, SLOT(gotoMessagePage())); quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this); quitAction->setToolTip(tr("Quit application")); @@ -221,10 +239,12 @@ void BitcoinGUI::createActions() openBitcoinAction = new QAction(QIcon(":/icons/bitcoin"), tr("Open &Bitcoin"), this); openBitcoinAction->setToolTip(tr("Show the Bitcoin window")); exportAction = new QAction(QIcon(":/icons/export"), tr("&Export..."), this); - exportAction->setToolTip(tr("Export the current view to a file")); + exportAction->setToolTip(tr("Export the data in the current tab to a file")); encryptWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Encrypt Wallet"), this); encryptWalletAction->setToolTip(tr("Encrypt or decrypt wallet")); encryptWalletAction->setCheckable(true); + backupWalletAction = new QAction(QIcon(":/icons/filesave"), tr("&Backup Wallet"), this); + backupWalletAction->setToolTip(tr("Backup wallet to another location")); changePassphraseAction = new QAction(QIcon(":/icons/key"), tr("&Change Passphrase"), this); changePassphraseAction->setToolTip(tr("Change the passphrase used for wallet encryption")); @@ -232,8 +252,9 @@ void BitcoinGUI::createActions() connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked())); connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked())); connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); - connect(openBitcoinAction, SIGNAL(triggered()), this, SLOT(showNormal())); + connect(openBitcoinAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(encryptWalletAction, SIGNAL(triggered(bool)), this, SLOT(encryptWallet(bool))); + connect(backupWalletAction, SIGNAL(triggered()), this, SLOT(backupWallet())); connect(changePassphraseAction, SIGNAL(triggered()), this, SLOT(changePassphrase())); } @@ -249,6 +270,12 @@ void BitcoinGUI::createMenuBar() // Configure the menus QMenu *file = appMenuBar->addMenu(tr("&File")); + file->addAction(backupWalletAction); + file->addAction(exportAction); +#ifndef FIRST_CLASS_MESSAGING + file->addAction(messageAction); +#endif + file->addSeparator(); file->addAction(quitAction); QMenu *settings = appMenuBar->addMenu(tr("&Settings")); @@ -271,6 +298,9 @@ void BitcoinGUI::createToolBars() toolbar->addAction(receiveCoinsAction); toolbar->addAction(historyAction); toolbar->addAction(addressBookAction); +#ifdef FIRST_CLASS_MESSAGING + toolbar->addAction(messageAction); +#endif QToolBar *toolbar2 = addToolBar(tr("Actions toolbar")); toolbar2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); @@ -325,6 +355,7 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel) addressBookPage->setModel(walletModel->getAddressTableModel()); receiveCoinsPage->setModel(walletModel->getAddressTableModel()); sendCoinsPage->setModel(walletModel); + messagePage->setModel(walletModel); setEncryptionStatus(walletModel->getEncryptionStatus()); connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int))); @@ -360,6 +391,10 @@ void BitcoinGUI::createTrayIcon() // Configuration of the tray icon (or dock icon) icon menu trayIconMenu->addAction(openBitcoinAction); trayIconMenu->addSeparator(); + trayIconMenu->addAction(messageAction); +#ifndef FIRST_CLASS_MESSAGING + trayIconMenu->addSeparator(); +#endif trayIconMenu->addAction(receiveCoinsAction); trayIconMenu->addAction(sendCoinsAction); trayIconMenu->addSeparator(); @@ -657,6 +692,26 @@ void BitcoinGUI::gotoSendCoinsPage() disconnect(exportAction, SIGNAL(triggered()), 0, 0); } +void BitcoinGUI::gotoMessagePage() +{ +#ifdef FIRST_CLASS_MESSAGING + messageAction->setChecked(true); + centralWidget->setCurrentWidget(messagePage); + + exportAction->setEnabled(false); + disconnect(exportAction, SIGNAL(triggered()), 0, 0); +#else + messagePage->show(); + messagePage->setFocus(); +#endif +} + +void BitcoinGUI::gotoMessagePage(QString addr) +{ + gotoMessagePage(); + messagePage->setAddress(addr); +} + void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event) { // Accept only URLs @@ -672,13 +727,24 @@ void BitcoinGUI::dropEvent(QDropEvent *event) QList urls = event->mimeData()->urls(); foreach(const QUrl &url, urls) { - sendCoinsPage->handleURL(&url); + sendCoinsPage->handleURL(url.toString()); } } event->acceptProposedAction(); } +void BitcoinGUI::handleURL(QString strURL) +{ + gotoSendCoinsPage(); + sendCoinsPage->handleURL(strURL); + + if(!isActiveWindow()) + activateWindow(); + + showNormalIfMinimized(); +} + void BitcoinGUI::setEncryptionStatus(int status) { switch(status) @@ -720,6 +786,17 @@ void BitcoinGUI::encryptWallet(bool status) setEncryptionStatus(walletModel->getEncryptionStatus()); } +void BitcoinGUI::backupWallet() +{ + QString saveDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); + QString filename = QFileDialog::getSaveFileName(this, tr("Backup Wallet"), saveDir, tr("Wallet Data (*.dat)")); + if(!filename.isEmpty()) { + if(!walletModel->backupWallet(filename)) { + QMessageBox::warning(this, tr("Backup Failed"), tr("There was an error trying to save the wallet data to the new location.")); + } + } +} + void BitcoinGUI::changePassphrase() { AskPassphraseDialog dlg(AskPassphraseDialog::ChangePass, this); @@ -739,3 +816,11 @@ void BitcoinGUI::unlockWallet() dlg.exec(); } } + +void BitcoinGUI::showNormalIfMinimized() +{ + if(!isVisible()) // Show, if hidden + show(); + if(isMinimized()) // Unminimize, if minimized + showNormal(); +} diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 0fcb72a..d221f6b 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -11,6 +11,7 @@ class TransactionView; class OverviewPage; class AddressBookPage; class SendCoinsDialog; +class MessagePage; class Notificator; QT_BEGIN_NAMESPACE @@ -62,6 +63,7 @@ private: AddressBookPage *addressBookPage; AddressBookPage *receiveCoinsPage; SendCoinsDialog *sendCoinsPage; + MessagePage *messagePage; QLabel *labelEncryptionIcon; QLabel *labelConnectionsIcon; @@ -75,12 +77,14 @@ private: QAction *quitAction; QAction *sendCoinsAction; QAction *addressBookAction; + QAction *messageAction; QAction *aboutAction; QAction *receiveCoinsAction; QAction *optionsAction; QAction *openBitcoinAction; QAction *exportAction; QAction *encryptWalletAction; + QAction *backupWalletAction; QAction *changePassphraseAction; QAction *aboutQtAction; @@ -123,6 +127,10 @@ public slots: @param[out] payFee true to pay the fee, false to not pay the fee */ void askFee(qint64 nFeeRequired, bool *payFee); + void handleURL(QString strURL); + + void gotoMessagePage(); + void gotoMessagePage(QString); private slots: /** Switch to overview (home) page */ @@ -151,10 +159,15 @@ private slots: void incomingTransaction(const QModelIndex & parent, int start, int end); /** Encrypt the wallet */ void encryptWallet(bool status); + /** Backup the wallet */ + void backupWallet(); /** Change encrypted wallet passphrase */ void changePassphrase(); /** Ask for pass phrase to unlock wallet temporarily */ void unlockWallet(); + + /** Show window if hidden, unminimize when minimized */ + void showNormalIfMinimized(); }; #endif diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp index 1b0a676..73db1fe 100644 --- a/src/qt/bitcoinstrings.cpp +++ b/src/qt/bitcoinstrings.cpp @@ -2,61 +2,70 @@ // Automatically generated by extract_strings.py static const char *bitcoin_strings[] = {QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin version"), QT_TRANSLATE_NOOP("bitcoin-core", "Usage:"), -QT_TRANSLATE_NOOP("bitcoin-core", "Send command to -server or bitcoind\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "List commands\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Get help for a command\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Options:\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify configuration file (default: bitcoin.conf)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify pid file (default: bitcoind.pid)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Generate coins\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Don't generate coins\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Start minimized\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify data directory\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify connection timeout (in milliseconds)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Connect through socks4 proxy\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for addnode and connect\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Add a node to connect to\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Connect only to the specified node\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Don't accept connections from outside\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Threshold for disconnecting misbehaving peers (default: 100)\n"), +QT_TRANSLATE_NOOP("bitcoin-core", "Send command to -server or bitcoind"), +QT_TRANSLATE_NOOP("bitcoin-core", "List commands"), +QT_TRANSLATE_NOOP("bitcoin-core", "Get help for a command"), +QT_TRANSLATE_NOOP("bitcoin-core", "Options:"), +QT_TRANSLATE_NOOP("bitcoin-core", "Specify configuration file (default: bitcoin.conf)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Specify pid file (default: bitcoind.pid)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Generate coins"), +QT_TRANSLATE_NOOP("bitcoin-core", "Don't generate coins"), +QT_TRANSLATE_NOOP("bitcoin-core", "Start minimized"), +QT_TRANSLATE_NOOP("bitcoin-core", "Specify data directory"), +QT_TRANSLATE_NOOP("bitcoin-core", "Specify connection timeout (in milliseconds)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Connect through socks4 proxy"), +QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for addnode and connect"), +QT_TRANSLATE_NOOP("bitcoin-core", "Listen for connections on (default: 8333 or testnet: 18333)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Maintain at most connections to peers (default: 125)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Add a node to connect to"), +QT_TRANSLATE_NOOP("bitcoin-core", "Connect only to the specified node"), +QT_TRANSLATE_NOOP("bitcoin-core", "Don't accept connections from outside"), +QT_TRANSLATE_NOOP("bitcoin-core", "Don't bootstrap list of peers using DNS"), +QT_TRANSLATE_NOOP("bitcoin-core", "Threshold for disconnecting misbehaving peers (default: 100)"), QT_TRANSLATE_NOOP("bitcoin-core", "" "Number of seconds to keep misbehaving peers from reconnecting (default: " -"86400)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Don't attempt to use UPnP to map the listening port\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to use UPnP to map the listening port\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Fee per kB to add to transactions you send\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use the test network\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Username for JSON-RPC connections\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on (default: 8332)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Allow JSON-RPC connections from specified IP address\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Send commands to node running on (default: 127.0.0.1)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to (default: 100)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Rescan the block chain for missing wallet transactions\n"), +"86400)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection receive buffer, *1000 bytes (default: 10000)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection send buffer, *1000 bytes (default: 10000)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Don't attempt to use UPnP to map the listening port"), +QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to use UPnP to map the listening port"), +QT_TRANSLATE_NOOP("bitcoin-core", "Fee per kB to add to transactions you send"), +QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands"), +QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands"), +QT_TRANSLATE_NOOP("bitcoin-core", "Use the test network"), +QT_TRANSLATE_NOOP("bitcoin-core", "Output extra debugging information"), +QT_TRANSLATE_NOOP("bitcoin-core", "Prepend debug output with timestamp"), +QT_TRANSLATE_NOOP("bitcoin-core", "Send trace/debug info to console instead of debug.log file"), +QT_TRANSLATE_NOOP("bitcoin-core", "Send trace/debug info to debugger"), +QT_TRANSLATE_NOOP("bitcoin-core", "Username for JSON-RPC connections"), +QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections"), +QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on (default: 8332)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Allow JSON-RPC connections from specified IP address"), +QT_TRANSLATE_NOOP("bitcoin-core", "Send commands to node running on (default: 127.0.0.1)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to (default: 100)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Rescan the block chain for missing wallet transactions"), QT_TRANSLATE_NOOP("bitcoin-core", "" "\n" -"SSL options: (see the Bitcoin Wiki for SSL setup instructions)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use OpenSSL (https) for JSON-RPC connections\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Server certificate file (default: server.cert)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Server private key (default: server.pem)\n"), +"SSL options: (see the Bitcoin Wiki for SSL setup instructions)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Use OpenSSL (https) for JSON-RPC connections"), +QT_TRANSLATE_NOOP("bitcoin-core", "Server certificate file (default: server.cert)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Server private key (default: server.pem)"), QT_TRANSLATE_NOOP("bitcoin-core", "" "Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:" -"@STRENGTH)\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "This help message\n"), +"@STRENGTH)"), +QT_TRANSLATE_NOOP("bitcoin-core", "This help message"), QT_TRANSLATE_NOOP("bitcoin-core", "" "Cannot obtain a lock on data directory %s. Bitcoin is probably already " "running."), QT_TRANSLATE_NOOP("bitcoin-core", "Loading addresses..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading addr.dat \n"), +QT_TRANSLATE_NOOP("bitcoin-core", "Error loading addr.dat"), QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading blkindex.dat \n"), +QT_TRANSLATE_NOOP("bitcoin-core", "Error loading blkindex.dat"), QT_TRANSLATE_NOOP("bitcoin-core", "Loading wallet..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet corrupted \n"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Error loading wallet.dat: Wallet requires newer version of Bitcoin \n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat \n"), +QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet corrupted"), +QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet requires newer version of Bitcoin"), +QT_TRANSLATE_NOOP("bitcoin-core", "Wallet needed to be rewritten: restart Bitcoin to complete"), +QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat"), QT_TRANSLATE_NOOP("bitcoin-core", "Rescanning..."), QT_TRANSLATE_NOOP("bitcoin-core", "Done loading"), QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -proxy address"), @@ -73,4 +82,4 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Warning: Please check that your computer's date and time are correct. If " "your clock is wrong Bitcoin will not work properly."), QT_TRANSLATE_NOOP("bitcoin-core", "beta"), -}; \ No newline at end of file +}; diff --git a/src/qt/forms/addressbookpage.ui b/src/qt/forms/addressbookpage.ui index fb098c8..b31a9ce 100644 --- a/src/qt/forms/addressbookpage.ui +++ b/src/qt/forms/addressbookpage.ui @@ -80,6 +80,31 @@ + + + Show &QR Code + + + + :/images/qrcode:/images/qrcode + + + + + + + Sign a message to prove you own this address + + + &Sign Message + + + + :/icons/edit:/icons/edit + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. diff --git a/src/qt/forms/messagepage.ui b/src/qt/forms/messagepage.ui new file mode 100644 index 0000000..131e15b --- /dev/null +++ b/src/qt/forms/messagepage.ui @@ -0,0 +1,170 @@ + + + MessagePage + + + + 0 + 0 + 627 + 380 + + + + Message + + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + Qt::AutoText + + + true + + + + + + + 0 + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + 34 + + + + + + + Choose adress from address book + + + + + + + :/icons/address-book:/icons/address-book + + + Alt+A + + + false + + + false + + + + + + + Paste address from clipboard + + + + + + + :/icons/editpaste:/icons/editpaste + + + Alt+P + + + false + + + + + + + + + Enter the message you want to sign here + + + + + + + + true + + + + Click "Sign Message" to get signature + + + true + + + + + + + + + Sign a message to prove you own this address + + + &Sign Message + + + + :/icons/edit:/icons/edit + + + + + + + Copy the currently selected address to the system clipboard + + + &Copy to Clipboard + + + + :/icons/editcopy:/icons/editcopy + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + QValidatedLineEdit + QLineEdit +
qvalidatedlineedit.h
+
+
+ + + + +
diff --git a/src/qt/forms/qrcodedialog.ui b/src/qt/forms/qrcodedialog.ui new file mode 100644 index 0000000..fa21f60 --- /dev/null +++ b/src/qt/forms/qrcodedialog.ui @@ -0,0 +1,213 @@ + + + QRCodeDialog + + + + 0 + 0 + 320 + 404 + + + + Dialog + + + + + + + 0 + 0 + + + + + 300 + 300 + + + + QR Code + + + Qt::AlignCenter + + + + + + + + + + + + + + true + + + Request Payment + + + + + + + + + + 0 + 0 + + + + Amount: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + lnReqAmount + + + + + + + false + + + + 60 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + BTC + + + lnReqAmount + + + + + + + + + + + + + Label: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + lnLabel + + + + + + + + 100 + 0 + + + + + + + + Message: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + lnMessage + + + + + + + + 100 + 0 + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Save As... + + + + + + + + + + + + + + chkReq + clicked(bool) + lnReqAmount + setEnabled(bool) + + + 92 + 285 + + + 98 + 311 + + + + + diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index d1490c8..ac69bd0 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -11,6 +11,10 @@ #include #include #include +#include // For Qt::escape +#include +#include +#include #include #include @@ -47,26 +51,43 @@ void GUIUtil::setupAmountWidget(QLineEdit *widget, QWidget *parent) widget->setAlignment(Qt::AlignRight|Qt::AlignVCenter); } -bool GUIUtil::parseBitcoinURL(const QUrl *url, SendCoinsRecipient *out) +bool GUIUtil::parseBitcoinURL(const QUrl &url, SendCoinsRecipient *out) { - if(url->scheme() != QString("bitcoin")) + if(url.scheme() != QString("bitcoin")) return false; SendCoinsRecipient rv; - rv.address = url->path(); - rv.label = url->queryItemValue("label"); - - QString amount = url->queryItemValue("amount"); - if(amount.isEmpty()) - { - rv.amount = 0; - } - else // Amount is non-empty + rv.address = url.path(); + rv.amount = 0; + QList > items = url.queryItems(); + for (QList >::iterator i = items.begin(); i != items.end(); i++) { - if(!BitcoinUnits::parse(BitcoinUnits::BTC, amount, &rv.amount)) + bool fShouldReturnFalse = false; + if (i->first.startsWith("req-")) { - return false; + i->first.remove(0, 4); + fShouldReturnFalse = true; + } + + if (i->first == "label") + { + rv.label = i->second; + fShouldReturnFalse = false; } + else if (i->first == "amount") + { + if(!i->second.isEmpty()) + { + if(!BitcoinUnits::parse(BitcoinUnits::BTC, i->second, &rv.amount)) + { + return false; + } + } + fShouldReturnFalse = false; + } + + if (fShouldReturnFalse) + return false; } if(out) { @@ -86,7 +107,35 @@ bool GUIUtil::parseBitcoinURL(QString url, SendCoinsRecipient *out) url.replace(0, 10, "bitcoin:"); } QUrl urlInstance(url); - return parseBitcoinURL(&urlInstance, out); + return parseBitcoinURL(urlInstance, out); +} + +QString GUIUtil::HtmlEscape(const QString& str, bool fMultiLine) +{ + QString escaped = Qt::escape(str); + if(fMultiLine) + { + escaped = escaped.replace("\n", "
\n"); + } + return escaped; +} + +QString GUIUtil::HtmlEscape(const std::string& str, bool fMultiLine) +{ + return HtmlEscape(QString::fromStdString(str), fMultiLine); +} + +void GUIUtil::copyEntryData(QAbstractItemView *view, int column, int role) +{ + if(!view || !view->selectionModel()) + return; + QModelIndexList selection = view->selectionModel()->selectedRows(column); + + if(!selection.isEmpty()) + { + // Copy first item + QApplication::clipboard()->setText(selection.at(0).data(role).toString()); + } } QString GUIUtil::getSaveFileName(QWidget *parent, const QString &caption, diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index a7eee09..75ba53f 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -9,6 +9,7 @@ class QLineEdit; class QWidget; class QDateTime; class QUrl; +class QAbstractItemView; QT_END_NAMESPACE class SendCoinsRecipient; @@ -30,9 +31,21 @@ public: // Parse "bitcoin:" URL into recipient object, return true on succesful parsing // See Bitcoin URL definition discussion here: https://bitcointalk.org/index.php?topic=33490.0 - static bool parseBitcoinURL(const QUrl *url, SendCoinsRecipient *out); + static bool parseBitcoinURL(const QUrl &url, SendCoinsRecipient *out); static bool parseBitcoinURL(QString url, SendCoinsRecipient *out); + // HTML escaping for rich text controls + static QString HtmlEscape(const QString& str, bool fMultiLine=false); + static QString HtmlEscape(const std::string& str, bool fMultiLine=false); + + /** Copy a field of the currently selected entry of a view to the clipboard. Does nothing if nothing + is selected. + @param[in] column Data column to extract from the model + @param[in] role Data role to extract from the model + @see TransactionView::copyLabel, TransactionView::copyAmount, TransactionView::copyAddress + */ + static void copyEntryData(QAbstractItemView *view, int column, int role=Qt::EditRole); + /** Get save file name, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when no suffix is provided by the user. diff --git a/src/qt/locale/bitcoin_ca_ES.ts b/src/qt/locale/bitcoin_ca_ES.ts new file mode 100644 index 0000000..0340550 --- /dev/null +++ b/src/qt/locale/bitcoin_ca_ES.ts @@ -0,0 +1,1963 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + Sobre Bitcoin + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> versió + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + llibreta d'adreces + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + + + + + Double-click to edit address or label + Feu doble clic per editar la direcció o l'etiqueta + + + + Create a new address + Crear una nova adreça + + + + &New Address... + &Nova Adreça ... + + + + Copy the currently selected address to the system clipboard + Copieu l'adreça seleccionada al porta-retalls del sistema + + + + &Copy to Clipboard + + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + + + + + &Delete + &Borrar + + + + Copy address + + + + + Copy label + + + + + Edit + + + + + Delete + + + + + Export Address Book Data + + + + + Comma separated file (*.csv) + + + + + Error exporting + + + + + Could not write to file %1. + + + + + AddressTableModel + + + Label + Etiqueta + + + + Address + Direcció + + + + (no label) + + + + + AskPassphraseDialog + + + Dialog + + + + + + TextLabel + + + + + Enter passphrase + + + + + New passphrase + + + + + Repeat new passphrase + + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + + + + + Encrypt wallet + Xifrar la cartera + + + + This operation needs your wallet passphrase to unlock the wallet. + + + + + Unlock wallet + + + + + This operation needs your wallet passphrase to decrypt the wallet. + + + + + Decrypt wallet + + + + + Change passphrase + + + + + Enter the old and new passphrase to the wallet. + + + + + Confirm wallet encryption + + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + + + + + + Wallet encrypted + + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + + + + + + The supplied passphrases do not match. + + + + + Wallet unlock failed + + + + + + + The passphrase entered for the wallet decryption was incorrect. + + + + + Wallet decryption failed + + + + + Wallet passphrase was succesfully changed. + + + + + BitcoinGUI + + + Bitcoin Wallet + + + + + + Synchronizing with network... + Sincronització amb la xarxa ... + + + + Block chain synchronization in progress + Sincronització de la cadena en el progrés + + + + &Overview + + + + + Show general overview of wallet + Mostra panorama general de la cartera + + + + &Transactions + + + + + Browse transaction history + Cerca a l'historial de transaccions + + + + &Address Book + + + + + Edit the list of stored addresses and labels + Edita la llista d'adreces emmagatzemada i etiquetes + + + + &Receive coins + &Rebre monedes + + + + Show the list of addresses for receiving payments + + + + + &Send coins + + + + + Send coins to a bitcoin address + + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + + + + + Quit application + Sortir de l'aplicació + + + + &About %1 + + + + + Show information about Bitcoin + Mostra informació sobre Bitcoin + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + &Opcions ... + + + + Modify configuration options for bitcoin + Modificar les opcions de configuració per bitcoin + + + + Open &Bitcoin + + + + + Show the Bitcoin window + + + + + &Export... + + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + + + + + Encrypt or decrypt wallet + + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + + + + + Change the passphrase used for wallet encryption + + + + + &File + + + + + &Settings + + + + + &Help + &Ajuda + + + + Tabs toolbar + + + + + Actions toolbar + Accions de la barra d'eines + + + + [testnet] + + + + + bitcoin-qt + + + + + %n active connection(s) to Bitcoin network + + + + + Downloaded %1 of %2 blocks of transaction history. + + + + + Downloaded %1 blocks of transaction history. + + + + + %n second(s) ago + + + + + %n minute(s) ago + + + + + %n hour(s) ago + + + + + %n day(s) ago + + + + + Up to date + Al dia + + + + Catching up... + Posar-se al dia ... + + + + Last received block was generated %1. + + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + + + + + Sending... + L'enviament de ... + + + + Sent transaction + Transacció enviada + + + + Incoming transaction + + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + + + + + Choose the default subdivision unit to show in the interface, and when sending coins + + + + + Display addresses in transaction list + + + + + EditAddressDialog + + + Edit Address + Editar Adreça + + + + &Label + + + + + The label associated with this address book entry + + + + + &Address + + + + + The address associated with this address book entry. This can only be modified for sending addresses. + + + + + New receiving address + + + + + New sending address + + + + + Edit receiving address + + + + + Edit sending address + + + + + The entered address "%1" is already in the address book. + + + + + The entered address "%1" is not a valid bitcoin address. + + + + + Could not unlock wallet. + + + + + New key generation failed. + + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + + + + + Automatically start Bitcoin after the computer is turned on + + + + + &Minimize to the tray instead of the taskbar + + + + + Show only a tray icon after minimizing the window + + + + + Map port using &UPnP + Port obert amb &UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + + + + + M&inimize on close + + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + + + + + &Connect through SOCKS4 proxy: + + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + + + + + Proxy &IP: + + + + + IP address of the proxy (e.g. 127.0.0.1) + + + + + &Port: + + + + + Port of the proxy (e.g. 1234) + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose adress from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Copieu l'adreça seleccionada al porta-retalls del sistema + + + + &Copy to Clipboard + + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + + + + + Display + + + + + Options + + + + + OverviewPage + + + Form + + + + + Balance: + Balanç: + + + + 123.456 BTC + + + + + Number of transactions: + + + + + 0 + + + + + Unconfirmed: + Sense confirmar: + + + + 0 BTC + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + + <b>Recent transactions</b> + + + + + Your current balance + El seu balanç actual + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + + + + + Total number of transactions in wallet + + + + + QRCodeDialog + + + Dialog + + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Enviar monedes + + + + Send to multiple recipients at once + + + + + &Add recipient... + + + + + Remove all transaction fields + + + + + Clear all + + + + + Balance: + Balanç: + + + + 123.456 BTC + + + + + Confirm the send action + + + + + &Send + + + + + <b>%1</b> to %2 (%3) + + + + + Confirm send coins + + + + + Are you sure you want to send %1? + + + + + and + + + + + The recepient address is not valid, please recheck. + + + + + The amount to pay must be larger than 0. + La quantitat a pagar ha de ser major que 0. + + + + Amount exceeds your balance + Import superi el saldo de la seva compte + + + + Total exceeds your balance when the %1 transaction fee is included + + + + + Duplicate address found, can only send to each address once in one send operation + + + + + Error: Transaction creation failed + + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + + + + + A&mount: + + + + + Pay &To: + + + + + + Enter a label for this address to add it to your address book + + + + + &Label: + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose address from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Remove this recipient + + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + TransactionDesc + + + Open for %1 blocks + + + + + Open until %1 + + + + + %1/offline? + + + + + %1/unconfirmed + + + + + %1 confirmations + + + + + <b>Status:</b> + + + + + , has not been successfully broadcast yet + + + + + , broadcast through %1 node + + + + + , broadcast through %1 nodes + + + + + <b>Date:</b> + + + + + <b>Source:</b> Generated<br> + + + + + + <b>From:</b> + + + + + unknown + + + + + + + <b>To:</b> + + + + + (yours, label: + + + + + (yours) + + + + + + + + <b>Credit:</b> + + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + + + + + + + <b>Debit:</b> + + + + + <b>Transaction fee:</b> + + + + + <b>Net amount:</b> + + + + + Message: + + + + + Comment: + + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + + + + + TransactionDescDialog + + + Transaction details + + + + + This pane shows a detailed description of the transaction + + + + + TransactionTableModel + + + Date + + + + + Type + + + + + Address + Direcció + + + + Amount + + + + + Open for %n block(s) + + + + + Open until %1 + + + + + Offline (%1 confirmations) + + + + + Unconfirmed (%1 of %2 confirmations) + + + + + Confirmed (%1 confirmations) + + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + + + + + Generated but not accepted + + + + + Received with + + + + + Received from + + + + + Sent to + + + + + Payment to yourself + + + + + Mined + + + + + (n/a) + + + + + Transaction status. Hover over this field to show number of confirmations. + + + + + Date and time that the transaction was received. + + + + + Type of transaction. + + + + + Destination address of transaction. + + + + + Amount removed from or added to balance. + + + + + TransactionView + + + + All + + + + + Today + + + + + This week + + + + + This month + + + + + Last month + + + + + This year + + + + + Range... + + + + + Received with + + + + + Sent to + + + + + To yourself + + + + + Mined + + + + + Other + + + + + Enter address or label to search + + + + + Min amount + + + + + Copy address + + + + + Copy label + + + + + Copy amount + + + + + Edit label + + + + + Show details... + + + + + Export Transaction Data + + + + + Comma separated file (*.csv) + + + + + Confirmed + + + + + Date + + + + + Type + + + + + Label + Etiqueta + + + + Address + Direcció + + + + Amount + + + + + ID + + + + + Error exporting + + + + + Could not write to file %1. + + + + + Range: + + + + + to + + + + + WalletModel + + + Sending... + L'enviament de ... + + + + bitcoin-core + + + Bitcoin version + + + + + Usage: + + + + + Send command to -server or bitcoind + + + + + List commands + + + + + Get help for a command + + + + + Options: + + + + + Specify configuration file (default: bitcoin.conf) + + + + + Specify pid file (default: bitcoind.pid) + + + + + Generate coins + + + + + Don't generate coins + + + + + Start minimized + + + + + Specify data directory + + + + + Specify connection timeout (in milliseconds) + + + + + Connect through socks4 proxy + + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + + + + + Connect only to the specified node + + + + + Don't accept connections from outside + + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + + + + + Loading wallet... + + + + + Rescanning... + + + + + Done loading + + + + + Invalid -proxy address + + + + + Invalid amount for -paytxfee=<amount> + + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts new file mode 100644 index 0000000..fafcf54 --- /dev/null +++ b/src/qt/locale/bitcoin_cs.ts @@ -0,0 +1,1979 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + O Bitcoinu + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> verze + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + Copyright © 2009-2012 Vývojáři Bitcoinu + +Tohle je experimentální program. + +Šířen pod licencí MIT/X11, viz přiložený soubor license.txt nebo http://www.opensource.org/licenses/mit-license.php. + +Tento produkt zahrnuje programy vyvinuté OpenSSL Projektem pro použití v OpenSSL Toolkitu (http://www.openssl.org/) a kryptografický program od Erika Younga (eay@cryptsoft.com) a program UPnP od Thomase Bernarda. + + + + AddressBookPage + + + Address Book + Adresář + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Tohle jsou tvé Bitcoinové adresy pro příjem plateb. MůžeÅ¡ pokaždé dát každému odesílateli jinou adresu, abys věděl, kdo ti kdy kolik platil. + + + + Double-click to edit address or label + Dvojklikem myÅ¡i začneÅ¡ upravovat označení adresy + + + + Create a new address + Vytvoř novou adresu + + + + &New Address... + Nová &adresa... + + + + Copy the currently selected address to the system clipboard + Zkopíruj aktuálně vybranou adresu do systémové schránky + + + + &Copy to Clipboard + &Zkopíruj do schránky + + + + Show &QR Code + Zobraz &QR kód + + + + Sign a message to prove you own this address + PodepiÅ¡ zprávu, čímž prokážeÅ¡, že jsi vlastníkem této adresy + + + + &Sign Message + Po&depiÅ¡ zprávu + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Smaž aktuálně vybranou adresu ze seznamu. Smazány mohou být pouze adresy příjemců. + + + + &Delete + S&maž + + + + Copy address + Kopíruj adresu + + + + Copy label + Kopíruj označení + + + + Edit + Uprav + + + + Delete + Smaž + + + + Export Address Book Data + Exportuj data adresáře + + + + Comma separated file (*.csv) + CSV formát (*.csv) + + + + Error exporting + Chyba při exportu + + + + Could not write to file %1. + Nemohu zapisovat do souboru %1. + + + + AddressTableModel + + + Label + Označení + + + + Address + Adresa + + + + (no label) + (bez označení) + + + + AskPassphraseDialog + + + Dialog + Dialog + + + + + TextLabel + Textový popisek + + + + Enter passphrase + Zadej platné heslo + + + + New passphrase + Zadej nové heslo + + + + Repeat new passphrase + Totéž heslo jeÅ¡tě jednou + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Zadej nové heslo k peněžence.<br/>Použij <b>alespoň 10 náhodných znaků</b> nebo <b>alespoň osm slov</b>. + + + + Encrypt wallet + ZaÅ¡ifruj peněženku + + + + This operation needs your wallet passphrase to unlock the wallet. + K provedení této operace musíš zadat heslo k peněžence, aby se mohla odemknout. + + + + Unlock wallet + Odemkni peněženku + + + + This operation needs your wallet passphrase to decrypt the wallet. + K provedení této operace musíš zadat heslo k peněžence, aby se mohla deÅ¡ifrovat. + + + + Decrypt wallet + DeÅ¡ifruj peněženku + + + + Change passphrase + Změň heslo + + + + Enter the old and new passphrase to the wallet. + Zadej staré a nové heslo k peněžence. + + + + Confirm wallet encryption + Potvrď zaÅ¡ifrování peněženky + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + VAROVÁNÍ: Pokud zaÅ¡ifrujeÅ¡ peněženku a ztratíš či zapomeneÅ¡ heslo, <b>PŘIJDEÅ  O VÅ ECHNY BITCOINY</b>! +Jsi si jistý, že chceÅ¡ peněženku zaÅ¡ifrovat? + + + + + Wallet encrypted + Peněženka je zaÅ¡ifrována + + + + Bitcoin 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. + Bitcoin se teď ukončí, aby dokončil zaÅ¡ifrování. Pamatuj vÅ¡ak, že pouhé zaÅ¡ifrování peněženky úplně nezabraňuje krádeži tvých bitcoinů malwarem, kterým se může počítač nakazit. + + + + + Warning: The Caps Lock key is on. + Upozornění: Caps Lock je zapnutý. + + + + + + + Wallet encryption failed + ZaÅ¡ifrování peněženky selhalo + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + ZaÅ¡ifrování peněženky selhalo kvůli vnitřní chybě. Tvá peněženka tedy nebyla zaÅ¡ifrována. + + + + + The supplied passphrases do not match. + Zadaná hesla nejsou shodná. + + + + Wallet unlock failed + Odemčení peněženky selhalo + + + + + + The passphrase entered for the wallet decryption was incorrect. + Nezadal jsi správné heslo pro deÅ¡ifrování peněženky. + + + + Wallet decryption failed + DeÅ¡ifrování peněženky selhalo + + + + Wallet passphrase was succesfully changed. + Heslo k peněžence bylo v pořádku změněno. + + + + BitcoinGUI + + + Bitcoin Wallet + Bitcoinová peněženka + + + + + Synchronizing with network... + Synchronizuji se sítí... + + + + Block chain synchronization in progress + Provádí se synchronizace řetězce bloků + + + + &Overview + &Přehled + + + + Show general overview of wallet + Zobraz celkový přehled peněženky + + + + &Transactions + &Transakce + + + + Browse transaction history + Procházet historii transakcí + + + + &Address Book + &Adresář + + + + Edit the list of stored addresses and labels + Uprav seznam uložených adres a jejich označení + + + + &Receive coins + Pří&jem mincí + + + + Show the list of addresses for receiving payments + Zobraz seznam adres pro příjem plateb + + + + &Send coins + P&oslání mincí + + + + Send coins to a bitcoin address + PoÅ¡li mince na Bitcoinovou adresu + + + + Sign &message + Po&depiÅ¡ zprávu + + + + Prove you control an address + Prokaž vlastnictví adresy + + + + E&xit + &Konec + + + + Quit application + Ukončit aplikaci + + + + &About %1 + &O %1 + + + + Show information about Bitcoin + Zobraz informace o Bitcoinu + + + + About &Qt + O &Qt + + + + Show information about Qt + Zobraz informace o Qt + + + + &Options... + &Možnosti... + + + + Modify configuration options for bitcoin + Uprav nastavení Bitcoinu + + + + Open &Bitcoin + Otevři &Bitcoin + + + + Show the Bitcoin window + Zobraz okno Bitcoinu + + + + &Export... + &Export... + + + + Export the data in the current tab to a file + Exportovat data z tohoto panelu do souboru + + + + &Encrypt Wallet + ZaÅ¡i&fruj peněženku + + + + Encrypt or decrypt wallet + ZaÅ¡ifruj nebo deÅ¡ifruj peněženku + + + + &Backup Wallet + &Zazálohovat peněženku + + + + Backup wallet to another location + Zazálohuj peněženku na jiné místo + + + + &Change Passphrase + Změň &heslo + + + + Change the passphrase used for wallet encryption + Změň heslo k Å¡ifrování peněženky + + + + &File + &Soubor + + + + &Settings + &Nastavení + + + + &Help + Ná&pověda + + + + Tabs toolbar + Panel s listy + + + + Actions toolbar + Panel akcí + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n aktivní spojení do Bitcoinové sítě%n aktivní spojení do Bitcoinové sítě%n aktivních spojení do Bitcoinové sítě + + + + Downloaded %1 of %2 blocks of transaction history. + Staženo %1 z %2 bloků transakční historie. + + + + Downloaded %1 blocks of transaction history. + Staženo %1 bloků transakční historie. + + + + %n second(s) ago + před vteřinoupřed %n vteřinamipřed %n vteřinami + + + + %n minute(s) ago + před minutoupřed %n minutamipřed %n minutami + + + + %n hour(s) ago + před hodinoupřed %n hodinamipřed %n hodinami + + + + %n day(s) ago + včerapřed %n dnypřed %n dny + + + + Up to date + aktuální + + + + Catching up... + Stahuji... + + + + Last received block was generated %1. + Poslední stažený blok byl vygenerován %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Tahle transakce přesahuje velikostní limit. I tak ji ale můžeÅ¡ poslat, pokud za ni zaplatíš poplatek %1, který půjde uzlům, které tvou transakci zpracují, a navíc tak podpoříš síť. ChceÅ¡ zaplatit poplatek? + + + + Sending... + Posílám... + + + + Sent transaction + Odeslané transakce + + + + Incoming transaction + Příchozí transakce + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Datum: %1 +Částka: %2 +Typ: %3 +Adresa: %4 + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Peněženka je <b>zaÅ¡ifrovaná</b> a momentálně <b>odemčená</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Peněženka je <b>zaÅ¡ifrovaná</b> a momentálně <b>zamčená</b> + + + + Backup Wallet + Záloha peněženky + + + + Wallet Data (*.dat) + Data peněženky (*.dat) + + + + Backup Failed + Zálohování selhalo + + + + There was an error trying to save the wallet data to the new location. + Při ukládání peněženky na nové místo se přihodila nějaká chyba. + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Jednotka pro částky: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Zvol výchozí podjednotku, která se bude zobrazovat v programu a při posílání mincí + + + + Display addresses in transaction list + Ukazovat adresy ve výpisu transakcí + + + + EditAddressDialog + + + Edit Address + Uprav adresu + + + + &Label + &Označení + + + + The label associated with this address book entry + Označení spojené s tímto záznamem v adresáři + + + + &Address + &Adresa + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Adresa spojená s tímto záznamem v adresáři. Lze upravovat jen pro odesílací adresy. + + + + New receiving address + Nová přijímací adresa + + + + New sending address + Nová odesílací adresa + + + + Edit receiving address + Uprav přijímací adresu + + + + Edit sending address + Uprav odesílací adresu + + + + The entered address "%1" is already in the address book. + Zadaná adresa "%1" už v adresáři je. + + + + The entered address "%1" is not a valid bitcoin address. + Zadaná adresa "%1" není platná Bitcoinová adresa. + + + + Could not unlock wallet. + Nemohu odemknout peněženku. + + + + New key generation failed. + Nepodařilo se mi vygenerovat nový klíč. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &Spustit Bitcoin při startu systému + + + + Automatically start Bitcoin after the computer is turned on + Automaticky spustí Bitcoin po zapnutí počítače + + + + &Minimize to the tray instead of the taskbar + &Minimalizovávat do ikony v panelu + + + + Show only a tray icon after minimizing the window + Po minimalizaci okna zobrazí pouze ikonu v panelu + + + + Map port using &UPnP + Namapovat port přes &UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Automaticky otevře potřebný port na routeru. Tohle funguje jen za předpokladu, že tvůj router podporuje UPnP a že je UPnP povolené. + + + + M&inimize on close + &Zavřením minimalizovat + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Zavřením se aplikace minimalizuje. Pokud je tato volba zaÅ¡krtnuta, tak se aplikace ukončí pouze zvolením Konec v menu. + + + + &Connect through SOCKS4 proxy: + &Připojit přes SOCKS4 proxy: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Připojí se do Bitcoinové sítě přes SOCKS4 proxy (např. když se připojuje přes Tor) + + + + Proxy &IP: + &IP adresa proxy: + + + + IP address of the proxy (e.g. 127.0.0.1) + IP adresa proxy (např. 127.0.0.1) + + + + &Port: + P&ort: + + + + Port of the proxy (e.g. 1234) + Port proxy (např. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Dobrovolný transakční poplatek za každý započatý kB dopomáhá k rychlému zpracování tvých transakcí. VětÅ¡ina transakcí má do 1 kB. Doporučená výše poplatku je 0.01. + + + + Pay transaction &fee + Platit &transakční poplatek + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Dobrovolný transakční poplatek za každý započatý kB dopomáhá k rychlému zpracování tvých transakcí. VětÅ¡ina transakcí má do 1 kB. Doporučená výše poplatku je 0.01. + + + + MessagePage + + + Message + Zpráva + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + Podepsáním zprávy svými adresami můžeÅ¡ prokázat, že je skutečně vlastníš. Buď opatrný a nepodepisuj nic vágního; například při phishingových útocích můžeÅ¡ být lákán, abys něco takového podepsal. Podepisuj pouze zcela úplná a detailní prohlášení, se kterými souhlasíš. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Tvá adresa (např. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Vyber adresu z adresáře + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Vlož adresu ze schránky + + + + Alt+P + Alt+V + + + + Enter the message you want to sign here + Sem vepiÅ¡ zprávu, kterou chceÅ¡ podepsat + + + + Click "Sign Message" to get signature + Kliknutím na "PodepiÅ¡ zprávu" získáš podpis + + + + Sign a message to prove you own this address + PodepiÅ¡ zprávu, čímž prokážeÅ¡, že jsi vlastníkem této adresy + + + + &Sign Message + &PodepiÅ¡ zprávu + + + + Copy the currently selected address to the system clipboard + Zkopíruj podpis do systémové schránky + + + + &Copy to Clipboard + &Zkopíruj do schránky + + + + + + Error signing + Chyba při podepisování + + + + %1 is not a valid address. + %1 není platná adresa. + + + + Private key for %1 is not available. + Soukromý klíč pro %1 není dostupný. + + + + Sign failed + Podepisování selhalo + + + + OptionsDialog + + + Main + Hlavní + + + + Display + Zobrazení + + + + Options + Možnosti + + + + OverviewPage + + + Form + Formulář + + + + Balance: + Stav účtu: + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Počet transakcí: + + + + 0 + 0 + + + + Unconfirmed: + Nepotvrzeno: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Peněženka</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Poslední transakce</b> + + + + Your current balance + Aktuální stav tvého účtu + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Celkem z transakcí, které jeÅ¡tě nejsou potvrzené a které se jeÅ¡tě nezapočítávají do celkového stavu účtu + + + + Total number of transactions in wallet + Celkový počet transakcí v peněžence + + + + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + QR kód + + + + Request Payment + Požadovat platbu + + + + Amount: + Částka: + + + + BTC + BTC + + + + Label: + Označení: + + + + Message: + Zpráva: + + + + &Save As... + &Ulož jako... + + + + Save Image... + Ulož obrázek... + + + + PNG Images (*.png) + PNG obrázky (*.png) + + + + SendCoinsDialog + + + + + + + + + + Send Coins + PoÅ¡li mince + + + + Send to multiple recipients at once + PoÅ¡li více příjemcům naráz + + + + &Add recipient... + Při&dej příjemce... + + + + Remove all transaction fields + Smaž vÅ¡echny transakční formuláře + + + + Clear all + VÅ¡echno smaž + + + + Balance: + Stav účtu: + + + + 123.456 BTC + 123.456 BTC + + + + Confirm the send action + Potvrď odeslání + + + + &Send + &PoÅ¡li + + + + <b>%1</b> to %2 (%3) + <b>%1</b> pro %2 (%3) + + + + Confirm send coins + Potvrď odeslání mincí + + + + Are you sure you want to send %1? + Jsi si jistý, že chceÅ¡ poslat %1? + + + + and + a + + + + The recepient address is not valid, please recheck. + Adresa příjemce je neplatná, překontroluj ji prosím. + + + + The amount to pay must be larger than 0. + Odesílaná částka musí být větší než 0. + + + + Amount exceeds your balance + Částka překračuje stav účtu + + + + Total exceeds your balance when the %1 transaction fee is included + Celková částka při připočítání poplatku %1 překročí stav účtu + + + + Duplicate address found, can only send to each address once in one send operation + Zaznamenána duplikovaná adresa; každá adresa může být v odesílané platbě pouze jednou + + + + Error: Transaction creation failed + Chyba: Vytvoření transakce selhalo + + + + Error: 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. + Chyba Transakce byla odmítnuta. Tohle může nastat, pokud nějaké mince z tvé peněženky už jednou byly utraceny, například pokud používáš kopii souboru wallet.dat a mince byly utraceny v druhé kopii, ale nebyly označeny jako utracené v této. + + + + SendCoinsEntry + + + Form + Formulář + + + + A&mount: + Čá&stka: + + + + Pay &To: + &Komu: + + + + + Enter a label for this address to add it to your address book + Zadej označení této adresy; obojí se ti pak uloží do adresáře + + + + &Label: + &Označení: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresa příjemce (např. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Vyber adresu z adresáře + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Vlož adresu ze schránky + + + + Alt+P + Alt+P + + + + Remove this recipient + Smaž tohoto příjemce + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Zadej Bitcoinovou adresu (např. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Otevřeno pro %1 bloků + + + + Open until %1 + Otřevřeno dokud %1 + + + + %1/offline? + %1/offline? + + + + %1/unconfirmed + %1/nepotvrzeno + + + + %1 confirmations + %1 potvrzení + + + + <b>Status:</b> + <b>Stav:</b> + + + + , has not been successfully broadcast yet + , jeÅ¡tě nebylo rozesláno + + + + , broadcast through %1 node + , rozesláno přes %1 uzel + + + + , broadcast through %1 nodes + , rozesláno přes %1 uzlů + + + + <b>Date:</b> + <b>Datum:</b> + + + + <b>Source:</b> Generated<br> + <b>Zdroj:</b> Vygenerováno<br> + + + + + <b>From:</b> + <b>Od:</b> + + + + unknown + neznámo + + + + + + <b>To:</b> + <b>Pro:</b> + + + + (yours, label: + (tvoje, označení: + + + + (yours) + (tvoje) + + + + + + + <b>Credit:</b> + <b>Příjem:</b> + + + + (%1 matures in %2 more blocks) + (%1 dozraje po %2 blocích) + + + + (not accepted) + (neakceptováno) + + + + + + <b>Debit:</b> + <b>Výdaj:</b> + + + + <b>Transaction fee:</b> + <b>Transakční poplatek:</b> + + + + <b>Net amount:</b> + <b>Čistá částka:</b> + + + + Message: + Zpráva: + + + + Comment: + Komentář: + + + + Transaction ID: + ID transakce: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Vygenerované mince musí čekat 120 bloků, než mohou být utraceny. Když jsi vygeneroval tenhle blok, tak byl rozposlán do sítě, aby byl přidán do řetězce bloků. Pokud se mu nepodaří dostat se do řetězce, změní se na "neakceptovaný" a nepůjde utratit. Občas se to může stát, když jiný uzel vygeneruje blok zhruba ve stejném okamžiku jako ty. + + + + TransactionDescDialog + + + Transaction details + Detaily transakce + + + + This pane shows a detailed description of the transaction + Toto okno zobrazuje detailní popis transakce + + + + TransactionTableModel + + + Date + Datum + + + + Type + Typ + + + + Address + Adresa + + + + Amount + Částka + + + + Open for %n block(s) + Otevřeno pro 1 blokOtevřeno pro %n blokyOtevřeno pro %n bloků + + + + Open until %1 + Otřevřeno dokud %1 + + + + Offline (%1 confirmations) + Offline (%1 potvrzení) + + + + Unconfirmed (%1 of %2 confirmations) + Nepotvrzeno (%1 z %2 potvrzení) + + + + Confirmed (%1 confirmations) + Potvrzeno (%1 potvrzení) + + + + Mined balance will be available in %n more blocks + Vytěžené mince budou použitelné po jednom blokuVytěžené mince budou použitelné po %n blocíchVytěžené mince budou použitelné po %n blocích + + + + This block was not received by any other nodes and will probably not be accepted! + Tento blok nedostal žádný jiný uzel a pravděpodobně nebude akceptován! + + + + Generated but not accepted + Vygenerováno, ale neakceptováno + + + + Received with + Přijato do + + + + Received from + Přijato od + + + + Sent to + Posláno na + + + + Payment to yourself + Platba sama sobě + + + + Mined + Vytěženo + + + + (n/a) + (n/a) + + + + Transaction status. Hover over this field to show number of confirmations. + Stav transakce. Najetím myÅ¡i na toto políčko si zobrazíš počet potvrzení. + + + + Date and time that the transaction was received. + Datum a čas přijetí transakce. + + + + Type of transaction. + Druh transakce. + + + + Destination address of transaction. + Cílová adresa transakce. + + + + Amount removed from or added to balance. + Částka odečtená z nebo přičtená k účtu. + + + + TransactionView + + + + All + VÅ¡e + + + + Today + Dnes + + + + This week + Tento týden + + + + This month + Tento měsíc + + + + Last month + Minulý měsíc + + + + This year + Letos + + + + Range... + Rozsah... + + + + Received with + Přijato + + + + Sent to + Posláno + + + + To yourself + Sám sobě + + + + Mined + Vytěženo + + + + Other + Ostatní + + + + Enter address or label to search + Zadej adresu nebo označení pro její vyhledání + + + + Min amount + Minimální částka + + + + Copy address + Kopíruj adresu + + + + Copy label + Kopíruj její označení + + + + Copy amount + Kopíruj částku + + + + Edit label + Uprav označení + + + + Show details... + Zobraz detaily.... + + + + Export Transaction Data + Exportuj transakční data + + + + Comma separated file (*.csv) + CSV formát (*.csv) + + + + Confirmed + Potvrzeno + + + + Date + Datum + + + + Type + Typ + + + + Label + Označení + + + + Address + Adresa + + + + Amount + Částka + + + + ID + ID + + + + Error exporting + Chyba při exportu + + + + Could not write to file %1. + Nemohu zapisovat do souboru %1. + + + + Range: + Rozsah: + + + + to + až + + + + WalletModel + + + Sending... + Posílám... + + + + bitcoin-core + + + Bitcoin version + Verze Bitcoinu + + + + Usage: + Užití: + + + + Send command to -server or bitcoind + Poslat příkaz pro -server nebo bitcoind + + + + List commands + Výpis příkazů + + + + Get help for a command + Získat nápovědu pro příkaz + + + + Options: + Možnosti: + + + + Specify configuration file (default: bitcoin.conf) + Konfigurační soubor (výchozí: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + PID soubor (výchozí: bitcoind.pid) + + + + Generate coins + Generovat mince + + + + Don't generate coins + Negenerovat mince + + + + Start minimized + Startovat minimalizovaně + + + + Specify data directory + Adresář pro data + + + + Specify connection timeout (in milliseconds) + Zadej časový limit spojení (v milisekundách) + + + + Connect through socks4 proxy + Připojovat se přes socks4 proxy + + + + Allow DNS lookups for addnode and connect + Povolit DNS dotazy pro addnode (přidání uzlu) a connect (připojení) + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + Čekat na spojení na <portu> (výchozí: 8333 nebo testnet: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Povol nejvýše <n> připojení k uzlům (výchozí: 125) + + + + Add a node to connect to + Přidat uzel, ke kterému se připojit + + + + Connect only to the specified node + Připojovat se pouze k udanému uzlu + + + + Don't accept connections from outside + Nepřijímat připojení zvenčí + + + + Don't bootstrap list of peers using DNS + Nenačítat seznam uzlů z DNS + + + + Threshold for disconnecting misbehaving peers (default: 100) + Práh pro odpojování nesprávně se chovajících uzlů (výchozí: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Doba ve vteřinách, po kterou se nebudou moci nesprávně se chovající uzly znovu připojit (výchozí: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maximální velikost přijímacího bufferu pro každé spojení, <n>*1000 bytů (výchozí: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maximální velikost odesílacího bufferu pro každé spojení, <n>*1000 bytů (výchozí: 10000) + + + + Don't attempt to use UPnP to map the listening port + Nesnažit se použít UPnP k namapování naslouchacího portu + + + + Attempt to use UPnP to map the listening port + Snažit se použít UPnP k namapování naslouchacího portu + + + + Fee per kB to add to transactions you send + Poplatek za kB, který se přidá ke každé odeslané transakci + + + + Accept command line and JSON-RPC commands + Akceptovat příkazy z příkazové řádky a přes JSON-RPC + + + + Run in the background as a daemon and accept commands + Běžet na pozadí jako démon a akceptovat příkazy + + + + Use the test network + Použít testovací síť (testnet) + + + + Output extra debugging information + Tisknout speciální ladící informace + + + + Prepend debug output with timestamp + Připojit před ladící výstup časové razítko + + + + Send trace/debug info to console instead of debug.log file + Posílat stopovací/ladící informace do konzole místo do souboru debug.log + + + + Send trace/debug info to debugger + Posílat stopovací/ladící informace do debuggeru + + + + Username for JSON-RPC connections + Uživatelské jméno pro JSON-RPC spojení + + + + Password for JSON-RPC connections + Heslo pro JSON-RPC spojení + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Čekat na JSON-RPC spojení na <portu> (výchozí: 8332) + + + + Allow JSON-RPC connections from specified IP address + Povolit JSON-RPC spojení ze specifikované IP adresy + + + + Send commands to node running on <ip> (default: 127.0.0.1) + Posílat příkazy uzlu běžícím na <ip> (výchozí: 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + Nastavit zásobník klíčů na velikost <n> (výchozí: 100) + + + + Rescan the block chain for missing wallet transactions + Přeskenovat řetězec bloků na chybějící transakce tvé pěněženky + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +Možnosti SSL: (viz instrukce nastavení SSL v Bitcoin Wiki) + + + + Use OpenSSL (https) for JSON-RPC connections + Použít OpenSSL (https) pro JSON-RPC spojení + + + + Server certificate file (default: server.cert) + Soubor se serverovým certifikátem (výchozí: server.cert) + + + + Server private key (default: server.pem) + Soubor se serverovým soukromým klíčem (výchozí: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Akceptovatelné Å¡ifry (výchozí: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Tato nápověda + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Nedaří se mi získat zámek na datový adresář %s. Bitcoin pravděpodobně už jednou běží. + + + + Loading addresses... + Načítám adresy... + + + + Error loading addr.dat + Chyba při načítání addr.dat + + + + Error loading blkindex.dat + Chyba při načítání blkindex.dat + + + + Error loading wallet.dat: Wallet corrupted + Chyba při načítání wallet.dat: peněženka je poÅ¡kozená + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Chyba při načítání wallet.dat: peněženka vyžaduje novější verzi Bitcoinu + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Soubor s peněženkou potřeboval přepsat: restartuj Bitcoin, aby se operace dokončila + + + + Error loading wallet.dat + Chyba při načítání wallet.dat + + + + Loading block index... + Načítám index bloků... + + + + Loading wallet... + Načítám peněženku... + + + + Rescanning... + Přeskenovávám... + + + + Done loading + Načítání dokončeno + + + + Invalid -proxy address + Neplatná -proxy adresa + + + + Invalid amount for -paytxfee=<amount> + Neplatná částka pro -paytxfee=<částka> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Upozornění: -paytxfee je nastaveno velmi vysoko. Toto je transakční poplatek, který zaplatíš za každou poslanou transakci. + + + + Error: CreateThread(StartNode) failed + Chyba: Selhalo CreateThread(StartNode) + + + + Warning: Disk space is low + Upozornění: Na disku je málo místa + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Nedaří se mi připojit na port %d na tomhle počítači. Bitcoin už pravděpodobně jednou běží. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + Upozornění: Zkontroluj, že máš v počítači správně nastavený datum a čas. Pokud jsou nastaveny Å¡patně, Bitcoin nebude fungovat správně. + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts index 7e5e683..1a7f916 100644 --- a/src/qt/locale/bitcoin_da.ts +++ b/src/qt/locale/bitcoin_da.ts @@ -14,20 +14,14 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright © 2009-2011 Bitcoin Developers - -Dette program er ekperimentielt. - -Det er gjort tilgængeligt under MIT/X11 softwarelicensen. Se den tilhørende fil "license.txt" eller http://www.opensource.org/licenses/mit-license.php. - -Produktet indeholder software som er udviklet af OpenSSL Project til brug i OpenSSL Toolkit (http://www.openssl.org/), kryptografisk software skrevet af Eric Young (eay@cryptsoft.com) og UPnP-software skrevet by Thomas Bernard. + @@ -69,31 +63,66 @@ Produktet indeholder software som er udviklet af OpenSSL Project til brug i Open + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Slet den valgte adresse fra listen. Kun adresser brugt til afsendelse kan slettes. - + &Delete &Slet - + + Copy address + Kopier adresse + + + + Copy label + Kopier etiket + + + + Edit + + + + + Delete + + + + Export Address Book Data Eksporter Adressekartoteketsdata - + Comma separated file (*.csv) Kommasepareret fil (*. csv) - + Error exporting Fejl under eksport - + Could not write to file %1. Kunne ikke skrive til filen %1. @@ -125,125 +154,132 @@ Produktet indeholder software som er udviklet af OpenSSL Project til brug i Open + TextLabel TekstEtiket - + Enter passphrase Indtast adgangskode - + New passphrase Ny adgangskode - + Repeat new passphrase Gentag ny adgangskode - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Indtast den nye adgangskode til tegnebogen.<br/>Brug venligst en adgangskode pÃ¥ <b>10 eller flere tilfældige tegn</b>, eller <b>otte eller flere ord</b>. - + Encrypt wallet Krypter tegnebog - + This operation needs your wallet passphrase to unlock the wallet. Denne funktion har brug for din tegnebogs kodeord for at lÃ¥se tegnebogen op. - + Unlock wallet LÃ¥s tegnebog op - + This operation needs your wallet passphrase to decrypt the wallet. Denne funktion har brug for din tegnebogs kodeord for at dekryptere tegnebogen. - + Decrypt wallet Dekryptér tegnebog - + Change passphrase Skift adgangskode - + Enter the old and new passphrase to the wallet. Indtast den gamle og nye adgangskode til tegnebogen. - + Confirm wallet encryption Bekræft tegnebogskryptering - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? ADVARSEL: Hvis du krypterer din tegnebog og mister dit kodeord vil du <b>miste alle dine BITCOINS</b>! Er du sikker pÃ¥ at du ønsker at kryptere din tegnebog? - - + + Wallet encrypted Tegnebog krypteret - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Husk, at kryptere din tegnebog vil ikke fuldt ud beskytte dine bitcoins mod at blive stjÃ¥let af malware pÃ¥ din computer. + + Bitcoin 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. + - - - - + + + Warning: The Caps Lock key is on. + + + + + + + Wallet encryption failed Tegnebogskryptering mislykkedes - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Tegnebogskryptering mislykkedes pÃ¥ grund af en intern fejl. Din tegnebog blev ikke krypteret. - - + + The supplied passphrases do not match. De angivne kodeord stemmer ikke overens. - + Wallet unlock failed TegnebogsoplÃ¥sning mislykkedes - - + + The passphrase entered for the wallet decryption was incorrect. Det angivne kodeord for tegnebogsdekrypteringen er forkert. - + Wallet decryption failed Tegnebogsdekryptering mislykkedes - + Wallet passphrase was succesfully changed. Tegnebogskodeord blev ændret. @@ -251,247 +287,278 @@ Er du sikker pÃ¥ at du ønsker at kryptere din tegnebog? BitcoinGUI - + Bitcoin Wallet Bitcoin Tegnebog - + + Synchronizing with network... Synkroniserer med netværk ... - + Block chain synchronization in progress Blokkæde synkronisering i gang - + &Overview &Oversigt - + Show general overview of wallet Vis generel oversigt over tegnebog - + &Transactions &Transaktioner - + Browse transaction history Gennemse transaktionshistorik - + &Address Book &Adressebog - + Edit the list of stored addresses and labels Rediger listen over gemte adresser og etiketter - + &Receive coins &Modtag coins - + Show the list of addresses for receiving payments Vis listen over adresser for at modtage betalinger - + &Send coins &Send coins - + Send coins to a bitcoin address Send coins til en bitcoinadresse - + + Sign &message + + + + + Prove you control an address + + + + E&xit &Luk - + Quit application Afslut program - + &About %1 &Om %1 - + Show information about Bitcoin Vis oplysninger om Bitcoin - + + About &Qt + + + + + Show information about Qt + + + + &Options... &Indstillinger ... - + Modify configuration options for bitcoin Rediger konfigurationsindstillinger af bitcoin - + Open &Bitcoin Åbn &Bitcoin - + Show the Bitcoin window Vis Bitcoinvinduet - + &Export... &Eksporter... - - Export the current view to a file - Eksportér den aktuelle visning til en fil + + Export the data in the current tab to a file + - + &Encrypt Wallet &Kryptér tegnebog - + Encrypt or decrypt wallet Kryptér eller dekryptér tegnebog - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase &Skift adgangskode - + Change the passphrase used for wallet encryption Skift kodeord anvendt til tegnebogskryptering - + &File &Fil - + &Settings &Indstillinger - + &Help &Hjælp - + Tabs toolbar Faneværktøjslinje - + Actions toolbar Handlingsværktøjslinje - + [testnet] [testnet] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n aktiv(e) forbindelse(r) til Bitcoinnetværket%n aktiv(e) forbindelse(r) til Bitcoinnetværket - + Downloaded %1 of %2 blocks of transaction history. Downloadet %1 af %2 blokke af transaktionshistorie. - + Downloaded %1 blocks of transaction history. Downloadet %1 blokke af transaktionshistorie. - + %n second(s) ago %n sekund(er) siden%n sekund(er) siden - + %n minute(s) ago %n minut(ter) siden%n minut(ter) siden - + %n hour(s) ago %n time(r) siden%n time(r) siden - + %n day(s) ago %n dag(e) siden%n dag(e) siden - + Up to date Opdateret - + Catching up... Indhenter... - + Last received block was generated %1. Sidst modtagne blok blev genereret %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Denne transaktion er over størrelsesbegrænsningen. Du kan stadig sende den for et gebyr pÃ¥ %1 som gÃ¥r til de noder der behandler din transaktion, og som hjælper med at støtte netværket. Ønsker du at betale gebyret? - + Sending... Sender... - + Sent transaction Afsendt transaktion - + Incoming transaction IndgÃ¥ende transaktion - + Date: %1 Amount: %2 Type: %3 @@ -504,15 +571,35 @@ Adresse: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Tegnebog er <b>krypteret</b> og i øjeblikket <b>ulÃ¥st</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> Tegnebog er <b>krypteret</b> og i øjeblikket <b>lÃ¥st</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -580,22 +667,22 @@ Adresse: %4 Rediger afsendelsesadresse - + The entered address "%1" is already in the address book. Den indtastede adresse "%1" er allerede i adressebogen. - + The entered address "%1" is not a valid bitcoin address. Den indtastede adresse "%1" er ikke en gyldig bitcoinadresse. - + Could not unlock wallet. Kunne ikke lÃ¥se tegnebog op. - + New key generation failed. Ny nøglegenerering mislykkedes. @@ -674,8 +761,8 @@ Adresse: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Valgfri transaktionsgebyr pr. kB, der hjælper dine transaktioner med at blive behandlet hurtigt. De fleste transaktioner er pÃ¥ 1kB. Gebyr pÃ¥ 0.01 anbefales. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + @@ -684,8 +771,98 @@ Adresse: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Valgfri transaktionsgebyr pr. kB, der hjælper dine transaktioner med at blive behandlet hurtigt. De fleste transaktioner er pÃ¥ 1kB. Gebyr pÃ¥ 0.01 anbefales. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresse som betalingen skal sendes til (f.eks. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Vælg adresse fra adressebog + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Indsæt adresse fra udklipsholderen + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Kopier den valgte adresse til systemets udklipsholder + + + + &Copy to Clipboard + &Kopier til Udklipsholder + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + @@ -753,7 +930,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> @@ -778,16 +955,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + Besked: + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Send Coins @@ -803,81 +1033,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + + + + Clear all Ryd alle - + Balance: Saldo: - + 123.456 BTC 123.456 BTC - + Confirm the send action Bekræft afsendelsen - + &Send &Afsend - + <b>%1</b> to %2 (%3) <b>%1</b> til %2 (%3) - + Confirm send coins Bekræft afsendelse af coins - + Are you sure you want to send %1? Er du sikker pÃ¥ at du vil sende %1? - + and og - + The recepient address is not valid, please recheck. Modtagerens adresse er ikke gyldig. Tjek venligst adressen igen. - + The amount to pay must be larger than 0. Beløbet til betaling skal være større end 0. - + Amount exceeds your balance Beløbet overstiger din saldo - + Total exceeds your balance when the %1 transaction fee is included Totalen overstiger din saldo nÃ¥r %1 transaktionsgebyr er inkluderet - + Duplicate address found, can only send to each address once in one send operation Duplikeret adresse fundet. Du kan kun sende til hver adresse en gang pr. afsendelse. - + Error: Transaction creation failed Fejl: Oprettelse af transaktionen mislykkedes - + Error: 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. Fejl: Transaktionen blev afvist. Dette kan ske hvis nogle af dine coins i din tegnebog allerede var brugt, som hvis du brugte en kopi af wallet.dat og dine coins er blevet brugt i kopien, men ikke er markeret som brugt her. @@ -949,135 +1184,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Åben for %1 blokke - + Open until %1 Åben indtil %1 - + %1/offline? %1/offline? - + %1/unconfirmed %1/ubekræftet - + %1 confirmations %1 bekræftelser - + <b>Status:</b> <b>Status:</b> - + , has not been successfully broadcast yet , er ikke blevet transmitteret endnu - + , broadcast through %1 node , transmitteret via %1 node - + , broadcast through %1 nodes , transmitteret via %1 noder - + <b>Date:</b> <b>Dato:</b> - + <b>Source:</b> Generated<br> <b>Kilde:</b> Genereret<br> - - + + <b>From:</b> <b>Fra:</b> - + unknown ukendt - - - + + + <b>To:</b> <b>Til:</b> - + (yours, label: (din, etiket: - + (yours) (din) - - - - + + + + <b>Credit:</b> <b>Kredit:</b> - + (%1 matures in %2 more blocks) (%1 modnes i %2 blokke mere) - + (not accepted) (ikke accepteret) - - - + + + <b>Debit:</b> <b>Debet:</b> - + <b>Transaction fee:</b> <b>Transaktionsgebyr:</b> - + <b>Net amount:</b> <b>Nettobeløb:</b> - + Message: Besked: - + Comment: Kommentar: - + + Transaction ID: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Genererede coins skal vente 120 blokke, før de kan blive brugt. Da du genererede denne blok blev det transmitteret til netværket, for at blive føjet til blokkæden. Hvis det mislykkes at komme ind i kæden, vil den skifte til "ikke godkendt", og ikke blive kunne bruges. Dette kan lejlighedsvis ske, hvis en anden node genererer en blok inden for fÃ¥ sekunder af din. @@ -1164,56 +1404,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Modtaget fra IP + Received from + - + Sent to Sendt til - - Sent to IP - Sendt til IP - - - + Payment to yourself Betaling til dig selv - + Mined Minerede - + (n/a) (n/a) - + Transaction status. Hover over this field to show number of confirmations. Transactionsstatus. Hold musen over dette felt for at vise antallet af bekræftelser. - + Date and time that the transaction was received. Dato og tid for at transaktionen blev modtaget. - + Type of transaction. Type af transaktion. - + Destination address of transaction. Destinationsadresse for transaktion. - + Amount removed from or added to balance. Beløb fjernet eller tilføjet balance. @@ -1292,16 +1527,21 @@ p, li { white-space: pre-wrap; } Min. beløb - + Copy address Kopier adresse - + Copy label Kopier etiket + + Copy amount + + + Edit label Rediger etiket @@ -1312,67 +1552,67 @@ p, li { white-space: pre-wrap; } Vis detaljer... - + Export Transaction Data Eksportér Transaktionsdata - + Comma separated file (*.csv) Kommasepareret fil (*.csv) - + Confirmed Bekræftet - + Date Dato - + Type Type - + Label Etiket - + Address Adresse - + Amount Beløb - + ID ID - + Error exporting Fejl under eksport - + Could not write to file %1. Kunne ikke skrive til filen %1. - + Range: Interval: - + to til @@ -1380,7 +1620,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Sender... @@ -1399,939 +1639,366 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind Send kommando til -server eller bitcoind - List commands - + List commands Liste over kommandoer - Get help for a command - + Get help for a command FÃ¥ hjælp til en kommando - Options: - + Options: Indstillinger: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Angiv konfigurationsfil (standard: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) Angiv pid-fil (default: bitcoind.pid) - Generate coins - + Generate coins Generér coins - Don't generate coins - + Don't generate coins Generér ikke coins - Start minimized - + Start minimized Start minimeret - Specify data directory - + Specify data directory Angiv databibliotek - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Angiv tilslutningstimeout (i millisekunder) - Connect through socks4 proxy - + Connect through socks4 proxy Tilslut via SOCKS4 proxy - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Tillad DNS-opslag for addnode og connect - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to Tilføj en node til at forbinde til - - Connect only to the specified node - + + Connect only to the specified node Tilslut kun til den angivne node - - Don't accept connections from outside - + + Don't accept connections from outside Acceptér ikke forbindelser udefra - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port Forsøg ikke at bruge UPnP til at konfigurere den lyttende port - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port Forsøg at bruge UPnP til at kofnigurere den lyttende port - - Fee per kB to add to transactions you send - - Gebyr pr. kB, som skal tilføjes til transaktioner du sender - + + Fee per kB to add to transactions you send + - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands Accepter kommandolinje- og JSON-RPC-kommandoer - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands Kør i baggrunden som en service, og acceptér kommandoer - - Use the test network - + + Use the test network Brug test-netværket - - Username for JSON-RPC connections - + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections Brugernavn til JSON-RPC-forbindelser - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Password til JSON-RPC-forbindelser - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) Lyt til JSON-RPC-forbindelser pÃ¥ <port> (standard: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address Tillad JSON-RPC-forbindelser fra bestemt IP-adresse - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) Send kommandoer til node, der kører pÃ¥ <ip> (standard: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Sæt nøglepoolstørrelse til <n> (standard: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions Gennemsøg blokkæden for manglende tegnebogstransaktioner - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) SSL-indstillinger: (se Bitcoin Wiki for SSL opsætningsinstruktioner) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections Brug OpenSSL (https) for JSON-RPC-forbindelser - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) Servercertifikat-fil (standard: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Server private nøgle (standard: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Acceptabele ciphers (standard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message Denne hjælpebesked - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. Kan lÃ¥se data-biblioteket %s. Bitcoin kører sikkert allerede. - + Loading addresses... Indlæser adresser... - - Error loading addr.dat - - Fejl ved indlæsning af addr.dat - + + Error loading addr.dat + - - Loading block index... - Indlæser blok-indeks... + + Error loading blkindex.dat + - - Error loading blkindex.dat - - Fejl ved indlæsning af blkindex.dat - + + Error loading wallet.dat: Wallet corrupted + - - Loading wallet... - Indlæser tegnebog... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + - - Error loading wallet.dat: Wallet corrupted - - Fejl ved indlæsning af wallet.dat: Tegnebog ødelagt - + + Wallet needed to be rewritten: restart Bitcoin to complete + - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Fejl ved indlæsning af wallet.dat: Tegnebog kræver en nyere version af Bitcoin - + + Error loading wallet.dat + - - Error loading wallet.dat - - Fejl ved indlæsning af wallet.dat - + + Loading block index... + Indlæser blok-indeks... - + + Loading wallet... + Indlæser tegnebog... + + + Rescanning... Genindlæser... - + Done loading Indlæsning gennemført - + Invalid -proxy address Ugyldig -proxy adresse - + Invalid amount for -paytxfee=<amount> Ugyldigt beløb for -paytxfee=<amount> - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Advarsel:-paytxfee er sat meget højt. Dette er det gebyr du vil betale, hvis du sender en transaktion. - + Error: CreateThread(StartNode) failed Fejl: CreateThread(StartNode) mislykkedes - + Warning: Disk space is low Advarsel: Diskplads er lav - + Unable to bind to port %d on this computer. Bitcoin is probably already running. Kunne ikke binde sig til port %d pÃ¥ denne computer. Bitcoin kører sikkert allerede. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Denne transaktion er over størrelsesbegrænsningen. Du kan stadig sende den for et gebyr pÃ¥ %s som gÃ¥r til de noder der behandler din transaktion, og som hjælper med at støtte netværket. Ønsker du at betale gebyret? - - - - Enter the current passphrase to the wallet. - Indtast den nuværende adgangskode til tegnebogen. - - - - Passphrase - Adgangskode - - - - Please supply the current wallet decryption passphrase. - Angiv venligst det nuværende kodeord til dekryptering af tegnebog. - - - - The passphrase entered for the wallet decryption was incorrect. - Det angivne kodeord for tegnebogsdekrypteringen er forkert. - - - - Status - Status - - - - Date - Dato - - - - Description - Beskrivelse - - - - Debit - Debet - - - - Credit - Kredit - - - Open for %d blocks - Åben for %d blokke - - - - Open until %s - Åben indtil %s - - - - %d/offline? - %d/offline? - - - - %d/unconfirmed - %d/ubekræftet - - - - %d confirmations - %d bekræftelser - - - - Generated - Genereret - - - - Generated (%s matures in %d more blocks) - Genereret (%s modnes om %d blokke) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Genereret - Advarsel: Denne blok blev ikke modtaget af nogen andre noder, og vil formentlig ikke blive accepteret! - - - - Generated (not accepted) - Genereret (ikke accepteret) - - - - From: - Fra: - - - - Received with: - Modtaget med: - - - - Payment to yourself - Betaling til dig selv - - - - To: - Til: - - - - Generating - Generering - - - - (not connected) - (ikke tilsluttet) - - - - %d connections %d blocks %d transactions - %d forbindelser %d blokke %d transaktioner - - - - Wallet already encrypted. - Tegnebog er allerede krypteret. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Indtast den nye adgangskode til tegnebogen. -Brug venligst en adgangskode pÃ¥ 10 eller flere tilfældige tegn, eller otte eller flere ord. - - - - Error: The supplied passphrase was too short. - Fejl: Den angivne kodeord var for kort. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - ADVARSEL: Hvis du krypterer din tegnebog og mister dit kodeord, vil du miste alle dine BITCOINS! -Er du sikker pÃ¥ at du ønsker at kryptere din tegnebog? - - - - Please re-enter your new wallet passphrase. - Angiv venligst dit nye tegneborgskodeord igen. - - - - Error: the supplied passphrases didn't match. - Fejl: de angive kodeord stemte ikke overens. - - - - Wallet encryption failed. - Tegnebogskryptering mislykkedes. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Tegnebog Krypteret. -Husk at kryptere din tegnebog ikke fuldt ud kan beskytte din bitcoins mod at blive stjÃ¥let af malware inficerer din computer. - - - - Wallet is unencrypted, please encrypt it first. - Tegnebogen er ikke krypteret. Kryptér den venligst først. - - - - Enter the new passphrase for the wallet. - Indtast den nye adgangskode til tegnebogen. - - - - Re-enter the new passphrase for the wallet. - Genindtast den nye adgangskode til tegnebogen. - - - - Wallet Passphrase Changed. - Adgangskode til tegnebog ændret. - - - - New Receiving Address - Ny modtageradresse - - - - You should use a new address for each payment you receive. - -Label - Du bør bruge en ny adresse for hver betaling du modtager. - -Mærkat - - - - <b>Status:</b> - <b>Status:</b> - - - - , has not been successfully broadcast yet - , er ikke blevet transmitteret endnu - - - - , broadcast through %d node - , spredt gennem %d knudepunkt - - - - , broadcast through %d nodes - , spredt gennem %d knudepunkter - - - - <b>Date:</b> - <b>Dato:</b> - - - - <b>Source:</b> Generated<br> - <b>Kilde:</b> Genereret<br> - - - - <b>From:</b> - <b>Fra:</b> - - - - unknown - ukendt - - - - <b>To:</b> - <b>Til:</b> - - - - (yours, label: - (din, etiket: - - - - (yours) - (din) - - - - <b>Credit:</b> - <b>Kredit:</b> - - - - (%s matures in %d more blocks) - (%s bliver moden om %d blokke) - - - - (not accepted) - (ikke accepteret) - - - - <b>Debit:</b> - <b>Debet:</b> - - - - <b>Transaction fee:</b> - <b>Transaktionsgebyr:</b> - - - - <b>Net amount:</b> - <b>Nettobeløb:</b> - - - - Message: - Besked: - - - - Comment: - Kommentar: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Genererede coins skal vente 120 blokke, før de kan blive brugt. Da du genererede denne blok blev det transmitteret til netværket, for at blive føjet til blokkæden. Hvis det mislykkes at komme ind i kæden, vil den skifte til "ikke godkendt", og ikke blive kunne bruges. Dette kan lejlighedsvis ske, hvis en anden node genererer en blok inden for fÃ¥ sekunder af din. - - - - Cannot write autostart/bitcoin.desktop file - Skrivning til filen autostart/bitcoin.desktop ikke mulig - - - - Main - Generelt - - - - &Start Bitcoin on window system startup - &Start Bitcoin nÃ¥r systemet startes - - - - &Minimize on close - &Minimér ved lukning - - - - version %s - version %s - - - - Error in amount - Fejl i beløb - - - - Send Coins - Send Coins - - - - Amount exceeds your balance - Beløb overstiger saldo - - - - Total exceeds your balance when the - Det samlede beløb overstiger saldoen nÃ¥r - - - - transaction fee is included - transaktionsgebyret er inkluderet - - - - Payment sent - Betaling afsendt - - - - Sending... - Sender... - - - - Invalid address - Ugyldig adresse - - - - Sending %s to %s - Sender %s til %s - - - - CANCELLED - ANNULLERET - - - - Cancelled - Annulleret - - - - Transfer cancelled - Overførsel annulleret - - - - Error: - Fejl: - - - - Insufficient funds - Du har ikke penge nok - - - - Connecting... - Forbinder... - - - - Unable to connect - Forbindelse mislykkedes - - - - Requesting public key... - Efterspørger offentlig nøgle... - - - - Received public key... - Modtog offentlig nøgle... - - - - Recipient is not accepting transactions sent by IP address - Modtageren accepterer ikke transaktioner sendt til en IP-adresse - - - - Transfer was not accepted - Overførsel ikke accepteret - - - - Invalid response received - Ugyldigt svar modtaget - - - - Creating transaction... - Opretter transaktion... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Denne transaktion kræver at du betaler et transaktionsgebyr pÃ¥ mindst %s pga. af transaktionens størrelse, dens kompleksitet eller fordi den gør brug af nyligt modtagne penge - - - - Transaction creation failed - Opretning af transaktion mislykkedes - - - - Transaction aborted - Transaktion afbrudt - - - - Lost connection, transaction cancelled - Forbindelse afbrudt, transaktion annulleret - - - - Sending payment... - Sender betaling... - - - - 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. - Transaktionen blev afvist. Dette kan ske hvis nogle af pengene i din tegnebog allerede er brugt, for eksempel hvis du har brugt en kopi af din wallet.dat-fil og pengene er brugt i kopien af din tegnebog, men ikke blev markeret som brugte deri. - - - - Waiting for confirmation... - Afventer bekræftelse... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - Betalingen blev afsendt, men modtageren var ikke i stand til at bekræfte den. -Transaktionen er oprettet og vil kreditere modtageren, -men kommentarfeltet vil være tomt. - - - - Payment was sent, but an invalid response was received - Betalingen blev afsendt, men et ugyldigt svar blev modtaget - - - - Payment completed - Betaling fuldført - - - - Name - Navn - - - - Address - Adresse - - - - Label - Etiket - - - - Bitcoin Address - Bitcoinadresse - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Dette er en af dine egne adresser til at modtage betalinger med, og kan ikke indtastes i adressebogen. - - - - Edit Address - Rediger Adresse - - - - Edit Address Label - Redigér adressemærkat - - - - Add Address - Tilføj adresse - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Bitcoin - Genererer - - - - Bitcoin - (not connected) - Bitcoin - (ikke tilsluttet) - - - - &Open Bitcoin - Å&bn Bitcoin - - - - &Send Bitcoins - &Send Bitcoins - - - - O&ptions... - &Indstillinger... - - - - E&xit - &Luk - - - - Program has crashed and will terminate. - Programmet er gÃ¥et ned og vil afslutte. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Advarsel: Undersøg venligst at din computers dato og klokkeslet er korrekt indstillet. Hvis der er fejl i disse vil Bitcoin ikke fungere korrekt. - + beta beta - - main - - - Bitcoin Qt - Bitcoin Qt - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts index c815b77..42cb17d 100644 --- a/src/qt/locale/bitcoin_de.ts +++ b/src/qt/locale/bitcoin_de.ts @@ -14,20 +14,20 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright © 2009-2011 Bitcoin Entwickler + Copyright © 2009-2012 Bitcoin Entwickler Dies ist experimentelle Software. -Veröffentlicht unter der MIT/X11 Software-Lizenz. Sie können diese in der beiligenden Datei license.txt oder unter http://www.opensource.org/licenses/mit-license.php nachlesen. +Veröffentlicht unter der MIT/X11 Software-Lizenz, siehe beiligende Datei license.txt oder http://www.opensource.org/licenses/mit-license.php. -Dieses Produkt enthält Software, welche vom OpenSSL Projekt zur Verwendung im OpenSSL Toolkit (http://www.openssl.org/) entwickelt wurde, kryptographische Software von Eric Young (eay@cryptsoft.com) und UPnP Software von Thomas-Bernard. +Dieses Produkt enthält Software, die vom OpenSSL Projekt zur Verwendung im OpenSSL Toolkit (http://www.openssl.org/) entwickelt wurde, sowie kryptographische Software geschrieben von Eric Young (eay@cryptsoft.com) und UPnP Software geschrieben von Thomas Bernard. @@ -40,22 +40,22 @@ Dieses Produkt enthält Software, welche vom OpenSSL Projekt zur Verwendung im O These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. - Dies sind ihre Bitcoin-Adressen zum Empfangen von Zahlungen. Um Ihre Zahlungen zurückverfolgen zu können, schlagen wir vor, jedem Sender eine andere Empfangsaddresse mitzuteilen. + Dies sind Ihre Bitcoin-Adressen zum Empfangen von Zahlungen. Es steht Ihnen frei, jedem Absender eine andere mitzuteilen, um einen besseren Überblick über eingehende Zahlungen zu erhalten. Double-click to edit address or label - Doppelklick zum Ändern der Adresse oder der Bezeichnung + Doppelklicken, um die Adresse oder die Bezeichnung zu bearbeiten Create a new address - Neue Adresse erstellen + Eine neue Adresse erstellen &New Address... - &Neue Adresse... + &Neue Adresse @@ -65,37 +65,72 @@ Dieses Produkt enthält Software, welche vom OpenSSL Projekt zur Verwendung im O &Copy to Clipboard - &In die Zwischenablage kopieren + In die Zwischenablage &kopieren + Show &QR Code + &QR-Code anzeigen + + + + Sign a message to prove you own this address + Eine Nachricht signieren, um den Besitz einer Adresse zu beweisen + + + + &Sign Message + Nachricht &signieren + + + Delete the currently selected address from the list. Only sending addresses can be deleted. - Die ausgewählte Adresse aus der Liste entfernen. Sie können nur ausgehende Adressen entfernen. + Die ausgewählte Adresse aus der Liste entfernen. Sie können nur Zahlungsadressen entfernen. - + &Delete &Löschen - + + Copy address + Adresse kopieren + + + + Copy label + Bezeichnung kopieren + + + + Edit + Bearbeiten + + + + Delete + Löschen + + + Export Address Book Data Adressbuch exportieren - + Comma separated file (*.csv) Kommagetrennte Datei (*.csv) - + Error exporting Fehler beim Exportieren - + Could not write to file %1. - Konnte Datei %1 nicht zum Schreiben öffnen. + Konnte nicht in Datei %1 schreiben. @@ -125,125 +160,131 @@ Dieses Produkt enthält Software, welche vom OpenSSL Projekt zur Verwendung im O + TextLabel - Text Bezeichnung + Textbezeichnung - + Enter passphrase Passphrase eingeben - + New passphrase Neue Passphrase - + Repeat new passphrase Neue Passphrase wiederholen - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. - Geben Sie die neue Passphrase für die Brieftasche ein.<br/>Bitte benutzen Sie eine Passphrase von <b>zehn oder mehr zufälligen Zeichen</b> oder <b>acht oder mehr Wörter</b>. + Geben Sie die neue Passphrase für die Brieftasche ein.<br>Bitte benutzen Sie eine Passphrase bestehend aus <b>10 oder mehr zufälligen Zeichen</b> oder <b>8 oder mehr Wörtern</b>. - + Encrypt wallet Brieftasche verschlüsseln - + This operation needs your wallet passphrase to unlock the wallet. Dieser Vorgang benötigt Ihre Passphrase um die Brieftasche zu entsperren. - + Unlock wallet Brieftasche entsperren - + This operation needs your wallet passphrase to decrypt the wallet. Dieser Vorgang benötigt Ihre Passphrase um die Brieftasche zu entschlüsseln. - + Decrypt wallet Brieftasche entschlüsseln - + Change passphrase Passphrase ändern - + Enter the old and new passphrase to the wallet. Geben Sie die alte und die neue Passphrase der Brieftasche ein. - + Confirm wallet encryption - Bestätige die Verschlüsselung der Brieftasche + Verschlüsselung der Brieftasche bestätigen - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? - WARNUNG: Wenn Sie Ihre Brieftasche verschlüsseln und Ihre Passphrase verlieren, werden Sie <b>ALLE IHRE BITCOINS VERLIEREN</b>! -Sind Sie sich sicher, dass Sie Ihre Brieftasche verschlüsseln möchten? + WARNUNG: Wenn Sie Ihre Brieftasche verschlüsseln und Ihre Passphrase verlieren, werden Sie <b>ALLE IHRE BITCOINS VERLIEREN</b>!<br><br>Sind Sie sich sicher, dass Sie Ihre Brieftasche verschlüsseln möchten? - - + + Wallet encrypted Brieftasche verschlüsselt - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Beachten Sie, dass das Verschlüsseln Ihrer Brieftasche nicht komplett vor Diebstahl Ihrer Bitcoins durch Malware schützt, die Ihren Computer infiziert hat. + + Bitcoin 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. + Bitcoin wird jetzt beendet, um den Verschlüsselungsprozess abzuschließen. Bitte beachten Sie, dass die Verschlüsselung Ihrer Brieftasche nicht vollständig vor Diebstahl Ihrer Bitcoins durch Schadsoftware schützt, die Ihren Computer befällt. - - - - + + + Warning: The Caps Lock key is on. + Warnung: Die Feststelltaste ist aktiviert. + + + + + + Wallet encryption failed Verschlüsselung der Brieftasche fehlgeschlagen - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. - Die Verschlüsselung der Brieftasche ist wegen eines internen Fehlers fehlgeschlagen. Ihre Brieftasche wurde nicht verschlüsselt. + Die Verschlüsselung der Brieftasche ist aufgrund eines internen Fehlers fehlgeschlagen. Ihre Brieftasche wurde nicht verschlüsselt. - - + + The supplied passphrases do not match. Die eingegebenen Passphrasen stimmen nicht überein. - + Wallet unlock failed Entsperrung der Brieftasche fehlgeschlagen - - + + The passphrase entered for the wallet decryption was incorrect. Die eingegebene Passphrase zum Entschlüsseln der Brieftasche war nicht korrekt. - + Wallet decryption failed Entschlüsselung der Brieftasche fehlgeschlagen - + Wallet passphrase was succesfully changed. Die Passphrase der Brieftasche wurde erfolgreich geändert. @@ -251,247 +292,278 @@ Sind Sie sich sicher, dass Sie Ihre Brieftasche verschlüsseln möchten? BitcoinGUI - + Bitcoin Wallet Bitcoin-Brieftasche - + + Synchronizing with network... Synchronisiere mit Netzwerk... - + Block chain synchronization in progress - Synchronisiere mit der Blockkette + Synchronisation der Blockkette wird durchgeführt - + &Overview &Übersicht - + Show general overview of wallet - Zeige allgemeine Übersicht der Brieftasche + Allgemeine Übersicht der Brieftasche anzeigen - + &Transactions &Transaktionen - + Browse transaction history Transaktionsverlauf durchsehen - + &Address Book &Adressbuch - + Edit the list of stored addresses and labels - Gespeicherte Adressen und Bezeichnungen bearbeiten + Liste der gespeicherten Zahlungsadressen und Bezeichnungen bearbeiten - + &Receive coins - &Bitcoins empfangen + Bitcoins &empfangen - + Show the list of addresses for receiving payments - Liste der Adressen zum Empfangen von Zahlungen anzeigen + Liste der Empfangsadressen anzeigen - + &Send coins - &Bitcoins überweisen + Bitcoins &überweisen - + Send coins to a bitcoin address Bitcoins an eine Bitcoin-Adresse überweisen - + + Sign &message + &Nachricht signieren... + + + + Prove you control an address + Beweisen Sie die Kontrolle einer Adresse + + + E&xit - + &Beenden - + Quit application Anwendung beenden - + &About %1 &Über %1 - + Show information about Bitcoin Informationen über Bitcoin anzeigen - + + About &Qt + Über &Qt + + + + Show information about Qt + Informationen über Qt anzeigen + + + &Options... - &Einstellungen... + &Erweiterte Einstellungen... - + Modify configuration options for bitcoin - Einstellungen für Bitcoin ändern + Erweiterte Bitcoin-Einstellungen ändern - + Open &Bitcoin &Bitcoin öffnen - + Show the Bitcoin window Bitcoin-Fenster anzeigen - + &Export... - &Exportieren... + &Exportieren nach... - - Export the current view to a file - Aktuelle Ansicht in eine Datei exportieren + + Export the data in the current tab to a file + Daten der aktuellen Ansicht in eine Datei exportieren - + &Encrypt Wallet - Brieftasche &verschlüsseln + Brieftasche &verschlüsseln... - + Encrypt or decrypt wallet Brieftasche ent- oder verschlüsseln - + + &Backup Wallet + Brieftasche &sichern... + + + + Backup wallet to another location + Eine Sicherungskopie der Brieftasche erstellen und abspeichern + + + &Change Passphrase - Passphrase &ändern + Passphrase &ändern... - + Change the passphrase used for wallet encryption Ändert die Passphrase, die für die Verschlüsselung der Brieftasche benutzt wird - + &File &Datei - + &Settings &Einstellungen - + &Help &Hilfe - + Tabs toolbar Registerkarten-Leiste - + Actions toolbar Aktionen-Werkzeugleiste - + [testnet] [testnet] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n aktive Verbindung zum Bitcoin-Netzwerk%n aktive Verbindungen zum Bitcoin-Netzwerk - + Downloaded %1 of %2 blocks of transaction history. - %1 von %2 Blöcken des Transaktionsverlauf heruntergeladen. + %1 von %2 Blöcken des Transaktionsverlaufs heruntergeladen. - + Downloaded %1 blocks of transaction history. %1 Blöcke des Transaktionsverlaufs heruntergeladen. - + %n second(s) ago vor %n Sekundevor %n Sekunden - + %n minute(s) ago vor %n Minutevor %n Minuten - + %n hour(s) ago vor %n Stundevor %n Stunden - + %n day(s) ago vor %n Tagvor %n Tagen - + Up to date Auf aktuellem Stand - + Catching up... Hole auf... - + Last received block was generated %1. - Der letzte empfangene Block wurde am %1 generiert. + Der letzte empfangene Block wurde %1 generiert. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Die Transaktion übersteigt das Größenlimit. Sie können sie jedoch senden, wenn Sie einen zusätzlichen Betrag von %1 zahlen. Dieser geht an die Knoten, die Ihre Transaktion bearbeiten und unterstützt das Bitcoin-Netzwerk. Möchten Sie die Gebühr bezahlen? + Die Transaktion übersteigt das Größenlimit. Sie können sie trotzdem senden, wenn Sie eine zusätzliche Transaktionsgebühr in Höhe von %1 zahlen. Diese wird an die Knoten verteilt, die Ihre Transaktion bearbeiten und unterstützt damit das Bitcoin-Netzwerk.<br><br>Möchten Sie die Gebühr bezahlen? - + Sending... - Senden... + Transaktionsgebühr bestätigen - + Sent transaction Gesendete Transaktion - + Incoming transaction - Empfangene Transaktion + Eingehende Transaktion - + Date: %1 Amount: %2 Type: %3 @@ -503,14 +575,34 @@ Typ: %3 Adresse: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> - Brieftasche ist <b>verschlüsselt</b> und momentan <b>entsperrt</b> + Brieftasche ist <b>verschlüsselt</b> und aktuell <b>entsperrt</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> - Brieftasche ist <b>verschlüsselt</b> und momentan <b>gesperrt</b> + Brieftasche ist <b>verschlüsselt</b> und aktuell <b>gesperrt</b> + + + + Backup Wallet + Brieftasche sichern + + + + Wallet Data (*.dat) + Brieftaschen-Datei (*.dat) + + + + Backup Failed + Sicherung der Brieftasche fehlgeschlagen + + + + There was an error trying to save the wallet data to the new location. + Fehler beim abspeichern der Sicherungskopie der Brieftasche. @@ -523,7 +615,7 @@ Adresse: %4 Choose the default subdivision unit to show in the interface, and when sending coins - Wählen Sie die Standard-Unterteilungseinheit, die in der Benutzeroberfläche und beim Senden von Bitcoins angezeigt werden soll + Wählen Sie die Standard-Untereinheit, die in der Benutzeroberfläche und beim Überweisen von Bitcoins angezeigt werden soll @@ -579,24 +671,24 @@ Adresse: %4 Zahlungsadresse bearbeiten - + The entered address "%1" is already in the address book. Die eingegebene Adresse "%1" befindet sich bereits im Adressbuch. - + The entered address "%1" is not a valid bitcoin address. Die eingegebene Adresse "%1" ist keine gültige Bitcoin-Adresse. - + Could not unlock wallet. Die Brieftasche konnte nicht entsperrt werden. - + New key generation failed. - Neue Schlüsselgenerierung fehlgeschlagen. + Generierung eines neuen Schlüssels fehlgeschlagen. @@ -604,22 +696,22 @@ Adresse: %4 &Start Bitcoin on window system startup - &Bitcoin beim Systemstart ausführen + Bitcoin beim &Systemstart ausführen Automatically start Bitcoin after the computer is turned on - Bitcoin automatisch starten, wenn der Computer eingeschaltet wird + Bitcoin automatisch ausführen, wenn der Computer eingeschaltet wird &Minimize to the tray instead of the taskbar - &In den Infobereich statt in die Taskleiste minimieren + In den Infobereich anstatt in die Taskleiste &minimieren Show only a tray icon after minimizing the window - Nur ein Symbol im Infobereich anzeigen, wenn das Fenster minimiert wird + Nur ein Symbol im Infobereich anzeigen, nachdem das Fenster minimiert wurde @@ -634,7 +726,7 @@ Adresse: %4 M&inimize on close - Beim Schließen m&inimieren + Beim Schließen &minimieren @@ -644,12 +736,12 @@ Adresse: %4 &Connect through SOCKS4 proxy: - &Über einen SOCKS4-Proxy verbinden: + Über einen SOCKS4-Proxy &verbinden: Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) - Über einen SOCKS4-Proxy zum Bitcoin-Netzwerk verbinden (bspw. für eine Verbindung über Tor) + Über einen SOCKS4-Proxy zum Bitcoin-Netzwerk verbinden (z.B. bei einer Verbindung über Tor) @@ -673,8 +765,8 @@ Adresse: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Zusätzliche Transaktionsgebühr pro kB, welche sicherstellt, dass Ihre Transaktionen schnell bearbeitet werden. Die meisten Transaktionen sind 1 kB groß. Eine Gebühr von 0.01 wird empfohlen. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Optionale Transaktionsgebühr pro kB, die sicherstellt, dass Ihre Transaktionen schnell bearbeitet werden. Die meisten Transaktionen sind 1 kB groß. Eine Gebühr von 0.01 wird empfohlen. @@ -683,8 +775,98 @@ Adresse: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Zusätzliche Transaktionsgebühr pro kB, welche sicherstellt, dass Ihre Transaktionen schnell bearbeitet werden. Die meisten Transaktionen sind 1 kB groß. Eine Gebühr von 0.01 wird empfohlen. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Optionale Transaktionsgebühr pro kB, die sicherstellt, dass Ihre Transaktionen schnell bearbeitet werden. Die meisten Transaktionen sind 1 kB groß. Eine Gebühr von 0.01 wird empfohlen. + + + + MessagePage + + + Message + Nachricht signieren + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + Sie können Nachrichten mit Ihren Adressen signieren, um den Besitz dieser Adressen zu beweisen. Bitte nutzen Sie diese Funktion mit Vorsicht und nehmen Sie sich vor Phishing-Angriffen in Acht, um nicht ungewollt etwas zu signieren, dass für Sie negative Auswirkungen haben könnte. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Die Adresse mit der die Nachricht signiert wird (z.B. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Adresse aus dem Adressbuch auswählen + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Adresse aus der Zwischenablage einfügen + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Zu signierende Nachricht hier eingeben + + + + Click "Sign Message" to get signature + Auf "Nachricht signieren" klicken, um die Signatur zu erhalten. Diese wird dann hier angezeigt. + + + + Sign a message to prove you own this address + Die Nachricht signieren, um den Besitz der angegebenen Adresse nachzuweisen + + + + &Sign Message + Nachricht &signieren + + + + Copy the currently selected address to the system clipboard + Aktuelle Signatur in die Zwischenablage kopieren + + + + &Copy to Clipboard + Signatur in die Zwischenablage &kopieren + + + + + + Error signing + Fehler beim Signieren + + + + %1 is not a valid address. + %1 ist keine gültige Adresse. + + + + Private key for %1 is not available. + Privater Schlüssel für %1 ist nicht verfügbar. + + + + Sign failed + Signierung der Nachricht fehlgeschlagen @@ -692,7 +874,7 @@ Adresse: %4 Main - Haupt + Allgemein @@ -702,7 +884,7 @@ Adresse: %4 Options - Einstellungen + Erweiterte Einstellungen @@ -752,7 +934,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Brieftasche</span></p></body></html> @@ -768,7 +950,7 @@ p, li { white-space: pre-wrap; } Total of transactions that have yet to be confirmed, and do not yet count toward the current balance - Anzahl der Transaktionen, die noch bestätigt werden müssen und noch nicht zum aktuellen Kontostand zählen + Betrag aus unbestätigten Transaktionen, der noch nicht im aktuellen Kontostand enthalten ist @@ -777,108 +959,166 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + QR-Code + + + + Request Payment + Zahlung anfordern + + + + Amount: + Betrag: + + + + BTC + BTC + + + + Label: + Bezeichnung: + + + + Message: + Nachricht: + + + + &Save As... + &Speichern unter... + + + + Save Image... + QR-Code abspeichern + + + + PNG Images (*.png) + PNG Bild (*.png) + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Bitcoins überweisen Send to multiple recipients at once - An mehrere Empfänger auf einmal überweisen + In einer Transaktion an mehrere Empfänger auf einmal überweisen &Add recipient... - &Empfänger hinzufügen... + &Empfänger hinzufügen + Remove all transaction fields + Alle Überweisungsfelder zurücksetzen + + + Clear all Zurücksetzen - + Balance: Kontostand: - + 123.456 BTC 123.456 BTC - + Confirm the send action Überweisung bestätigen - + &Send &Überweisen - + <b>%1</b> to %2 (%3) <b>%1</b> an %2 (%3) - + Confirm send coins Überweisung bestätigen - + Are you sure you want to send %1? - Sind Sie sich sicher, dass Sie folgendes überweisen möchten: %1? + Sind Sie sich sicher, dass Sie die folgende Überweisung ausführen möchten?<br>%1 - + and und - + The recepient address is not valid, please recheck. - Die Empfangsadresse ist ungültig, bitte nochmals überprüfen. + Die Zahlungsadresse ist ungültig, bitte nochmals überprüfen. - + The amount to pay must be larger than 0. - Der zu zahlende Betrag muss mehr als 0 betragen. + Der zu zahlende Betrag muss größer 0 sein. - + Amount exceeds your balance - Der Betrag übersteigt Ihren Kontostand + Der angegebene Betrag übersteigt Ihren Kontostand. - + Total exceeds your balance when the %1 transaction fee is included - Summe übersteigt aufgrund der Transaktionsgebühr in Höhe von %1 Ihren Kontostand + Der angegebene Betrag übersteigt aufgrund der Transaktionsgebühr in Höhe von %1 Ihren Kontostand. - + Duplicate address found, can only send to each address once in one send operation - Doppelte Adresse gefunden. Pro Vorgang kann an eine Adresse nur einmalig etwas überwiesen werden + Doppelte Adresse gefunden, pro Überweisung kann an jede Adresse nur einmalig etwas überwiesen werden - + Error: Transaction creation failed Fehler: Transaktionserstellung fehlgeschlagen - + Error: 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. - Fehler: Die Transaktion wurde abgelehnt. Dies kann passieren, wenn einige Ihrer Bitcoins aus Ihrer Brieftasche bereits ausgegeben wurden (z.B. aus einer Sicherungskopie Ihrer wallet.dat). + Fehler: Die Transaktion wurde abgelehnt. Dies kann passieren, wenn einige Bitcoins aus Ihrer Brieftasche bereits ausgegeben wurden. Beispielsweise weil Sie eine Kopie Ihrer wallet.dat genutzt, die Bitcoins dort ausgegeben haben und dies daher in der derzeit aktiven Brieftasche nicht vermerkt ist. @@ -902,7 +1142,7 @@ p, li { white-space: pre-wrap; } Enter a label for this address to add it to your address book - Geben Sie hier eine Bezeichnung der Adresse ein, um sie zum Adressbuch hinzuzufügen + Adressbezeichnung eingeben (diese wird bei unbekannten Adressen inkl. der Adresse dem Adressbuch hinzugefügt) @@ -912,12 +1152,12 @@ p, li { white-space: pre-wrap; } The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) - Die Empfangsadresse für die Überweisung (z.B. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Die Zahlungsadresse der Überweisung (z.B. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) Choose address from address book - Adresse aus dem Adressbuch auswählen + Adresse aus Adressbuch wählen @@ -948,137 +1188,142 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Offen für %1 Blöcke - + Open until %1 Offen bis %1 - + %1/offline? %1/offline? - + %1/unconfirmed %1/unbestätigt - + %1 confirmations %1 Bestätigungen - + <b>Status:</b> <b>Status:</b> - + , has not been successfully broadcast yet - ; wurde noch nicht erfolgreich gesendet + , wurde noch nicht erfolgreich übertragen - + , broadcast through %1 node - ; über %1 Knoten gesendet + , über %1 Knoten übertragen - + , broadcast through %1 nodes - ; über %1 Knoten gesendet + , über %1 Knoten übertragen - + <b>Date:</b> <b>Datum:</b> - + <b>Source:</b> Generated<br> <b>Quelle:</b> Generiert<br> - - + + <b>From:</b> <b>Von:</b> - + unknown unbekannt - - - + + + <b>To:</b> <b>An:</b> - + (yours, label: - (Ihre, Bezeichnung: + (Eigene Adresse, Bezeichnung: - + (yours) - (Ihre) + (Eigene Adresse) - - - - + + + + <b>Credit:</b> <b>Gutschrift:</b> - + (%1 matures in %2 more blocks) - (%1 reift in weiteren %2 Blöcken) + %1 (reift noch %2 weitere Blöcke) - + (not accepted) (nicht angenommen) - - - + + + <b>Debit:</b> <b>Belastung:</b> - + <b>Transaction fee:</b> <b>Transaktionsgebühr:</b> - + <b>Net amount:</b> <b>Nettobetrag:</b> - + Message: Nachricht: - + Comment: Kommentar: - + + Transaction ID: + Transaktions-ID: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Generierte Bitcoins müssen 120 Blöcke lang warten, bevor sie ausgegeben werden können. Als Sie diesen Block generierten, wurde er an das Netzwerk gesendet, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und der Betrag wird nicht verfügbar werden. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block zur selben Zeit wie Sie generierte. + Generierte Bitcoins müssen 120 Blöcke lang warten, bevor sie ausgegeben werden können. Als Sie diesen Block generierten, wurde er an das Netzwerk übertragen, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und der Betrag wird nicht verfügbar werden. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block zur selben Zeit wie Sie generierte. @@ -1159,62 +1404,57 @@ p, li { white-space: pre-wrap; } Received with - Empfangen durch + Empfangen über - Received from IP - Empfangen von IP + Received from + Empfangen von - + Sent to Überwiesen an - - Sent to IP - Überwiesen an IP - - - + Payment to yourself - Zahlung an Sie selbst + Eigenüberweisung - + Mined Erarbeitet - + (n/a) (k.A.) - + Transaction status. Hover over this field to show number of confirmations. Transaktionsstatus. Fahren Sie mit der Maus über dieses Feld, um die Anzahl der Bestätigungen zu sehen. - + Date and time that the transaction was received. Datum und Uhrzeit als die Transaktion empfangen wurde. - + Type of transaction. - Art der Transaktion. + Art der Transaktion - + Destination address of transaction. - Empfangsadresse der Transaktion. + Zieladresse der Transaktion. - + Amount removed from or added to balance. - Betrag vom Kontostand entfernt oder hinzugefügt. + Der Betrag, der dem Kontostand abgezogen oder hinzugefügt wurde. @@ -1253,12 +1493,12 @@ p, li { white-space: pre-wrap; } Range... - Bereich... + Zeitraum Received with - Empfangen durch + Empfangen über @@ -1268,7 +1508,7 @@ p, li { white-space: pre-wrap; } To yourself - Zu Ihnen selbst + Eigenüberweisung @@ -1288,19 +1528,24 @@ p, li { white-space: pre-wrap; } Min amount - Kleinster Betrag + Minimaler Betrag - + Copy address Adresse kopieren - + Copy label Bezeichnung kopieren + + Copy amount + Betrag kopieren + + Edit label Bezeichnung bearbeiten @@ -1308,70 +1553,70 @@ p, li { white-space: pre-wrap; } Show details... - Details anzeigen... + Transaktionsdetails anzeigen - + Export Transaction Data Transaktionen exportieren - + Comma separated file (*.csv) Kommagetrennte Datei (*.csv) - + Confirmed Bestätigt - + Date Datum - + Type Typ - + Label Bezeichnung - + Address Adresse - + Amount Betrag - + ID ID - + Error exporting Fehler beim Exportieren - + Could not write to file %1. Konnte nicht in Datei %1 schreiben. - + Range: - Bereich: + Zeitraum: - + to bis @@ -1379,7 +1624,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Überweise... @@ -1398,917 +1643,335 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - - Sende Befehl an -server oder bitcoind - + Send command to -server or bitcoind + Befehl an -server oder bitcoind senden - List commands - - Befehle auflisten - + List commands + Befehle auflisten - Get help for a command - - Hilfe für Befehl erhalten - + Get help for a command + Hilfe zu einem Befehl erhalten - Options: - + Options: Einstellungen: - Specify configuration file (default: bitcoin.conf) - - Bitte wählen Sie eine Konfigurationsdatei (Standard: bitcoin.conf) + Specify configuration file (default: bitcoin.conf) + Konfigurationsdatei angeben (Standard: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - - Bitte wählen Sie den Namen der PID Datei (Standard bitcoind.pid) + Specify pid file (default: bitcoind.pid) + PID-Datei angeben (Standard: bitcoind.pid) - Generate coins - - Erarbeite Bitcoins + Generate coins + Bitcoins generieren - Don't generate coins - - Keine Bitcoins erarbeiten - + Don't generate coins + Keine Bitcoins generieren - Start minimized - - minimiert starten + Start minimized + Minimiert starten - Specify data directory - - Bitte wählen Sie das Datenverzeichnis + Specify data directory + Datenverzeichnis angeben - Specify connection timeout (in milliseconds) - - Netzwerkverbindungsabbruch nach (in Millisekunden) + Specify connection timeout (in milliseconds) + Verbindungstimeout angeben (in Millisekunden) - Connect through socks4 proxy - - Durch SOCKS4-Proxy verbinden + Connect through socks4 proxy + Über einen SOCKS4-Proxy verbinden: - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Erlaube DNS Namensauflösung für addnode und connect - Add a node to connect to - - Bitcoin Knoten hinzufügen - + Listen for connections on <port> (default: 8333 or testnet: 18333) + Verbindungen erwarten an <port> (Standard: 8333 oder test-Netzwerk: 18333) - Connect only to the specified node - - Nur zu angegebenen Knoten verbinden - + Maintain at most <n> connections to peers (default: 125) + Maximal <n> Verbindungen zu Peers aufrechterhalten (Standard: 125) - Don't accept connections from outside - - Keine externen Transatkionen akzeptieren + Add a node to connect to + Einen Knoten hinzufügen, mit dem sich verbunden werden soll - Don't attempt to use UPnP to map the listening port - - UPnP nicht verwenden + Connect only to the specified node + Nur mit dem angegebenem Knoten verbinden - Attempt to use UPnP to map the listening port - - Versuche eine Verbindung mittels UPnP herzustellen + Don't accept connections from outside + Keine Verbindungen von außen akzeptieren - Fee per kB to add to transactions you send - - Gebühr pro kB, die gesendeten Transaktionen hinzugefügt wird - + Don't bootstrap list of peers using DNS + Keine Peerliste durch die Nutzung von DNS erzeugen - Accept command line and JSON-RPC commands - - Erlaube Kommandozeilen und JSON-RPC Befehle - + Threshold for disconnecting misbehaving peers (default: 100) + Schwellenwert, um Verbindungen zu sich nicht konform verhaltenden Peers zu beenden (Standard: 100) - Run in the background as a daemon and accept commands - - Als Hintergrunddienst starten und Befehle akzeptieren - - - - - Use the test network - - Das Test Netzwerk verwenden - - - - - Username for JSON-RPC connections - - Benutzername für JSON-RPC Verbindungen - + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Anzahl Sekunden, während denen sich nicht konform verhaltenden Peers die Wiederverbindung verweigert wird (Standard: 86400) - Password for JSON-RPC connections - - Passwort für JSON-RPC Verbindungen - + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maximale Größe des Empfangspuffers pro Verbindung, <n>*1000 Bytes (Standard: 10000) - Listen for JSON-RPC connections on <port> (default: 8332) - - Port für JSON-RPC Befehle (Standard: 8332) - + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maximale Größe des Sendepuffers pro Verbindung, <n>*1000 Bytes (Standard: 10000) - Allow JSON-RPC connections from specified IP address - - JSON-RPC Befehle nur von dieser IP-Adresse erlauben - + Don't attempt to use UPnP to map the listening port + Nicht versuchen UPnP zu verwenden, um den abgehörten Port weiterzuleiten - Send commands to node running on <ip> (default: 127.0.0.1) - - Befehle an Bitcoin Knoten <ip> senden (Standard: 127.0.0.1) - + Attempt to use UPnP to map the listening port + Versuchen UPnP zu verwenden, um den abgehörten Port weiterzuleiten - Set key pool size to <n> (default: 100) - - Menge der vorgenerierten Adressen (Standard: 100) - + Fee per kB to add to transactions you send + Gebühr pro kB, die gesendeten Transaktionen hinzugefügt wird - Rescan the block chain for missing wallet transactions - - Blockkette nach verlorenen Transaktionen durchsuchen (rescan) + Accept command line and JSON-RPC commands + Kommandozeilenbefehle und JSON-RPC Befehle annehmen - -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - - SSL Einstellungen: (Siehe im BitCoin-Wiki für eine detallierte Beschreibung) - + Run in the background as a daemon and accept commands + Als Hintergrunddienst starten und Befehle akzeptieren + + + + Use the test network + Das test-Netzwerk verwenden + + + + Output extra debugging information + Ausgabe zusätzlicher Debugging-Informationen - Use OpenSSL (https) for JSON-RPC connections - - JSON-RPC Befehle über OpenSSL (https) - + Prepend debug output with timestamp + Der Debug-Ausgabe einen Zeitstempel voranstellen - Server certificate file (default: server.cert) - - SSL Server Zertifikat (Standard: server.cert) - + Send trace/debug info to console instead of debug.log file + Rückverfolgungs- und Debug-Informationen an die Konsole senden anstatt sie in die debug.log Datei zu schreiben - Server private key (default: server.pem) - - Privater SSL Schlüssel (Standard: server.pem) + Send trace/debug info to debugger + Rückverfolgungs- und Debug-Informationen an den Debugger senden - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - Erlaubte Kryptographiealgorithmen (Standard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Username for JSON-RPC connections + Benutzername für JSON-RPC Verbindungen + + + + Password for JSON-RPC connections + Passwort für JSON-RPC Verbindungen + + + + Listen for JSON-RPC connections on <port> (default: 8332) + JSON-RPC Verbindungen erwarten an <port> (Standard: 8332) - This help message - - Dieser Hilfetext + Allow JSON-RPC connections from specified IP address + JSON-RPC Verbindungen von der angegebenen IP-Adresse erlauben - Cannot obtain a lock on data directory %s. Bitcoin is probably already running. - Konnte das Datenverzeichnis %s nicht sperren. Evtl. wurde das Programm mehrfach gestartet. + Send commands to node running on <ip> (default: 127.0.0.1) + Sende Befehle an Knoten <ip> (Standard: 127.0.0.1) - - Loading addresses... - Lade Adressen... + + Set key pool size to <n> (default: 100) + Setze Größe des Schlüsselpools auf <n> (Standard: 100) - - Error loading addr.dat - - Fehler beim Laden der addr.dat - + + Rescan the block chain for missing wallet transactions + Blockkette erneut nach fehlenden Transaktionen der Brieftasche durchsuchen - - Loading block index... - Lade Blockindex... + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +SSL Einstellungen: (siehe Bitcoin-Wiki für SSL Installationsanweisungen) - Error loading blkindex.dat - - Fehler beim laden der blkindex.dat + Use OpenSSL (https) for JSON-RPC connections + OpenSSL (https) für JSON-RPC Verbindungen benutzen - Loading wallet... - Lade Geldbörse... + Server certificate file (default: server.cert) + Server Zertifikat (Standard: server.cert) - Error loading wallet.dat: Wallet corrupted - - Fehler beim Laden von wallet.dat: Brieftasche beschädigt - + Server private key (default: server.pem) + Privater Serverschlüssel (Standard: server.pem) - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Fehler beim Laden von wallet.dat: Neuere Version von Bitcoin notwendig - - - - - Error loading wallet.dat - - Fehler beim Laden von wallet.dat + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Akzeptierte Chiffren (Standard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - Rescanning... - Lade neu... + This help message + Dieser Hilfetext - Done loading - Laden abgeschlossen - - - - Invalid -proxy address - Fehlerhafte Proxy Adresse - - - - Invalid amount for -paytxfee=<amount> - Ungültige Angabe für -paytxfee=<Betrag> + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Konnte das Datenverzeichnis %s nicht sperren. Evtl. wurde Bitcoin bereits gestartet. - Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. - Warnung: -paytxfee ist auf einen sehr hohen Wert gesetzt. Dies ist die Gebühr die beim senden einer Transaktion fällig wird. + Loading addresses... + Lade Adressen... - - Error: CreateThread(StartNode) failed - Fehler: CreateThread(StartNode) fehlerhaft + + Error loading addr.dat + Fehler beim Laden von addr.dat - - Warning: Disk space is low - Warnung: Festplattenplatz wird knapp. + + Error loading blkindex.dat + Fehler beim Laden von blkindex.dat - Unable to bind to port %d on this computer. Bitcoin is probably already running. - Fehler beim registrieren des Ports %d auf diesem Computer. Evtl. läuft BitCoin bereits - - - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - - - - - Enter the current passphrase to the wallet. - Geben Sie bitte das Passwort für die Brieftasche ein. - - - - Passphrase - Passwort - - - - Please supply the current wallet decryption passphrase. - Bitte die aktuelle Passphrase zur Entschlüsselung eingeben. - - - - The passphrase entered for the wallet decryption was incorrect. - Das eingegebene Passwort für die Brieftasche war fehlerhaft - - - - Status - Status - - - - Date - Datum - - - - Description - Beschreibung - - - - Debit - Debitoren - - - - Credit - Kreditoren - - - - Open for %d blocks - Öffne für %d Blöcke - - - - Open until %s - Geöffnet bis %s - - - - %d/offline? - %d/offline? - - - - %d/unconfirmed - %d/unbestätigt - - - - %d confirmations - %d Bestätigungen - - - - Generated - Generiert - - - - Generated (%s matures in %d more blocks) - Erstellt (%s reift nach %d weiteren Blöcken) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Generiert - Warnung: Dieser Block wurde bei keinem anderen Knoten empfangen und wird wahrscheinlich nicht akzeptiert! - - - - Generated (not accepted) - Generiert (nicht akzeptiert) - - - - From: - Von: - - - - Received with: - Erhalten mit: - - - - Payment to yourself - Bezahlung an sich selbst - - - - To: - An: - - - - Generating - Erzeuge - - - - (not connected) - (nicht verbunden) - - - - %d connections %d blocks %d transactions - %d Verbindungen %d Blöcke %d Transaktionen - - - - Wallet already encrypted. - Brieftasche ist bereits verschlüsselt. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Geben Sie die neue Passphrase für die Brieftasche ein -Bitte benutzen Sie eine Passphrase von 10 oder mehr zufälligen Zeichen oder acht oder mehr Wörtern. - - - - Error: The supplied passphrase was too short. - Fehler: Das eingegebene Passwort war zu kurz. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - WARNUNG: Wenn Sie Ihre Brieftasche verschlüsseln und Ihre Passphrase verlieren, werden Sie <b>ALLE IHRE BITCOINS VERLIEREN</b>! Sind Sie sich sicher, dass Sie Ihre Brieftasche verschlüsseln möchten? - - - - Please re-enter your new wallet passphrase. - Bitte geben Sie Ihr neues Brieftaschenpasswort erneut ein. - - - - Error: the supplied passphrases didn't match. - Fehler: Die eingegebenen Passphrasen stimmen nicht überein. - - - - Wallet encryption failed. - Verschlüsselung der Brieftasche fehlgeschlagen. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - - - - - Wallet is unencrypted, please encrypt it first. - Brieftasche nicht verschlüsselt, bitte zuerst verschlüsseln. - - - - Enter the new passphrase for the wallet. - Gib eine neue Passphrase für die Brieftasche eine. - - - - Re-enter the new passphrase for the wallet. - Gib die neue Passphrase erneut ein. - - - - Wallet Passphrase Changed. - Passphrase geändert. - - - - New Receiving Address - Neue Empfangsadresse - - - - You should use a new address for each payment you receive. - -Label - - - - - <b>Status:</b> - <b>Status:</b> - - - - , has not been successfully broadcast yet - ; wurde noch nicht erfolgreich gesendet - - - - , broadcast through %d node - - - - - , broadcast through %d nodes - - - - - <b>Date:</b> - <b>Datum:</b> - - - - <b>Source:</b> Generated<br> - <b>Quelle:</b> Generiert<br> - - - - <b>From:</b> - <b>Von:</b> - - - - unknown - unbekannt - - - - <b>To:</b> - <b>An:</b> - - - - (yours, label: - (Ihre, Bezeichnung: - - - - (yours) - (Ihre) - - - - <b>Credit:</b> - <b>Gutschrift:</b> - - - - (%s matures in %d more blocks) - - - - - (not accepted) - (nicht angenommen) - - - - <b>Debit:</b> - <b>Belastung:</b> + Error loading wallet.dat: Wallet corrupted + Fehler beim Laden von wallet.dat: Brieftasche beschädigt - - <b>Transaction fee:</b> - <b>Transaktionsgebühr:</b> - - - - <b>Net amount:</b> - <b>Nettobetrag:</b> - - - - Message: - Nachricht: - - - - Comment: - Kommentar: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Generierte Bitcoins müssen 120 Blöcke lang warten, bevor sie ausgegeben werden können. Als Sie diesen Block generierten, wurde er an das Netzwerk gesendet, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und der Betrag wird nicht verfügbar werden. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block zur selben Zeit wie Sie generierte. - - - - Cannot write autostart/bitcoin.desktop file - - - - - Main - Haupt - - - - &Start Bitcoin on window system startup - &Bitcoin beim Systemstart ausführen - - - - &Minimize on close - - - - - version %s - Version %s - - - - Error in amount - - - - - Send Coins - Bitcoins überweisen - - - - Amount exceeds your balance - Betrag übersteigt Ihr Guthaben - - - - Total exceeds your balance when the - - - - - transaction fee is included - - - - - Payment sent - Zahlung gesendet - - - - Sending... - Senden... - - - - Invalid address - ungültige Adresse - - - - Sending %s to %s - Sende %s an %s - - - - CANCELLED - ABGEBROCHEN - - - - Cancelled - Abgebrochen - - - - Transfer cancelled - - - - - Error: - Fehler: - - - - Insufficient funds - Unzureichender Kontostand - - - - Connecting... - Verbinde... - - - - Unable to connect - Kann nicht verbinden - - - - Requesting public key... - - - - - Received public key... - - - - - Recipient is not accepting transactions sent by IP address - + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Fehler beim Laden von wallet.dat: Brieftasche benötigt neuere Version von Bitcoin - - Transfer was not accepted - + + Wallet needed to be rewritten: restart Bitcoin to complete + Brieftasche muss neu geschrieben werden: starten Sie Bitcoin zur Fertigstellung neu - - Invalid response received - - - - - Creating transaction... - - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - - - - - Transaction creation failed - - - - - Transaction aborted - Transaktion abgebrochen - - - - Lost connection, transaction cancelled - - - - - Sending payment... - Sende Zahlung... - - - - 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. - Fehler: Die Transaktion wurde abgelehnt. Dies kann passieren, wenn einige Ihrer Bitcoins aus Ihrer Brieftasche bereits ausgegeben wurden (z.B. aus einer Sicherungskopie Ihrer wallet.dat). - - - - Waiting for confirmation... - Warte auf Bestätigung... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - - - - - Payment was sent, but an invalid response was received - - - - - Payment completed - Die Zahlung wurde abgeschlossen - - - - Name - Name - - - - Address - Adresse - - - - Label - Bezeichnung - - - - Bitcoin Address - Bitcoin Adresse - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - - - - - Edit Address - Adresse bearbeiten + + Error loading wallet.dat + Fehler beim Laden von wallet.dat (Brieftasche) - - Edit Address Label - + + Loading block index... + Lade Blockindex... - - Add Address - Adresse hinzufügen + + Loading wallet... + Lade Geldbörse... - - Bitcoin - Bitcoin + + Rescanning... + Durchsuche erneut... - - Bitcoin - Generating - Bitcoin - Generiere + + Done loading + Laden abgeschlossen - - Bitcoin - (not connected) - Bitcoin - (nicht verbunden) + + Invalid -proxy address + Fehlerhafte Proxy-Adresse - - &Open Bitcoin - + + Invalid amount for -paytxfee=<amount> + Ungültige Angabe für -paytxfee=<Betrag> - - &Send Bitcoins - + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Warnung: -paytxfee ist auf einen sehr hohen Wert gesetzt. Dies ist die Gebühr die beim Senden einer Transaktion fällig wird. - - O&ptions... - + + Error: CreateThread(StartNode) failed + Fehler: CreateThread(StartNode) fehlgeschlagen - - E&xit - + + Warning: Disk space is low + Warnung: Festplattenplatz wird knapp - - Program has crashed and will terminate. - + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Fehler beim registrieren des Ports %d auf diesem Computer. Evtl. wurde Bitcoin bereits gestartet. - + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. - Bitte prüfen Sie Ihre Datums- und Uhrzeiteinstellungen, ansonsten kann es sein das BitCoin nicht ordnungsgemäss funktioniert. + Warnung: Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da Bitcoin ansonsten nicht ordnungsgemäß funktionieren wird. - + beta Beta - - main - - - Bitcoin Qt - Bitcoin Qt - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts index 122f6d5..d83d4bc 100644 --- a/src/qt/locale/bitcoin_en.ts +++ b/src/qt/locale/bitcoin_en.ts @@ -16,7 +16,7 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. @@ -65,31 +65,66 @@ This product includes software developed by the OpenSSL Project for use in the O + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. - + &Delete - + + Copy address + + + + + Copy label + + + + + Edit + + + + + Delete + + + + Export Address Book Data - + Comma separated file (*.csv) - + Error exporting - + Could not write to file %1. @@ -121,124 +156,131 @@ This product includes software developed by the OpenSSL Project for use in the O + TextLabel - + Enter passphrase - + New passphrase - + Repeat new passphrase - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. - + Encrypt wallet - + This operation needs your wallet passphrase to unlock the wallet. - + Unlock wallet - + This operation needs your wallet passphrase to decrypt the wallet. - + Decrypt wallet - + Change passphrase - + Enter the old and new passphrase to the wallet. - + Confirm wallet encryption - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? - - + + Wallet encrypted - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. + + Bitcoin 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. - - - - + + + Warning: The Caps Lock key is on. + + + + + + + Wallet encryption failed - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. - - + + The supplied passphrases do not match. - + Wallet unlock failed - - + + The passphrase entered for the wallet decryption was incorrect. - + Wallet decryption failed - + Wallet passphrase was succesfully changed. @@ -246,177 +288,208 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet - + + Synchronizing with network... - + Block chain synchronization in progress - + &Overview - + Show general overview of wallet - + &Transactions - + Browse transaction history - + &Address Book - + Edit the list of stored addresses and labels - + &Receive coins - + Show the list of addresses for receiving payments - + &Send coins - + Send coins to a bitcoin address - + + Sign &message + + + + + Prove you control an address + + + + E&xit - + Quit application - + &About %1 - + Show information about Bitcoin - + + About &Qt + + + + + Show information about Qt + + + + &Options... - + Modify configuration options for bitcoin - + Open &Bitcoin - + Show the Bitcoin window - + &Export... - - Export the current view to a file + + Export the data in the current tab to a file - + &Encrypt Wallet - + Encrypt or decrypt wallet - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase - + Change the passphrase used for wallet encryption - + &File - + &Settings - + &Help - + Tabs toolbar - + Actions toolbar - + [testnet] - + bitcoin-qt - + %n active connection(s) to Bitcoin network %n active connection to Bitcoin network @@ -424,17 +497,17 @@ Are you sure you wish to encrypt your wallet? - + Downloaded %1 of %2 blocks of transaction history. - + Downloaded %1 blocks of transaction history. - + %n second(s) ago %n second ago @@ -442,7 +515,7 @@ Are you sure you wish to encrypt your wallet? - + %n minute(s) ago %n minute ago @@ -450,7 +523,7 @@ Are you sure you wish to encrypt your wallet? - + %n hour(s) ago %n hour ago @@ -458,7 +531,7 @@ Are you sure you wish to encrypt your wallet? - + %n day(s) ago %n day ago @@ -466,42 +539,42 @@ Are you sure you wish to encrypt your wallet? - + Up to date - + Catching up... - + Last received block was generated %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - + Sending... - + Sent transaction - + Incoming transaction - + Date: %1 Amount: %2 Type: %3 @@ -510,15 +583,35 @@ Address: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -586,22 +679,22 @@ Address: %4 - + The entered address "%1" is already in the address book. - + The entered address "%1" is not a valid bitcoin address. - + Could not unlock wallet. - + New key generation failed. @@ -680,7 +773,7 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. @@ -690,7 +783,97 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose adress from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + + + + + &Copy to Clipboard + + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed @@ -780,16 +963,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins @@ -805,81 +1041,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + + + + Clear all - + Balance: - + 123.456 BTC - + Confirm the send action - + &Send - + <b>%1</b> to %2 (%3) - + Confirm send coins - + Are you sure you want to send %1? - + and - + The recepient address is not valid, please recheck. - + The amount to pay must be larger than 0. - + Amount exceeds your balance - + Total exceeds your balance when the %1 transaction fee is included - + Duplicate address found, can only send to each address once in one send operation - + Error: Transaction creation failed - + Error: 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. @@ -951,135 +1192,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks - + Open until %1 - + %1/offline? - + %1/unconfirmed - + %1 confirmations - + <b>Status:</b> - + , has not been successfully broadcast yet - + , broadcast through %1 node - + , broadcast through %1 nodes - + <b>Date:</b> - + <b>Source:</b> Generated<br> - - + + <b>From:</b> - + unknown - - - + + + <b>To:</b> - + (yours, label: - + (yours) - - - - + + + + <b>Credit:</b> - + (%1 matures in %2 more blocks) - + (not accepted) - - - + + + <b>Debit:</b> - + <b>Transaction fee:</b> - + <b>Net amount:</b> - + Message: - + Comment: - + + Transaction ID: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. @@ -1172,56 +1418,51 @@ p, li { white-space: pre-wrap; } - Received from IP + Received from - + Sent to - - Sent to IP - - - - + Payment to yourself - + Mined - + (n/a) - + Transaction status. Hover over this field to show number of confirmations. - + Date and time that the transaction was received. - + Type of transaction. - + Destination address of transaction. - + Amount removed from or added to balance. @@ -1300,16 +1541,21 @@ p, li { white-space: pre-wrap; } - + Copy address - + Copy label + + Copy amount + + + Edit label @@ -1320,67 +1566,67 @@ p, li { white-space: pre-wrap; } - + Export Transaction Data - + Comma separated file (*.csv) - + Confirmed - + Date - + Type - + Label - + Address - + Amount - + ID - + Error exporting - + Could not write to file %1. - + Range: - + to @@ -1388,7 +1634,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... @@ -1407,894 +1653,334 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind - List commands - + List commands - Get help for a command - + Get help for a command - Options: - + Options: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) - Generate coins - + Generate coins - Don't generate coins - + Don't generate coins - Start minimized - + Start minimized - Specify data directory - + Specify data directory - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) - Connect through socks4 proxy - + Connect through socks4 proxy - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) - Connect only to the specified node - + Maintain at most <n> connections to peers (default: 125) - Don't accept connections from outside - + Add a node to connect to - Don't attempt to use UPnP to map the listening port - + Connect only to the specified node - Attempt to use UPnP to map the listening port - + Don't accept connections from outside - Fee per kB to add to transactions you send - + Don't bootstrap list of peers using DNS - Accept command line and JSON-RPC commands - + Threshold for disconnecting misbehaving peers (default: 100) - Run in the background as a daemon and accept commands - - - - - - Use the test network - - - - - - Username for JSON-RPC connections - + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) - Password for JSON-RPC connections - + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) - Listen for JSON-RPC connections on <port> (default: 8332) - + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) - Allow JSON-RPC connections from specified IP address - + Don't attempt to use UPnP to map the listening port - Send commands to node running on <ip> (default: 127.0.0.1) - + Attempt to use UPnP to map the listening port - Set key pool size to <n> (default: 100) - + Fee per kB to add to transactions you send - Rescan the block chain for missing wallet transactions - + Accept command line and JSON-RPC commands - -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information - Use OpenSSL (https) for JSON-RPC connections - + Prepend debug output with timestamp - Server certificate file (default: server.cert) - + Send trace/debug info to console instead of debug.log file - Server private key (default: server.pem) - + Send trace/debug info to debugger - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) - This help message - + Allow JSON-RPC connections from specified IP address - Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Send commands to node running on <ip> (default: 127.0.0.1) - - Loading addresses... + + Set key pool size to <n> (default: 100) - - Error loading addr.dat - + + Rescan the block chain for missing wallet transactions - - Loading block index... + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) - Error loading blkindex.dat - + Use OpenSSL (https) for JSON-RPC connections - Loading wallet... + Server certificate file (default: server.cert) - Error loading wallet.dat: Wallet corrupted - + Server private key (default: server.pem) - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - - - - - Error loading wallet.dat - + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - Rescanning... + This help message - Done loading - - - - - Invalid -proxy address - - - - - Invalid amount for -paytxfee=<amount> + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. - Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Loading addresses... - - Error: CreateThread(StartNode) failed + + Error loading addr.dat - - Warning: Disk space is low + + Error loading blkindex.dat - Unable to bind to port %d on this computer. Bitcoin is probably already running. - - - - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - - - - - Enter the current passphrase to the wallet. - - - - - Passphrase - - - - - Please supply the current wallet decryption passphrase. - - - - - The passphrase entered for the wallet decryption was incorrect. - - - - - Status - - - - - Date + Error loading wallet.dat: Wallet corrupted - - Description - - - - - Debit - - - - - Credit - - - - - Open for %d blocks - - - - - Open until %s - - - - - %d/offline? - - - - - %d/unconfirmed - - - - - %d confirmations - - - - - Generated - - - - - Generated (%s matures in %d more blocks) - - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - - - - - Generated (not accepted) - - - - - From: - - - - - Received with: - - - - - Payment to yourself - - - - - To: - - - - - Generating - - - - - (not connected) - - - - - %d connections %d blocks %d transactions - - - - - Wallet already encrypted. - - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - - - - - Error: The supplied passphrase was too short. - - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - - - - - Please re-enter your new wallet passphrase. - - - - - Error: the supplied passphrases didn't match. - - - - - Wallet encryption failed. - - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - - - - - Wallet is unencrypted, please encrypt it first. - - - - - Enter the new passphrase for the wallet. - - - - - Re-enter the new passphrase for the wallet. - - - - - Wallet Passphrase Changed. - - - - - New Receiving Address - - - - - You should use a new address for each payment you receive. - -Label - - - - - <b>Status:</b> - - - - - , has not been successfully broadcast yet - - - - - , broadcast through %d node - - - - - , broadcast through %d nodes - - - - - <b>Date:</b> - - - - - <b>Source:</b> Generated<br> - - - - - <b>From:</b> - - - - - unknown - - - - - <b>To:</b> - - - - - (yours, label: - - - - - (yours) - - - - - <b>Credit:</b> - - - - - (%s matures in %d more blocks) - - - - - (not accepted) - - - - - <b>Debit:</b> - - - - - <b>Transaction fee:</b> - - - - - <b>Net amount:</b> + + Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Message: - - - - - Comment: - - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - - - - - Cannot write autostart/bitcoin.desktop file - - - - - Main - - - - - &Start Bitcoin on window system startup - - - - - &Minimize on close - - - - - version %s - - - - - Error in amount - - - - - Send Coins - - - - - Amount exceeds your balance - - - - - Total exceeds your balance when the - - - - - transaction fee is included + + Wallet needed to be rewritten: restart Bitcoin to complete - - Payment sent - - - - - Sending... - - - - - Invalid address - - - - - Sending %s to %s - - - - - CANCELLED - - - - - Cancelled - - - - - Transfer cancelled - - - - - Error: - - - - - Insufficient funds - - - - - Connecting... - - - - - Unable to connect - - - - - Requesting public key... - - - - - Received public key... - - - - - Recipient is not accepting transactions sent by IP address - - - - - Transfer was not accepted - - - - - Invalid response received - - - - - Creating transaction... - - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - - - - - Transaction creation failed - - - - - Transaction aborted - - - - - Lost connection, transaction cancelled - - - - - Sending payment... - - - - - 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. - - - - - Waiting for confirmation... - - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - - - - - Payment was sent, but an invalid response was received - - - - - Payment completed - - - - - Name - - - - - Address - - - - - Label - - - - - Bitcoin Address - - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - - - - - Edit Address + + Error loading wallet.dat - - Edit Address Label + + Loading block index... - - Add Address + + Loading wallet... - - Bitcoin + + Rescanning... - - Bitcoin - Generating + + Done loading - - Bitcoin - (not connected) + + Invalid -proxy address - - &Open Bitcoin + + Invalid amount for -paytxfee=<amount> - - &Send Bitcoins + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. - - O&ptions... + + Error: CreateThread(StartNode) failed - - E&xit + + Warning: Disk space is low - - Program has crashed and will terminate. + + Unable to bind to port %d on this computer. Bitcoin is probably already running. - + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. - + beta - - main - - - Bitcoin Qt - - - diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts index 768efae..a388508 100644 --- a/src/qt/locale/bitcoin_es.ts +++ b/src/qt/locale/bitcoin_es.ts @@ -14,23 +14,14 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright (c) 2009-2010 Bitcoin Developers - -Este es un software experimental. - -Distribuido bajo la licencia MIT/X11, vea el archivo adjunto -license.txt o http://www.opensource.org/licenses/mit-license.php. - -Este producto incluye software desarrollado por OpenSSL Project para su uso en -el OpenSSL Toolkit (http://www.openssl.org) y software criptográfico escrito por -Eric Young (eay@cryptsoft.com) y UPnP software escrito por Thomas Bernard. + @@ -72,31 +63,66 @@ Eric Young (eay@cryptsoft.com) y UPnP software escrito por Thomas Bernard. + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Borra la dirección seleccionada de la lista. Solo las direcciónes de envio se pueden borrar. - + &Delete Bo&rrar - + + Copy address + Copia dirección + + + + Copy label + Copia etiqueta + + + + Edit + + + + + Delete + + + + Export Address Book Data Exporta datos de la Guia de direcciones - + Comma separated file (*.csv) Archivos separados por coma (*.csv) - + Error exporting Exportar errores - + Could not write to file %1. No se pudo escribir al archivo %1. @@ -128,125 +154,132 @@ Eric Young (eay@cryptsoft.com) y UPnP software escrito por Thomas Bernard. + TextLabel Cambiar contraseña: - + Enter passphrase Introduce contraseña actual - + New passphrase Nueva contraseña - + Repeat new passphrase Repite nueva contraseña: - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Introduce la nueva contraseña de cartera.<br/>Por favor utiliza un contraseña <b>de 10 o mas caracteres aleatorios</b>, u <b>ocho o mas palabras</b>. - + Encrypt wallet Encriptar cartera - + This operation needs your wallet passphrase to unlock the wallet. Esta operación necesita la contraseña para desbloquear la cartera. - + Unlock wallet Desbloquea cartera - + This operation needs your wallet passphrase to decrypt the wallet. Esta operación necesita la contraseña para decriptar la cartera. - + Decrypt wallet Decriptar cartera - + Change passphrase Cambia contraseña - + Enter the old and new passphrase to the wallet. Introduce la contraseña anterior y la nueva de cartera - + Confirm wallet encryption Confirma la encriptación de cartera - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? ATENCION: ¡Si encriptas tu cartera y pierdes la contraseña perderas <b>TODOS TUS BITCOINS</b>!" ¿Seguro que quieres seguir encriptando la cartera? - - + + Wallet encrypted Cartera encriptada - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Recuerda que encriptando tu cartera no garantiza mantener a salvo tus bitcoins en caso de tener viruses en el ordenador. + + Bitcoin 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. + - - - - + + + Warning: The Caps Lock key is on. + + + + + + + Wallet encryption failed Encriptación de cartera fallida - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Encriptación de cartera fallida debido a un error interno. Tu cartera no ha sido encriptada. - - + + The supplied passphrases do not match. Las contraseñas no coinciden. - + Wallet unlock failed Desbloqueo de cartera fallido - - + + The passphrase entered for the wallet decryption was incorrect. La contraseña introducida para decriptar la cartera es incorrecta. - + Wallet decryption failed Decriptación de cartera fallida - + Wallet passphrase was succesfully changed. La contraseña de cartera ha sido cambiada con exit. @@ -254,247 +287,278 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet Cartera Bitcoin - + + Synchronizing with network... Sincronizando con la red... - + Block chain synchronization in progress Sincronización cadena de bloques en progreso - + &Overview &Vista general - + Show general overview of wallet Muestra una vista general de cartera - + &Transactions &Transacciónes - + Browse transaction history Visiona el historial de transacciónes - + &Address Book &Guia de direcciónes - + Edit the list of stored addresses and labels Edita la lista de las direcciónes y etiquetas almacenada - + &Receive coins &Recibe monedas - + Show the list of addresses for receiving payments Muestra la lista de direcciónes utilizadas para recibir pagos - + &Send coins &Envia monedas - + Send coins to a bitcoin address Envia monedas a una dirección bitcoin - + + Sign &message + + + + + Prove you control an address + + + + E&xit &Salir - + Quit application Salir de la aplicación - + &About %1 S&obre %1 - + Show information about Bitcoin Muestra información sobre Bitcoin - + + About &Qt + + + + + Show information about Qt + + + + &Options... &Opciones - + Modify configuration options for bitcoin Modifica opciones de configuración - + Open &Bitcoin Abre &Bitcoin - + Show the Bitcoin window Muestra la ventana de Bitcoin - + &Export... &Exporta... - - Export the current view to a file - Exporta la vista actual a un archivo + + Export the data in the current tab to a file + - + &Encrypt Wallet &Encriptar cartera - + Encrypt or decrypt wallet Encriptar o decriptar cartera - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase &Cambiar la contraseña - + Change the passphrase used for wallet encryption Cambiar la contraseña utilizada para la encriptación de cartera - + &File &Archivo - + &Settings &Configuración - + &Help &Ayuda - + Tabs toolbar Barra de pestañas - + Actions toolbar Barra de acciónes - + [testnet] [testnet] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n conexión activa hacia la red Bitcoin%n conexiones activas hacia la red Bitcoin - + Downloaded %1 of %2 blocks of transaction history. Se han bajado %1 de %2 bloques de historial. - + Downloaded %1 blocks of transaction history. Se han bajado %1 bloques de historial. - + %n second(s) ago Hace %n segundoHace %n segundos - + %n minute(s) ago Hace %n minutoHace %n minutos - + %n hour(s) ago Hace %n horaHace %n horas - + %n day(s) ago Hace %n díaHace %n días - + Up to date Actualizado - + Catching up... Recuperando... - + Last received block was generated %1. El ultimo bloque recibido fue generado %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Esta transacción supera el límite. Puedes seguir enviandola incluyendo una comisión de %s que se va a repartir entre los nodos que procesan su transacción y ayudan a mantener la red. ¿Quieres seguir con la transacción? - + Sending... Enviando... - + Sent transaction Transacción enviada - + Incoming transaction Transacción entrante - + Date: %1 Amount: %2 Type: %3 @@ -506,15 +570,35 @@ Tipo: %3 Dirección: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> La cartera esta <b>encriptada</b> y actualmente <b>desbloqueda</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> La cartera esta <b>encriptada</b> y actualmente <b>bloqueda</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -582,22 +666,22 @@ Dirección: %4 Editar dirección de envio - + The entered address "%1" is already in the address book. La dirección introducia "%1" ya esta guardada en la guia. - + The entered address "%1" is not a valid bitcoin address. La dirección introducida "%1" no es una dirección Bitcoin valida. - + Could not unlock wallet. No se pudo desbloquear la cartera. - + New key generation failed. La generación de nueva clave fallida. @@ -676,8 +760,8 @@ Dirección: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Comisión opcional a las transacciones por kB que ayuda a asegurar que tus transacciones son procesadas rápidamente. La mayoría de las transacciones son de 1kB. Se recomienda una comisión de 0.01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + @@ -686,8 +770,98 @@ Dirección: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Comisión opcional a las transacciones por kB que ayuda a asegurar que tus transacciones son procesadas rápidamente. La mayoría de las transacciones son de 1kB. Se recomienda una comisión de 0.01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + La dirección donde enviar el pago (ej. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Elije dirección de la guia + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Pega dirección desde portapapeles + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Copia la dirección seleccionada al portapapeles + + + + &Copy to Clipboard + &Copiar al portapapeles + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + @@ -755,7 +929,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cartera</span></p></body></html> @@ -780,16 +954,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Cambiar contraseña + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + Mensaje: + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Envia monedas @@ -805,81 +1032,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + + + + Clear all &Borra todos - + Balance: Balance: - + 123.456 BTC 123.456 BTC - + Confirm the send action Confirma el envio - + &Send &Envía - + <b>%1</b> to %2 (%3) <b>%1</b> to %2 (%3) - + Confirm send coins Confirmar el envio de monedas - + Are you sure you want to send %1? Estas seguro que quieres enviar %1? - + and y - + The recepient address is not valid, please recheck. La dirección de destinatarion no es valida, comprueba otra vez. - + The amount to pay must be larger than 0. La cantidad por pagar tiene que ser mayor 0. - + Amount exceeds your balance La cantidad sobrepasa tu saldo - + Total exceeds your balance when the %1 transaction fee is included El total sobrepasa tu saldo cuando se incluyen %1 como tasa de envio - + Duplicate address found, can only send to each address once in one send operation Tienes una dirección duplicada, solo puedes enviar a direcciónes individuales de una sola vez - + Error: Transaction creation failed Error: La transacción no se pudo crear - + Error: 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. Error: La transacción fue rechazada. Esto puede haber ocurrido si alguna de las monedas ya estaba gastada o si ha usado una copia de wallet.dat y las monedas se gastaron en la copia pero no se han marcado como gastadas aqui. @@ -951,135 +1183,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Abierto hasta %1 bloques - + Open until %1 Abierto hasta %1 - + %1/offline? %1/fuera de linea? - + %1/unconfirmed %1/no confirmado - + %1 confirmations %1 confirmaciónes - + <b>Status:</b> <b>Estado:</b> - + , has not been successfully broadcast yet , no ha sido emitido satisfactoriamente todavía - + , broadcast through %1 node , emitido mediante %1 nodo - + , broadcast through %1 nodes , emitido mediante %1 nodos - + <b>Date:</b> <b>Fecha:</b> - + <b>Source:</b> Generated<br> <b>Fuente:</b> Generado<br> - - + + <b>From:</b> <b>De:</b> - + unknown desconocido - - - + + + <b>To:</b> <b>Para:</b> - + (yours, label: (tuya, etiqueta: - + (yours) (tuya) - - - - + + + + <b>Credit:</b> <b>Crédito:</b> - + (%1 matures in %2 more blocks) (%1 madura en %1 bloques mas) - + (not accepted) (no aceptada) - - - + + + <b>Debit:</b> <b>Débito:</b> - + <b>Transaction fee:</b> <b>Comisión transacción:</b> - + <b>Net amount:</b> <b>Cantidad total:</b> - + Message: Mensaje: - + Comment: Comentario: - + + Transaction ID: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Las monedas generadas deben esperar 120 bloques antes de ser gastadas. Cuando has generado este bloque se emitió a la red para ser agregado en la cadena de bloques. Si falla al incluirse en la cadena, cambiará a "no aceptado" y las monedas no se podrán gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque casi al mismo tiempo que el tuyo. @@ -1166,56 +1403,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Recibido de IP + Received from + - + Sent to Enviado a - - Sent to IP - Enviado a IP - - - + Payment to yourself Pago proprio - + Mined Minado - + (n/a) (n/a) - + Transaction status. Hover over this field to show number of confirmations. Estado de transacción. Pasa el raton sobre este campo para ver el numero de confirmaciónes. - + Date and time that the transaction was received. Fecha y hora cuando se recibió la transaccion - + Type of transaction. Tipo de transacción. - + Destination address of transaction. Dirección de destino para la transacción - + Amount removed from or added to balance. Cantidad restada o añadida al balance @@ -1294,16 +1526,21 @@ p, li { white-space: pre-wrap; } Cantidad minima - + Copy address Copia dirección - + Copy label Copia etiqueta + + Copy amount + + + Edit label Edita etiqueta @@ -1314,67 +1551,67 @@ p, li { white-space: pre-wrap; } Muestra detalles... - + Export Transaction Data Exportar datos de transacción - + Comma separated file (*.csv) Archivos separados por coma (*.csv) - + Confirmed Confirmado - + Date Fecha - + Type Tipo - + Label Etiqueta - + Address Dirección - + Amount Cantidad - + ID ID - + Error exporting Error exportando - + Could not write to file %1. No se pudo escribir en el archivo %1. - + Range: Rango: - + to para @@ -1382,7 +1619,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Enviando... @@ -1401,942 +1638,369 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind Envia comando a bitcoin lanzado con -server u bitcoind - List commands - + List commands Muestra comandos - Get help for a command - + Get help for a command Recibir ayuda para un comando - Options: - + Options: Opciones: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Especifica archivo de configuración (predeterminado: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) Especifica archivo pid (predeterminado: bitcoin.pid) - Generate coins - + Generate coins Genera monedas - Don't generate coins - + Don't generate coins No generar monedas - Start minimized - + Start minimized Arranca minimizado - Specify data directory - + Specify data directory Especifica directorio para los datos - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Especifica tiempo de espera para conexion (en milisegundos) - Connect through socks4 proxy - + Connect through socks4 proxy Conecta mediante proxy socks4 - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Permite búsqueda DNS para addnode y connect - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to Agrega un nodo para conectarse - - Connect only to the specified node - + + Connect only to the specified node Conecta solo al nodo especificado - - Don't accept connections from outside - + + Don't accept connections from outside No aceptar conexiones desde el exterior - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port No intentar usar UPnP para mapear el puerto de entrada - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port Intenta usar UPnP para mapear el puerto de escucha. - - Fee per kB to add to transactions you send - - Comisión por kB para agregar a las transacciones que envias - + + Fee per kB to add to transactions you send + - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands Aceptar comandos consola y JSON-RPC - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands Correr como demonio y acepta comandos - - Use the test network - + + Use the test network Usa la red de pruebas - - Username for JSON-RPC connections - + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections Usuario para las conexiones JSON-RPC - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Contraseña para las conexiones JSON-RPC - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) Escucha conexiones JSON-RPC en el puerto <port> (predeterminado: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address Permite conexiones JSON-RPC desde la dirección IP especificada - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) Envia comando al nodo situado en <ip> (predeterminado: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Ajusta el numero de claves en reserva <n> (predeterminado: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions Rescanea la cadena de bloques para transacciones perdidas de la cartera - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) Opciones SSL: (ver la Bitcoin Wiki para instrucciones de configuración SSL) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections Usa OpenSSL (https) para las conexiones JSON-RPC - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) Certificado del servidor (Predeterminado: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Clave privada del servidor (Predeterminado: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Cifrados aceptados (Predeterminado: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message Este mensaje de ayuda - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. No se puede obtener permiso de trabajo en la carpeta de datos %s. Probablemente Bitcoin ya se está ejecutando. - + Loading addresses... Cargando direcciónes... - - Error loading addr.dat - - Error cargando addr.dat - + + Error loading addr.dat + - - Loading block index... - Cargando el index de bloques... + + Error loading blkindex.dat + - - Error loading blkindex.dat - - Error cargando blkindex.dat - + + Error loading wallet.dat: Wallet corrupted + - - Loading wallet... - Cargando cartera... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + - - Error loading wallet.dat: Wallet corrupted - - Error cargando wallet.dat: Cartera dañada - + + Wallet needed to be rewritten: restart Bitcoin to complete + - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Error cargando el archivo wallet.dat: Se necesita una versión mas nueva de Bitcoin - + + Error loading wallet.dat + - - Error loading wallet.dat - - Error cargando wallet.dat - + + Loading block index... + Cargando el index de bloques... - + + Loading wallet... + Cargando cartera... + + + Rescanning... Rescaneando... - + Done loading Carga completa - + Invalid -proxy address Dirección -proxy invalida - + Invalid amount for -paytxfee=<amount> Cantidad inválida para -paytxfee=<amount> - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Precaución: -paytxfee es muy alta. Esta es la comisión que pagarás si envias una transacción. - + Error: CreateThread(StartNode) failed Error: CreateThread(StartNode) fallido - + Warning: Disk space is low Atención: Poco espacio en el disco duro - + Unable to bind to port %d on this computer. Bitcoin is probably already running. No es posible escuchar en el puerto %d en este ordenador. Probablemente Bitcoin ya se está ejecutando. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Esta transacción supera el límite. Puedes seguir enviandola incluyendo una comisión de %s que se va a repartir entre los nodos que procesan su transacción y ayudan a mantener la red. ¿Quieres seguir con la transacción? - - - - Enter the current passphrase to the wallet. - Introduce la contraseña actual de la cartera. - - - - Passphrase - Contraseña - - - - Please supply the current wallet decryption passphrase. - Por favor introduce la contraseña actual de la cartera. - - - - The passphrase entered for the wallet decryption was incorrect. - La contraseña introducida para decriptar la cartera es incorrecta. - - - - Status - Estado - - - - Date - Fecha - - - - Description - Descripción - - - - Debit - Debito - - - - Credit - Credito - - - Open for %d blocks - Abierto para %d bloques - - - - Open until %s - Abierto hasta %s - - - - %d/offline? - %d/fuera de linea? - - - - %d/unconfirmed - %d/no confirmado - - - - %d confirmations - %d confirmaciónes - - - - Generated - Generado - - - - Generated (%s matures in %d more blocks) - Generado (%s madura en %d bloques) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Generado - Cuidado: Este bloque no se recibió de otros nodos y probablemente no sea aceptado! - - - - Generated (not accepted) - Generado (no aceptado) - - - - From: - De: - - - - Received with: - Recibido con: - - - - Payment to yourself - Pago a ti mismo - - - - To: - Para: - - - - Generating - Generando - - - - (not connected) - (no conectado) - - - - %d connections %d blocks %d transactions - %d conexiones %d bloques %d transacciones - - - - Wallet already encrypted. - La cartera ya esta encriptada. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Introduce la nueva contraseña de cartera. -Por favor utiliza un contraseña de 10 o mas caracteres aleatorios, u ocho o mas palabras. - - - - Error: The supplied passphrase was too short. - Error: La contraseña introducida es demasiado corta. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - ATENCION: ¡Si encriptas tu cartera y pierdes la contraseña perderas TODOS TUS BITCOINS! -¿Estas seguro que quieres seguir encriptando la cartera? - - - - Please re-enter your new wallet passphrase. - Por favor vuelve introducir la nueva contraseña. - - - - Error: the supplied passphrases didn't match. - Error: las contraseñas no son identicas. - - - - Wallet encryption failed. - Encriptacion de cartera fallida. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Cartera Encriptada. -Recuerda que encriptando tu cartera no garantiza mantener a salvo tus bitcoins en caso de tener viruses en el ordenador. - - - - Wallet is unencrypted, please encrypt it first. - Cartera no encriptada, intenta encriptar primero. - - - - Enter the new passphrase for the wallet. - Introduce la nueva contraseña para la cartera. - - - - Re-enter the new passphrase for the wallet. - Reintroduce la nueva contraseña para la cartera. - - - - Wallet Passphrase Changed. - Contraseña de cartera cambiada. - - - - New Receiving Address - Nueva dirección de recepción - - - - You should use a new address for each payment you receive. - -Label - Debes usar una nueva dirección para cada pago que usted recibe. - -Etiqueta - - - - <b>Status:</b> - <b>Estado:</b> - - - - , has not been successfully broadcast yet - , no ha sido emitido satisfactoriamente todavía - - - - , broadcast through %d node - , emitido mediante %d nodo - - - - , broadcast through %d nodes - , emitido mediante %d nodos - - - - <b>Date:</b> - <b>Fecha:</b> - - - - <b>Source:</b> Generated<br> - <b>Fuente:</b> Generado<br> - - - - <b>From:</b> - <b>De:</b> - - - - unknown - desconocido - - - - <b>To:</b> - <b>Para:</b> - - - - (yours, label: - (tuya, etiqueta: - - - - (yours) - (tuya) - - - - <b>Credit:</b> - <b>Crédito:</b> - - - - (%s matures in %d more blocks) - (%s madura en %d bloques) - - - - (not accepted) - (no aceptada) - - - - <b>Debit:</b> - <b>Débito:</b> - - - - <b>Transaction fee:</b> - <b>Comisión transacción:</b> - - - - <b>Net amount:</b> - <b>Cantidad total:</b> - - - - Message: - Mensaje: - - - - Comment: - Comentario: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Las monedas generadas deben esperar 120 bloques antes de ser gastadas. Cuando has generado este bloque se emitió a la red para ser agregado en la cadena de bloques. Si falla al incluirse en la cadena, cambiará a "no aceptado" y las monedas no se podrán gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque casi al mismo tiempo que el tuyo. - - - - Cannot write autostart/bitcoin.desktop file - No se puede escribir el fichero autostart/bitcoin.desktop - - - - Main - Principal - - - - &Start Bitcoin on window system startup - &Arranca Bitcoin al iniciar el sistema - - - - &Minimize on close - &Minimiza al cerrar - - - - version %s - versión %s - - - - Error in amount - Error en la cantidad - - - - Send Coins - Envia monedas - - - - Amount exceeds your balance - La cantidad sobrepasa tu balance - - - - Total exceeds your balance when the - El total sobrepasa tu balance cuando se - - - - transaction fee is included - incluyen las tasas de transacción - - - - Payment sent - Pago enviado - - - - Sending... - Enviando... - - - - Invalid address - Dirección inválida - - - - Sending %s to %s - Enviando %s a %s - - - - CANCELLED - CANCELADO - - - - Cancelled - Cancelado - - - - Transfer cancelled - Transferencia cancelada - - - - Error: - Error: - - - - Insufficient funds - Fondos insuficientes - - - - Connecting... - Conectando... - - - - Unable to connect - No es posible conectar - - - - Requesting public key... - Pidiendo clave pública... - - - - Received public key... - Clave pública recibida... - - - - Recipient is not accepting transactions sent by IP address - El destinatario no accepta transacciones enviadas a direcciones IP - - - - Transfer was not accepted - La transferencia no fue aceptada - - - - Invalid response received - Respuesta inválida recibida - - - - Creating transaction... - Creando transacción... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Esta transacción requiere una comisión de al menos %s por su cantidad, complejidad o uso de fondos recibidos recientemente - - - - Transaction creation failed - Fallo al crear la transacción. - - - - Transaction aborted - Transacción abortada - - - - Lost connection, transaction cancelled - Conexión perdida, transacción cancelada - - - - Sending payment... - Enviando pago... - - - - 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. - La transacción fue rechazada. Esto puede haber ocurrido si alguna de las monedas ya estaba gastada o si ha usado una copia de wallet.dat y las monedas se gastaron en la copia pero no se han marcado como gastadas aqui. - - - - Waiting for confirmation... - Esperando confirmación... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - El pago se ha enviado, pero el receptor no pudo verificarlo. -La transacción se grabó y el saldo fue transferido, -pero la información de los comentarios quedará en blanco. - - - - Payment was sent, but an invalid response was received - El pago fue enviado, pero se recibió una respuesta inválida - - - - Payment completed - Pago completado - - - - Name - Nombre - - - - Address - Dirección - - - - Label - Etiqueta - - - - Bitcoin Address - Dirección Bitcoin - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Esta es una de sus direcciones para recibir pagos y no puede incluirse en la libreta de direcciones. - - - - Edit Address - Edita dirección - - - - Edit Address Label - Edita etiqueta dirección - - - - Add Address - Agrega dirección - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Bitcoin - Generando - - - - Bitcoin - (not connected) - Bitcoin - (no conectado) - - - - &Open Bitcoin - &Abre Bitcoin - - - - &Send Bitcoins - &Envia Bitcoins - - - - O&ptions... - O&pciones - - - - E&xit - S&alir - - - - Program has crashed and will terminate. - El programa ha detectado un error y va a cerrarse. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Precaución: Por favor revisa que la fecha y hora de tu ordenador son correctas. Si tu reloj está mal Bitcoin no funcionará correctamente. - + beta beta - - main - - - Bitcoin Qt - Bitcoin Qt - - - + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts index c0bea54..d0986b6 100644 --- a/src/qt/locale/bitcoin_es_CL.ts +++ b/src/qt/locale/bitcoin_es_CL.ts @@ -14,23 +14,14 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright © 2009-2011 Bitcoin Developers - -Este es un software experimental. - -Distribuido bajo la licencia MIT/X11, vea el archivo adjunto -license.txt o http://www.opensource.org/licenses/mit-license.php. - -Este producto incluye software desarrollado por OpenSSL Project para su uso en -el OpenSSL Toolkit (http://www.openssl.org/), software criptográfico escrito por -Eric Young (eay@cryptsoft.com) y UPnP software escrito por Thomas Bernard. + @@ -72,31 +63,66 @@ Eric Young (eay@cryptsoft.com) y UPnP software escrito por Thomas Bernard. + Show &QR Code + Mostrar Código &QR + + + + Sign a message to prove you own this address + Firmar un mensaje para provar que usted es dueño de esta dirección + + + + &Sign Message + Firmar Mensaje + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Borra la dirección seleccionada de la lista. Solo las direcciónes de envio se pueden borrar. - + &Delete &Borrar - + + Copy address + Copia dirección + + + + Copy label + Copia etiqueta + + + + Edit + Editar + + + + Delete + Borrar + + + Export Address Book Data Exporta datos de la guia de direcciones - + Comma separated file (*.csv) Archivos separados por coma (*.csv) - + Error exporting Exportar errores - + Could not write to file %1. No se pudo escribir al archivo %1. @@ -128,125 +154,132 @@ Eric Young (eay@cryptsoft.com) y UPnP software escrito por Thomas Bernard. + TextLabel Cambiar contraseña: - + Enter passphrase Introduce contraseña actual - + New passphrase Nueva contraseña - + Repeat new passphrase Repite nueva contraseña: - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Introduce la nueva contraseña para la billetera.<br/>Por favor utiliza un contraseña <b>de 10 o mas caracteres aleatorios</b>, u <b>ocho o mas palabras</b>. - + Encrypt wallet Codificar billetera - + This operation needs your wallet passphrase to unlock the wallet. Esta operación necesita la contraseña para desbloquear la billetera. - + Unlock wallet Desbloquea billetera - + This operation needs your wallet passphrase to decrypt the wallet. Esta operación necesita la contraseña para decodificar la billetara. - + Decrypt wallet Decodificar cartera - + Change passphrase Cambia contraseña - + Enter the old and new passphrase to the wallet. Introduce la contraseña anterior y la nueva de cartera - + Confirm wallet encryption Confirma la codificación de cartera - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? ATENCIÓN: ¡Si codificas tu billetera y pierdes la contraseña perderás <b>TODOS TUS BITCOINS</b>!" ¿Seguro que quieres seguir codificando la billetera? - - + + Wallet encrypted Billetera codificada - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Recuerda que codificando tu billetera no garantiza mantener a salvo tus bitcoins en caso de tener virus en el computador. + + Bitcoin 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. + Bitcoin se cerrará para finalizar el proceso de encriptación. Recuerde que encriptar su billetera no protegera completatamente sus bitcoins de ser robados por malware que infecte su computador - - - - + + + Warning: The Caps Lock key is on. + Precaucion: Mayúsculas Activadas + + + + + + Wallet encryption failed Falló la codificación de la billetera - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. La codificación de la billetera falló debido a un error interno. Tu billetera no ha sido codificada. - - + + The supplied passphrases do not match. Las contraseñas no coinciden. - + Wallet unlock failed Ha fallado el desbloqueo de la billetera - - + + The passphrase entered for the wallet decryption was incorrect. La contraseña introducida para decodificar la billetera es incorrecta. - + Wallet decryption failed Ha fallado la decodificación de la billetera - + Wallet passphrase was succesfully changed. La contraseña de billetera ha sido cambiada con éxito. @@ -254,247 +287,278 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet Billetera Bitcoin - + + Synchronizing with network... Sincronizando con la red... - + Block chain synchronization in progress Sincronización de la cadena de bloques en progreso - + &Overview &Vista general - + Show general overview of wallet Muestra una vista general de la billetera - + &Transactions &Transacciónes - + Browse transaction history Explora el historial de transacciónes - + &Address Book &Guia de direcciónes - + Edit the list of stored addresses and labels Edita la lista de direcciones y etiquetas almacenadas - + &Receive coins &Recibir monedas - + Show the list of addresses for receiving payments Muestra la lista de direcciónes utilizadas para recibir pagos - + &Send coins &Envíar monedas - + Send coins to a bitcoin address Enviar monedas a una dirección bitcoin - + + Sign &message + Firmar Mensaje + + + + Prove you control an address + Suministre dirección de control + + + E&xit &Salir - + Quit application Salir del programa - + &About %1 S&obre %1 - + Show information about Bitcoin Muestra información acerca de Bitcoin - + + About &Qt + Acerca de + + + + Show information about Qt + Mostrar Información sobre QT + + + &Options... &Opciones - + Modify configuration options for bitcoin Modifica las opciones de configuración de bitcoin - + Open &Bitcoin Abre &Bitcoin - + Show the Bitcoin window Muestra la ventana de Bitcoin - + &Export... &Exportar... - - Export the current view to a file - Exportar la vista actual a un archivo + + Export the data in the current tab to a file + - + &Encrypt Wallet &Codificar la billetera - + Encrypt or decrypt wallet Codificar o decodificar la billetera - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase &Cambiar la contraseña - + Change the passphrase used for wallet encryption Cambiar la contraseña utilizada para la codificación de la billetera - + &File &Archivo - + &Settings &Configuración - + &Help &Ayuda - + Tabs toolbar Barra de pestañas - + Actions toolbar Barra de acciónes - + [testnet] [red-de-pruebas] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n conexión activa hacia la red Bitcoin%n conexiones activas hacia la red Bitcoin - + Downloaded %1 of %2 blocks of transaction history. Descargados %1 de %2 bloques del historial de transacciones. - + Downloaded %1 blocks of transaction history. Descargado %1 bloques del historial de transacciones. - + %n second(s) ago Hace %n segundoHace %n segundos - + %n minute(s) ago Hace %n minutoHace %n minutos - + %n hour(s) ago Hace %n horaHace %n horas - + %n day(s) ago Hace %n díaHace %n días - + Up to date Actualizado - + Catching up... Recuperando... - + Last received block was generated %1. El ultimo bloque recibido fue generado %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Esta transacción supera el límite. Puedes seguir enviandola incluyendo una comisión de %s que se va a repartir entre los nodos que procesan su transacción y ayudan a mantener la red. ¿Quieres seguir con la transacción? - + Sending... Enviando... - + Sent transaction Transacción enviada - + Incoming transaction Transacción entrante - + Date: %1 Amount: %2 Type: %3 @@ -506,15 +570,35 @@ Tipo: %3 Dirección: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> La billetera esta <b>codificada</b> y actualmente <b>desbloqueda</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> La billetera esta <b>codificada</b> y actualmente <b>bloqueda</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -582,22 +666,22 @@ Dirección: %4 Editar dirección de envio - + The entered address "%1" is already in the address book. La dirección introducida "%1" ya esta guardada en la libreta de direcciones. - + The entered address "%1" is not a valid bitcoin address. La dirección introducida "%1" no es una dirección Bitcoin valida. - + Could not unlock wallet. No se pudo desbloquear la billetera. - + New key generation failed. La generación de nueva clave falló. @@ -676,18 +760,108 @@ Dirección: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Comisión de operación opcional por kB que ayuda a asegurar que tus transacciones sean procesadas rápidamente. La mayoría de las transacciones son de 1kB. Se recomienda una comisión de 0.01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Comisión opcional por kB que ayuda a asegurar que sus transacciones son procesadas rápidamente. La mayoria de transacciones son de 1 KB. Se recomienda comisión de 0.01 Pay transaction &fee - Comision de &transacciónes + Comisión de &transacciónes - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Comisión de operación opcional por kB que ayuda a asegurar que tus transacciones sean procesadas rápidamente. La mayoría de las transacciones son de 1kB. Se recomienda una comisión de 0.01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Comisión opcional por kB que ayuda a asegurar que sus transacciones son procesadas rápidamente. La mayoria de transacciones son de 1 KB. Se recomienda comisión de 0.01 + + + + MessagePage + + + Message + Mensaje + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + La dirección donde enviar el pago (ej. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Elije dirección de la guia + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Pega dirección desde portapapeles + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Escriba el mensaje que desea firmar + + + + Click "Sign Message" to get signature + Click en "Firmar Mensage" para conseguir firma + + + + Sign a message to prove you own this address + Firmar un mensjage para probar que usted es dueño de esta dirección + + + + &Sign Message + & Firmar Mensaje + + + + Copy the currently selected address to the system clipboard + Copiar la dirección seleccionada al portapapeles + + + + &Copy to Clipboard + &Copiar al portapapeles + + + + + + Error signing + Error al firmar + + + + %1 is not a valid address. + %1 no es una dirección válida. + + + + Private key for %1 is not available. + Llave privada para %q no esta disponible. + + + + Sign failed + Falló Firma @@ -755,7 +929,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cartera</span></p></body></html> @@ -780,16 +954,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Cambiar contraseña + + + + QR Code + Código QR + + + + Request Payment + Solicitar Pago + + + + Amount: + Cantidad: + + + + BTC + BTC + + + + Label: + Etiqueta + + + + Message: + Mensaje: + + + + &Save As... + &Guardar Como... + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Enviar monedas @@ -805,81 +1032,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + Remover todos los campos de la transacción + + + Clear all &Borra todos - + Balance: Balance: - + 123.456 BTC 123.456 BTC - + Confirm the send action Confirma el envio - + &Send &Envía - + <b>%1</b> to %2 (%3) <b>%1</b> to %2 (%3) - + Confirm send coins Confirmar el envio de monedas - + Are you sure you want to send %1? Estas seguro que quieres enviar %1? - + and y - + The recepient address is not valid, please recheck. La dirección de destinatarion no es valida, comprueba otra vez. - + The amount to pay must be larger than 0. La cantidad por pagar tiene que ser mayor 0. - + Amount exceeds your balance La cantidad sobrepasa tu saldo - + Total exceeds your balance when the %1 transaction fee is included El total sobrepasa tu saldo cuando se incluyen %1 como tasa de envio - + Duplicate address found, can only send to each address once in one send operation Tienes una dirección duplicada, solo puedes enviar a direcciónes individuales de una sola vez - + Error: Transaction creation failed Error: La transacción no se pudo crear - + Error: 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. Error: La transacción fue rechazada. Esto puede haber ocurrido si alguna de las monedas ya estaba gastada o si ha usado una copia de wallet.dat y las monedas se gastaron en la copia pero no se han marcado como gastadas aqui. @@ -920,7 +1152,7 @@ p, li { white-space: pre-wrap; } Choose address from address book - Elije dirección de la guia + Elije dirección de la guia @@ -951,135 +1183,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Abierto hasta %1 bloques - + Open until %1 Abierto hasta %1 - + %1/offline? %1/fuera de linea? - + %1/unconfirmed %1/no confirmado - + %1 confirmations %1 confirmaciónes - + <b>Status:</b> <b>Estado:</b> - + , has not been successfully broadcast yet , no ha sido emitido satisfactoriamente todavía - + , broadcast through %1 node , emitido mediante %1 nodo - + , broadcast through %1 nodes , emitido mediante %1 nodos - + <b>Date:</b> <b>Fecha:</b> - + <b>Source:</b> Generated<br> <b>Fuente:</b> Generado<br> - - + + <b>From:</b> <b>De:</b> - + unknown desconocido - - - + + + <b>To:</b> <b>Para:</b> - + (yours, label: (tuya, etiqueta: - + (yours) (tuya) - - - - + + + + <b>Credit:</b> <b>Crédito:</b> - + (%1 matures in %2 more blocks) (%1 madura en %2 bloques mas) - + (not accepted) (no aceptada) - - - + + + <b>Debit:</b> <b>Débito:</b> - + <b>Transaction fee:</b> <b>Comisión transacción:</b> - + <b>Net amount:</b> <b>Cantidad total:</b> - + Message: Mensaje: - + Comment: Comentario: - + + Transaction ID: + ID de Transacción: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Las monedas generadas deben esperar 120 bloques antes de ser gastadas. Cuando has generado este bloque se emitió a la red para ser agregado en la cadena de bloques. Si falla al incluirse en la cadena, cambiará a "no aceptado" y las monedas no se podrán gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque casi al mismo tiempo que el tuyo. @@ -1166,56 +1403,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Recibido de IP + Received from + Recibido de - + Sent to Enviado a - - Sent to IP - Enviado a IP - - - + Payment to yourself - Pago proprio + Pagar a usted mismo - + Mined Minado - + (n/a) (n/a) - + Transaction status. Hover over this field to show number of confirmations. Estado de transacción. Pasa el raton sobre este campo para ver el numero de confirmaciónes. - + Date and time that the transaction was received. Fecha y hora cuando se recibió la transaccion - + Type of transaction. Tipo de transacción. - + Destination address of transaction. Dirección de destino para la transacción - + Amount removed from or added to balance. Cantidad restada o añadida al balance @@ -1294,16 +1526,21 @@ p, li { white-space: pre-wrap; } Cantidad minima - + Copy address Copia dirección - + Copy label Copia etiqueta + + Copy amount + Copiar Cantidad + + Edit label Edita etiqueta @@ -1314,67 +1551,67 @@ p, li { white-space: pre-wrap; } Muestra detalles... - + Export Transaction Data Exportar datos de transacción - + Comma separated file (*.csv) Archivos separados por coma (*.csv) - + Confirmed Confirmado - + Date Fecha - + Type Tipo - + Label Etiqueta - + Address Dirección - + Amount Cantidad - + ID ID - + Error exporting Error exportando - + Could not write to file %1. No se pudo escribir en el archivo %1. - + Range: Rango: - + to para @@ -1382,7 +1619,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Enviando... @@ -1401,942 +1638,369 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind Envia comando a bitcoin lanzado con -server u bitcoind - List commands - + List commands Muestra comandos - Get help for a command - + Get help for a command Recibir ayuda para un comando - Options: - + Options: Opciones: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Especifica archivo de configuración (predeterminado: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) Especifica archivo pid (predeterminado: bitcoin.pid) - Generate coins - + Generate coins Genera monedas - Don't generate coins - + Don't generate coins No generar monedas - Start minimized - + Start minimized Arranca minimizado - Specify data directory - + Specify data directory Especifica directorio para los datos - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Especifica tiempo de espera para conexion (en milisegundos) - Connect through socks4 proxy - + Connect through socks4 proxy Conecta mediante proxy socks4 - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Permite búsqueda DNS para addnode y connect - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + Escuchar por conecciones en <puerto> (Por defecto: 8333 o red de prueba: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Mantener al menos <n> conecciones por cliente (por defecto: 125) + + + + Add a node to connect to Agrega un nodo para conectarse - - Connect only to the specified node - + + Connect only to the specified node Conecta solo al nodo especificado - - Don't accept connections from outside - + + Don't accept connections from outside No aceptar conexiones desde el exterior - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + Umbral de desconección de clientes con mal comportamiento (por defecto: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port No intentar usar UPnP para mapear el puerto de entrada - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port Intenta usar UPnP para mapear el puerto de escucha. - - Fee per kB to add to transactions you send - - Comisión por kB para agregar a las transacciones que envias - + + Fee per kB to add to transactions you send + Comisión por kB para adicionarla a las transacciones enviadas - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands Aceptar comandos consola y JSON-RPC - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands Correr como demonio y acepta comandos - - Use the test network - + + Use the test network Usa la red de pruebas - - Username for JSON-RPC connections - + + Output extra debugging information + Adjuntar informacion extra de depuracion + + + + Prepend debug output with timestamp + Anteponer salida de depuracion con marca de tiempo + + + + Send trace/debug info to console instead of debug.log file + Enviar informacion de seguimiento a la consola en vez del archivo debug.log + + + + Send trace/debug info to debugger + Enviar informacion de seguimiento al depurador + + + + Username for JSON-RPC connections Usuario para las conexiones JSON-RPC - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Contraseña para las conexiones JSON-RPC - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) Escucha conexiones JSON-RPC en el puerto <port> (predeterminado: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address Permite conexiones JSON-RPC desde la dirección IP especificada - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) Envia comando al nodo situado en <ip> (predeterminado: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Ajusta el numero de claves en reserva <n> (predeterminado: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions Rescanea la cadena de bloques para transacciones perdidas de la cartera - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) Opciones SSL: (ver la Bitcoin Wiki para instrucciones de configuración SSL) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections Usa OpenSSL (https) para las conexiones JSON-RPC - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) Certificado del servidor (Predeterminado: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Clave privada del servidor (Predeterminado: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Cifrados aceptados (Predeterminado: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message Este mensaje de ayuda - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. No se puede obtener permiso de trabajo en la carpeta de datos %s. Probablemente Bitcoin ya se está ejecutando. - + Loading addresses... Cargando direcciónes... - - Error loading addr.dat - - Error cargando addr.dat - + + Error loading addr.dat + Error cargando addr.dat - - Loading block index... - Cargando el index de bloques... + + Error loading blkindex.dat + Error cargando blkindex.dat - - Error loading blkindex.dat - - Error cargando blkindex.dat - + + Error loading wallet.dat: Wallet corrupted + Error cargando wallet.dat: Billetera corrupta - - Loading wallet... - Cargando cartera... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Error cargando wallet.dat: Billetera necesita una vercion reciente de Bitcoin - - Error loading wallet.dat: Wallet corrupted - - Error cargando wallet.dat: Cartera dañada - + + Wallet needed to be rewritten: restart Bitcoin to complete + La billetera necesita ser reescrita: reinicie Bitcoin para completar - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Error cargando el archivo wallet.dat: Se necesita una versión mas nueva de Bitcoin - + + Error loading wallet.dat + Error cargando wallet.dat - - Error loading wallet.dat - - Error cargando wallet.dat - + + Loading block index... + Cargando el index de bloques... - + + Loading wallet... + Cargando cartera... + + + Rescanning... Rescaneando... - + Done loading Carga completa - + Invalid -proxy address Dirección -proxy invalida - + Invalid amount for -paytxfee=<amount> Cantidad inválida para -paytxfee=<amount> - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Precaución: -paytxfee es muy alta. Esta es la comisión que pagarás si envias una transacción. - + Error: CreateThread(StartNode) failed Error: CreateThread(StartNode) fallido - + Warning: Disk space is low Atención: Poco espacio en el disco duro - + Unable to bind to port %d on this computer. Bitcoin is probably already running. No es posible escuchar en el puerto %d en este ordenador. Probablemente Bitcoin ya se está ejecutando. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Esta transacción supera el límite. Puedes seguir enviandola incluyendo una comisión de %s que se va a repartir entre los nodos que procesan su transacción y ayudan a mantener la red. ¿Quieres seguir con la transacción? - - - - Enter the current passphrase to the wallet. - Introduce la contraseña actual de la cartera. - - - - Passphrase - Contraseña - - - - Please supply the current wallet decryption passphrase. - Por favor introduce la contraseña actual de la cartera. - - - - The passphrase entered for the wallet decryption was incorrect. - La contraseña introducida para decriptar la cartera es incorrecta. - - - - Status - Estado - - - - Date - Fecha - - - - Description - Descripción - - - - Debit - Debito - - - - Credit - Credito - - - Open for %d blocks - Abierto para %d bloques - - - - Open until %s - Abierto hasta %s - - - - %d/offline? - %d/fuera de linea? - - - - %d/unconfirmed - %d/no confirmado - - - - %d confirmations - %d confirmaciónes - - - - Generated - Generado - - - - Generated (%s matures in %d more blocks) - Generado (%s madura en %d bloques) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Generado - Cuidado: Este bloque no se recibió de otros nodos y probablemente no sea aceptado! - - - - Generated (not accepted) - Generado (no aceptado) - - - - From: - De: - - - - Received with: - Recibido con: - - - - Payment to yourself - Pago a ti mismo - - - - To: - Para: - - - - Generating - Generando - - - - (not connected) - (no conectado) - - - - %d connections %d blocks %d transactions - %d conexiones %d bloques %d transacciones - - - - Wallet already encrypted. - La cartera ya esta encriptada. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Introduce la nueva contraseña de cartera. -Por favor utiliza un contraseña de 10 o mas caracteres aleatorios, u ocho o mas palabras. - - - - Error: The supplied passphrase was too short. - Error: La contraseña introducida es demasiado corta. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - ATENCION: ¡Si encriptas tu cartera y pierdes la contraseña perderas TODOS TUS BITCOINS! -¿Estas seguro que quieres seguir encriptando la cartera? - - - - Please re-enter your new wallet passphrase. - Por favor vuelve introducir la nueva contraseña. - - - - Error: the supplied passphrases didn't match. - Error: las contraseñas no son identicas. - - - - Wallet encryption failed. - Encriptacion de cartera fallida. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Cartera Encriptada. -Recuerda que encriptando tu cartera no garantiza mantener a salvo tus bitcoins en caso de tener viruses en el ordenador. - - - - Wallet is unencrypted, please encrypt it first. - Cartera no encriptada, intenta encriptar primero. - - - - Enter the new passphrase for the wallet. - Introduce la nueva contraseña para la cartera. - - - - Re-enter the new passphrase for the wallet. - Reintroduce la nueva contraseña para la cartera. - - - - Wallet Passphrase Changed. - Contraseña de cartera cambiada. - - - - New Receiving Address - Nueva dirección de recepción - - - - You should use a new address for each payment you receive. - -Label - Debes usar una nueva dirección para cada pago que usted recibe. - -Etiqueta - - - - <b>Status:</b> - <b>Estado:</b> - - - - , has not been successfully broadcast yet - , no ha sido emitido satisfactoriamente todavía - - - - , broadcast through %d node - , emitido mediante %d nodo - - - - , broadcast through %d nodes - , emitido mediante %d nodos - - - - <b>Date:</b> - <b>Fecha:</b> - - - - <b>Source:</b> Generated<br> - <b>Fuente:</b> Generado<br> - - - - <b>From:</b> - <b>De:</b> - - - - unknown - desconocido - - - - <b>To:</b> - <b>Para:</b> - - - - (yours, label: - (tuya, etiqueta: - - - - (yours) - (tuya) - - - - <b>Credit:</b> - <b>Crédito:</b> - - - - (%s matures in %d more blocks) - (%s madura en %d bloques) - - - - (not accepted) - (no aceptada) - - - - <b>Debit:</b> - <b>Débito:</b> - - - - <b>Transaction fee:</b> - <b>Comisión transacción:</b> - - - - <b>Net amount:</b> - <b>Cantidad total:</b> - - - - Message: - Mensaje: - - - - Comment: - Comentario: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Las monedas generadas deben esperar 120 bloques antes de ser gastadas. Cuando has generado este bloque se emitió a la red para ser agregado en la cadena de bloques. Si falla al incluirse en la cadena, cambiará a "no aceptado" y las monedas no se podrán gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque casi al mismo tiempo que el tuyo. - - - - Cannot write autostart/bitcoin.desktop file - No se puede escribir el fichero autostart/bitcoin.desktop - - - - Main - Principal - - - - &Start Bitcoin on window system startup - &Arranca Bitcoin al iniciar el sistema - - - - &Minimize on close - &Minimiza al cerrar - - - - version %s - versión %s - - - - Error in amount - Error en la cantidad - - - - Send Coins - Envia monedas - - - - Amount exceeds your balance - La cantidad sobrepasa tu balance - - - - Total exceeds your balance when the - El total sobrepasa tu balance cuando se - - - - transaction fee is included - incluyen las tasas de transacción - - - - Payment sent - Pago enviado - - - - Sending... - Enviando... - - - - Invalid address - Dirección inválida - - - - Sending %s to %s - Enviando %s a %s - - - - CANCELLED - CANCELADO - - - - Cancelled - Cancelado - - - - Transfer cancelled - Transferencia cancelada - - - - Error: - Error: - - - - Insufficient funds - Fondos insuficientes - - - - Connecting... - Conectando... - - - - Unable to connect - No es posible conectar - - - - Requesting public key... - Pidiendo clave pública... - - - - Received public key... - Clave pública recibida... - - - - Recipient is not accepting transactions sent by IP address - El destinatario no accepta transacciones enviadas a direcciones IP - - - - Transfer was not accepted - La transferencia no fue aceptada - - - - Invalid response received - Respuesta inválida recibida - - - - Creating transaction... - Creando transacción... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Esta transacción requiere una comisión de al menos %s por su cantidad, complejidad o uso de fondos recibidos recientemente - - - - Transaction creation failed - Fallo al crear la transacción. - - - - Transaction aborted - Transacción abortada - - - - Lost connection, transaction cancelled - Conexión perdida, transacción cancelada - - - - Sending payment... - Enviando pago... - - - - 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. - La transacción fue rechazada. Esto puede haber ocurrido si alguna de las monedas ya estaba gastada o si ha usado una copia de wallet.dat y las monedas se gastaron en la copia pero no se han marcado como gastadas aqui. - - - - Waiting for confirmation... - Esperando confirmación... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - El pago se ha enviado, pero el receptor no pudo verificarlo. -La transacción se grabó y el saldo fue transferido, -pero la información de los comentarios quedará en blanco. - - - - Payment was sent, but an invalid response was received - El pago fue enviado, pero se recibió una respuesta inválida - - - - Payment completed - Pago completado - - - - Name - Nombre - - - - Address - Dirección - - - - Label - Etiqueta - - - - Bitcoin Address - Dirección Bitcoin - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Esta es una de sus direcciones para recibir pagos y no puede incluirse en la libreta de direcciones. - - - - Edit Address - Edita dirección - - - - Edit Address Label - Edita etiqueta dirección - - - - Add Address - Agrega dirección - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Bitcoin - Generando - - - - Bitcoin - (not connected) - Bitcoin - (no conectado) - - - - &Open Bitcoin - &Abre Bitcoin - - - - &Send Bitcoins - &Envia Bitcoins - - - - O&ptions... - O&pciones - - - - E&xit - S&alir - - - - Program has crashed and will terminate. - El programa ha detectado un error y va a cerrarse. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. - Precaución: Por favor revisa que la fecha y hora de tu ordenador son correctas. Si tu reloj está mal Bitcoin no funcionará correctamente. + Precaución: Por favor revise que la fecha y hora de tu ordenador son correctas. Si tu reloj está mal configurado Bitcoin no funcionará correctamente. - + beta beta - - main - - - Bitcoin Qt - Bitcoin Qt - - - + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts new file mode 100644 index 0000000..a14037f --- /dev/null +++ b/src/qt/locale/bitcoin_et.ts @@ -0,0 +1,1963 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + + + + + <b>Bitcoin</b> version + + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + + + + + Double-click to edit address or label + + + + + Create a new address + Loo uus aadress + + + + &New Address... + &Uus aadress... + + + + Copy the currently selected address to the system clipboard + + + + + &Copy to Clipboard + Kopeeri lõikelauale + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + + + + + &Delete + &Kustuta + + + + Copy address + + + + + Copy label + + + + + Edit + + + + + Delete + + + + + Export Address Book Data + + + + + Comma separated file (*.csv) + + + + + Error exporting + Viga eksportimisel + + + + Could not write to file %1. + + + + + AddressTableModel + + + Label + Silt + + + + Address + Aadress + + + + (no label) + (silti pole) + + + + AskPassphraseDialog + + + Dialog + Dialoog + + + + + TextLabel + + + + + Enter passphrase + + + + + New passphrase + + + + + Repeat new passphrase + + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + + + + + Encrypt wallet + + + + + This operation needs your wallet passphrase to unlock the wallet. + + + + + Unlock wallet + + + + + This operation needs your wallet passphrase to decrypt the wallet. + + + + + Decrypt wallet + + + + + Change passphrase + + + + + Enter the old and new passphrase to the wallet. + + + + + Confirm wallet encryption + + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + + + + + + Wallet encrypted + + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + + + + + + The supplied passphrases do not match. + + + + + Wallet unlock failed + + + + + + + The passphrase entered for the wallet decryption was incorrect. + + + + + Wallet decryption failed + + + + + Wallet passphrase was succesfully changed. + + + + + BitcoinGUI + + + Bitcoin Wallet + + + + + + Synchronizing with network... + + + + + Block chain synchronization in progress + + + + + &Overview + &Ülevaade + + + + Show general overview of wallet + + + + + &Transactions + &Tehingud + + + + Browse transaction history + Sirvi tehingute ajalugu + + + + &Address Book + &Aadressiraamat + + + + Edit the list of stored addresses and labels + + + + + &Receive coins + + + + + Show the list of addresses for receiving payments + + + + + &Send coins + + + + + Send coins to a bitcoin address + + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + + + + + Quit application + + + + + &About %1 + + + + + Show information about Bitcoin + + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + &Valikud... + + + + Modify configuration options for bitcoin + + + + + Open &Bitcoin + + + + + Show the Bitcoin window + + + + + &Export... + &Ekspordi... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + + + + + Encrypt or decrypt wallet + + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + + + + + Change the passphrase used for wallet encryption + + + + + &File + &Fail + + + + &Settings + &Seaded + + + + &Help + &Abiinfo + + + + Tabs toolbar + + + + + Actions toolbar + + + + + [testnet] + + + + + bitcoin-qt + + + + + %n active connection(s) to Bitcoin network + + + + + Downloaded %1 of %2 blocks of transaction history. + + + + + Downloaded %1 blocks of transaction history. + + + + + %n second(s) ago + + + + + %n minute(s) ago + + + + + %n hour(s) ago + + + + + %n day(s) ago + + + + + Up to date + + + + + Catching up... + + + + + Last received block was generated %1. + + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + + + + + Sending... + + + + + Sent transaction + + + + + Incoming transaction + + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + + + + + Choose the default subdivision unit to show in the interface, and when sending coins + + + + + Display addresses in transaction list + + + + + EditAddressDialog + + + Edit Address + Muuda aadressi + + + + &Label + Si&lt + + + + The label associated with this address book entry + + + + + &Address + + + + + The address associated with this address book entry. This can only be modified for sending addresses. + + + + + New receiving address + + + + + New sending address + + + + + Edit receiving address + + + + + Edit sending address + + + + + The entered address "%1" is already in the address book. + + + + + The entered address "%1" is not a valid bitcoin address. + + + + + Could not unlock wallet. + + + + + New key generation failed. + + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + + + + + Automatically start Bitcoin after the computer is turned on + + + + + &Minimize to the tray instead of the taskbar + + + + + Show only a tray icon after minimizing the window + + + + + Map port using &UPnP + + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + + + + + M&inimize on close + + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + + + + + &Connect through SOCKS4 proxy: + + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + + + + + Proxy &IP: + + + + + IP address of the proxy (e.g. 127.0.0.1) + + + + + &Port: + + + + + Port of the proxy (e.g. 1234) + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose adress from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + + + + + &Copy to Clipboard + Kopeeri lõikelauale + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + + + + + Display + + + + + Options + + + + + OverviewPage + + + Form + + + + + Balance: + + + + + 123.456 BTC + + + + + Number of transactions: + + + + + 0 + + + + + Unconfirmed: + + + + + 0 BTC + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + + <b>Recent transactions</b> + + + + + Your current balance + + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + + + + + Total number of transactions in wallet + + + + + QRCodeDialog + + + Dialog + Dialoog + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + Sõnum: + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + + + + + Send to multiple recipients at once + + + + + &Add recipient... + + + + + Remove all transaction fields + + + + + Clear all + + + + + Balance: + + + + + 123.456 BTC + + + + + Confirm the send action + + + + + &Send + + + + + <b>%1</b> to %2 (%3) + + + + + Confirm send coins + + + + + Are you sure you want to send %1? + + + + + and + + + + + The recepient address is not valid, please recheck. + + + + + The amount to pay must be larger than 0. + + + + + Amount exceeds your balance + + + + + Total exceeds your balance when the %1 transaction fee is included + + + + + Duplicate address found, can only send to each address once in one send operation + + + + + Error: Transaction creation failed + + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + + + + + A&mount: + + + + + Pay &To: + + + + + + Enter a label for this address to add it to your address book + + + + + &Label: + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose address from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Remove this recipient + + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + TransactionDesc + + + Open for %1 blocks + + + + + Open until %1 + + + + + %1/offline? + + + + + %1/unconfirmed + + + + + %1 confirmations + + + + + <b>Status:</b> + + + + + , has not been successfully broadcast yet + + + + + , broadcast through %1 node + + + + + , broadcast through %1 nodes + + + + + <b>Date:</b> + + + + + <b>Source:</b> Generated<br> + + + + + + <b>From:</b> + + + + + unknown + tundmatu + + + + + + <b>To:</b> + + + + + (yours, label: + + + + + (yours) + + + + + + + + <b>Credit:</b> + + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + + + + + + + <b>Debit:</b> + + + + + <b>Transaction fee:</b> + + + + + <b>Net amount:</b> + + + + + Message: + Sõnum: + + + + Comment: + Kommentaar: + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + + + + + TransactionDescDialog + + + Transaction details + + + + + This pane shows a detailed description of the transaction + + + + + TransactionTableModel + + + Date + Kuupäev + + + + Type + Tüüp + + + + Address + Aadress + + + + Amount + Kogus + + + + Open for %n block(s) + + + + + Open until %1 + + + + + Offline (%1 confirmations) + + + + + Unconfirmed (%1 of %2 confirmations) + + + + + Confirmed (%1 confirmations) + + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + + + + + Generated but not accepted + + + + + Received with + + + + + Received from + + + + + Sent to + + + + + Payment to yourself + + + + + Mined + + + + + (n/a) + + + + + Transaction status. Hover over this field to show number of confirmations. + + + + + Date and time that the transaction was received. + + + + + Type of transaction. + + + + + Destination address of transaction. + + + + + Amount removed from or added to balance. + + + + + TransactionView + + + + All + + + + + Today + + + + + This week + + + + + This month + + + + + Last month + + + + + This year + + + + + Range... + + + + + Received with + + + + + Sent to + + + + + To yourself + + + + + Mined + + + + + Other + + + + + Enter address or label to search + + + + + Min amount + + + + + Copy address + + + + + Copy label + + + + + Copy amount + + + + + Edit label + + + + + Show details... + + + + + Export Transaction Data + + + + + Comma separated file (*.csv) + + + + + Confirmed + + + + + Date + Kuupäev + + + + Type + Tüüp + + + + Label + Silt + + + + Address + Aadress + + + + Amount + Kogus + + + + ID + + + + + Error exporting + Viga eksportimisel + + + + Could not write to file %1. + + + + + Range: + + + + + to + + + + + WalletModel + + + Sending... + + + + + bitcoin-core + + + Bitcoin version + + + + + Usage: + + + + + Send command to -server or bitcoind + + + + + List commands + + + + + Get help for a command + + + + + Options: + + + + + Specify configuration file (default: bitcoin.conf) + + + + + Specify pid file (default: bitcoind.pid) + + + + + Generate coins + + + + + Don't generate coins + + + + + Start minimized + + + + + Specify data directory + + + + + Specify connection timeout (in milliseconds) + + + + + Connect through socks4 proxy + + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + + + + + Connect only to the specified node + + + + + Don't accept connections from outside + + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + + + + + Loading wallet... + + + + + Rescanning... + + + + + Done loading + + + + + Invalid -proxy address + + + + + Invalid amount for -paytxfee=<amount> + + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_eu_ES.ts b/src/qt/locale/bitcoin_eu_ES.ts new file mode 100644 index 0000000..b4e71af --- /dev/null +++ b/src/qt/locale/bitcoin_eu_ES.ts @@ -0,0 +1,1963 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> Bertsio + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + Helbide-liburua + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + + + + + Double-click to edit address or label + + + + + Create a new address + Sortu helbide berria + + + + &New Address... + + + + + Copy the currently selected address to the system clipboard + + + + + &Copy to Clipboard + + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + + + + + &Delete + &Ezabatu + + + + Copy address + + + + + Copy label + + + + + Edit + + + + + Delete + + + + + Export Address Book Data + + + + + Comma separated file (*.csv) + + + + + Error exporting + + + + + Could not write to file %1. + + + + + AddressTableModel + + + Label + + + + + Address + Helbidea + + + + (no label) + + + + + AskPassphraseDialog + + + Dialog + + + + + + TextLabel + + + + + Enter passphrase + + + + + New passphrase + + + + + Repeat new passphrase + + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + + + + + Encrypt wallet + + + + + This operation needs your wallet passphrase to unlock the wallet. + + + + + Unlock wallet + + + + + This operation needs your wallet passphrase to decrypt the wallet. + + + + + Decrypt wallet + + + + + Change passphrase + + + + + Enter the old and new passphrase to the wallet. + + + + + Confirm wallet encryption + + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + + + + + + Wallet encrypted + + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + + + + + + The supplied passphrases do not match. + + + + + Wallet unlock failed + + + + + + + The passphrase entered for the wallet decryption was incorrect. + + + + + Wallet decryption failed + + + + + Wallet passphrase was succesfully changed. + + + + + BitcoinGUI + + + Bitcoin Wallet + + + + + + Synchronizing with network... + + + + + Block chain synchronization in progress + + + + + &Overview + + + + + Show general overview of wallet + + + + + &Transactions + + + + + Browse transaction history + + + + + &Address Book + + + + + Edit the list of stored addresses and labels + + + + + &Receive coins + + + + + Show the list of addresses for receiving payments + + + + + &Send coins + + + + + Send coins to a bitcoin address + + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + + + + + Quit application + + + + + &About %1 + + + + + Show information about Bitcoin + + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + + + + + Modify configuration options for bitcoin + + + + + Open &Bitcoin + + + + + Show the Bitcoin window + + + + + &Export... + + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + + + + + Encrypt or decrypt wallet + + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + + + + + Change the passphrase used for wallet encryption + + + + + &File + + + + + &Settings + + + + + &Help + + + + + Tabs toolbar + + + + + Actions toolbar + + + + + [testnet] + + + + + bitcoin-qt + + + + + %n active connection(s) to Bitcoin network + + + + + Downloaded %1 of %2 blocks of transaction history. + + + + + Downloaded %1 blocks of transaction history. + + + + + %n second(s) ago + + + + + %n minute(s) ago + + + + + %n hour(s) ago + + + + + %n day(s) ago + + + + + Up to date + + + + + Catching up... + + + + + Last received block was generated %1. + + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + + + + + Sending... + + + + + Sent transaction + + + + + Incoming transaction + + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + + + + + Choose the default subdivision unit to show in the interface, and when sending coins + + + + + Display addresses in transaction list + + + + + EditAddressDialog + + + Edit Address + + + + + &Label + + + + + The label associated with this address book entry + + + + + &Address + + + + + The address associated with this address book entry. This can only be modified for sending addresses. + + + + + New receiving address + + + + + New sending address + + + + + Edit receiving address + + + + + Edit sending address + + + + + The entered address "%1" is already in the address book. + + + + + The entered address "%1" is not a valid bitcoin address. + + + + + Could not unlock wallet. + + + + + New key generation failed. + + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + + + + + Automatically start Bitcoin after the computer is turned on + + + + + &Minimize to the tray instead of the taskbar + + + + + Show only a tray icon after minimizing the window + + + + + Map port using &UPnP + + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + + + + + M&inimize on close + + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + + + + + &Connect through SOCKS4 proxy: + + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + + + + + Proxy &IP: + + + + + IP address of the proxy (e.g. 127.0.0.1) + + + + + &Port: + + + + + Port of the proxy (e.g. 1234) + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose adress from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + + + + + &Copy to Clipboard + + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + + + + + Display + + + + + Options + + + + + OverviewPage + + + Form + + + + + Balance: + + + + + 123.456 BTC + + + + + Number of transactions: + + + + + 0 + + + + + Unconfirmed: + + + + + 0 BTC + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + + <b>Recent transactions</b> + + + + + Your current balance + + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + + + + + Total number of transactions in wallet + + + + + QRCodeDialog + + + Dialog + + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + + + + + Send to multiple recipients at once + + + + + &Add recipient... + + + + + Remove all transaction fields + + + + + Clear all + + + + + Balance: + + + + + 123.456 BTC + + + + + Confirm the send action + + + + + &Send + + + + + <b>%1</b> to %2 (%3) + + + + + Confirm send coins + + + + + Are you sure you want to send %1? + + + + + and + + + + + The recepient address is not valid, please recheck. + + + + + The amount to pay must be larger than 0. + + + + + Amount exceeds your balance + + + + + Total exceeds your balance when the %1 transaction fee is included + + + + + Duplicate address found, can only send to each address once in one send operation + + + + + Error: Transaction creation failed + + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + + + + + A&mount: + + + + + Pay &To: + + + + + + Enter a label for this address to add it to your address book + + + + + &Label: + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose address from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Remove this recipient + + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + TransactionDesc + + + Open for %1 blocks + + + + + Open until %1 + + + + + %1/offline? + + + + + %1/unconfirmed + + + + + %1 confirmations + + + + + <b>Status:</b> + + + + + , has not been successfully broadcast yet + + + + + , broadcast through %1 node + + + + + , broadcast through %1 nodes + + + + + <b>Date:</b> + + + + + <b>Source:</b> Generated<br> + + + + + + <b>From:</b> + + + + + unknown + + + + + + + <b>To:</b> + + + + + (yours, label: + + + + + (yours) + + + + + + + + <b>Credit:</b> + + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + + + + + + + <b>Debit:</b> + + + + + <b>Transaction fee:</b> + + + + + <b>Net amount:</b> + + + + + Message: + + + + + Comment: + + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + + + + + TransactionDescDialog + + + Transaction details + + + + + This pane shows a detailed description of the transaction + + + + + TransactionTableModel + + + Date + + + + + Type + + + + + Address + Helbidea + + + + Amount + + + + + Open for %n block(s) + + + + + Open until %1 + + + + + Offline (%1 confirmations) + + + + + Unconfirmed (%1 of %2 confirmations) + + + + + Confirmed (%1 confirmations) + + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + + + + + Generated but not accepted + + + + + Received with + + + + + Received from + + + + + Sent to + + + + + Payment to yourself + + + + + Mined + + + + + (n/a) + + + + + Transaction status. Hover over this field to show number of confirmations. + + + + + Date and time that the transaction was received. + + + + + Type of transaction. + + + + + Destination address of transaction. + + + + + Amount removed from or added to balance. + + + + + TransactionView + + + + All + + + + + Today + + + + + This week + + + + + This month + + + + + Last month + + + + + This year + + + + + Range... + + + + + Received with + + + + + Sent to + + + + + To yourself + + + + + Mined + + + + + Other + + + + + Enter address or label to search + + + + + Min amount + + + + + Copy address + + + + + Copy label + + + + + Copy amount + + + + + Edit label + + + + + Show details... + + + + + Export Transaction Data + + + + + Comma separated file (*.csv) + + + + + Confirmed + + + + + Date + + + + + Type + + + + + Label + + + + + Address + Helbidea + + + + Amount + + + + + ID + + + + + Error exporting + + + + + Could not write to file %1. + + + + + Range: + + + + + to + + + + + WalletModel + + + Sending... + + + + + bitcoin-core + + + Bitcoin version + + + + + Usage: + + + + + Send command to -server or bitcoind + + + + + List commands + + + + + Get help for a command + + + + + Options: + + + + + Specify configuration file (default: bitcoin.conf) + + + + + Specify pid file (default: bitcoind.pid) + + + + + Generate coins + + + + + Don't generate coins + + + + + Start minimized + + + + + Specify data directory + + + + + Specify connection timeout (in milliseconds) + + + + + Connect through socks4 proxy + + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + + + + + Connect only to the specified node + + + + + Don't accept connections from outside + + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + + + + + Loading wallet... + + + + + Rescanning... + + + + + Done loading + + + + + Invalid -proxy address + + + + + Invalid amount for -paytxfee=<amount> + + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts new file mode 100644 index 0000000..ed2aff6 --- /dev/null +++ b/src/qt/locale/bitcoin_fa.ts @@ -0,0 +1,1980 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + در مورد بیتکویین + + + + + <b>Bitcoin</b> version + نسخه + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + کپی رایت © 2012-2009 Bitcoin Developers + +این یک نرم‌افزار آزمایشی است. + +توزیع شده تحت امتیاز نرم‌افزار MIT/X11، از فایل همراه با عنوان license.txt یا http://www.opensource.org/licenses/mit-license.php دیدن کنید. + +این محصول از نرم‌افزار ساخته شده در OpenSSL Project برای استفاده در جعبه ابزار OpenSSL‏ (http://www.openssl.org/‎)، نرم‌افزار نهفته نوشته شده توسط اریک یانگ (eay@cryptsoft.com) و نرم‌افزار UPnP نوشته شده توسط توماس برنارد تشکیل شده است. + + + + AddressBookPage + + + Address Book + دفتر آدرس + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + ااینجا آدرسهای بیتکویین هستند برای در یافت پر داختها. شما می توانید از مسیر های متفاوت پر داخت در بیابید بدین دلیل شما می توانید مسیر پر داخت کننده نگهداری کنید +درس روی پنجره اصلی نمایش می شود + + + + Double-click to edit address or label + برای ویرایش آدرس یا بر چسب دو بار کلیک کنید + + + + Create a new address + آدرس نو ایجاد کنید + + + + &New Address... + آدرس نو... + + + + Copy the currently selected address to the system clipboard + آدرس انتخاب شده در سیستم تخته رسم گیره دار کپی کنید + + + + &Copy to Clipboard + کپی در تخته رسم گیره دار + + + + Show &QR Code + نمایش &کد QR + + + + Sign a message to prove you own this address + یک پیام را امضا کنید تا ثابت کنید صاحب این نشانی هستید + + + + &Sign Message + &امضای پیام + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + آدرس انتخاب شده از لیست حذف کنید. فقط آدرسهای ارسال شده می شود حفذ کرد + + + + &Delete + آدرس نو + + + + Copy address + کپی آدرس + + + + Copy label + کپی بر چسب + + + + Edit + ویرایش + + + + Delete + حذف + + + + Export Address Book Data + آدرس انتخاب شده در سیستم تخته رسم گیره دار کپی کنید + + + + Comma separated file (*.csv) + Comma فایل جدا + + + + Error exporting + خطای صادرت + + + + Could not write to file %1. + تا فایل %1 نمی شود نوشت + + + + AddressTableModel + + + Label + ر چسب + + + + Address + ایل جدا + + + + (no label) + خطای صادرت + + + + AskPassphraseDialog + + + Dialog + تگفتگو + + + + + TextLabel + بر چسب + + + + Enter passphrase + وارد عبارت عبور + + + + New passphrase + عبارت عبور نو + + + + Repeat new passphrase + تکرار عبارت عبور نو + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + وارد کنید..&lt;br/&gt عبارت عبور نو در پنجره + 10 یا بیشتر کاراکتورهای تصادفی استفاده کنید &lt;b&gt لطفا عبارت عبور + + + + Encrypt wallet + رمز بندی پنجره + + + + This operation needs your wallet passphrase to unlock the wallet. + این عملیت نیاز عبارت عبور پنجره شما دارد برای رمز گشایی آن + + + + Unlock wallet + تکرار عبارت عبور نو + + + + This operation needs your wallet passphrase to decrypt the wallet. + این عملیت نیاز عبارت عبور شما دارد برای رمز بندی آن + + + + Decrypt wallet + رمز بندی پنجره + + + + Change passphrase + تغییر عبارت عبور + + + + Enter the old and new passphrase to the wallet. + عبارت عبور نو و قدیم در پنجره وارد کنید + + + + Confirm wallet encryption + تایید رمز گذاری + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + هشدار اگر شما روی پنجره رمز بگذارید و عبارت عبور فراموش کنید همه بیتکویینس شما گم می کنید. متماینید کن که می خواهید رمز بگذارید + + + + + Wallet encrypted + تغییر عبارت عبور + + + + Bitcoin 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. + Biticon هم اکنون بسته می‌شود تا فرایند رمزگذاری را تمام کند. به خاطر داشته باشید که رمزگذاری کیف پولتان نمی‌تواند به طور کامل بیتیکون‌های شما را در برابر دزدیده شدن توسط بدافزارهایی که رایانه شما را آلوده می‌کنند، محافظت نماید. + + + + + Warning: The Caps Lock key is on. + هشدار: کلید حروف بزرگ روشن است. + + + + + + + Wallet encryption failed + عبارت عبور نو و قدیم در پنجره وارد کنید + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + تنا موفق رمز بندی پنجره ناشی از خطای داخل شد. پنجره شما مرز بندی نشده است + + + + + The supplied passphrases do not match. + عبارت عبور عرضه تطابق نشد + + + + Wallet unlock failed + نجره رمز گذار شد + + + + + + The passphrase entered for the wallet decryption was incorrect. + اموفق رمز بندی پنجر + + + + Wallet decryption failed + ناموفق رمز بندی پنجره + + + + Wallet passphrase was succesfully changed. + عبارت عبور با موفقیت تغییر شد + + + + BitcoinGUI + + + Bitcoin Wallet + پنجره بیتکویین + + + + + Synchronizing with network... + همگام سازی با شبکه ... + + + + Block chain synchronization in progress + همگام زنجیر بلوک در حال پیشرفت + + + + &Overview + بررسی اجمالی + + + + Show general overview of wallet + نمای کلی پنجره نشان بده + + + + &Transactions + &amp;معاملات + + + + Browse transaction history + نمایش تاریخ معاملات + + + + &Address Book + دفتر آدرس + + + + Edit the list of stored addresses and labels + ویرایش لیست آدرسها و بر چسب های ذخیره ای + + + + &Receive coins + در یافت سکه + + + + Show the list of addresses for receiving payments + نمایش لیست آدرس ها برای در یافت پر داخت ها + + + + &Send coins + رسال سکه ها + + + + Send coins to a bitcoin address + ارسال سکه به آدرس بیتکویین + + + + Sign &message + امضای &پیام + + + + Prove you control an address + اثبات کنید که روی یک نشانی کنترل دارید + + + + E&xit + خروج + + + + Quit application + خروج از برنامه + + + + &About %1 + &حدود%1 + + + + Show information about Bitcoin + نمایش اطلاعات در مورد بیتکویین + + + + About &Qt + درباره &Qt + + + + Show information about Qt + نمایش اطلاعات درباره Qt + + + + &Options... + تنظیمات... + + + + Modify configuration options for bitcoin + صلاح تنظیمات برای بیتکویین + + + + Open &Bitcoin + باز کردن &amp;بیتکویین + + + + Show the Bitcoin window + نمایش پنجره بیتکویین + + + + &Export... + &;صادرات + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + &رمز بندی پنجره + + + + Encrypt or decrypt wallet + رمز بندی یا رمز گشایی پنجره + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + تغییر عبارت عبور + + + + Change the passphrase used for wallet encryption + عبارت عبور رمز گشایی پنجره تغییر کنید + + + + &File + فایل + + + + &Settings + تنظیمات + + + + &Help + کمک + + + + Tabs toolbar + نوار ابزار زبانه ها + + + + Actions toolbar + نوار ابزار عملیت + + + + [testnet] + آزمایش شبکه + + + + bitcoin-qt + بیتکویین + + + + %n active connection(s) to Bitcoin network + در صد ارتباطات فعال بیتکویین با شبکه %n + + + + Downloaded %1 of %2 blocks of transaction history. + %1 %2 دانلود 1% 2% بلوک معاملات + + + + Downloaded %1 blocks of transaction history. + دانلود بلوکهای معملات %1 + + + + %n second(s) ago + %n بعد از چند دقیقه + + + + %n minute(s) ago + %n بعد از چند دقیقه + + + + %n hour(s) ago + %n بعد از چند دقیقه + + + + %n day(s) ago + %n بعد از چند روزز + + + + Up to date + تا تاریخ + + + + Catching up... + ابتلا به بالا + + + + Last received block was generated %1. + خرین بلوک در یافت شده تولید شده بود %1 + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + این معامله از اندازه محدوده بیشتر است. شما می توانید آد را با دستمزد 1% بفرستید که شامل گره معامله شما می باشد و به شبکه های اینترنتی کمک خواهد کردو آیا شما می خواهید این پول پر داخت%1 + + + + Sending... + ارسال... + + + + Sent transaction + معامله ارسال شده + + + + Incoming transaction + معامله در یافت شده + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + تاریخ %1 +مبلغ%2 +نوع %3 +آدرس %4 + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + زمایش شبکهه + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + زمایش شبکه + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &;واحد نمایش مبلغ + + + + Choose the default subdivision unit to show in the interface, and when sending coins + زیر بخش پیش فرض در واسط انتخاب کنید و سکه ها ارسال کنید + + + + Display addresses in transaction list + نمایش آدرس ها در لیست معامله + + + + EditAddressDialog + + + Edit Address + اصلاح آدرس + + + + &Label + بر چسب + + + + The label associated with this address book entry + بر چسب با دفتر آدرس ورود مرتبط است + + + + &Address + آدرس + + + + The address associated with this address book entry. This can only be modified for sending addresses. + آدرس با دفتر آدرس ورودی مرتبط است. این فقط در مورد آدرسهای ارسال شده است + + + + New receiving address + آدرس در یافت نو + + + + New sending address + آدرس ارسال نو + + + + Edit receiving address + اصلاح آدرس در یافت + + + + Edit sending address + اصلاح آدرس ارسال + + + + The entered address "%1" is already in the address book. + %1آدرس وارد شده دیگر در دفتر آدرس است + + + + The entered address "%1" is not a valid bitcoin address. + آدرس وارد شده آدرس معتبر بیتکویید نیست %1 + + + + Could not unlock wallet. + رمز گشایی پنجره امکان پذیر نیست + + + + New key generation failed. + کلید نسل جدید ناموفق است + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + شروع بیتکویین از پنجره سیستم استارت + + + + Automatically start Bitcoin after the computer is turned on + شروع بیتکویین اتوماتین بعد از روشن کامپیوتر + + + + &Minimize to the tray instead of the taskbar + حد اقل رساندن در جای نوار ابزار ها + + + + Show only a tray icon after minimizing the window + نمایش فقط نماد سینی بعد از حد اقل رساندن پنجره + + + + Map port using &UPnP + درگاه با استفاده از + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + اتوماتیک باز کردن بندر بیتکویین در روتر . این فقط در مواردی می باشد که روتر با کمک یو Ù¾ ن Ù¾ کار می کند + + + + M&inimize on close + حد اقل رساندن در نزدیک + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + حد اقل رساندن در جای خروج بر نامه وقتیکه پنجره بسته است.وقتیکه این فعال است برنامه خاموش می شود بعد از انتخاب دستور خاموش در منیو + + + + &Connect through SOCKS4 proxy: + ارتباط با توسط + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + وسل به شبکه بیتکویین با توسط + + + + Proxy &IP: + درس پروکسی + + + + IP address of the proxy (e.g. 127.0.0.1) + درس پروکسی + + + + &Port: + پورت پروکسی + + + + Port of the proxy (e.g. 1234) + ورت پروکسی + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + نرخ اختیاری تراکنش هر کیلوبایت که به شما کمک می‌کند اطمینان پیدا کنید که تراکنش‌ها به سرعت پردازش می‌شوند. بیشتر تراکنش‌ها Û± کیلوبایت هستند. نرخ 0.01 پیشنهاد می‌شود. + + + + Pay transaction &fee + دستمزد&amp;پر داخت معامله + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + نرخ اختیاری تراکنش هر کیلوبایت که به شما کمک می‌کند اطمینان پیدا کنید که تراکنش‌ها به سرعت پردازش می‌شوند. بیشتر تراکنش‌ها Û± کیلوبایت هستند. نرخ 0.01 پیشنهاد می‌شود. + + + + MessagePage + + + Message + پیام + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + آدرس برای ارسال پر داخت (bijvoorbeeld: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + آدرس از دفتر انتخاب کنید + + + + Alt+A + Alt+A + + + + Paste address from clipboard + آدرس از تخته رسم گیره دار پست کنید + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + پیامی را که می‌خواهید امضا کنید در اینجا وارد کنید + + + + Click "Sign Message" to get signature + روی «امضای پیام» کلیک کنید تا امضا را دریافت نمایید + + + + Sign a message to prove you own this address + یک پیام را امضا کنید تا ثابت کنید صاحب این نشانی هستید + + + + &Sign Message + &امضای پیام + + + + Copy the currently selected address to the system clipboard + آدرس انتخاب شده در سیستم تخته رسم گیره دار کپی کنید + + + + &Copy to Clipboard + کپی در تخته رسم گیره دار + + + + + + Error signing + خطا در امضا + + + + %1 is not a valid address. + %1 یک نشانی معتبر نیست. + + + + Private key for %1 is not available. + کلید خصوصی برای %1 در دسترس نیست. + + + + Sign failed + امضا موفق نبود + + + + OptionsDialog + + + Main + صلی + + + + Display + دیسپلی + + + + Options + اصلی + + + + OverviewPage + + + Form + تراز + + + + Balance: + راز: + + + + 123.456 BTC + 123.456 بتس + + + + Number of transactions: + تعداد معامله + + + + 0 + 0 + + + + Unconfirmed: + تایید نشده + + + + 0 BTC + 0 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">⏎ +<html><head><meta name="qrichtext" content="1" /><style type="text/css">⏎ +p, li { white-space: pre-wrap; }⏎ +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">⏎ +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">کیف پول</span></p></body></html> + + + + <b>Recent transactions</b> + اخرین معاملات&lt + + + + Your current balance + تزار جاری شما + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + تعداد معاملات که تایید شده ولی هنوز در تزار جاری شما بر شمار نرفته است + + + + Total number of transactions in wallet + تعداد معاملات در صندوق + + + + QRCodeDialog + + + Dialog + تگفتگو + + + + QR Code + کد QR + + + + Request Payment + درخواست پرداخت + + + + Amount: + مقدار: + + + + BTC + BTC + + + + Label: + برچسب: + + + + Message: + پیام + + + + &Save As... + &ذخیره به عنوان... + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + ارسال سکه ها + + + + Send to multiple recipients at once + ارسال چندین در یافت ها فورا + + + + &Add recipient... + &;در یافت کننده اضافه کنید ... + + + + Remove all transaction fields + پاک کردن تمام ستون‌های تراکنش + + + + Clear all + >همه چیز پاک کنید + + + + Balance: + تزار : + + + + 123.456 BTC + 123.456 بتس + + + + Confirm the send action + عملیت دوم تایید کنید + + + + &Send + &;ارسال + + + + <b>%1</b> to %2 (%3) + (%3) تا <b>%1</b> درصد%2 + + + + Confirm send coins + ارسال سکه ها تایید کنید + + + + Are you sure you want to send %1? + %1شما متماینید که می خواهید 1% ارسال کنید ؟ + + + + and + و + + + + The recepient address is not valid, please recheck. + آدرس در یافت دو باره چک کنید + + + + The amount to pay must be larger than 0. + مبلغ پر داخت باید از 0 بیشتر باشد + + + + Amount exceeds your balance + مبلغ از تزار بیشتر است + + + + Total exceeds your balance when the %1 transaction fee is included + مجموعه از تزار شما بیشتر می باشد وقتیکه 1% معامله شامل می شود %1 + + + + Duplicate address found, can only send to each address once in one send operation + نشانی تکراری مشاهده شد. در یک عملیات ارسال فقط می‌توان یک بار به هر نشانی ارسال کرد + + + + Error: Transaction creation failed + خطا ایجاد معامله اشتباه است + + + + Error: 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. + خطا . معامله رد شد.این هنگامی که سکه ها در والت شما هنوز ارسال شده اند ولی شما کپی والت استفاده می کنید و سکه ها روی کپی فرستاده شده اند و به عنوان ارسال شنه مشخص نشده اتفاقی می افتد. + + + + SendCoinsEntry + + + Form + تراز + + + + A&mount: + A&amp;مبلغ : + + + + Pay &To: + به&amp;پر داخت : + + + + + Enter a label for this address to add it to your address book + برای آدرس بر پسب وارد کنید که در دفتر آدرس اضافه شود + + + + &Label: + & بر چسب + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + آدرس برای ارسال پر داخت (bijvoorbeeld: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + اآدرسن ازدفتر آدرس انتخاب کنید + + + + Alt+A + Alt+A + + + + Paste address from clipboard + آدرس از تخته رسم گیره دار پست کنید + + + + Alt+P + Alt+P + + + + Remove this recipient + بر داشتن این در یافت کننده + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + آدرس بیتکویین وارد کنید (bijvoorbeeld: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + باز کردن 1% بلوک 1%1 + + + + Open until %1 + باز کردن تا%1 + + + + %1/offline? + %1 انلاین نیست + + + + %1/unconfirmed + %1 تایید نشده + + + + %1 confirmations + ایید %1 + + + + <b>Status:</b> + &lt;b&gt;وضعیت :&lt;/b&gt; + + + + , has not been successfully broadcast yet + هنوز با مو فقیت ارسال نشده + + + + , broadcast through %1 node + ارسال توسط گره %1 + + + + , broadcast through %1 nodes + رسال توسط گره های %1 + + + + <b>Date:</b> + &lt;b&gt;تاریخ :&lt;/b&gt + + + + <b>Source:</b> Generated<br> + &lt;b&gt;منبع :&lt;/b&gt; Generated&lt;br&gt + + + + + <b>From:</b> + &lt;b&gt;از:&lt;/b&gt; + + + + unknown + مشخص نیست + + + + + + <b>To:</b> + &lt;b&gt;به :&lt;/b&gt; + + + + (yours, label: + مال شما ، بر چسب( + + + + (yours) + مال شما) ( + + + + + + + <b>Credit:</b> + &lt;b&gt;اعتبار :&lt;/b&gt; + + + + (%1 matures in %2 more blocks) + (%1 )بالغ در بلوک 2% و بیشتر%2 + + + + (not accepted) + قابل قبول نیست ( ) + + + + + + <b>Debit:</b> + &lt;b&gt;مقدار خالص:&lt;/b&gt; + + + + <b>Transaction fee:</b> + &lt;b&gt;پر داخت معامله :&lt;/b&gt; + + + + <b>Net amount:</b> + &lt;b&gt;مبلغ خالص :&lt;/b&gt; + + + + Message: + پیام + + + + Comment: + مورد نظر + + + + Transaction ID: + شماره تراکنش: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + برای ارسال واحد های تولید شده باید 120 بلوک باشند. هنگامی که بلون ایجاد می شود به شبکه ارسال می شود تا در زنجیر بلوکها اضافه شود. و گر نه بلوک به غیر قابول و غیر ارسال عوض می شود. این اتفاقی می افتد وقتی که همزمان گره دیگر در بلوک ایجاد می شود. + + + + TransactionDescDialog + + + Transaction details + جزییات معاملات + + + + This pane shows a detailed description of the transaction + در این قاب شیشه توصیف دقیق معامله نشان می شود + + + + TransactionTableModel + + + Date + تاریخ + + + + Type + نوع + + + + Address + ایل جدا + + + + Amount + مبلغ + + + + Open for %n block(s) + بلوک %n باز شده برای + + + + Open until %1 + از شده تا 1%1 + + + + Offline (%1 confirmations) + افلایین (%1) + + + + Unconfirmed (%1 of %2 confirmations) + تایید نشده (%1/%2) + + + + Confirmed (%1 confirmations) + تایید شده (%1) + + + + Mined balance will be available in %n more blocks + و بیشتر باشند قابل قابول می شود %n تزار اصلی بعد از اینکه بلوکها + + + + This block was not received by any other nodes and will probably not be accepted! + این بلوک از دیگر گره ها در یافت نشده بدین دلیل شاید قابل قابول نیست + + + + Generated but not accepted + تولید شده ولی قبول نشده + + + + Received with + در یافت با : + + + + Received from + دریافتی از + + + + Sent to + ارسال به : + + + + Payment to yourself + پر داخت به خودتان + + + + Mined + استخراج + + + + (n/a) + (کاربرد ندارد) + + + + Transaction status. Hover over this field to show number of confirmations. + وضعیت معالمه . عرصه که تعداد تایید نشان می دهد + + + + Date and time that the transaction was received. + تاریخ و ساعت در یافت معامله + + + + Type of transaction. + نوع معاملات + + + + Destination address of transaction. + آدرس مقصود معاملات + + + + Amount removed from or added to balance. + مبلغ از تزار شما خارج یا وارد شده + + + + TransactionView + + + + All + همه + + + + Today + امروز + + + + This week + این هفته + + + + This month + این ماه + + + + Last month + ماه گذشته + + + + This year + امسال + + + + Range... + محدوده + + + + Received with + در یافت با + + + + Sent to + ارسال به + + + + To yourself + به خودتان + + + + Mined + استخراج + + + + Other + یگر + + + + Enter address or label to search + برای جست‌‌وجو نشانی یا برچسب را وارد کنید + + + + Min amount + حد اقل مبلغ + + + + Copy address + کپی آدرس + + + + Copy label + کپی بر چسب + + + + Copy amount + روگرفت مقدار + + + + Edit label + اصلاح بر چسب + + + + Show details... + جزییت نشان بده + + + + Export Transaction Data + صادرات تاریخ معامله + + + + Comma separated file (*.csv) + Comma فایل جدا + + + + Confirmed + تایید شده + + + + Date + تاریخ + + + + Type + نوع + + + + Label + ر چسب + + + + Address + ایل جدا + + + + Amount + مبلغ + + + + ID + آی دی + + + + Error exporting + خطای صادرت + + + + Could not write to file %1. + تا فایل %1 نمی شود نوشت + + + + Range: + >محدوده + + + + to + به + + + + WalletModel + + + Sending... + ارسال... + + + + bitcoin-core + + + Bitcoin version + سخه بیتکویین + + + + Usage: + ستفاده : + + + + Send command to -server or bitcoind + ارسال فرمان به سرور یا باتکویین + + + + List commands + لیست فومان ها + + + + Get help for a command + کمک برای فرمان + + + + Options: + تنظیمات + + + + Specify configuration file (default: bitcoin.conf) + (: bitcoin.confپیش فرض: )فایل تنظیمی خاص + + + + Specify pid file (default: bitcoind.pid) + (bitcoind.pidپیش فرض : ) فایل پید خاص + + + + Generate coins + سکه های تولید شده + + + + Don't generate coins + تولید سکه ها + + + + Start minimized + شروع حد اقل + + + + Specify data directory + دایرکتور اطلاعاتی خاص + + + + Specify connection timeout (in milliseconds) + (میلی ثانیه )فاصله ارتباط خاص + + + + Connect through socks4 proxy + socks4 proxy ارتباط توسط + + + + Allow DNS lookups for addnode and connect + اجازه متغیر دی ان اس برای اضافه گره یا ارتباط + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + برای اتصالات به <port> (پیش‌فرض: 8333 یا تست‌نت: 18333) گوش کنید + + + + Maintain at most <n> connections to peers (default: 125) + حداکثر <n> اتصال با همکاران برقرار داشته باشید (پیش‌فرض: 125) + + + + Add a node to connect to + ضافه گره برای ارتباط به + + + + Connect only to the specified node + ارتباط فقط به گره خاص + + + + Don't accept connections from outside + قابل ارتباطات از بیرون + + + + Don't bootstrap list of peers using DNS + فهرست همکاران را با استفاده از DNS خودراه‌اندازی نکنید + + + + Threshold for disconnecting misbehaving peers (default: 100) + آستانه برای قطع ارتباط با همکاران بدرفتار (پیش‌فرض: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + مدت زمان به ثانیه برای جلوگیری از همکاران بدرفتار برای اتصال دوباره (پیش‌فرض: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + حداکثر بافر دریافتی در هر اتصال، 1000*<n> (پیش‌فرض: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + حداکثر بافر ارسالی در هر اتصال، 1000*<n> (پیش‌فرض: 10000) + + + + Don't attempt to use UPnP to map the listening port + برای ترسیم بندر شنیدنی UPnP استفاده + + + + Attempt to use UPnP to map the listening port + برای ترسیم بندر شنیدنی UPnP استفاده + + + + Fee per kB to add to transactions you send + نرخ هر کیلوبایت برای اضافه کردن به تراکنش‌هایی که می‌فرستید + + + + Accept command line and JSON-RPC commands + JSON-RPC قابل فرمانها و + + + + Run in the background as a daemon and accept commands + اجرای در پس زمینه به عنوان شبح و قبول فرمان ها + + + + Use the test network + استفاده شبکه آزمایش + + + + Output extra debugging information + اطلاعات اشکال‌زدایی اضافی خروجی + + + + Prepend debug output with timestamp + به خروجی اشکال‌زدایی برچسب زمان بزنید + + + + Send trace/debug info to console instead of debug.log file + اطلاعات ردگیری/اشکال‌زدایی را به جای فایل لاگ اشکال‌زدایی به کنسول بفرستید + + + + Send trace/debug info to debugger + اطلاعات ردگیری/اشکال‌زدایی را به اشکال‌زدا بفرستید + + + + Username for JSON-RPC connections + JSON-RPC شناسه برای ارتباطات + + + + Password for JSON-RPC connections + JSON-RPC عبارت عبور برای ارتباطات + + + + Listen for JSON-RPC connections on <port> (default: 8332) + ( 8332پیش فرض :) &lt;poort&gt; JSON-RPC شنوایی برای ارتباطات + + + + Allow JSON-RPC connections from specified IP address + از آدرس آی پی خاص JSON-RPC قبول ارتباطات + + + + Send commands to node running on <ip> (default: 127.0.0.1) + (127.0.0.1پیش فرض: ) &lt;ip&gt; دادن فرمانها برای استفاده گره ها روی + + + + Set key pool size to <n> (default: 100) + (100پیش فرض:)&lt;n&gt; گذاشتن اندازه کلید روی + + + + Rescan the block chain for missing wallet transactions + اسکان مجدد زنجیر بلوکها برای گم والت معامله + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +( نگاه کنید Bitcoin Wiki در SSLتنظیمات ):SSL گزینه های + + + + Use OpenSSL (https) for JSON-RPC connections + JSON-RPCبرای ارتباطات استفاده کنید OpenSSL (https) + + + + Server certificate file (default: server.cert) + (server.certپیش فرض: )گواهی نامه سرور + + + + Server private key (default: server.pem) + (server.pemپیش فرض: ) کلید خصوصی سرور + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + رمز های قابل قبول( TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + پیام کمکی + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + رمز گشایی دایرکتور داده ها امکان پذیر نیست. شاید بیت کویین در حال فعال می باشد%s + + + + Loading addresses... + بار گیری آدرس ها + + + + Error loading addr.dat + خطا در بارگیری addr.dat + + + + Error loading blkindex.dat + خطا در بارگیری blkindex.dat + + + + Error loading wallet.dat: Wallet corrupted + خطا در بارگیری wallet.dat: کیف پول خراب شده است + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + خطا در بارگیری wallet.dat: کیف پول به ویرایش جدیدتری از Biticon نیاز دارد + + + + Wallet needed to be rewritten: restart Bitcoin to complete + سلام + + + + Error loading wallet.dat + خطا در بارگیری wallet.dat + + + + Loading block index... + بار گیری شاخص بلوک + + + + Loading wallet... + بار گیری والت + + + + Rescanning... + اسکان مجدد + + + + Done loading + بار گیری انجام شده است + + + + Invalid -proxy address + آدرس پروکسی معتبر نیست + + + + Invalid amount for -paytxfee=<amount> + paytxfee=&lt;بالغ &gt;مبلغ نا معتبر + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + خطا : پر داخت خیلی بالا است. این پر داخت معامله است که شما هنگام ارسال معامله باید پر داخت کنید + + + + Error: CreateThread(StartNode) failed + خطا :ایجاد موضوع(گره) اشتباه بود + + + + Warning: Disk space is low + هشدار: جای دیسک پایین است + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + وسل بندر به کامپیوتر امکان پذیر نیست. شاید بیتکویید در حال فعال است%d + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + هشدار: تاریخ و ساعت کامپیوتر شما چک کنید. اگر ساعت درست نیست بیتکویین مناسب نخواهد کار کرد + + + + beta + بتا + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_fa_IR.ts b/src/qt/locale/bitcoin_fa_IR.ts new file mode 100644 index 0000000..2e8df62 --- /dev/null +++ b/src/qt/locale/bitcoin_fa_IR.ts @@ -0,0 +1,1963 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + در مورد بیتکویین + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> version + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + + + + + Double-click to edit address or label + + + + + Create a new address + + + + + &New Address... + + + + + Copy the currently selected address to the system clipboard + + + + + &Copy to Clipboard + + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + + + + + &Delete + + + + + Copy address + + + + + Copy label + + + + + Edit + + + + + Delete + + + + + Export Address Book Data + + + + + Comma separated file (*.csv) + + + + + Error exporting + + + + + Could not write to file %1. + + + + + AddressTableModel + + + Label + + + + + Address + + + + + (no label) + + + + + AskPassphraseDialog + + + Dialog + + + + + + TextLabel + + + + + Enter passphrase + + + + + New passphrase + + + + + Repeat new passphrase + + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + + + + + Encrypt wallet + + + + + This operation needs your wallet passphrase to unlock the wallet. + + + + + Unlock wallet + + + + + This operation needs your wallet passphrase to decrypt the wallet. + + + + + Decrypt wallet + + + + + Change passphrase + + + + + Enter the old and new passphrase to the wallet. + + + + + Confirm wallet encryption + + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + + + + + + Wallet encrypted + + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + + + + + + The supplied passphrases do not match. + + + + + Wallet unlock failed + + + + + + + The passphrase entered for the wallet decryption was incorrect. + + + + + Wallet decryption failed + + + + + Wallet passphrase was succesfully changed. + + + + + BitcoinGUI + + + Bitcoin Wallet + + + + + + Synchronizing with network... + + + + + Block chain synchronization in progress + + + + + &Overview + + + + + Show general overview of wallet + + + + + &Transactions + + + + + Browse transaction history + + + + + &Address Book + + + + + Edit the list of stored addresses and labels + + + + + &Receive coins + + + + + Show the list of addresses for receiving payments + + + + + &Send coins + + + + + Send coins to a bitcoin address + + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + + + + + Quit application + + + + + &About %1 + + + + + Show information about Bitcoin + + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + + + + + Modify configuration options for bitcoin + + + + + Open &Bitcoin + + + + + Show the Bitcoin window + + + + + &Export... + + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + + + + + Encrypt or decrypt wallet + + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + + + + + Change the passphrase used for wallet encryption + + + + + &File + + + + + &Settings + + + + + &Help + + + + + Tabs toolbar + + + + + Actions toolbar + + + + + [testnet] + + + + + bitcoin-qt + + + + + %n active connection(s) to Bitcoin network + + + + + Downloaded %1 of %2 blocks of transaction history. + + + + + Downloaded %1 blocks of transaction history. + + + + + %n second(s) ago + + + + + %n minute(s) ago + + + + + %n hour(s) ago + + + + + %n day(s) ago + + + + + Up to date + + + + + Catching up... + + + + + Last received block was generated %1. + + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + + + + + Sending... + + + + + Sent transaction + + + + + Incoming transaction + + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + + + + + Choose the default subdivision unit to show in the interface, and when sending coins + + + + + Display addresses in transaction list + + + + + EditAddressDialog + + + Edit Address + + + + + &Label + + + + + The label associated with this address book entry + + + + + &Address + + + + + The address associated with this address book entry. This can only be modified for sending addresses. + + + + + New receiving address + + + + + New sending address + + + + + Edit receiving address + + + + + Edit sending address + + + + + The entered address "%1" is already in the address book. + + + + + The entered address "%1" is not a valid bitcoin address. + + + + + Could not unlock wallet. + + + + + New key generation failed. + + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + + + + + Automatically start Bitcoin after the computer is turned on + + + + + &Minimize to the tray instead of the taskbar + + + + + Show only a tray icon after minimizing the window + + + + + Map port using &UPnP + + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + + + + + M&inimize on close + + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + + + + + &Connect through SOCKS4 proxy: + + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + + + + + Proxy &IP: + + + + + IP address of the proxy (e.g. 127.0.0.1) + + + + + &Port: + + + + + Port of the proxy (e.g. 1234) + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose adress from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + + + + + &Copy to Clipboard + + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + + + + + Display + + + + + Options + + + + + OverviewPage + + + Form + + + + + Balance: + + + + + 123.456 BTC + + + + + Number of transactions: + + + + + 0 + + + + + Unconfirmed: + + + + + 0 BTC + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + + <b>Recent transactions</b> + + + + + Your current balance + + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + + + + + Total number of transactions in wallet + + + + + QRCodeDialog + + + Dialog + + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + + + + + Send to multiple recipients at once + + + + + &Add recipient... + + + + + Remove all transaction fields + + + + + Clear all + + + + + Balance: + + + + + 123.456 BTC + + + + + Confirm the send action + + + + + &Send + + + + + <b>%1</b> to %2 (%3) + + + + + Confirm send coins + + + + + Are you sure you want to send %1? + + + + + and + + + + + The recepient address is not valid, please recheck. + + + + + The amount to pay must be larger than 0. + + + + + Amount exceeds your balance + + + + + Total exceeds your balance when the %1 transaction fee is included + + + + + Duplicate address found, can only send to each address once in one send operation + + + + + Error: Transaction creation failed + + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + + + + + A&mount: + + + + + Pay &To: + + + + + + Enter a label for this address to add it to your address book + + + + + &Label: + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose address from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Remove this recipient + + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + TransactionDesc + + + Open for %1 blocks + + + + + Open until %1 + + + + + %1/offline? + + + + + %1/unconfirmed + + + + + %1 confirmations + + + + + <b>Status:</b> + + + + + , has not been successfully broadcast yet + + + + + , broadcast through %1 node + + + + + , broadcast through %1 nodes + + + + + <b>Date:</b> + + + + + <b>Source:</b> Generated<br> + + + + + + <b>From:</b> + + + + + unknown + + + + + + + <b>To:</b> + + + + + (yours, label: + + + + + (yours) + + + + + + + + <b>Credit:</b> + + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + + + + + + + <b>Debit:</b> + + + + + <b>Transaction fee:</b> + + + + + <b>Net amount:</b> + + + + + Message: + + + + + Comment: + + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + + + + + TransactionDescDialog + + + Transaction details + + + + + This pane shows a detailed description of the transaction + + + + + TransactionTableModel + + + Date + + + + + Type + + + + + Address + + + + + Amount + + + + + Open for %n block(s) + + + + + Open until %1 + + + + + Offline (%1 confirmations) + + + + + Unconfirmed (%1 of %2 confirmations) + + + + + Confirmed (%1 confirmations) + + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + + + + + Generated but not accepted + + + + + Received with + + + + + Received from + + + + + Sent to + + + + + Payment to yourself + + + + + Mined + + + + + (n/a) + + + + + Transaction status. Hover over this field to show number of confirmations. + + + + + Date and time that the transaction was received. + + + + + Type of transaction. + + + + + Destination address of transaction. + + + + + Amount removed from or added to balance. + + + + + TransactionView + + + + All + + + + + Today + + + + + This week + + + + + This month + + + + + Last month + + + + + This year + + + + + Range... + + + + + Received with + + + + + Sent to + + + + + To yourself + + + + + Mined + + + + + Other + + + + + Enter address or label to search + + + + + Min amount + + + + + Copy address + + + + + Copy label + + + + + Copy amount + + + + + Edit label + + + + + Show details... + + + + + Export Transaction Data + + + + + Comma separated file (*.csv) + + + + + Confirmed + + + + + Date + + + + + Type + + + + + Label + + + + + Address + + + + + Amount + + + + + ID + + + + + Error exporting + + + + + Could not write to file %1. + + + + + Range: + + + + + to + + + + + WalletModel + + + Sending... + + + + + bitcoin-core + + + Bitcoin version + + + + + Usage: + + + + + Send command to -server or bitcoind + + + + + List commands + + + + + Get help for a command + + + + + Options: + + + + + Specify configuration file (default: bitcoin.conf) + + + + + Specify pid file (default: bitcoind.pid) + + + + + Generate coins + + + + + Don't generate coins + + + + + Start minimized + + + + + Specify data directory + + + + + Specify connection timeout (in milliseconds) + + + + + Connect through socks4 proxy + + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + + + + + Connect only to the specified node + + + + + Don't accept connections from outside + + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + + + + + Loading wallet... + + + + + Rescanning... + + + + + Done loading + + + + + Invalid -proxy address + + + + + Invalid amount for -paytxfee=<amount> + + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts new file mode 100644 index 0000000..8b64819 --- /dev/null +++ b/src/qt/locale/bitcoin_fi.ts @@ -0,0 +1,1978 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + Tietoa Bitcoinista + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> versio + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + AddressBookPage + + + Address Book + Osoitekirja + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Nämä ovat sinun Bitcoin-osoitteesi suoritusten vastaanottamiseen. Voit halutessasi antaa kullekin lähettäjälle eri osoitteen, jotta voit seurata kuka sinulle maksaa. + + + + Double-click to edit address or label + Kaksoisnapauta muokataksesi osoitetta tai nimeä + + + + Create a new address + Luo uusi osoite + + + + &New Address... + &Uusi osoite + + + + Copy the currently selected address to the system clipboard + Kopioi valittu osoite leikepöydälle + + + + &Copy to Clipboard + &Kopioi leikepöydälle + + + + Show &QR Code + Näytä &QR-koodi + + + + Sign a message to prove you own this address + Allekirjoita viesti millä todistat omistavasi tämän osoitteen + + + + &Sign Message + &Allekirjoita viesti + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Poista valittuna oleva osoite listasta. Vain lähettämiseen käytettäviä osoitteita voi poistaa. + + + + &Delete + &Poista + + + + Copy address + Kopioi osoite + + + + Copy label + Kopioi nimi + + + + Edit + Muokkaa + + + + Delete + Poista + + + + Export Address Book Data + Vie osoitekirja + + + + Comma separated file (*.csv) + Comma separated file (*.csv) + + + + Error exporting + Virhe viedessä osoitekirjaa + + + + Could not write to file %1. + Ei voida kirjoittaa tiedostoon %1. + + + + AddressTableModel + + + Label + Nimi + + + + Address + Osoite + + + + (no label) + (ei nimeä) + + + + AskPassphraseDialog + + + Dialog + Dialogi + + + + + TextLabel + TekstiMerkki + + + + Enter passphrase + Anna tunnuslause + + + + New passphrase + Uusi tunnuslause + + + + Repeat new passphrase + Toista uusi tunnuslause + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Anna lompakolle uusi tunnuslause.<br/>Käytä tunnuslausetta, jossa on ainakin <b>10 satunnaista mekkiä</b> tai <b>kahdeksan sanaa</b>. + + + + Encrypt wallet + Salaa lompakko + + + + This operation needs your wallet passphrase to unlock the wallet. + Tätä toimintoa varten sinun täytyy antaa lompakon tunnuslause sen avaamiseksi. + + + + Unlock wallet + Avaa lompakko + + + + This operation needs your wallet passphrase to decrypt the wallet. + Tätä toimintoa varten sinun täytyy antaa lompakon tunnuslause salauksen purkuun. + + + + Decrypt wallet + Pura lompakon salaus + + + + Change passphrase + Vaihda tunnuslause + + + + Enter the old and new passphrase to the wallet. + Anna vanha ja uusi tunnuslause. + + + + Confirm wallet encryption + Hyväksy lompakon salaus + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + VAROITUS: Mikäli salaat lompakkosi ja unohdat tunnuslauseen, <b>MENETÄT LOMPAKON KOKO SISÄLLÖN</b>! +Tahdotko varmasti salata lompakon? + + + + + Wallet encrypted + Lompakko salattu + + + + Bitcoin 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. + Bitcoin sulkeutuu lopettaessaan salausprosessin. Muista että salattu lompakko ei täysin suojaa sitä haittaohjelmien aiheuttamilta varkauksilta. + + + + + Warning: The Caps Lock key is on. + Varoitus: Caps Lock on päällä. + + + + + + + Wallet encryption failed + Lompakon salaus epäonnistui + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Lompakon salaaminen epäonnistui sisäisen virheen vuoksi. Lompakkoa ei salattu. + + + + + The supplied passphrases do not match. + Annetut tunnuslauseet eivät täsmää. + + + + Wallet unlock failed + Lompakon avaaminen epäonnistui. + + + + + + The passphrase entered for the wallet decryption was incorrect. + Annettu tunnuslause oli väärä. + + + + Wallet decryption failed + Lompakon salauksen purku epäonnistui. + + + + Wallet passphrase was succesfully changed. + Lompakon tunnuslause on vaihdettu. + + + + BitcoinGUI + + + Bitcoin Wallet + Bitcoin-lompakko + + + + + Synchronizing with network... + Synkronoidaan verkon kanssa... + + + + Block chain synchronization in progress + Block chainin synkronointi kesken + + + + &Overview + &Yleisnäkymä + + + + Show general overview of wallet + Näyttää kokonaiskatsauksen lompakon tilanteesta + + + + &Transactions + &Rahansiirrot + + + + Browse transaction history + Selaa rahansiirtohistoriaa + + + + &Address Book + &Osoitekirja + + + + Edit the list of stored addresses and labels + Muokkaa tallennettujen nimien ja osoitteiden listaa + + + + &Receive coins + &Bitcoinien vastaanottaminen + + + + Show the list of addresses for receiving payments + Näytä Bitcoinien vastaanottamiseen käytetyt osoitteet + + + + &Send coins + &Lähetä Bitcoineja + + + + Send coins to a bitcoin address + Lähetä Bitcoin-osoitteeseen + + + + Sign &message + Allekirjoita &viesti + + + + Prove you control an address + Todista että hallitset osoitetta + + + + E&xit + L&opeta + + + + Quit application + Lopeta ohjelma + + + + &About %1 + &Tietoja %1 + + + + Show information about Bitcoin + Näytä tietoa Bitcoin-projektista + + + + About &Qt + Tietoja &Qt + + + + Show information about Qt + Näytä tietoja QT:ta + + + + &Options... + &Asetukset... + + + + Modify configuration options for bitcoin + Muokkaa asetuksia + + + + Open &Bitcoin + Avaa &Bitcoin + + + + Show the Bitcoin window + Näytä Bitcoin-ikkuna + + + + &Export... + &Vie... + + + + Export the data in the current tab to a file + Vie aukiolevan välilehden tiedot tiedostoon + + + + &Encrypt Wallet + &Salaa lompakko + + + + Encrypt or decrypt wallet + Kryptaa tai dekryptaa lompakko + + + + &Backup Wallet + &Varmuuskopioi lompakko + + + + Backup wallet to another location + Varmuuskopioi lompakko toiseen sijaintiin + + + + &Change Passphrase + &Vaihda tunnuslause + + + + Change the passphrase used for wallet encryption + Vaihda lompakon salaukseen käytettävä tunnuslause + + + + &File + &Tiedosto + + + + &Settings + &Asetukset + + + + &Help + &Apua + + + + Tabs toolbar + Välilehtipalkki + + + + Actions toolbar + Toimintopalkki + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n aktiivinen yhteys Bitcoin-verkkoon%n aktiivista yhteyttä Bitcoin-verkkoon + + + + Downloaded %1 of %2 blocks of transaction history. + Ladattu %1 of %2 rahansiirtohistorian lohkoa. + + + + Downloaded %1 blocks of transaction history. + Ladattu %1 lohkoa rahansiirron historiasta. + + + + %n second(s) ago + %n sekunti sitten%n sekuntia sitten + + + + %n minute(s) ago + %n minuutti sitten%n minuuttia sitten + + + + %n hour(s) ago + %n tunti sitten%n tuntia sitten + + + + %n day(s) ago + %n päivä sitten%n päivää sitten + + + + Up to date + Ohjelmisto on ajan tasalla + + + + Catching up... + Kurotaan kiinni... + + + + Last received block was generated %1. + Viimeisin vastaanotettu lohko tuotettu %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Tämä rahansiirto ylittää kokorajoituksen. Voit siitä huolimatta lähettää sen %1 siirtopalkkion mikä menee solmuille jotka käsittelevät rahansiirtosi tämä auttaa myös verkostoa. Haluatko maksaa siirtopalkkion? + + + + Sending... + Lähetetään... + + + + Sent transaction + Lähetetyt rahansiirrot + + + + Incoming transaction + Saapuva rahansiirto + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Päivä: %1 +Määrä: %2 +Tyyppi: %3 +Osoite: %4 + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Lompakko on <b>salattu</b> ja tällä hetkellä <b>avoinna</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Lompakko on <b>salattu</b> ja tällä hetkellä <b>lukittuna</b> + + + + Backup Wallet + Varmuuskopioi lompakko + + + + Wallet Data (*.dat) + Lompakkodata (*.dat) + + + + Backup Failed + Varmuuskopio epäonnistui + + + + There was an error trying to save the wallet data to the new location. + Virhe tallennettaessa lompakkodataa uuteen sijaintiin. + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Yksikkö, jossa määrät näytetään: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Valitse oletus lisämääre mikä näkyy käyttöliittymässä ja kun lähetät kolikoita + + + + Display addresses in transaction list + Näytä osoitteet rahansiirtoluettelossa + + + + EditAddressDialog + + + Edit Address + Muokkaa osoitetta + + + + &Label + &Nimi + + + + The label associated with this address book entry + Tähän osoitteeseen liitetty nimi + + + + &Address + &Osoite + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Osoite, joka liittyy tämän osoitekirjan merkintään. Tätä voidaan muuttaa vain lähtevissä osoitteissa. + + + + New receiving address + Uusi vastaanottava osoite + + + + New sending address + Uusi lähettävä osoite + + + + Edit receiving address + Muokkaa vastaanottajan osoitetta + + + + Edit sending address + Muokkaa lähtevää osoitetta + + + + The entered address "%1" is already in the address book. + Osoite "%1" on jo osoitekirjassa. + + + + The entered address "%1" is not a valid bitcoin address. + Osoite "%1" ei ole kelvollinen Bitcoin-osoite. + + + + Could not unlock wallet. + Lompakkoa ei voitu avata. + + + + New key generation failed. + Uuden avaimen luonti epäonnistui. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &Käynnistä Bitcoin kun kirjaudutaan sisään + + + + Automatically start Bitcoin after the computer is turned on + Käynnistä Bitcoin automaattisesti, kun tietokone kytketään päälle + + + + &Minimize to the tray instead of the taskbar + &Pienennä ilmaisinalueelle työkalurivin sijasta + + + + Show only a tray icon after minimizing the window + Näytä ainoastaan pikkukuvake ikkunan pienentämisen jälkeen + + + + Map port using &UPnP + Portin uudelleenohjaus &UPnP:llä + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Avaa Bitcoin-asiakasohjelman portti reitittimellä automaattisesti. Tämä toimii vain, jos reitittimesi tukee UPnP:tä ja se on käytössä. + + + + M&inimize on close + P&ienennä ikkuna suljettaessa + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Ikkunaa suljettaessa vain pienentää Bitcoin-ohjelman ikkunan lopettamatta itse ohjelmaa. Kun tämä asetus on valittuna, ohjelman voi sulkea vain valitsemalla Lopeta ohjelman valikosta. + + + + &Connect through SOCKS4 proxy: + &Yhdistä SOCKS4-välityspalvelimen kautta: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Yhdistä Bitcoin-verkkoon SOCKS4-välityspalvelimen kautta (esimerkiksi käyttäessä Tor:ia) + + + + Proxy &IP: + Palvelimen &IP: + + + + IP address of the proxy (e.g. 127.0.0.1) + Välityspalvelimen IP-osoite (esim. 127.0.0.1) + + + + &Port: + &Portti: + + + + Port of the proxy (e.g. 1234) + Portti, johon Bitcoin-asiakasohjelma yhdistää (esim. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Vapaaehtoinen rahansiirtopalkkio per kB auttaa nopeuttamaan siirtoja. Useimmat rahansiirrot ovat 1 kB. 0.01 palkkio on suositeltava. + + + + Pay transaction &fee + Maksa rahansiirtopalkkio + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Vapaaehtoinen rahansiirtopalkkio per kB auttaa nopeuttamaan siirtoja. Useimmat rahansiirrot ovat 1 kB. 0.01 palkkio on suositeltava. + + + + MessagePage + + + Message + Viesti + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + Voit allekirjoittaa viestit omalla osoitteellasi todistaaksesi että omistat ne. Ole huolellinen, että et allekirjoita mitään epämääräistä, phishing-hyökkääjät voivat huijata sinua allekirjoittamaan luovuttamalla henkilöllisyytesi. Allekirjoita selvitys täysin yksityiskohtaisesti mihin olet sitoutunut. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Osoite, johon Bitcoinit lähetetään (esim. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Valitse osoite osoitekirjasta + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Liitä osoite leikepöydältä + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Kirjoita tähän viesti minkä haluat allekirjoittaa + + + + Click "Sign Message" to get signature + Klikkaa "Allekirjoita viesti" saadaksesi allekirjoituksen + + + + Sign a message to prove you own this address + Allekirjoita viesti millä todistat omistavasi tämän osoitteen + + + + &Sign Message + &Allekirjoita viesti + + + + Copy the currently selected address to the system clipboard + Kopioi valittu osoite leikepöydälle + + + + &Copy to Clipboard + &Kopioi leikepöydälle + + + + + + Error signing + Virhe allekirjoitettaessa + + + + %1 is not a valid address. + %1 ei ole kelvollinen osoite. + + + + Private key for %1 is not available. + Yksityisavain %1 :lle ei ole saatavilla. + + + + Sign failed + Allekirjoittaminen epäonnistui + + + + OptionsDialog + + + Main + Yleiset + + + + Display + Näyttö + + + + Options + Asetukset + + + + OverviewPage + + + Form + Lomake + + + + Balance: + Saldo: + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Rahansiirtojen lukumäärä: + + + + 0 + 0 + + + + Unconfirmed: + Vahvistamatta: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Lompakko</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Viimeisimmät rahansiirrot</b> + + + + Your current balance + Tililläsi tällä hetkellä olevien Bitcoinien määrä + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Niiden saapuvien rahansiirtojen määrä, joita Bitcoin-verkko ei vielä ole ehtinyt vahvistaa ja siten eivät vielä näy saldossa. + + + + Total number of transactions in wallet + Lompakolla tehtyjen rahansiirtojen yhteismäärä + + + + QRCodeDialog + + + Dialog + Dialogi + + + + QR Code + QR-koodi + + + + Request Payment + Vastaanota maksu + + + + Amount: + Määrä: + + + + BTC + BTC + + + + Label: + Tunniste: + + + + Message: + Viesti: + + + + &Save As... + &Tallenna nimellä... + + + + Save Image... + Tallenna kuva... + + + + PNG Images (*.png) + PNG kuvat (*png) + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Lähetä Bitcoineja + + + + Send to multiple recipients at once + Lähetä monelle vastaanottajalle + + + + &Add recipient... + &Lisää vastaanottaja... + + + + Remove all transaction fields + Poista kaikki rahansiiron kentät + + + + Clear all + Tyhjennä lista + + + + Balance: + Saldo: + + + + 123.456 BTC + 123,456 BTC + + + + Confirm the send action + Vahvista lähetys + + + + &Send + &Lähetä + + + + <b>%1</b> to %2 (%3) + <b>%1</b> to %2 (%3) + + + + Confirm send coins + Hyväksy Bitcoinien lähettäminen + + + + Are you sure you want to send %1? + Haluatko varmasti lähettää %1? + + + + and + ja + + + + The recepient address is not valid, please recheck. + Vastaanottajan osoite ei kelpaa, ole hyvä ja tarkista + + + + The amount to pay must be larger than 0. + Maksettavan summan tulee olla suurempi kuin 0 Bitcoinia. + + + + Amount exceeds your balance + Määrä on suurempi kuin tilisi tämänhetkinen saldo. + + + + Total exceeds your balance when the %1 transaction fee is included + Kokonaissumma ylittäää tilisi saldon, kun siihen lisätään %1 BTC rahansiirtomaksu. + + + + Duplicate address found, can only send to each address once in one send operation + Tuplaosite löytynyt, voit ainoastaan lähettää kunkin osoitteen kerran yhdessä lähetysoperaatiossa. + + + + Error: Transaction creation failed + Virhe: Rahansiirron luonti epäonnistui + + + + Error: 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. + Virhe: Rahansiirto hylättiin. Tämä voi tapahtua jos jotkin bitcoineistasi on jo käytetty, esimerkiksi jos olet käyttänyt kopiota wallet.dat-lompakkotiedostosta ja bitcoinit on merkitty käytetyksi vain kopiossa. + + + + SendCoinsEntry + + + Form + Lomake + + + + A&mount: + M&äärä: + + + + Pay &To: + Maksun saaja: + + + + + Enter a label for this address to add it to your address book + Anna nimi tälle osoitteelle, jos haluat lisätä sen osoitekirjaan + + + + &Label: + &Nimi: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Osoite, johon Bitcoinit lähetetään (esim. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Valitse osoite osoitekirjasta + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Liitä osoite leikepöydältä + + + + Alt+P + Alt+P + + + + Remove this recipient + Poista + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Anna Bitcoin-osoite (esim. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Avoinna %1 lohkolle + + + + Open until %1 + Avoinna %1 asti + + + + %1/offline? + %1/ei linjalla? + + + + %1/unconfirmed + %1/vahvistamaton + + + + %1 confirmations + %1 vahvistusta + + + + <b>Status:</b> + <b>Tila:</b> + + + + , has not been successfully broadcast yet + , ei ole vielä onnistuneesti lähetetty + + + + , broadcast through %1 node + , lähetetään %1 solmun kautta + + + + , broadcast through %1 nodes + , lähetetään %1 solmunkautta + + + + <b>Date:</b> + <b>Päivä:</b> + + + + <b>Source:</b> Generated<br> + <b>Lähde:</b> Generoitu<br> + + + + + <b>From:</b> + <b>Lähettäjä:</b> + + + + unknown + tuntematon + + + + + + <b>To:</b> + <b>Vast. ott.:</b> + + + + (yours, label: + (sinun, tunniste: + + + + (yours) + (sinun) + + + + + + + <b>Credit:</b> + <b>Krediitti:</b> + + + + (%1 matures in %2 more blocks) + (%1 erääntyy %2 useammassa lohkossa) + + + + (not accepted) + (ei hyväksytty) + + + + + + <b>Debit:</b> + <b>Debit:</b> + + + + <b>Transaction fee:</b> + <b>Rahansiirtomaksu:</b> + + + + <b>Net amount:</b> + <b>Nettomäärä:</b> + + + + Message: + Viesti: + + + + Comment: + Kommentti: + + + + Transaction ID: + Rahansiirron ID: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Luotujen kolikoiden on odotettava 120 lohkoa ennen kuin ne voidaan käyttää. Kun loit tämän lohkon, se lähetettiin verkkoon lisättäväksi lohkoketjuun. Jos se epäonnistuu ketjuun liittymisessä, se tila tulee muuttumaan "ei hyväksytty" eikä sitä voi käyttää. Tätä voi silloin tällöin esiintyä jos toinen solmu luo lohkon muutamia sekunteja omastasi. + + + + TransactionDescDialog + + + Transaction details + Rahansiirron yksityiskohdat + + + + This pane shows a detailed description of the transaction + Tämä ruutu näyttää yksityiskohtaisen tiedon rahansiirrosta + + + + TransactionTableModel + + + Date + Päivämäärä + + + + Type + Laatu + + + + Address + Osoite + + + + Amount + Määrä + + + + Open for %n block(s) + Auki %n lohkolleAuki %n lohkoille + + + + Open until %1 + Avoinna %1 asti + + + + Offline (%1 confirmations) + Ei yhteyttä verkkoon (%1 vahvistusta) + + + + Unconfirmed (%1 of %2 confirmations) + Vahvistamatta (%1/%2 vahvistusta) + + + + Confirmed (%1 confirmations) + Vahvistettu (%1 vahvistusta) + + + + Mined balance will be available in %n more blocks + Louhittu saldo tulee saataville %n lohkossaLouhittu saldo tulee saataville %n lohkossa + + + + This block was not received by any other nodes and will probably not be accepted! + Tätä lohkoa ei vastaanotettu mistään muusta solmusta ja sitä ei mahdollisesti hyväksytty! + + + + Generated but not accepted + Generoitu mutta ei hyväksytty + + + + Received with + Vastaanotettu osoitteella + + + + Received from + Vastaanotettu + + + + Sent to + Saaja + + + + Payment to yourself + Maksu itsellesi + + + + Mined + Louhittu + + + + (n/a) + (ei saatavilla) + + + + Transaction status. Hover over this field to show number of confirmations. + Rahansiirron tila. Siirrä osoitin kentän päälle nähdäksesi vahvistusten lukumäärä. + + + + Date and time that the transaction was received. + Rahansiirron vastaanottamisen päivämäärä ja aika. + + + + Type of transaction. + Rahansiirron laatu. + + + + Destination address of transaction. + Rahansiirron kohteen Bitcoin-osoite + + + + Amount removed from or added to balance. + Saldoon lisätty tai siitä vähennetty määrä. + + + + TransactionView + + + + All + Kaikki + + + + Today + Tänään + + + + This week + Tällä viikolla + + + + This month + Tässä kuussa + + + + Last month + Viime kuussa + + + + This year + Tänä vuonna + + + + Range... + Alue... + + + + Received with + Vastaanotettu osoitteella + + + + Sent to + Saaja + + + + To yourself + Itsellesi + + + + Mined + Louhittu + + + + Other + Muu + + + + Enter address or label to search + Anna etsittävä osoite tai tunniste + + + + Min amount + Minimimäärä + + + + Copy address + Kopioi osoite + + + + Copy label + Kopioi nimi + + + + Copy amount + Kopioi määrä + + + + Edit label + Muokkaa nimeä + + + + Show details... + Näytä tarkemmat tiedot... + + + + Export Transaction Data + Vie transaktion tiedot + + + + Comma separated file (*.csv) + Comma separated file (*.csv) + + + + Confirmed + Vahvistettu + + + + Date + Aika + + + + Type + Laatu + + + + Label + Nimi + + + + Address + Osoite + + + + Amount + Määrä + + + + ID + ID + + + + Error exporting + Virhe tietojen viennissä + + + + Could not write to file %1. + Ei voida kirjoittaa tiedostoon %1. + + + + Range: + Alue: + + + + to + kenelle + + + + WalletModel + + + Sending... + Lähetetään... + + + + bitcoin-core + + + Bitcoin version + Bitcoinin versio + + + + Usage: + Käyttö: + + + + Send command to -server or bitcoind + Lähetä käsky palvelimelle tai bitcoind:lle + + + + List commands + Lista komennoista + + + + Get help for a command + Hanki apua käskyyn + + + + Options: + Asetukset: + + + + Specify configuration file (default: bitcoin.conf) + Määritä asetustiedosto (oletus: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + Määritä pid-tiedosto (oletus: bitcoin.pid) + + + + Generate coins + Generoi kolikoita + + + + Don't generate coins + Älä generoi kolikoita + + + + Start minimized + Käynnistä pienennettynä + + + + Specify data directory + Määritä data-hakemisto + + + + Specify connection timeout (in milliseconds) + Määritä yhteyden aikakatkaisu (millisekunneissa) + + + + Connect through socks4 proxy + Yhteys socks4-proxyn kautta + + + + Allow DNS lookups for addnode and connect + Salli DNS haut lisäsolmulle ja yhdistä + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + Kuuntele yhteyksiä portista <port> (oletus: 8333 tai testnet: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Pidä enintään <n> yhteyttä verkkoihin (oletus: 125) + + + + Add a node to connect to + Lisää solmu mihin yhdistetään + + + + Connect only to the specified node + Ota yhteys vain tiettyyn solmuun + + + + Don't accept connections from outside + Älä hyväksy ulkopuolisia yhteyksiä + + + + Don't bootstrap list of peers using DNS + Älä alkulataa listaa verkoista DNS:ää käyttäen + + + + Threshold for disconnecting misbehaving peers (default: 100) + Kynnysarvo aikakatkaisulle heikosti toimiville verkoille (oletus: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Sekuntien määrä, kuinka kauan uudelleenkytkeydytään verkkoihin (oletus: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maksimi verkkoyhteyden vastaanottopuskuri, <n>*1000 tavua (oletus: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maksimi verkkoyhteyden lähetyspuskuri, <n>*1000 tavua (oletus: 10000) + + + + Don't attempt to use UPnP to map the listening port + Älä käytä UPnP toimintoa kartoittamaan avointa porttia + + + + Attempt to use UPnP to map the listening port + Yritä käyttää UPnP toimintoa kartoittamaan avointa porttia + + + + Fee per kB to add to transactions you send + palkkio per kB lisätty lähettämiisi rahansiirtoihin + + + + Accept command line and JSON-RPC commands + Hyväksy merkkipohjaiset- ja JSON-RPC-käskyt + + + + Run in the background as a daemon and accept commands + Aja taustalla daemonina ja hyväksy komennot + + + + Use the test network + Käytä test -verkkoa + + + + Output extra debugging information + Tulosta ylimääräistä debuggaustietoa + + + + Prepend debug output with timestamp + Lisää debuggaustiedon tulostukseen aikaleima + + + + Send trace/debug info to console instead of debug.log file + Lähetä jäljitys/debug-tieto konsoliin, debug.log-tiedoston sijaan + + + + Send trace/debug info to debugger + Lähetä jäljitys/debug-tieto debuggeriin + + + + Username for JSON-RPC connections + Käyttäjätunnus JSON-RPC-yhteyksille + + + + Password for JSON-RPC connections + Salasana JSON-RPC-yhteyksille + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Kuuntele JSON-RPC -yhteyksiä portista <port> (oletus: 8332) + + + + Allow JSON-RPC connections from specified IP address + Salli JSON-RPC yhteydet tietystä ip-osoitteesta + + + + Send commands to node running on <ip> (default: 127.0.0.1) + Lähetä käskyjä solmuun osoitteessa <ip> (oletus: 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + Aseta avainpoolin koko arvoon <n> (oletus: 100) + + + + Rescan the block chain for missing wallet transactions + Skannaa uudelleen lohkoketju lompakon puuttuvien rahasiirtojen vuoksi + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + SSL-asetukset: (lisätietoja Bitcoin-Wikistä) + + + + Use OpenSSL (https) for JSON-RPC connections + Käytä OpenSSL:ää (https) JSON-RPC-yhteyksille + + + + Server certificate file (default: server.cert) + Palvelimen sertifikaatti-tiedosto (oletus: server.cert) + + + + Server private key (default: server.pem) + Palvelimen yksityisavain (oletus: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Hyväksyttävä salaus (oletus: +TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Tämä ohjeviesti + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + En pääse käsiksi data-hakemiston lukitukseen %s. Bitcoin on todennäköisesti jo käynnistetty. + + + + Loading addresses... + Ladataan osoitteita... + + + + Error loading addr.dat + Virhe ladattaessa addr.dat-tiedostoa + + + + Error loading blkindex.dat + Virhe ladattaessa blkindex.dat-tiedostoa + + + + Error loading wallet.dat: Wallet corrupted + Virhe ladattaessa wallet.dat-tiedostoa: Lompakko vioittunut + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Virhe ladattaessa wallet.dat-tiedostoa: Tarvitset uudemman version Bitcoinista + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Lompakko tarvitsee uudelleenkirjoittaa: käynnistä Bitcoin uudelleen + + + + Error loading wallet.dat + Virhe ladattaessa wallet.dat-tiedostoa + + + + Loading block index... + Ladataan lohkoindeksiä... + + + + Loading wallet... + Ladataan lompakkoa... + + + + Rescanning... + Skannataan uudelleen... + + + + Done loading + Lataus on valmis + + + + Invalid -proxy address + Virheellinen proxy-osoite + + + + Invalid amount for -paytxfee=<amount> + Virheellinen määrä -paytxfee=<amount> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Varoitus:-paytxfee on erittäin korkea. Tämä on palkkio siirrosta minkä suoritat rahansiirrosta. + + + + Error: CreateThread(StartNode) failed + Virhe: CreateThread(StartNode) epäonnistui + + + + Warning: Disk space is low + Varoitus: Kiintolevytila on loppumassa + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + En pysty varaamaan porttia %d tähän koneeseen. Ehkä Bitcoin on jo käynnissä. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + Varoitus: Tarkista, ovatko tietokoneesi päivämäärä ja aika oikein. Mikäli aika on väärin, Bitcoin-ohjelma ei toimi oikein. + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_fr_CA.ts b/src/qt/locale/bitcoin_fr_CA.ts new file mode 100644 index 0000000..cc0a0fd --- /dev/null +++ b/src/qt/locale/bitcoin_fr_CA.ts @@ -0,0 +1,1963 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + A propos de Bitcoin + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> version + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + Carnet d'adresses + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Ceux-ci sont vos adresses Bitcoin qui vous permettent de recevoir des paiements. Vous pouvez en donner une différente à chaque expédieur afin de savoir qui vous payent. + + + + Double-click to edit address or label + Double-cliquez afin de modifier l'adress ou l'étiquette + + + + Create a new address + Créer une nouvelle adresse + + + + &New Address... + $Nouvelle Adresse + + + + Copy the currently selected address to the system clipboard + Copier l'adresse surligné a votre presse-papier + + + + &Copy to Clipboard + &Copier dans le presse papier + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Supprimer l'adresse sélectionnée dans la liste. Seules les adresses d'envoi peuvent être supprimé. + + + + &Delete + &Supprimer + + + + Copy address + + + + + Copy label + + + + + Edit + + + + + Delete + + + + + Export Address Book Data + Exporter les données du carnet d'adresses + + + + Comma separated file (*.csv) + + + + + Error exporting + + + + + Could not write to file %1. + + + + + AddressTableModel + + + Label + + + + + Address + + + + + (no label) + + + + + AskPassphraseDialog + + + Dialog + + + + + + TextLabel + + + + + Enter passphrase + + + + + New passphrase + + + + + Repeat new passphrase + + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + + + + + Encrypt wallet + + + + + This operation needs your wallet passphrase to unlock the wallet. + + + + + Unlock wallet + + + + + This operation needs your wallet passphrase to decrypt the wallet. + + + + + Decrypt wallet + + + + + Change passphrase + + + + + Enter the old and new passphrase to the wallet. + + + + + Confirm wallet encryption + + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + + + + + + Wallet encrypted + + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + + + + + + The supplied passphrases do not match. + + + + + Wallet unlock failed + + + + + + + The passphrase entered for the wallet decryption was incorrect. + + + + + Wallet decryption failed + + + + + Wallet passphrase was succesfully changed. + + + + + BitcoinGUI + + + Bitcoin Wallet + + + + + + Synchronizing with network... + + + + + Block chain synchronization in progress + + + + + &Overview + + + + + Show general overview of wallet + + + + + &Transactions + + + + + Browse transaction history + + + + + &Address Book + + + + + Edit the list of stored addresses and labels + + + + + &Receive coins + + + + + Show the list of addresses for receiving payments + + + + + &Send coins + + + + + Send coins to a bitcoin address + + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + + + + + Quit application + + + + + &About %1 + + + + + Show information about Bitcoin + + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + + + + + Modify configuration options for bitcoin + + + + + Open &Bitcoin + + + + + Show the Bitcoin window + + + + + &Export... + + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + + + + + Encrypt or decrypt wallet + + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + + + + + Change the passphrase used for wallet encryption + + + + + &File + + + + + &Settings + + + + + &Help + + + + + Tabs toolbar + + + + + Actions toolbar + + + + + [testnet] + + + + + bitcoin-qt + + + + + %n active connection(s) to Bitcoin network + + + + + Downloaded %1 of %2 blocks of transaction history. + + + + + Downloaded %1 blocks of transaction history. + + + + + %n second(s) ago + + + + + %n minute(s) ago + + + + + %n hour(s) ago + + + + + %n day(s) ago + + + + + Up to date + + + + + Catching up... + + + + + Last received block was generated %1. + + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + + + + + Sending... + + + + + Sent transaction + + + + + Incoming transaction + + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + + + + + Choose the default subdivision unit to show in the interface, and when sending coins + + + + + Display addresses in transaction list + + + + + EditAddressDialog + + + Edit Address + + + + + &Label + + + + + The label associated with this address book entry + + + + + &Address + + + + + The address associated with this address book entry. This can only be modified for sending addresses. + + + + + New receiving address + + + + + New sending address + + + + + Edit receiving address + + + + + Edit sending address + + + + + The entered address "%1" is already in the address book. + + + + + The entered address "%1" is not a valid bitcoin address. + + + + + Could not unlock wallet. + + + + + New key generation failed. + + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + + + + + Automatically start Bitcoin after the computer is turned on + + + + + &Minimize to the tray instead of the taskbar + + + + + Show only a tray icon after minimizing the window + + + + + Map port using &UPnP + + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + + + + + M&inimize on close + + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + + + + + &Connect through SOCKS4 proxy: + + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + + + + + Proxy &IP: + + + + + IP address of the proxy (e.g. 127.0.0.1) + + + + + &Port: + + + + + Port of the proxy (e.g. 1234) + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose adress from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Copier l'adresse surligné a votre presse-papier + + + + &Copy to Clipboard + &Copier dans le presse papier + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + + + + + Display + + + + + Options + + + + + OverviewPage + + + Form + + + + + Balance: + + + + + 123.456 BTC + + + + + Number of transactions: + + + + + 0 + + + + + Unconfirmed: + + + + + 0 BTC + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + + <b>Recent transactions</b> + + + + + Your current balance + + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + + + + + Total number of transactions in wallet + + + + + QRCodeDialog + + + Dialog + + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + + + + + Send to multiple recipients at once + + + + + &Add recipient... + + + + + Remove all transaction fields + + + + + Clear all + + + + + Balance: + + + + + 123.456 BTC + + + + + Confirm the send action + + + + + &Send + + + + + <b>%1</b> to %2 (%3) + + + + + Confirm send coins + + + + + Are you sure you want to send %1? + + + + + and + + + + + The recepient address is not valid, please recheck. + + + + + The amount to pay must be larger than 0. + + + + + Amount exceeds your balance + + + + + Total exceeds your balance when the %1 transaction fee is included + + + + + Duplicate address found, can only send to each address once in one send operation + + + + + Error: Transaction creation failed + + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + + + + + A&mount: + + + + + Pay &To: + + + + + + Enter a label for this address to add it to your address book + + + + + &Label: + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose address from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Remove this recipient + + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + TransactionDesc + + + Open for %1 blocks + + + + + Open until %1 + + + + + %1/offline? + + + + + %1/unconfirmed + + + + + %1 confirmations + + + + + <b>Status:</b> + + + + + , has not been successfully broadcast yet + + + + + , broadcast through %1 node + + + + + , broadcast through %1 nodes + + + + + <b>Date:</b> + + + + + <b>Source:</b> Generated<br> + + + + + + <b>From:</b> + + + + + unknown + + + + + + + <b>To:</b> + + + + + (yours, label: + + + + + (yours) + + + + + + + + <b>Credit:</b> + + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + + + + + + + <b>Debit:</b> + + + + + <b>Transaction fee:</b> + + + + + <b>Net amount:</b> + + + + + Message: + + + + + Comment: + + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + + + + + TransactionDescDialog + + + Transaction details + + + + + This pane shows a detailed description of the transaction + + + + + TransactionTableModel + + + Date + + + + + Type + + + + + Address + + + + + Amount + + + + + Open for %n block(s) + + + + + Open until %1 + + + + + Offline (%1 confirmations) + + + + + Unconfirmed (%1 of %2 confirmations) + + + + + Confirmed (%1 confirmations) + + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + + + + + Generated but not accepted + + + + + Received with + + + + + Received from + + + + + Sent to + + + + + Payment to yourself + + + + + Mined + + + + + (n/a) + + + + + Transaction status. Hover over this field to show number of confirmations. + + + + + Date and time that the transaction was received. + + + + + Type of transaction. + + + + + Destination address of transaction. + + + + + Amount removed from or added to balance. + + + + + TransactionView + + + + All + + + + + Today + + + + + This week + + + + + This month + + + + + Last month + + + + + This year + + + + + Range... + + + + + Received with + + + + + Sent to + + + + + To yourself + + + + + Mined + + + + + Other + + + + + Enter address or label to search + + + + + Min amount + + + + + Copy address + + + + + Copy label + + + + + Copy amount + + + + + Edit label + + + + + Show details... + + + + + Export Transaction Data + + + + + Comma separated file (*.csv) + + + + + Confirmed + + + + + Date + + + + + Type + + + + + Label + + + + + Address + + + + + Amount + + + + + ID + + + + + Error exporting + + + + + Could not write to file %1. + + + + + Range: + + + + + to + + + + + WalletModel + + + Sending... + + + + + bitcoin-core + + + Bitcoin version + + + + + Usage: + + + + + Send command to -server or bitcoind + + + + + List commands + + + + + Get help for a command + + + + + Options: + + + + + Specify configuration file (default: bitcoin.conf) + + + + + Specify pid file (default: bitcoind.pid) + + + + + Generate coins + + + + + Don't generate coins + + + + + Start minimized + + + + + Specify data directory + + + + + Specify connection timeout (in milliseconds) + + + + + Connect through socks4 proxy + + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + + + + + Connect only to the specified node + + + + + Don't accept connections from outside + + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + + + + + Loading wallet... + + + + + Rescanning... + + + + + Done loading + + + + + Invalid -proxy address + + + + + Invalid amount for -paytxfee=<amount> + + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_fr_FR.ts b/src/qt/locale/bitcoin_fr_FR.ts new file mode 100644 index 0000000..08cea95 --- /dev/null +++ b/src/qt/locale/bitcoin_fr_FR.ts @@ -0,0 +1,1979 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + À propos de Bitcoin + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> version + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + Copyright © 2009-2012 Développeurs de Bitcoin + +Ce logiciel est en phase expérimentale. + +Distribué sous licence MIT/X11, voir le fichier license.txt ou http://www.opensource.org/licenses/mit-license.php. + +Ce produit inclut des logiciels développés par OpenSSL Project pour utilisation dans le OpenSSL Toolkit (http://www.openssl.org/), un logiciel cryptographique écrit par Eric Young (eay@cryptsoft.com) et un logiciel UPnP écrit par Thomas Bernard. + + + + AddressBookPage + + + Address Book + Carnet d'adresses + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Voici vos adresses Bitcoin qui vous permettent de recevoir des paiements. Vous pouvez donner une adresse différente à chaque expéditeur afin de savoir qui vous paye. + + + + Double-click to edit address or label + Double cliquez afin de modifier l'adresse ou l'étiquette + + + + Create a new address + Créer une nouvelle adresse + + + + &New Address... + &Nouvelle Adresse... + + + + Copy the currently selected address to the system clipboard + Copier l'adresse surlignée dans votre presse-papiers + + + + &Copy to Clipboard + &Copier dans le presse-papiers + + + + Show &QR Code + Afficher le &QR Code + + + + Sign a message to prove you own this address + Signer un message pour prouver que vous détenez cette adresse + + + + &Sign Message + &Signer un message + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Supprimer l'adresse sélectionnée dans la liste. Seules les adresses d'envoi peuvent être supprimées. + + + + &Delete + &Supprimer + + + + Copy address + Copier l'adresse + + + + Copy label + Copier l'étiquette + + + + Edit + Éditer + + + + Delete + Effacer + + + + Export Address Book Data + Exporter les données du carnet d'adresses + + + + Comma separated file (*.csv) + Valeurs séparées par des virgules (*.csv) + + + + Error exporting + Erreur lors de l'exportation + + + + Could not write to file %1. + Impossible d'écrire sur le fichier %1. + + + + AddressTableModel + + + Label + Étiquette + + + + Address + Adresse + + + + (no label) + (aucune étiquette) + + + + AskPassphraseDialog + + + Dialog + Dialogue + + + + + TextLabel + TextLabel + + + + Enter passphrase + Entrez la phrase de passe + + + + New passphrase + Nouvelle phrase de passe + + + + Repeat new passphrase + Répétez la phrase de passe + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Entrez une nouvelle phrase de passe pour le porte-monnaie.<br/>Veuillez utiliser une phrase de <b>10 caractères au hasard ou plus</b> ou bien de <b>huit mots ou plus</b>. + + + + Encrypt wallet + Chiffrer le porte-monnaie + + + + This operation needs your wallet passphrase to unlock the wallet. + Cette opération nécessite votre phrase de passe pour déverrouiller le porte-monnaie. + + + + Unlock wallet + Déverrouiller le porte-monnaie + + + + This operation needs your wallet passphrase to decrypt the wallet. + Cette opération nécessite votre phrase de passe pour décrypter le porte-monnaie. + + + + Decrypt wallet + Décrypter le porte-monnaie + + + + Change passphrase + Changer la phrase de passe + + + + Enter the old and new passphrase to the wallet. + Entrez l’ancienne phrase de passe pour le porte-monnaie ainsi que la nouvelle. + + + + Confirm wallet encryption + Confirmer le chiffrement du porte-monnaie + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + ATTENTION : Si vous chiffrez votre porte-monnaie et perdez votre phrase de passe, vous <b>PERDREZ TOUS VOS BITCOINS</b> ! +Êtes-vous sûr de vouloir chiffrer votre porte-monnaie ? + + + + + Wallet encrypted + Porte-monnaie chiffré + + + + Bitcoin 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. + Bitcoin va à présent se fermer pour terminer la procédure de cryptage. N'oubliez pas que le chiffrement de votre porte-monnaie ne peut pas fournir une protection totale contre le vol par des logiciels malveillants qui infecteraient votre ordinateur. + + + + + Warning: The Caps Lock key is on. + Attention : la touche Verrouiller Maj est activée. + + + + + + + Wallet encryption failed + Le chiffrement du porte-monnaie a échoué + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Le chiffrement du porte-monnaie a échoué en raison d'une erreur interne. Votre porte-monnaie n'a pas été chiffré. + + + + + The supplied passphrases do not match. + Les phrases de passe entrées ne correspondent pas. + + + + Wallet unlock failed + Le déverrouillage du porte-monnaie a échoué + + + + + + The passphrase entered for the wallet decryption was incorrect. + La phrase de passe entrée pour décrypter le porte-monnaie était incorrecte. + + + + Wallet decryption failed + Le décryptage du porte-monnaie a échoué + + + + Wallet passphrase was succesfully changed. + La phrase de passe du porte-monnaie a été modifiée avec succès. + + + + BitcoinGUI + + + Bitcoin Wallet + Porte-monnaie Bitcoin + + + + + Synchronizing with network... + Synchronisation avec le réseau... + + + + Block chain synchronization in progress + Synchronisation de la chaîne de blocs en cours + + + + &Overview + &Vue d'ensemble + + + + Show general overview of wallet + Affiche une vue d'ensemble du porte-monnaie + + + + &Transactions + &Transactions + + + + Browse transaction history + Permet de parcourir l'historique des transactions + + + + &Address Book + Carnet d'&adresses + + + + Edit the list of stored addresses and labels + Éditer la liste des adresses et des étiquettes stockées + + + + &Receive coins + &Recevoir des pièces + + + + Show the list of addresses for receiving payments + Affiche la liste des adresses pour recevoir des paiements + + + + &Send coins + &Envoyer des pièces + + + + Send coins to a bitcoin address + Envoyer des pièces à une adresse bitcoin + + + + Sign &message + Signer un &message + + + + Prove you control an address + Prouver que vous contrôlez une adresse + + + + E&xit + Q&uitter + + + + Quit application + Quitter l'application + + + + &About %1 + &À propos de %1 + + + + Show information about Bitcoin + Afficher des informations à propos de Bitcoin + + + + About &Qt + À propos de &Qt + + + + Show information about Qt + Afficher des informations sur Qt + + + + &Options... + &Options... + + + + Modify configuration options for bitcoin + Modifier les options de configuration pour bitcoin + + + + Open &Bitcoin + Ouvrir &Bitcoin + + + + Show the Bitcoin window + Afficher la fenêtre de Bitcoin + + + + &Export... + &Exporter... + + + + Export the data in the current tab to a file + Exporter les données de l'onglet courant vers un fichier + + + + &Encrypt Wallet + &Chiffrer le porte-monnaie + + + + Encrypt or decrypt wallet + Chiffrer ou décrypter le porte-monnaie + + + + &Backup Wallet + &Sauvegarder le porte-monnaie + + + + Backup wallet to another location + Sauvegarder le porte-monnaie à un autre emplacement + + + + &Change Passphrase + &Modifier la phrase de passe + + + + Change the passphrase used for wallet encryption + Modifier la phrase de passe utilisée pour le cryptage du porte-monnaie + + + + &File + &Fichier + + + + &Settings + &Réglages + + + + &Help + &Aide + + + + Tabs toolbar + Barre d'outils des onglets + + + + Actions toolbar + Barre d'outils des actions + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n connexion active avec le réseau Bitcoin%n connexions actives avec le réseau Bitcoin + + + + Downloaded %1 of %2 blocks of transaction history. + %1 blocs de l'historique des transactions téléchargés sur un total de %2. + + + + Downloaded %1 blocks of transaction history. + %1 blocs de l'historique de transaction téléchargé. + + + + %n second(s) ago + il y a %n secondeil y a %n secondes + + + + %n minute(s) ago + il y a %n minuteil y a %n minutes + + + + %n hour(s) ago + il y a %n heureil y a %n heures + + + + %n day(s) ago + il y a %n jouril y a %n jours + + + + Up to date + À jour + + + + Catching up... + Rattrapage... + + + + Last received block was generated %1. + Le dernier bloc reçu a été généré %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Cette transaction dépasse la limite de taille. Vous pouvez quand-même l'envoyer en vous acquittant de frais d'un montant de %1, qui iront aux nœuds qui traitent la transaction et aideront à soutenir le réseau. Voulez-vous payer les frais ? + + + + Sending... + Envoi en cours... + + + + Sent transaction + Transaction envoyée + + + + Incoming transaction + Transaction entrante + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Date : %1 +Montant : %2 +Type : %3 +Adresse : %4 + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Le porte-monnaie est <b>chiffré</b> et est actuellement <b>déverrouillé</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Le porte-monnaie est <b>chiffré</b> et est actuellement <b>verrouillé</b> + + + + Backup Wallet + Sauvegarder le porte-monnaie + + + + Wallet Data (*.dat) + Données de porte-monnaie (*.dat) + + + + Backup Failed + La sauvegarde a échoué + + + + There was an error trying to save the wallet data to the new location. + Une erreur est survenue lors de l'enregistrement des données de porte-monnaie à un autre emplacement. + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Unité d'affichage des montants : + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Choisissez la sous-unité par défaut pour l'affichage dans l'interface et lors de l'envoi de pièces + + + + Display addresses in transaction list + Afficher les adresses dans la liste des transactions + + + + EditAddressDialog + + + Edit Address + Éditer l'adresse + + + + &Label + &Étiquette + + + + The label associated with this address book entry + L'étiquette associée à cette entrée du carnet d'adresses + + + + &Address + &Adresse + + + + The address associated with this address book entry. This can only be modified for sending addresses. + L'adresse associée avec cette entrée du carnet d'adresses. Ne peut être modifiée que pour les adresses d'envoi. + + + + New receiving address + Nouvelle adresse de réception + + + + New sending address + Nouvelle adresse d'envoi + + + + Edit receiving address + Éditer l'adresse de réception + + + + Edit sending address + Éditer l'adresse d'envoi + + + + The entered address "%1" is already in the address book. + L'adresse fournie « %1 » est déjà présente dans le carnet d'adresses. + + + + The entered address "%1" is not a valid bitcoin address. + L'adresse fournie « %1 » n'est pas une adresse bitcoin valide. + + + + Could not unlock wallet. + Impossible de déverrouiller le porte-monnaie. + + + + New key generation failed. + Échec de la génération de la nouvelle clef. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &Démarrer Bitcoin avec le système de fenêtres + + + + Automatically start Bitcoin after the computer is turned on + Lancer automatiquement Bitcoin lorsque l'ordinateur est allumé + + + + &Minimize to the tray instead of the taskbar + &Minimiser dans la barre système au lieu de la barre des tâches + + + + Show only a tray icon after minimizing the window + Montrer uniquement une icône système après minimisation + + + + Map port using &UPnP + Ouvrir le port avec l'&UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + 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. + + + + M&inimize on close + M&inimiser lors de la fermeture + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Minimiser au lieu quitter l'application lorsque la fenêtre est fermée. Lorsque cette option est activée, l'application ne pourra être fermée qu'en sélectionnant Quitter dans le menu déroulant. + + + + &Connect through SOCKS4 proxy: + &Connexion à travers un proxy SOCKS4 : + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Connexion au réseau Bitcoin à travers un proxy SOCKS4 (par ex. lors d'une connexion via Tor) + + + + Proxy &IP: + &IP du proxy : + + + + IP address of the proxy (e.g. 127.0.0.1) + Adresse IP du proxy (par ex. 127.0.0.1) + + + + &Port: + &Port : + + + + Port of the proxy (e.g. 1234) + Port du proxy (par ex. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Frais de transaction optionnels par ko qui aident à garantir un traitement rapide des transactions. La plupart des transactions occupent 1 ko. Des frais de 0.01 sont recommandés. + + + + Pay transaction &fee + Payer des &frais de transaction + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Frais de transaction optionnels par ko qui aident à garantir un traitement rapide des transactions. La plupart des transactions occupent 1 ko. Des frais de 0.01 sont recommandés. + + + + MessagePage + + + Message + Message + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + Vous pouvez signer des messages avec vos adresses pour prouver que les détenez. Faites attention à ne pas signer quoi que ce soit de vague car des attaques d'hameçonnage peuvent essayer d'obtenir votre identité par votre signature. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous serez d'accord. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + L'adresse à laquelle le paiement sera envoyé (par ex. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Choisir une adresse depuis le carnet d'adresses + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Coller une adresse depuis le presse-papiers + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Entrez ici le message que vous désirez signer + + + + Click "Sign Message" to get signature + Cliquez sur « Signer le message » pour obtenir la signature + + + + Sign a message to prove you own this address + Signer le message pour prouver que vous détenez cette adresse + + + + &Sign Message + &Signer le message + + + + Copy the currently selected address to the system clipboard + Copier l'adresse surlignée dans votre presse-papiers + + + + &Copy to Clipboard + &Copier dans le presse-papiers + + + + + + Error signing + Une erreur est survenue lors de la signature + + + + %1 is not a valid address. + %1 n'est pas une adresse valide. + + + + Private key for %1 is not available. + La clef privée pour %1 n'est pas disponible. + + + + Sign failed + Échec de la signature + + + + OptionsDialog + + + Main + Principal + + + + Display + Affichage + + + + Options + Options + + + + OverviewPage + + + Form + Formulaire + + + + Balance: + Solde : + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Nombre de transactions : + + + + 0 + 0 + + + + Unconfirmed: + Non confirmé : + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Porte-monnaie</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Transactions récentes</b> + + + + Your current balance + Votre solde actuel + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Total des transactions qui doivent encore être confirmées et qui ne sont pas pris en compte pour le solde actuel + + + + Total number of transactions in wallet + Nombre total de transactions dans le porte-monnaie + + + + QRCodeDialog + + + Dialog + Dialogue + + + + QR Code + QR Code + + + + Request Payment + Demande de paiement + + + + Amount: + Montant : + + + + BTC + BTC + + + + Label: + Étiquette : + + + + Message: + Message : + + + + &Save As... + &Enregistrer sous... + + + + Save Image... + Enregistrer l'image... + + + + PNG Images (*.png) + Images PNG (*.png) + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Envoyer des pièces + + + + Send to multiple recipients at once + Envoyer des pièces à plusieurs destinataires à la fois + + + + &Add recipient... + &Ajouter un destinataire... + + + + Remove all transaction fields + Enlever tous les champs de transaction + + + + Clear all + Tout effacer + + + + Balance: + Solde : + + + + 123.456 BTC + 123.456 BTC + + + + Confirm the send action + Confirmez l'action d'envoi + + + + &Send + &Envoyer + + + + <b>%1</b> to %2 (%3) + <b>%1</b> à %2 (%3) + + + + Confirm send coins + Confirmez l'envoi des pièces + + + + Are you sure you want to send %1? + Êtes-vous sûr de vouloir envoyer %1 ? + + + + and + et + + + + The recepient address is not valid, please recheck. + L'adresse du destinataire n'est pas valide, veuillez la vérifier. + + + + The amount to pay must be larger than 0. + Le montant à payer doit être supérieur à 0. + + + + Amount exceeds your balance + Le montant dépasse votre solde + + + + Total exceeds your balance when the %1 transaction fee is included + Le total dépasse votre solde lorsque les frais de transaction de %1 sont inclus + + + + Duplicate address found, can only send to each address once in one send operation + Adresse dupliquée trouvée, un seul envoi par adresse est possible à chaque opération d'envoi + + + + Error: Transaction creation failed + Erreur : échec de la création de la transaction + + + + Error: 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. + Erreur : la transaction a été rejetée. Cela peut arriver si certaines pièces de votre porte-monnaie ont déjà été dépensées, par exemple si vous avez utilisé une copie de wallet.dat et si des pièces ont été dépensées avec cette copie sans être marquées comme telles ici. + + + + SendCoinsEntry + + + Form + Formulaire + + + + A&mount: + &Montant : + + + + Pay &To: + Payer &à : + + + + + Enter a label for this address to add it to your address book + Entrez une étiquette pour cette adresse afin de l'ajouter à votre carnet d'adresses + + + + &Label: + &Étiquette : + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + L'adresse à laquelle le paiement sera envoyé (par ex. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Choisir une adresse dans le carnet d'adresses + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Coller une adresse depuis le presse-papiers + + + + Alt+P + Alt+P + + + + Remove this recipient + Enlever ce destinataire + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Entez une adresse Bitcoin (par ex. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Ouvert pour %1 blocs + + + + Open until %1 + Ouvert jusqu'à %1 + + + + %1/offline? + %1/hors ligne ? + + + + %1/unconfirmed + %1/non confirmée + + + + %1 confirmations + %1 confirmations + + + + <b>Status:</b> + <b>État :</b> + + + + , has not been successfully broadcast yet + , n'a pas encore été diffusée avec succès + + + + , broadcast through %1 node + , diffusée à travers %1 nœud + + + + , broadcast through %1 nodes + , diffusée à travers %1 nœuds + + + + <b>Date:</b> + <b>Date :</b> + + + + <b>Source:</b> Generated<br> + <b>Source :</b> Généré<br> + + + + + <b>From:</b> + <b>De :</b> + + + + unknown + inconnue + + + + + + <b>To:</b> + <b>À :</b> + + + + (yours, label: + (vôtre, étiquette : + + + + (yours) + (vôtre) + + + + + + + <b>Credit:</b> + <b>Crédit : </b> + + + + (%1 matures in %2 more blocks) + (%1 sera considérée comme mûre suite à %2 blocs de plus) + + + + (not accepted) + (pas accepté) + + + + + + <b>Debit:</b> + <b>Débit : </b> + + + + <b>Transaction fee:</b> + <b>Frais de transaction :</b> + + + + <b>Net amount:</b> + <b>Montant net :</b> + + + + Message: + Message : + + + + Comment: + Commentaire : + + + + Transaction ID: + ID de la transaction : + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Les pièces générées doivent attendre 120 blocs avant de pouvoir être dépensées. Lorsque vous avez généré ce bloc, il a été diffusé sur le réseau pour être ajouté à la chaîne des blocs. S'il échoue a intégrer la chaîne, il sera modifié en « pas accepté » et il ne sera pas possible de le dépenser. Cela peut arriver occasionnellement si un autre nœud génère un bloc quelques secondes avant ou après vous. + + + + TransactionDescDialog + + + Transaction details + Détails de la transaction + + + + This pane shows a detailed description of the transaction + Ce panneau affiche une description détaillée de la transaction + + + + TransactionTableModel + + + Date + Date + + + + Type + Type + + + + Address + Adresse + + + + Amount + Montant + + + + Open for %n block(s) + Ouvert pour %n blocOuvert pour %n blocs + + + + Open until %1 + Ouvert jusqu'à %1 + + + + Offline (%1 confirmations) + Hors ligne (%1 confirmations) + + + + Unconfirmed (%1 of %2 confirmations) + Non confirmée (%1 confirmations sur un total de %2) + + + + Confirmed (%1 confirmations) + Confirmée (%1 confirmations) + + + + Mined balance will be available in %n more blocks + Le solde d'extraction (mined) sera disponible dans %n blocLe solde d'extraction (mined) sera disponible dans %n blocs + + + + This block was not received by any other nodes and will probably not be accepted! + Ce bloc n'a été reçu par aucun autre nœud et ne sera probablement pas accepté ! + + + + Generated but not accepted + Généré mais pas accepté + + + + Received with + Reçue avec + + + + Received from + Reçue de + + + + Sent to + Envoyée à + + + + Payment to yourself + Paiement à vous-même + + + + Mined + Extraction + + + + (n/a) + (indisponible) + + + + Transaction status. Hover over this field to show number of confirmations. + État de la transaction. Laissez le pointeur de la souris sur ce champ pour voir le nombre de confirmations. + + + + Date and time that the transaction was received. + Date et heure de réception de la transaction. + + + + Type of transaction. + Type de transaction. + + + + Destination address of transaction. + L'adresse de destination de la transaction. + + + + Amount removed from or added to balance. + Montant ajouté au ou enlevé du solde. + + + + TransactionView + + + + All + Toutes + + + + Today + Aujourd'hui + + + + This week + Cette semaine + + + + This month + Ce mois + + + + Last month + Mois dernier + + + + This year + Cette année + + + + Range... + Intervalle... + + + + Received with + Reçu avec + + + + Sent to + Envoyé à + + + + To yourself + À vous-même + + + + Mined + Extraction + + + + Other + Autre + + + + Enter address or label to search + Entrez une adresse ou une étiquette à rechercher + + + + Min amount + Montant min + + + + Copy address + Copier l'adresse + + + + Copy label + Copier l'étiquette + + + + Copy amount + Copier le montant + + + + Edit label + Éditer l'étiquette + + + + Show details... + Afficher les détails... + + + + Export Transaction Data + Exporter les données de transaction + + + + Comma separated file (*.csv) + Valeurs séparées par des virgules (*.csv) + + + + Confirmed + Confirmée + + + + Date + Date + + + + Type + Type + + + + Label + Étiquette + + + + Address + Adresse + + + + Amount + Montant + + + + ID + ID + + + + Error exporting + Erreur lors de l'exportation + + + + Could not write to file %1. + Impossible d'écrire sur le fichier %1. + + + + Range: + Intervalle : + + + + to + à + + + + WalletModel + + + Sending... + Envoi en cours... + + + + bitcoin-core + + + Bitcoin version + Version de bitcoin + + + + Usage: + Utilisation : + + + + Send command to -server or bitcoind + Envoyer une commande à -server ou à bitcoind + + + + List commands + Lister les commandes + + + + Get help for a command + Obtenir de l'aide pour une commande + + + + Options: + Options : + + + + Specify configuration file (default: bitcoin.conf) + Spécifier le fichier de configuration (par défaut : bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + Spécifier le fichier pid (par défaut : bitcoind.pid) + + + + Generate coins + Générer des pièces + + + + Don't generate coins + Ne pas générer de pièces + + + + Start minimized + Démarrer sous forme minimisée + + + + Specify data directory + Spécifier le répertoire de données + + + + Specify connection timeout (in milliseconds) + Spécifier le délai d'expiration de la connexion (en millisecondes) + + + + Connect through socks4 proxy + Connexion via un proxy socks4 + + + + Allow DNS lookups for addnode and connect + Autoriser les recherches DNS pour l'ajout de nœuds et la connexion + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + Écouter les connexions sur le <port> (par défaut : 8333 ou testnet : 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Garder au plus <n> connexions avec les pairs (par défaut : 125) + + + + Add a node to connect to + Ajouter un nœud auquel se connecter + + + + Connect only to the specified node + Ne se connecter qu'au nœud spécifié + + + + Don't accept connections from outside + Ne pas accepter les connexion depuis l'extérieur + + + + Don't bootstrap list of peers using DNS + Ne pas amorcer la liste des pairs en utilisant le DNS + + + + Threshold for disconnecting misbehaving peers (default: 100) + Seuil de déconnexion des pairs de mauvaise qualité (par défaut : 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Délai en secondes de refus de reconnexion aux pairs de mauvaise qualité (par défaut : 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Tampon maximal de réception par connexion, <n>*1000 octets (par défaut : 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Tampon maximal d'envoi par connexion, <n>*1000 octets (par défaut : 10000) + + + + Don't attempt to use UPnP to map the listening port + Ne pas tenter d'utiliser l'UPnP pour ouvrir le port d'écoute + + + + Attempt to use UPnP to map the listening port + Essayer d'utiliser l'UPnP pour ouvrir le port d'écoute + + + + Fee per kB to add to transactions you send + Frais par ko à ajouter aux transactions que vous enverrez + + + + Accept command line and JSON-RPC commands + Accepter les commandes de JSON-RPC et de la ligne de commande + + + + Run in the background as a daemon and accept commands + Fonctionner en arrière-plan en tant que démon et accepter les commandes + + + + Use the test network + Utiliser le réseau de test + + + + Output extra debugging information + Informations de débogage supplémentaires + + + + Prepend debug output with timestamp + Faire précéder les données de débogage par un horodatage + + + + Send trace/debug info to console instead of debug.log file + Envoyer les informations de débogage/trace à la console au lieu du fichier debug.log + + + + Send trace/debug info to debugger + Envoyer les informations de débogage/trace au débogueur + + + + Username for JSON-RPC connections + Nom d'utilisateur pour les connexions JSON-RPC + + + + Password for JSON-RPC connections + Mot de passe pour les connexions JSON-RPC + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Écouter les connexions JSON-RPC sur le <port> (par défaut : 8332) + + + + Allow JSON-RPC connections from specified IP address + Autoriser les connexions JSON-RPC depuis l'adresse IP spécifiée + + + + Send commands to node running on <ip> (default: 127.0.0.1) + Envoyer des commandes au nœud fonctionnant à <ip> (par défaut : 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + Régler la taille de la plage de clefs sur <n> (par défaut : 100) + + + + Rescan the block chain for missing wallet transactions + Réanalyser la chaîne de blocs pour les transactions de porte-monnaie manquantes + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +Options SSL : (cf. le wiki Bitcoin pour les réglages SSL) + + + + Use OpenSSL (https) for JSON-RPC connections + Utiliser OpenSSL (https) pour les connexions JSON-RPC + + + + Server certificate file (default: server.cert) + Fichier de certificat serveur (par défaut : server.cert) + + + + Server private key (default: server.pem) + Clef privée du serveur (par défaut : server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Clefs de chiffrement acceptables (par défaut : TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Ce message d'aide + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Impossible d'obtenir un verrou sur le répertoire de données %s. Bitcoin fonctionne probablement déjà. + + + + Loading addresses... + Chargement des adresses... + + + + Error loading addr.dat + Erreur lors du chargement de addr.dat + + + + Error loading blkindex.dat + Erreur lors du chargement de blkindex.dat + + + + Error loading wallet.dat: Wallet corrupted + Erreur lors du chargement de wallet.dat : porte-monnaie corrompu + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Erreur lors du chargement de wallet.dat : le porte-monnaie nécessite une version plus récente de Bitcoin + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Le porte-monnaie nécessitait une réécriture. Veuillez redémarrer Bitcoin pour terminer l'opération + + + + Error loading wallet.dat + Erreur lors du chargement de wallet.dat + + + + Loading block index... + Chargement de l'index des blocs... + + + + Loading wallet... + Chargement du porte-monnaie... + + + + Rescanning... + Nouvelle analyse... + + + + Done loading + Chargement terminé + + + + Invalid -proxy address + Adresse -proxy invalide + + + + Invalid amount for -paytxfee=<amount> + Montant invalide pour -paytxfee=<montant> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Attention : -paytxfee est réglée sur un montant très élevé. Il s'agit des frais de transaction que vous payerez si vous envoyez une transaction. + + + + Error: CreateThread(StartNode) failed + Erreur : CreateThread(StartNode) a échoué + + + + Warning: Disk space is low + Attention : l'espace disque est faible + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Impossible de s'attacher au port %d sur cet ordinateur. Bitcoin fonctionne probablement déjà. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + Attention : veuillez vérifier que l'heure et la date de votre ordinateur sont corrects. Si votre horloge n'est pas à l'heure, Bitcoin ne fonctionnera pas correctement. + + + + beta + bêta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts new file mode 100644 index 0000000..6272450 --- /dev/null +++ b/src/qt/locale/bitcoin_he.ts @@ -0,0 +1,1977 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + אודות ביטקוין + + + + <b>Bitcoin</b> version + גרסת <b>ביטקוין</b> + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + זכויות יוצרים © 2009-2012 שמורות למפתחי ביטקוין + +זוהי תוכנה ניסיונית. + +מופץ תחת רישיון תוכנה MIT/X11, ראה את הקובץ המלווה license.txt או http://www.opensource.org/licenses/mit-license.php. + +המוצר הזה כולל תוכנה שפותחה על ידי פרויקט OpenSSL עבור שימוש בערכת הכלים של OpenSSL (http://www.openssl.org/) ובתוכנה קריפטוגרפית שנכתבה על ידי אריק יאנג (eay@cryptsoft.com) ותוכנת UPnP שנכתבה על ידי תומס ברנרד. + + + + AddressBookPage + + + Address Book + פנקס כתובות + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + אלה כתובות הביטקוין שלך עבור קבלת תשלומים. אתה עשוי לרצות לתת כתובת שונה לכל שולח כדי שתוכל לעקוב אחר מי משלם לך. + + + + Double-click to edit address or label + לחץ לחיצה כפולה לערוך כתובת או תוית + + + + Create a new address + יצירת כתובת חדשה + + + + &New Address... + כתובת &חדשה + + + + Copy the currently selected address to the system clipboard + העתק את הכתובת המסומנת ללוח העריכה + + + + &Copy to Clipboard + &העתק ללוח + + + + Show &QR Code + הצג &קוד QR + + + + Sign a message to prove you own this address + חתום על הודעה כדי להוכיח שכתובת זו בבעלותך + + + + &Sign Message + חתום על הו&דעה + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + מחק את הכתובת המסומנת מהרשימה. ניתן למחוק רק כתובות לשליחה. + + + + &Delete + &מחיקה + + + + Copy address + העתק כתובת + + + + Copy label + העתק תוית + + + + Edit + ערוך + + + + Delete + מחק + + + + Export Address Book Data + יצוא נתוני פנקס כתובות + + + + Comma separated file (*.csv) + קובץ מופרד בפסיקים (*.csv) + + + + Error exporting + שגיאה ביצוא + + + + Could not write to file %1. + לא מסוגל לכתוב לקובץ %1. + + + + AddressTableModel + + + Label + תוית + + + + Address + כתובת + + + + (no label) + (ללא כתובת) + + + + AskPassphraseDialog + + + Dialog + שיח + + + + + TextLabel + טקסטתוית + + + + Enter passphrase + הכנס סיסמא + + + + New passphrase + סיסמה חדשה + + + + Repeat new passphrase + חזור על הסיסמה החדשה + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + הכנס את הסיסמה החדשה לארנק. <br/>אנא השתמש בסיסמה המכילה <b>10 תוים אקראיים או יותר</b>, או <b>שמונה מילים או יותר</b>. + + + + Encrypt wallet + הצפנת ארנק + + + + This operation needs your wallet passphrase to unlock the wallet. + הפעולה הזו דורשת את סיסמת הארנק שלך בשביל לפתוח את הארנק. + + + + Unlock wallet + פתיחת ארנק + + + + This operation needs your wallet passphrase to decrypt the wallet. + הפעולה הזו דורשת את סיסמת הארנק שלך בשביל לפענח את הארנק. + + + + Decrypt wallet + פענוח ארנק + + + + Change passphrase + שינוי סיסמה + + + + Enter the old and new passphrase to the wallet. + הכנס את הסיסמות הישנה והחדשה לארנק. + + + + Confirm wallet encryption + אשר הצפנת ארנק + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + אזהרה: אם תצפין את הארנק שלך ותאבד את הסיסמה אתה <b>תאבד את כל הביטקוין שלך</b>! +אתה בטוח שברצונך להצפין את הארנק? + + + + + Wallet encrypted + הארנק הוצפן + + + + Bitcoin 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. + ביטקוין ייסגר עכשיו כדי להשלים את תהליך ההצפנה. זכור שהצפנת הארנק שלך אינו יכול להגן באופן מלא על הביטקוינים שלך מתוכנות זדוניות המושתלות על המחשב. + + + + + Warning: The Caps Lock key is on. + אזהרה: מקש Caps Lock מופעל. + + + + + + + Wallet encryption failed + הצפנת הארנק נכשלה + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + הצפנת הארנק נכשלה עקב שגיאה פנימית. הארנק שלך לא הוצפן. + + + + + The supplied passphrases do not match. + הסיסמות שניתנו אינן תואמות. + + + + Wallet unlock failed + פתיחת הארנק נכשלה + + + + + + The passphrase entered for the wallet decryption was incorrect. + הסיסמה שהוכנסה לפענוח הארנק שגויה. + + + + Wallet decryption failed + פענוח הארנק נכשל + + + + Wallet passphrase was succesfully changed. + סיסמת הארנק שונתה בהצלחה. + + + + BitcoinGUI + + + Bitcoin Wallet + ארנק ביטקוין + + + + + Synchronizing with network... + מסתנכרן עם הרשת... + + + + Block chain synchronization in progress + סנכרון עם שרשרת הבלוקים בעיצומו + + + + &Overview + &סקירה + + + + Show general overview of wallet + הצג סקירה כללית של הארנק + + + + &Transactions + &פעולות + + + + Browse transaction history + דפדף בהיסטוריית הפעולות + + + + &Address Book + פנקס &כתובות + + + + Edit the list of stored addresses and labels + ערוך את רשימת הכתובות והתויות + + + + &Receive coins + &קבלת מטבעות + + + + Show the list of addresses for receiving payments + הצג את רשימת הכתובות לקבלת תשלומים + + + + &Send coins + &שלח מטבעות + + + + Send coins to a bitcoin address + שלח מטבעות לכתובת ביטקוין + + + + Sign &message + חתום על הו&דעה + + + + Prove you control an address + הוכח שאתה שולט בכתובת + + + + E&xit + י&ציאה + + + + Quit application + סגור תוכנה + + + + &About %1 + &אודות %1 + + + + Show information about Bitcoin + הצג מידע על ביטקוין + + + + About &Qt + אודות Qt + + + + Show information about Qt + הצג מידע על Qt + + + + &Options... + &אפשרויות + + + + Modify configuration options for bitcoin + שנה הגדרות עבור ביטקוין + + + + Open &Bitcoin + פתח את &ביטקוין + + + + Show the Bitcoin window + הצג את חלון ביטקוין + + + + &Export... + י&צא + + + + Export the data in the current tab to a file + יצוא הנתונים בטאב הנוכחי לקובץ + + + + &Encrypt Wallet + הצ&פן ארנק + + + + Encrypt or decrypt wallet + הצפן או פענח ארנק + + + + &Backup Wallet + &גיבוי ארנק + + + + Backup wallet to another location + גיבוי הארנק למקום אחר + + + + &Change Passphrase + שנה &סיסמה + + + + Change the passphrase used for wallet encryption + שנה את הסיסמה להצפנת הארנק + + + + &File + &קובץ + + + + &Settings + ה&גדרות + + + + &Help + &עזרה + + + + Tabs toolbar + סרגל כלים טאבים + + + + Actions toolbar + סרגל כלים פעולות + + + + [testnet] + [רשת-בדיקה] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + חיבור פעיל אחד לרשת הביטקוין%n חיבורים פעילים לרשת הביטקוין + + + + Downloaded %1 of %2 blocks of transaction history. + הורדו %1 מתוך %2 בלוקים של היסטוריית פעולות. + + + + Downloaded %1 blocks of transaction history. + הורדו %1 בלוקים של היסטוריית פעולות. + + + + %n second(s) ago + לפני שניהלפני %n שניות + + + + %n minute(s) ago + לפני דקהלפני %n דקות + + + + %n hour(s) ago + לפני שעהלפני %n שעות + + + + %n day(s) ago + לפני יוםלפני %n ימים + + + + Up to date + עדכני + + + + Catching up... + מתעדכן... + + + + Last received block was generated %1. + הבלוק האחרון שהתקבל נוצר ב-%1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + הפעולה הזאת חורגת מהמגבלה. ניתן לשלוח אותה תמורת עמלה בסך %1, שמגיעה לצמתים שמעבדים את הפעולה ועוזרת לתמוך ברשת. האם אתה מעוניין לשלם את העמלה? + + + + Sending... + שולח... + + + + Sent transaction + פעולה שנשלחה + + + + Incoming transaction + פעולה שהתקבלה + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + תאריך: %1 +כמות: %2 +סוג: %3 +כתובת: %4 + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + הארנק <b>מוצפן</b> וכרגע <b>פתוח</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + הארנק <b>מוצפן</b> וכרגע <b>נעול</b> + + + + Backup Wallet + גיבוי ארנק + + + + Wallet Data (*.dat) + נתוני ארנק (*.dat) + + + + Backup Failed + הגיבוי נכשל + + + + There was an error trying to save the wallet data to the new location. + היתה שגיאה בניסיון לשמור את מידע הארנק למיקום החדש. + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &יחידת מדידה להציג בה כמויות: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + בחר את יחידת החלוקה להצגה בממשק, ובעת שליחת מטבעות + + + + Display addresses in transaction list + הצג כתובות ברשימת הפעולות + + + + EditAddressDialog + + + Edit Address + ערוך כתובת + + + + &Label + ת&וית + + + + The label associated with this address book entry + התוית המשויכת לרשומה הזו בפנקס הכתובות + + + + &Address + &כתובת + + + + The address associated with this address book entry. This can only be modified for sending addresses. + הכתובת המשויכת לרשומה זו בפנקס הכתובות. ניתן לשנות זאת רק עבור כתובות לשליחה. + + + + New receiving address + כתובת חדשה לקבלה + + + + New sending address + כתובת חדשה לשליחה + + + + Edit receiving address + ערוך כתובת לקבלה + + + + Edit sending address + ערוך כתובת לשליחה + + + + The entered address "%1" is already in the address book. + הכתובת שהכנסת "%1" כבר נמצאת בפנקס הכתובות. + + + + The entered address "%1" is not a valid bitcoin address. + הכתובת שהכנסת "%1" אינה כתובת ביטקוין תקינה. + + + + Could not unlock wallet. + פתיחת הארנק נכשלה. + + + + New key generation failed. + יצירת מפתח חדש נכשלה. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + התח&ל את ביטקוין בהפעלת מערכת חלונות + + + + Automatically start Bitcoin after the computer is turned on + התחל את ביטקוין אוטומטית כשהמחשב נדלק + + + + &Minimize to the tray instead of the taskbar + מ&זער למגש במקום לשורת המשימות + + + + Show only a tray icon after minimizing the window + הצג אייקון מגש בלבד לאחר מזעור החלון + + + + Map port using &UPnP + מיפוי פורט באמצעות UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + פתח את פורט ביטקוין בנתב באופן אוטומטי. עובד רק אם UPnP מאופשר ונתמך ×¢"י הנתב. + + + + M&inimize on close + מז&ער בעת סגירה + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + מזער את התוכנה במקום לצאת ממנה כשהחלון נסגר. כשאפשרות זו פעילה, התוכנה תיסגר רק לאחר בחירת יציאה מהתפריט. + + + + &Connect through SOCKS4 proxy: + התח&בר דרך פרוקסי SOCKS4: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + התחבר לרשת הביטקוין דרך פרוקסי SOCKS4 (למשל, בעת חיבור דרך Tor) + + + + Proxy &IP: + IP של פרוקסי: + + + + IP address of the proxy (e.g. 127.0.0.1) + כתובת האינטרנט של הפרוקסי (למשל 127.0.0.1) + + + + &Port: + &פורט: + + + + Port of the proxy (e.g. 1234) + הפורט של הפרוקסי (למשל 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + עמלת פעולה אופציונלית לכל kB תבטיח שהפעולה שלך תעובד בזריזות. רוב הפעולות הן 1 kB. מומלצת עמלה בסך 0.01. + + + + Pay transaction &fee + שלם &עמלת פעולה + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + עמלת פעולה אופציונלית לכל kB תבטיח שהפעולה שלך תעובד בזריזות. רוב הפעולות הן 1 kB. מומלצת עמלה בסך 0.01. + + + + MessagePage + + + Message + הודעה + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + אתה יכול לחתום על הודעות עם הכתובות שלך כדי להוכיח שהן בבעלותך. היזהר לא לחתום על משהו מעורפל, שכן התקפות פישינג עשויות לגרום לך בעורמה למסור את זהותך. חתום רק על אמרות מפורטות לחלוטין שאתה מסכים עימן. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + הכתובת אליה יישלח התשלום (למשל 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + בחר כתובת מפנקס הכתובות + + + + Alt+A + Alt+A + + + + Paste address from clipboard + הדבק כתובת מהלוח + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + הכנס כאן את ההודעה שעליך ברצונך לחתום + + + + Click "Sign Message" to get signature + לחץ על "חתום על הודעה" לקבלת חתימה + + + + Sign a message to prove you own this address + חתום על הודעה כדי להוכיח שכתובת זו בבעלותך + + + + &Sign Message + חתום על הו&דעה + + + + Copy the currently selected address to the system clipboard + העתק את הכתובת שסומנה ללוח המערכת + + + + &Copy to Clipboard + ה&עתק ללוח + + + + + + Error signing + שגיאה בחתימה + + + + %1 is not a valid address. + %1 אינה כתובת תקינה. + + + + Private key for %1 is not available. + המפתח הפרטי עבור %1 אינו זמין. + + + + Sign failed + החתימה נכשלה + + + + OptionsDialog + + + Main + ראשי + + + + Display + תצוגה + + + + Options + אפשרויות + + + + OverviewPage + + + Form + טופס + + + + Balance: + יתרה: + + + + 123.456 BTC + 123.456 ביטקוין + + + + Number of transactions: + מספר פעולות: + + + + 0 + 0 + + + + Unconfirmed: + ממתין לאישור: + + + + 0 BTC + 0 ביטקוין + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + <b>Recent transactions</b> + <b>פעולות אחרונות</b> + + + + Your current balance + היתרה הנוכחית שלך + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + הסכום הכולל של פעולות שטרם אושרו, ועוד אינן נספרות בחישוב היתרה הנוכחית + + + + Total number of transactions in wallet + המספר הכולל של פעולות בארנק + + + + QRCodeDialog + + + Dialog + שיח + + + + QR Code + קוד QR + + + + Request Payment + בקש תשלום + + + + Amount: + כמות: + + + + BTC + ביטקוין + + + + Label: + תוית: + + + + Message: + הודעה: + + + + &Save As... + &שמור בשם... + + + + Save Image... + שמור תמונה... + + + + PNG Images (*.png) + תמונות PNG (*.png) + + + + SendCoinsDialog + + + + + + + + + + Send Coins + שלח מטבעות + + + + Send to multiple recipients at once + שלח למספר מקבלים בו-זמנית + + + + &Add recipient... + &הוסף מקבל... + + + + Remove all transaction fields + הסר את כל השדות בפעולה + + + + Clear all + נקה הכל + + + + Balance: + יתרה: + + + + 123.456 BTC + 123.456 ביטקוין + + + + Confirm the send action + אשר את פעולת השליחה + + + + &Send + &שלח + + + + <b>%1</b> to %2 (%3) + <b>%1</b> ל- %2 (%3) + + + + Confirm send coins + אשר שליחת מטבעות + + + + Are you sure you want to send %1? + האם אתה בטוח שברצונך לשלוח %1? + + + + and + ו- + + + + The recepient address is not valid, please recheck. + כתובת המקבל אינה תקינה, אנא בדוק שנית. + + + + The amount to pay must be larger than 0. + הכמות לשלם חייבת להיות גדולה מ-0. + + + + Amount exceeds your balance + הכמות חורגת מהיתרה שלך. + + + + Total exceeds your balance when the %1 transaction fee is included + הסכום חורג מהיתרה לאחר הכללת עמלת פעולה בסך %1. + + + + Duplicate address found, can only send to each address once in one send operation + כתובת כפולה נמצאה, ניתן לשלוח לכל כתובת רק פעם אחת בכל פעולה שליחה + + + + Error: Transaction creation failed + שגיאה: יצירת הפעולה נכשלה + + + + Error: 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. + שגיאה: הפעולה נדחתה. זה עשוי לקרות אם חלק מהמטבעות בארנק שלך כבר נוצלו, למשל אם השתמשת בעותק של הקובץ wallet.dat ומטבעות נוצלו בהעתק אך לא סומנו כמנוצלות כאן. + + + + SendCoinsEntry + + + Form + טופס + + + + A&mount: + כ&מות: + + + + Pay &To: + שלם &ל: + + + + + Enter a label for this address to add it to your address book + הכנס תוית לכתובת הזאת כדי להכניס לפנקס הכתובות + + + + &Label: + ת&וית: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + הכתובת אליה יישלח התשלום (למשל 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + בחר כתובת מפנקס הכתובות + + + + Alt+A + Alt+A + + + + Paste address from clipboard + הדבר כתובת מהלוח + + + + Alt+P + Alt+P + + + + Remove this recipient + הסר את המקבל הזה + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + הכנס כתובת ביטקוין (למשל 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + פתוח למשך %1 בלוקים + + + + Open until %1 + פתוח עד %1 + + + + %1/offline? + %1/לא מחובר? + + + + %1/unconfirmed + %1/ממתין לאישור + + + + %1 confirmations + %1 אישורים + + + + <b>Status:</b> + <b>מצב:</b> + + + + , has not been successfully broadcast yet + , טרם שודר בהצלחה + + + + , broadcast through %1 node + , שודר דרך צומת %1 + + + + , broadcast through %1 nodes + , שודר דרך %1 צמתים + + + + <b>Date:</b> + <b>תאריך:</b> + + + + <b>Source:</b> Generated<br> + <b>מקור:</b> נוצר<br> + + + + + <b>From:</b> + <b>מאת:</b> + + + + unknown + לא ידוע + + + + + + <b>To:</b> + <b>אל:</b> + + + + (yours, label: + (שלך, תוית: + + + + (yours) + (שלך) + + + + + + + <b>Credit:</b> + <b>זיכוי:</b> + + + + (%1 matures in %2 more blocks) + (%1 יבגור עוד %2 בלוקים) + + + + (not accepted) + (לא התקבל) + + + + + + <b>Debit:</b> + <b<חיוב:</b> + + + + <b>Transaction fee:</b> + <b>עמלת פעולה:</b> + + + + <b>Net amount:</b> + <b>כמות נטו:</b> + + + + Message: + הודעה: + + + + Comment: + הערה: + + + + Transaction ID: + מזהה פעולה: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + מטבעות שנוצרו חייבים לחכות 120 בלוקים לפני שניתן לנצל אותם. כשיצרת את הבלוק הזה, הוא שודר לרשת כדי להתווסף לשרשרת הבלוקים. אם הוא אינו מצליח להיכנס לשרשרת, הוא ישתנה ל"לא התקבל" ולא ניתן יהיה לנצל אותו. זה יכול לקרות מדי פעם אם צומת אחר מייצר בלוק בהפרש של מספר שניות מהבלוק שלך. + + + + TransactionDescDialog + + + Transaction details + פרטי הפעולה + + + + This pane shows a detailed description of the transaction + חלונית זו מציגה תיאור מפורט של הפעולה + + + + TransactionTableModel + + + Date + תאריך + + + + Type + סוג + + + + Address + כתובת + + + + Amount + כמות + + + + Open for %n block(s) + פתוח למשך בלוק אחדפתוח למשך %n בלוקים + + + + Open until %1 + פתוח עד %1 + + + + Offline (%1 confirmations) + לא מחובר (%1 אישורים) + + + + Unconfirmed (%1 of %2 confirmations) + ממתין לאישור (%1 מתוך %2 אישורים) + + + + Confirmed (%1 confirmations) + מאושר (%1 אישורים) + + + + Mined balance will be available in %n more blocks + יתרה שנכרתה תהיה זמינה עוד בלוק אחדיתרה שנכרתה תהיה זמינה עוד %n בלוקים + + + + This block was not received by any other nodes and will probably not be accepted! + הבלוק הזה לא נקלט על ידי אף צומת אחר, וכנראה לא יתקבל! + + + + Generated but not accepted + נוצר אך לא התקבל + + + + Received with + התקבל עם + + + + Received from + התקבל מאת + + + + Sent to + נשלח ל + + + + Payment to yourself + תשלום לעצמך + + + + Mined + נכרה + + + + (n/a) + (n/a) + + + + Transaction status. Hover over this field to show number of confirmations. + מצב הפעולה. השהה את הסמן מעל שדה זה כדי לראות את מספר האישורים. + + + + Date and time that the transaction was received. + התאריך והשעה בה הפעולה הזאת התקבלה. + + + + Type of transaction. + סוג הפעולה. + + + + Destination address of transaction. + כתובת היעד של הפעולה. + + + + Amount removed from or added to balance. + הכמות שהתווספה או הוסרה מהיתרה. + + + + TransactionView + + + + All + הכל + + + + Today + היום + + + + This week + השבוע + + + + This month + החודש + + + + Last month + החודש שעבר + + + + This year + השנה + + + + Range... + טווח... + + + + Received with + התקבל עם + + + + Sent to + נשלח ל + + + + To yourself + לעצמך + + + + Mined + נכרה + + + + Other + אחר + + + + Enter address or label to search + הכנס כתובת או תוית לחפש + + + + Min amount + כמות מזערית + + + + Copy address + העתק כתובת + + + + Copy label + העתק תוית + + + + Copy amount + העתק כמות + + + + Edit label + ערוך תוית + + + + Show details... + הצג פרטים... + + + + Export Transaction Data + יצוא נתוני פעולות + + + + Comma separated file (*.csv) + קובץ מופרד בפסיקים (*.csv) + + + + Confirmed + מאושר + + + + Date + תאריך + + + + Type + סוג + + + + Label + תוית + + + + Address + כתובת + + + + Amount + כמות + + + + ID + מזהה + + + + Error exporting + שגיאה ביצוא + + + + Could not write to file %1. + לא מסוגל לכתוב לקובץ %1. + + + + Range: + טווח: + + + + to + אל + + + + WalletModel + + + Sending... + שולח... + + + + bitcoin-core + + + Bitcoin version + גרסת ביטקוין + + + + Usage: + שימוש: + + + + Send command to -server or bitcoind + שלח פקודה ל -server או bitcoind + + + + List commands + רשימת פקודות + + + + Get help for a command + קבל עזרה עבור פקודה + + + + Options: + אפשרויות: + + + + Specify configuration file (default: bitcoin.conf) + ציין קובץ הגדרות (ברירת מחדל: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + ציין קובץ pid (ברירת מחדל: bitcoind.pid) + + + + Generate coins + צור מטבעות + + + + Don't generate coins + אל תייצר מטבעות + + + + Start minimized + התחל ממוזער + + + + Specify data directory + ציין תיקיית נתונים + + + + Specify connection timeout (in milliseconds) + ציין הגבלת זמן לחיבור (במילישניות) + + + + Connect through socks4 proxy + התחבר דרך פרוקסי socks4 + + + + Allow DNS lookups for addnode and connect + אפשר עיון ב-DNS להוספת צומת וחיבור + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + האזן לחיבורים ב<פורט> (ברירת מחדל: 8333 או ברשת הבדיקה: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + החזק לכל היותר <n> חיבורים לעמיתים (ברירת מחדל: 125) + + + + Add a node to connect to + הוסף צומת להתחבר אליו + + + + Connect only to the specified node + התחבר רק לצומת המצוין + + + + Don't accept connections from outside + אל תקבל חיבורים מבחוץ + + + + Don't bootstrap list of peers using DNS + אל תשתמש ב-DNS לאתחול רשימת עמיתים + + + + Threshold for disconnecting misbehaving peers (default: 100) + סף להתנתקות מעמיתים הנוהגים שלא כהלכה (ברירת מחדל: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + מספר שניות למנוע מעמיתים הנוהגים שלא כהלכה מלהתחבר מחדש (ברירת מחדל: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + חוצץ מירבי לקבלה לכל חיבור, <n>*1000 בתים (ברירת מחדל: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + חוצץ מירבי לשליחה לכל חיבור, <n>*1000 בתים (ברירת מחדל: 10000) + + + + Don't attempt to use UPnP to map the listening port + אל תנסה להשתמש ב-UPnP כדי למפות את הפורט להאזנה + + + + Attempt to use UPnP to map the listening port + נסה להשתמש ב-UPnP כדי למפות את הפורט להאזנה + + + + Fee per kB to add to transactions you send + עמלה לכל kB להוסיף לפעולות שאתה שולח + + + + Accept command line and JSON-RPC commands + קבל פקודות משורת הפקודה ו- JSON-RPC + + + + Run in the background as a daemon and accept commands + רוץ ברקע כדימון וקבל פקודות + + + + Use the test network + השתמש ברשת הבדיקה + + + + Output extra debugging information + פלוט מידע דיבאג נוסף + + + + Prepend debug output with timestamp + הוסף חותמת זמן לפני פלט דיבאג + + + + Send trace/debug info to console instead of debug.log file + שלח מידע דיבאג ועקבה לקונסולה במקום לקובץ debug.log + + + + Send trace/debug info to debugger + שלח מידע דיבאג ועקבה לכלי דיבאג + + + + Username for JSON-RPC connections + שם משתמש לחיבורי JSON-RPC + + + + Password for JSON-RPC connections + סיסמה לחיבורי JSON-RPC + + + + Listen for JSON-RPC connections on <port> (default: 8332) + האזן לחיבורי JSON-RPC ב<פורט> (ברירת מחדל: 8332) + + + + Allow JSON-RPC connections from specified IP address + אפשר חיבורי JSON-RPC מכתובת האינטרנט המצוינת + + + + Send commands to node running on <ip> (default: 127.0.0.1) + שלח פקודות לצומת ב-<ip> (ברירת מחדל: 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + קבע את גודל המאגר ל -<n> (ברירת מחדל: 100) + + + + Rescan the block chain for missing wallet transactions + סרוק מחדש את שרשרת הבלוקים למציאת פעולות חסרות בארנק + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + אפשרויות SSL: (ראה את הויקי של ביטקוין עבור הוראות להתקנת SSL) + + + + Use OpenSSL (https) for JSON-RPC connections + השתמש ב-OpenSSL (https( עבור חיבורי JSON-RPC + + + + Server certificate file (default: server.cert) + קובץ תעודת שרת (ברירת מחדל: server.cert) + + + + Server private key (default: server.pem) + מפתח פרטי של השרת (ברירת מחדל: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + צפנים קבילים (ברירת מחדל: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + הודעת העזרה הזו + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + אינו מסוגל לנעול את תיקיית הנתונים %s. כנראה שביטקוין כבר רץ. + + + + Loading addresses... + טוען כתובות... + + + + Error loading addr.dat + שגיאה בטעינת הקובץ addr.dat + + + + Error loading blkindex.dat + שגיאה בטעינת הקובץ blkindex.dat + + + + Error loading wallet.dat: Wallet corrupted + שגיאה בטעינת הקובץ wallet.dat: הארנק מושחת + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + שגיאה בטעינת הקובץ wallet.dat: הארנק דורש גרסה חדשה יותר של ביטקוין + + + + Wallet needed to be rewritten: restart Bitcoin to complete + יש לכתוב מחדש את הארנק: אתחל את ביטקוין לסיום + + + + Error loading wallet.dat + שגיאה בטעינת הקובץ wallet.dat + + + + Loading block index... + טוען את אינדקס הבלוקים... + + + + Loading wallet... + טוען ארנק... + + + + Rescanning... + סורק מחדש... + + + + Done loading + טעינה הושלמה + + + + Invalid -proxy address + כתובת פרוקסי לא תקינה + + + + Invalid amount for -paytxfee=<amount> + כמות לא תקינה בפרמטר -paytxfee=<amount> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + אזהרה: ערך גבוה מדי הושם בפרמטר -paytxfee. זו העמלה שתשלם אם אתה שולח פעולה. + + + + Error: CreateThread(StartNode) failed + שגיאה: כישלון ב- CreateThread(StartNode) + + + + Warning: Disk space is low + אזהרה: מעט מקום בדיסק + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + לא מסוגל להיקשר לפורט %d במחשב הזה. כנראה שביטקוין כבר רץ. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + אזהרה: אנא בדוק שהתאריך והשעה של המחשב הזה נכונים. אם השעון שלך שגוי ביטקוין לא יפעל כהלכה. + + + + beta + בטא + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts new file mode 100644 index 0000000..9d9e269 --- /dev/null +++ b/src/qt/locale/bitcoin_hr.ts @@ -0,0 +1,1972 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + O Bitcoinu + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> verzija + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + Adresar + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Ovo su vaÅ¡e Bitcoin adrese za primanje isplate. Možda želite dati drukčiju adresu svakom primatelju tako da možete pratiti tko je platio. + + + + Double-click to edit address or label + Dvostruki klik za uređivanje adrese ili oznake + + + + Create a new address + Dodajte novu adresu + + + + &New Address... + &Nova adresa... + + + + Copy the currently selected address to the system clipboard + Kopiraj trenutno odabranu adresu u međuspremnik + + + + &Copy to Clipboard + &Kopiraj u međuspremnik + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Brisanje trenutno odabrane adrese s popisa. Samo adrese za slanje se mogu izbrisati. + + + + &Delete + &Brisanje + + + + Copy address + Kopirati adresu + + + + Copy label + Kopirati oznaku + + + + Edit + + + + + Delete + + + + + Export Address Book Data + Izvoz podataka adresara + + + + Comma separated file (*.csv) + Datoteka vrijednosti odvojenih zarezom (*. csv) + + + + Error exporting + PogreÅ¡ka kod izvoza + + + + Could not write to file %1. + Ne mogu pisati u datoteku %1. + + + + AddressTableModel + + + Label + Oznaka + + + + Address + Adresa + + + + (no label) + (bez oznake) + + + + AskPassphraseDialog + + + Dialog + Dijalog + + + + + TextLabel + TekstualnaOznaka + + + + Enter passphrase + Unesite lozinku + + + + New passphrase + Nova lozinka + + + + Repeat new passphrase + Ponovite novu lozinku + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Unesite novi lozinku za novčanik. <br/> Molimo Vas da koristite zaporku od <b>10 ili viÅ¡e slučajnih znakova,</b> ili <b>osam ili viÅ¡e riječi.</b> + + + + Encrypt wallet + Å ifriranje novčanika + + + + This operation needs your wallet passphrase to unlock the wallet. + Ova operacija treba lozinku vaÅ¡eg novčanika kako bi se novčanik otključao. + + + + Unlock wallet + Otključaj novčanik + + + + This operation needs your wallet passphrase to decrypt the wallet. + Ova operacija treba lozinku vaÅ¡eg novčanika kako bi se novčanik deÅ¡ifrirao. + + + + Decrypt wallet + DeÅ¡ifriranje novčanika. + + + + Change passphrase + Promjena lozinke + + + + Enter the old and new passphrase to the wallet. + Unesite staru i novu lozinku za novčanik. + + + + Confirm wallet encryption + Potvrdi Å¡ifriranje novčanika + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + UPOZORENJE: Ako Å¡ifrirate vaÅ¡ novčanik i izgubite lozinku, <b>IZGUBIT ĆETE SVE SVOJE BITCOINSE!</b> +Jeste li sigurni da želite Å¡ifrirati svoj novčanik? + + + + + Wallet encrypted + Novčanik Å¡ifriran + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + Å ifriranje novčanika nije uspjelo + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Å ifriranje novčanika nije uspjelo zbog interne pogreÅ¡ke. VaÅ¡ novčanik nije Å¡ifriran. + + + + + The supplied passphrases do not match. + Priložene lozinke se ne podudaraju. + + + + Wallet unlock failed + Otključavanje novčanika nije uspjelo + + + + + + The passphrase entered for the wallet decryption was incorrect. + Lozinka za deÅ¡ifriranje novčanika nije točna. + + + + Wallet decryption failed + DeÅ¡ifriranje novčanika nije uspjelo + + + + Wallet passphrase was succesfully changed. + Lozinka novčanika je uspjeÅ¡no promijenjena. + + + + BitcoinGUI + + + Bitcoin Wallet + Bitcoin novčanik + + + + + Synchronizing with network... + Usklađivanje s mrežom ... + + + + Block chain synchronization in progress + Sinkronizacija lanca blokova u tijeku + + + + &Overview + &Pregled + + + + Show general overview of wallet + Prikaži opći pregled novčanika + + + + &Transactions + &Transakcije + + + + Browse transaction history + Pretraži povijest transakcija + + + + &Address Book + &Adresar + + + + Edit the list of stored addresses and labels + Uređivanje popisa pohranjenih adresa i oznaka + + + + &Receive coins + &Primanje novca + + + + Show the list of addresses for receiving payments + Prikaži popis adresa za primanje isplate + + + + &Send coins + &PoÅ¡alji novac + + + + Send coins to a bitcoin address + Slanje novca na bitcoin adresu + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + &Izlaz + + + + Quit application + Izlazak iz programa + + + + &About %1 + &ViÅ¡e o %1 + + + + Show information about Bitcoin + Prikaži informacije o Bitcoinu + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + &Postavke + + + + Modify configuration options for bitcoin + Promijeni postavke konfiguracije za bitcoin + + + + Open &Bitcoin + Otvori &Bitcoin + + + + Show the Bitcoin window + Prikaži Bitcoin prozor + + + + &Export... + &Izvoz... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + &Å ifriraj novčanik + + + + Encrypt or decrypt wallet + Å ifriranje ili deÅ¡ifriranje novčanika + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + &Promijena lozinke + + + + Change the passphrase used for wallet encryption + Promijenite lozinku za Å¡ifriranje novčanika + + + + &File + &Datoteka + + + + &Settings + &Konfiguracija + + + + &Help + &Pomoć + + + + Tabs toolbar + Traka kartica + + + + Actions toolbar + Traka akcija + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n aktivna veza na Bitcoin mrežu%n aktivne veze na Bitcoin mrežu%n aktivnih veza na Bitcoin mrežu + + + + Downloaded %1 of %2 blocks of transaction history. + Preuzeto %1 od %2 blokova povijesti transakcije. + + + + Downloaded %1 blocks of transaction history. + Preuzeto %1 blokova povijesti transakcije. + + + + %n second(s) ago + prije %n sekundeprije %n sekundeprije %n sekundi + + + + %n minute(s) ago + prije %n minuteprije %n minuteprije %n minuta + + + + %n hour(s) ago + prije %n sataprije %n sataprije %n sati + + + + %n day(s) ago + prije %n danaprije %n danaprije %n dana + + + + Up to date + Ažurno + + + + Catching up... + Ažuriranje... + + + + Last received block was generated %1. + Zadnji primljeni blok je generiran %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Ova transakcija je preko ograničenja veličine. Možete ju ipak poslati za naknadu od %1, koja se daje čvorovima koji procesiraju vaÅ¡e transakcije i tako podržavate mrežu. Želite li platiti naknadu? + + + + Sending... + Slanje... + + + + Sent transaction + Poslana transakcija + + + + Incoming transaction + Dolazna transakcija + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Datum:%1 +Iznos:%2 +Tip:%3 +Adresa:%4 + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Novčanik je <b>Å¡ifriran</b> i trenutno <b>otključan</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Novčanik je <b>Å¡ifriran</b> i trenutno <b>zaključan</b> + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Jedinica za prikazivanje iznosa: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Izaberite željeni najmanji dio bitcoina koji će biti prikazan u sučelju i koji će se koristiti za plaćanje. + + + + Display addresses in transaction list + Prikaži adrese u popisu transakcija + + + + EditAddressDialog + + + Edit Address + Izmjeni adresu + + + + &Label + &Oznaka + + + + The label associated with this address book entry + Oznaka ovog upisa u adresar + + + + &Address + &Adresa + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Adresa ovog upisa u adresar. Može se mjenjati samo kod adresa za slanje. + + + + New receiving address + Nova adresa za primanje + + + + New sending address + Nova adresa za slanje + + + + Edit receiving address + Uredi adresu za primanje + + + + Edit sending address + Uredi adresu za slanje + + + + The entered address "%1" is already in the address book. + Upisana adresa "%1" je već u adresaru. + + + + The entered address "%1" is not a valid bitcoin address. + Upisana adresa "%1" nije valjana bitcoin adresa. + + + + Could not unlock wallet. + Ne mogu otključati novčanik. + + + + New key generation failed. + Stvaranje novog ključa nije uspjelo. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &Pokreni Bitcoin kod pokretanja sustava + + + + Automatically start Bitcoin after the computer is turned on + Automatski pokreni Bitcoin kad se uključi računalo + + + + &Minimize to the tray instead of the taskbar + &Minimiziraj u sistemsku traku umjesto u traku programa + + + + Show only a tray icon after minimizing the window + Prikaži samo ikonu u sistemskoj traci nakon minimiziranja prozora + + + + Map port using &UPnP + Mapiraj port koristeći &UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Automatski otvori port Bitcoin klijenta na ruteru. To radi samo ako ruter podržava UPnP i ako je omogućen. + + + + M&inimize on close + M&inimiziraj kod zatvaranja + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Minimizirati umjesto izaći iz aplikacije kada je prozor zatvoren. Kada je ova opcija omogućena, aplikacija će biti zatvorena tek nakon odabira Izlaz u izborniku. + + + + &Connect through SOCKS4 proxy: + &Povezivanje putem SOCKS4 proxy-a: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Spojite se na Bitcon mrežu putem SOCKS4 proxy-a (npr. kod povezivanja kroz Tor) + + + + Proxy &IP: + Proxy &IP: + + + + IP address of the proxy (e.g. 127.0.0.1) + IP adresa proxy-a (npr. 127.0.0.1) + + + + &Port: + &Port: + + + + Port of the proxy (e.g. 1234) + Port od proxy-a (npr. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + Plati &naknadu za transakciju + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresa za slanje plaćanja (npr. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Odaberite adresu iz adresara + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Zalijepi adresu iz međuspremnika + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Kopiraj trenutno odabranu adresu u međuspremnik + + + + &Copy to Clipboard + &Kopiraj u međuspremnik + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + Glavno + + + + Display + Prikaz + + + + Options + Postavke + + + + OverviewPage + + + Form + Oblik + + + + Balance: + Stanje: + + + + 123.456 BTC + 123,456 BTC + + + + Number of transactions: + Broj transakcija: + + + + 0 + 0 + + + + Unconfirmed: + Nepotvrđene: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Lisnica</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Nedavne transakcije</b> + + + + Your current balance + VaÅ¡e trenutno stanje računa + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Ukupni iznos transakcija koje tek trebaju biti potvrđene, i joÅ¡ uvijek nisu uračunate u trenutni saldo + + + + Total number of transactions in wallet + Ukupni broj tansakcija u lisnici + + + + QRCodeDialog + + + Dialog + Dijalog + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + Poruka: + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + PoÅ¡alji novac + + + + Send to multiple recipients at once + PoÅ¡alji k nekoliko primatelja odjednom + + + + &Add recipient... + &Dodaj primatelja... + + + + Remove all transaction fields + + + + + Clear all + ObriÅ¡i sve + + + + Balance: + Stanje: + + + + 123.456 BTC + 123,456 BTC + + + + Confirm the send action + Potvrdi akciju slanja + + + + &Send + &PoÅ¡alji + + + + <b>%1</b> to %2 (%3) + <b>%1</b> do %2 (%3) + + + + Confirm send coins + Potvrdi slanje novca + + + + Are you sure you want to send %1? + Jeste li sigurni da želite poslati %1? + + + + and + i + + + + The recepient address is not valid, please recheck. + Adresa primatelja je nevaljala, molimo provjerite je ponovo. + + + + The amount to pay must be larger than 0. + Iznos mora biti veći od 0. + + + + Amount exceeds your balance + Iznos je veći od stanja računa + + + + Total exceeds your balance when the %1 transaction fee is included + Iznos je veći od stanja računa kad se doda naknada za transakcije od %1 + + + + Duplicate address found, can only send to each address once in one send operation + PronaÅ¡li smo adresu koja se ponavlja. U svakom plaćanju program može svaku adresu koristiti samo jedanput + + + + Error: Transaction creation failed + GreÅ¡ka: priprema transakcije nije uspjela + + + + Error: 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. + Generirani novčići moraju pričekati nastanak 120 blokova prije nego Å¡to ih je moguće potroÅ¡iti. Kad ste generirali taj blok, on je bio emitiran u mrežu kako bi bio dodan postojećim lancima blokova. Ako ne uspije biti dodan, njegov status bit će promijenjen u "nije prihvatljiv" i on neće biti potroÅ¡iv. S vremena na vrijeme tako neÅ¡to se može desiti ako neki drugi nod približno istovremeno generira blok. + + + + SendCoinsEntry + + + Form + Oblik + + + + A&mount: + &Iznos: + + + + Pay &To: + &Primatelj plaćanja: + + + + + Enter a label for this address to add it to your address book + Unesite oznaku za ovu adresu kako bi ju dodali u vaÅ¡ adresar + + + + &Label: + &Oznaka: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresa za slanje plaćanja (npr. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Odaberite adresu iz adresara + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Zalijepi adresu iz međuspremnika + + + + Alt+P + Alt+P + + + + Remove this recipient + Ukloni ovog primatelja + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Unesite Bitcoin adresu (npr. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Otvori za %1 blokova + + + + Open until %1 + Otvoren do %1 + + + + %1/offline? + %1 nije dostupan? + + + + %1/unconfirmed + %1/nepotvrđeno + + + + %1 confirmations + %1 potvrda + + + + <b>Status:</b> + <b>Status:</b> + + + + , has not been successfully broadcast yet + , joÅ¡ nije bio uspjeÅ¡no emitiran + + + + , broadcast through %1 node + , emitiran kroz nod %1 + + + + , broadcast through %1 nodes + , emitiran kroz nodove %1 + + + + <b>Date:</b> + <b>Datum:</b> + + + + <b>Source:</b> Generated<br> + <b>Izvor:</b> Generirano<br> + + + + + <b>From:</b> + <b>Od:</b> + + + + unknown + nepoznato + + + + + + <b>To:</b> + <b>Za:</b> + + + + (yours, label: + (tvoje, oznaka: + + + + (yours) + (tvoje) + + + + + + + <b>Credit:</b> + <b>Uplaćeno:</b> + + + + (%1 matures in %2 more blocks) + (%1 stasava za %2 dodatna bloka) + + + + (not accepted) + (Nije prihvaćeno) + + + + + + <b>Debit:</b> + <b>PotroÅ¡eno:</b> + + + + <b>Transaction fee:</b> + <b>Naknada za transakciju:</b> + + + + <b>Net amount:</b> + <b>Neto iznos:</b> + + + + Message: + Poruka: + + + + Comment: + Komentar: + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Generirani novčići moraju pričekati nastanak 120 blokova prije nego Å¡to ih je moguće potroÅ¡iti. Kad ste generirali taj blok, on je bio emitiran u mrežu kako bi bio dodan postojećim lancima blokova. Ako ne uspije biti dodan, njegov status bit će promijenjen u "nije prihvaćen" i on neće biti potroÅ¡iv. S vremena na vrijeme tako neÅ¡to se može desiti ako neki drugi nod generira blok u približno isto vrijeme. + + + + TransactionDescDialog + + + Transaction details + Detalji transakcije + + + + This pane shows a detailed description of the transaction + Ova panela prikazuje detaljni opis transakcije + + + + TransactionTableModel + + + Date + Datum + + + + Type + Tip + + + + Address + Adresa + + + + Amount + Iznos + + + + Open for %n block(s) + Otvoren za %n blokaOtvoren za %n blokovaOtvoren za %n blokova + + + + Open until %1 + Otvoren do %1 + + + + Offline (%1 confirmations) + Nije na mreži (%1 potvrda) + + + + Unconfirmed (%1 of %2 confirmations) + Nepotvrđen (%1 od %2 potvrda) + + + + Confirmed (%1 confirmations) + Potvrđen (%1 potvrda) + + + + Mined balance will be available in %n more blocks + Saldo iskovanih novčićća bit de dostupan nakon %n dodatnog blokaSaldo iskovanih novčićća bit de dostupan nakon %n dodatnih blokovaSaldo iskovanih novčićća bit de dostupan nakon %n dodatnih blokova + + + + This block was not received by any other nodes and will probably not be accepted! + Generirano - Upozorenje: ovaj blok nije bio primljen od strane bilo kojeg drugog noda i vjerojatno neće biti prihvaćen! + + + + Generated but not accepted + Generirano, ali nije prihvaćeno + + + + Received with + Primljeno s + + + + Received from + + + + + Sent to + Poslano za + + + + Payment to yourself + Plaćanje samom sebi + + + + Mined + Rudareno + + + + (n/a) + (n/d) + + + + Transaction status. Hover over this field to show number of confirmations. + Status transakcije + + + + Date and time that the transaction was received. + Datum i vrijeme kad je transakcija primljena + + + + Type of transaction. + Vrsta transakcije. + + + + Destination address of transaction. + OdrediÅ¡te transakcije + + + + Amount removed from or added to balance. + Iznos odbijen od ili dodan k saldu. + + + + TransactionView + + + + All + Sve + + + + Today + Danas + + + + This week + Ovaj tjedan + + + + This month + Ovaj mjesec + + + + Last month + ProÅ¡li mjesec + + + + This year + Ove godine + + + + Range... + Raspon... + + + + Received with + Primljeno s + + + + Sent to + Poslano za + + + + To yourself + Tebi + + + + Mined + Rudareno + + + + Other + Ostalo + + + + Enter address or label to search + Unesite adresu ili oznaku za pretraživanje + + + + Min amount + Min iznos + + + + Copy address + Kopirati adresu + + + + Copy label + Kopirati oznaku + + + + Copy amount + + + + + Edit label + Izmjeniti oznaku + + + + Show details... + Prikazati detalje... + + + + Export Transaction Data + Izvoz podataka transakcija + + + + Comma separated file (*.csv) + Datoteka podataka odvojenih zarezima (*.csv) + + + + Confirmed + Potvrđeno + + + + Date + Datum + + + + Type + Tip + + + + Label + Oznaka + + + + Address + Adresa + + + + Amount + Iznos + + + + ID + ID + + + + Error exporting + Izvoz pogreÅ¡ke + + + + Could not write to file %1. + Ne mogu pisati u datoteku %1. + + + + Range: + Raspon: + + + + to + za + + + + WalletModel + + + Sending... + Slanje... + + + + bitcoin-core + + + Bitcoin version + Bitcoin verzija + + + + Usage: + Upotreba: + + + + Send command to -server or bitcoind + PoÅ¡alji komandu usluzi -server ili bitcoind + + + + List commands + Prikaži komande + + + + Get help for a command + Potraži pomoć za komandu + + + + Options: + Postavke: + + + + Specify configuration file (default: bitcoin.conf) + Odredi konfiguracijsku datoteku (ugrađeni izbor: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + Odredi proces ID datoteku (ugrađeni izbor: bitcoin.pid) + + + + Generate coins + Generiraj novčiće + + + + Don't generate coins + Ne generiraj novčiće + + + + Start minimized + Pokreni minimiziran + + + + Specify data directory + Odredi direktorij za datoteke + + + + Specify connection timeout (in milliseconds) + Odredi vremenski prozor za spajanje na mrežu (u milisekundama) + + + + Connect through socks4 proxy + Poveži se kroz socks4 proxy + + + + Allow DNS lookups for addnode and connect + Dozvoli DNS upite za dodavanje nodova i povezivanje + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + Unesite nod s kojim se želite spojiti + + + + Connect only to the specified node + Poveži se samo sa određenim nodom + + + + Don't accept connections from outside + Ne prihvaćaj povezivanje izvana + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + Ne pokuÅ¡aj koristiti UPnP da otvoriÅ¡ port za uslugu + + + + Attempt to use UPnP to map the listening port + PokuÅ¡aj koristiti UPnP da otvoriÅ¡ port za uslugu + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + Prihvati komande iz tekst moda i JSON-RPC + + + + Run in the background as a daemon and accept commands + IzvrÅ¡avaj u pozadini kao uslužnik i prihvaćaj komande + + + + Use the test network + Koristi test mrežu + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + Korisničko ime za JSON-RPC veze + + + + Password for JSON-RPC connections + Lozinka za JSON-RPC veze + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Prihvaćaj JSON-RPC povezivanje na portu broj <port> (ugrađeni izbor: 8332) + + + + Allow JSON-RPC connections from specified IP address + Dozvoli JSON-RPC povezivanje s određene IP adrese + + + + Send commands to node running on <ip> (default: 127.0.0.1) + PoÅ¡alji komande nodu na adresi <ip> (ugrađeni izbor: 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + Podesi memorijski prostor za ključeve na <n> (ugrađeni izbor: 100) + + + + Rescan the block chain for missing wallet transactions + Ponovno pretraži lanac blokova za transakcije koje nedostaju + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + SSL postavke: (za detalje o podeÅ¡avanju SSL opcija vidi Bitcoin Wiki) + + + + Use OpenSSL (https) for JSON-RPC connections + Koristi OpenSSL (https) za JSON-RPC povezivanje + + + + Server certificate file (default: server.cert) + Uslužnikov SSL certifikat (ugrađeni izbor: server.cert) + + + + Server private key (default: server.pem) + Uslužnikov privatni ključ (ugrađeni izbor: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Prihvaljivi načini Å¡ifriranja (ugrađeni izbor: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Ova poruka za pomoć + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Program ne može pristupiti direktoriju s datotekama %s. Bitcoin program je vjerojatno već pokrenut. + + + + Loading addresses... + Učitavanje adresa... + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + Učitavanje indeksa blokova... + + + + Loading wallet... + Učitavanje novčanika... + + + + Rescanning... + Rescaniranje + + + + Done loading + Učitavanje gotovo + + + + Invalid -proxy address + Nevaljala -proxy adresa + + + + Invalid amount for -paytxfee=<amount> + Nevaljali iznos za opciju -paytxfee=<amount> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Upozorenje: -paytxfee je podeÅ¡en na preveliki iznos. To je iznos koji ćete platiti za obradu transakcije. + + + + Error: CreateThread(StartNode) failed + GreÅ¡ka: CreateThread(StartNode) nije uspjela + + + + Warning: Disk space is low + Upozorenje: Malo diskovnog prostora + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Program ne može koristiti port %d na ovom računalu. Bitcoin program je vjerojatno već pokrenut. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + Upozorenje: Molimo provjerite jesu li datum i vrijeme na vaÅ¡em računalu točni. Ako vaÅ¡ sat ide krivo, Bitcoin neće raditi ispravno. + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts index bc48ed8..7a66fa6 100644 --- a/src/qt/locale/bitcoin_hu.ts +++ b/src/qt/locale/bitcoin_hu.ts @@ -14,19 +14,14 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Szerzői jog © 2009-2011 Bitcoin Developers - -Ez egy kísérleti program. -MIT/X11 szoftverlicenc alatt kiadva, lásd a mellékelt fájlt license.txt vagy http://www.opensource.org/licenses/mit-license.php. - -Ez a termék az OpenSSL Project által lett kifejlesztve az OpenSSL Toolkit (http://www.openssl.org/) és kriptográfiai szoftvertben való felhasználásra, írta Eric Young (eay@cryptsoft.com) és UPnP szoftver, írta Thomas Bernard. + @@ -68,31 +63,66 @@ Ez a termék az OpenSSL Project által lett kifejlesztve az OpenSSL Toolkit (htt + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. A kiválasztott cím törlése a listáról. Csak a küldő címek törölhetőek. - + &Delete &Törlés - + + Copy address + Cím másolása + + + + Copy label + Címke másolása + + + + Edit + + + + + Delete + + + + Export Address Book Data Címjegyzék adatainak exportálása - + Comma separated file (*.csv) Vesszővel elválasztott fájl (*. csv) - + Error exporting Hiba exportálás közben - + Could not write to file %1. %1 nevű fájl nem írható. @@ -124,125 +154,132 @@ Ez a termék az OpenSSL Project által lett kifejlesztve az OpenSSL Toolkit (htt + TextLabel SzövegCímke - + Enter passphrase Add meg a jelszót - + New passphrase Új jelszó - + Repeat new passphrase Új jelszó újra - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Írd be az új jelszót a tárcához.<br/>Használj legalább 10<br/>véletlenszerű karaktert</b> vagy <b>legalább nyolc szót</b>. - + Encrypt wallet Tárca kódolása - + This operation needs your wallet passphrase to unlock the wallet. A tárcád megnyitásához a műveletnek szüksége van a tárcád jelszavára. - + Unlock wallet Tárca megnyitása - + This operation needs your wallet passphrase to decrypt the wallet. A tárcád dekódolásához a műveletnek szüksége van a tárcád jelszavára. - + Decrypt wallet Tárca dekódolása - + Change passphrase Jelszó megváltoztatása - + Enter the old and new passphrase to the wallet. Írd be a tárca régi és új jelszavát. - + Confirm wallet encryption Biztosan kódolni akarod a tárcát? - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? FIGYELEM: Ha kódolod a tárcát, és elveszíted a jelszavad, akkor <b>AZ ÖSSZES BITCOINODAT IS EL FOGOD VESZÍTENI!</b> Biztosan kódolni akarod a tárcát? - - + + Wallet encrypted Tárca kódolva - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Ne feledd, hogy a tárca titkosítása sem nyújt teljes védelmet az adathalász programok fertőzésével szemben. + + Bitcoin 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. + - - - - + + + Warning: The Caps Lock key is on. + + + + + + + Wallet encryption failed Tárca kódolása sikertelen. - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Tárca kódolása belső hiba miatt sikertelen. A tárcád nem lett kódolva. - - + + The supplied passphrases do not match. A megadott jelszavak nem egyeznek. - + Wallet unlock failed Tárca megnyitása sikertelen - - + + The passphrase entered for the wallet decryption was incorrect. Hibás jelszó. - + Wallet decryption failed Dekódolás sikertelen. - + Wallet passphrase was succesfully changed. Jelszó megváltoztatva. @@ -250,247 +287,278 @@ Biztosan kódolni akarod a tárcát? BitcoinGUI - + Bitcoin Wallet Bitcoin-tárca - + + Synchronizing with network... Szinkronizálás a hálózattal... - + Block chain synchronization in progress Blokklánc-szinkronizálás folyamatban - + &Overview &Áttekintés - + Show general overview of wallet Tárca általános áttekintése - + &Transactions &Tranzakciók - + Browse transaction history Tranzakciótörténet megtekintése - + &Address Book Cím&jegyzék - + Edit the list of stored addresses and labels Tárolt címek és címkék listájának szerkesztése - + &Receive coins Érmék &fogadása - + Show the list of addresses for receiving payments Kiizetést fogadó címek listája - + &Send coins Érmék &küldése - + Send coins to a bitcoin address Érmék küldése megadott címre - + + Sign &message + + + + + Prove you control an address + + + + E&xit &Kilépés - + Quit application Kilépés - + &About %1 &A %1-ról - + Show information about Bitcoin Információk a Bitcoinról - + + About &Qt + + + + + Show information about Qt + + + + &Options... &Opciók... - + Modify configuration options for bitcoin Bitcoin konfigurációs opciók - + Open &Bitcoin A &Bitcoin megnyitása - + Show the Bitcoin window A Bitcoin-ablak mutatása - + &Export... &Exportálás... - - Export the current view to a file - Jelenlegi nézet exportálása fájlba + + Export the data in the current tab to a file + - + &Encrypt Wallet Tárca &kódolása - + Encrypt or decrypt wallet Tárca kódolása vagy dekódolása - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase Jelszó &megváltoztatása - + Change the passphrase used for wallet encryption Tárcakódoló jelszó megváltoztatása - + &File &Fájl - + &Settings &Beállítások - + &Help &Súgó - + Tabs toolbar Fül eszköztár - + Actions toolbar Parancsok eszköztár - + [testnet] [teszthálózat] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n aktív kapcsolat a Bitcoin-hálózattal%n aktív kapcsolat a Bitcoin-hálózattal - + Downloaded %1 of %2 blocks of transaction history. %1 blokk letöltve a tranzakciótörténet %2 blokkjából. - + Downloaded %1 blocks of transaction history. %1 blokk letöltve a tranzakciótörténetből. - + %n second(s) ago %n másodperccel ezelőtt%n másodperccel ezelőtt - + %n minute(s) ago %n perccel ezelőtt%n perccel ezelőtt - + %n hour(s) ago %n órával ezelőtt%n órával ezelőtt - + %n day(s) ago %n nappal ezelőtt%n nappal ezelőtt - + Up to date Naprakész - + Catching up... Frissítés... - + Last received block was generated %1. Az utolsóként kapott blokk generálva: %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Ez a tranzakció túllépi a mérethatárt, de %1 tranzakciós díj ellenében így is elküldheted. Ezt a plusz összeget a tranzakcióidat feldolgozó csomópontok kapják, így magát a hálózatot támogatod vele. Hajlandó vagy megfizetni a díjat? - + Sending... Küldés... - + Sent transaction Tranzakció elküldve. - + Incoming transaction Beérkező tranzakció - + Date: %1 Amount: %2 Type: %3 @@ -503,15 +571,35 @@ Cím: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Tárca <b>kódolva</b> és jelenleg <b>nyitva</b>. - + Wallet is <b>encrypted</b> and currently <b>locked</b> Tárca <b>kódolva</b> és jelenleg <b>zárva</b>. + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -579,22 +667,22 @@ Cím: %4 Küldő cím szerkesztése - + The entered address "%1" is already in the address book. A megadott "%1" cím már szerepel a címjegyzékben. - + The entered address "%1" is not a valid bitcoin address. A megadott "%1" cím nem egy érvényes Bitcoin-cím. - + Could not unlock wallet. Tárca feloldása sikertelen - + New key generation failed. Új kulcs generálása sikertelen @@ -673,8 +761,8 @@ Cím: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Opcionális, kB-onkénti tranzakciós díj a tranzakcióid minél gyorsabb feldolgozásának elősegítésére. A legtöbb tranzakció 1 kB-os. 0,01 BTC ajánlott. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + @@ -683,8 +771,98 @@ Cím: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Opcionális, kB-onkénti tranzakciós díj a tranzakcióid minél gyorsabb feldolgozásának elősegítésére. A legtöbb tranzakció 1 kB-os. 0,01 BTC ajánlott. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Címzett címe (pl.: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L ) + + + + Choose adress from address book + Válassz egy címet a címjegyzékből + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Cím beillesztése a vágólapról + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + A kiválasztott cím másolása a vágólapra + + + + &Copy to Clipboard + &Másolás a vágólapra + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + @@ -752,7 +930,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> @@ -777,16 +955,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Párbeszéd + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + Üzenet: + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Érmék küldése @@ -802,81 +1033,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + + + + Clear all Mindent töröl - + Balance: Egyenleg: - + 123.456 BTC 123.456 BTC - + Confirm the send action Küldés megerősítése - + &Send &Küldés - + <b>%1</b> to %2 (%3) <b>%1</b> %2-re (%3) - + Confirm send coins Küldés megerősítése - + Are you sure you want to send %1? Valóban el akarsz küldeni %1-t? - + and és - + The recepient address is not valid, please recheck. A címzett címe érvénytelen, kérlek, ellenőrizd. - + The amount to pay must be larger than 0. A fizetendő összegnek nagyobbnak kell lennie 0-nál. - + Amount exceeds your balance Nincs ennyi bitcoin az egyenlegeden. - + Total exceeds your balance when the %1 transaction fee is included A küldeni kívánt összeg és a %1 tranzakciós díj együtt meghaladja az egyenlegeden rendelkezésedre álló összeget. - + Duplicate address found, can only send to each address once in one send operation Többször szerepel ugyanaz a cím. Egy küldési műveletben egy címre csak egyszer lehet küldeni. - + Error: Transaction creation failed Hiba: nem sikerült létrehozni a tranzakciót - + Error: 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. Hiba: a tranzakciót elutasították. Ezt az okozhatja, ha már elköltöttél valamennyi érmét a tárcádból - például ha a wallet.dat-od egy másolatát használtad, és így az elköltés csak abban lett jelölve, de itt nem. @@ -949,135 +1185,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Megnyitva %1 blokkra - + Open until %1 Megnyitva %1-ig - + %1/offline? %1/offline? - + %1/unconfirmed %1/megerősítetlen - + %1 confirmations %1 megerősítés - + <b>Status:</b> <b>Állapot:</b> - + , has not been successfully broadcast yet , még nem sikerült elküldeni. - + , broadcast through %1 node , %1 csomóponton keresztül elküldve. - + , broadcast through %1 nodes , elküldve %1 csomóponton keresztül. - + <b>Date:</b> <b>Dátum:</b> - + <b>Source:</b> Generated<br> <b>Forrás:</b> Generálva <br> - - + + <b>From:</b> <b>Å°rlap:</b> - + unknown ismeretlen - - - + + + <b>To:</b> <b>Címzett:</b> - + (yours, label: (tiéd, címke: - + (yours) (tiéd) - - - - + + + + <b>Credit:</b> <b>Jóváírás</b> - + (%1 matures in %2 more blocks) (%1, %2 múlva készül el) - + (not accepted) (elutasítva) - - - + + + <b>Debit:</b> <b>Terhelés</b> - + <b>Transaction fee:</b> <b>Tranzakciós díj:</b> - + <b>Net amount:</b> <b>Nettó összeg:</b> - + Message: Üzenet: - + Comment: Megjegyzés: - + + Transaction ID: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. A frissen generált érméket csak 120 blokkal később tudod elkölteni. Ez a blokk nyomban szétküldésre került a hálózatba, amint legeneráltad, hogy hozzáadhassák a blokklánchoz. Ha nem kerül be a láncba, úgy az állapota "elutasítva"-ra módosul, és nem költheted el az érméket. Ez akkor következhet be időnként, ha egy másik csomópont mindössze néhány másodperc különbséggel generált le egy blokkot a tiédhez képest. @@ -1164,56 +1405,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Erről az IP-címről + Received from + - + Sent to Erre a címre - - Sent to IP - Erre az IP-címre: - - - + Payment to yourself Magadnak kifizetve - + Mined Kibányászva - + (n/a) (nincs) - + Transaction status. Hover over this field to show number of confirmations. Tranzakció állapota. Húzd ide a kurzort, hogy lásd a megerősítések számát. - + Date and time that the transaction was received. Tranzakció fogadásának dátuma és időpontja. - + Type of transaction. Tranzakció típusa. - + Destination address of transaction. A tranzakció címzettjének címe. - + Amount removed from or added to balance. Az egyenleghez jóváírt vagy ráterhelt összeg. @@ -1292,16 +1528,21 @@ p, li { white-space: pre-wrap; } Minimális összeg - + Copy address Cím másolása - + Copy label Címke másolása + + Copy amount + + + Edit label Címke szerkesztése @@ -1312,67 +1553,67 @@ p, li { white-space: pre-wrap; } Részletek... - + Export Transaction Data Tranzakció adatainak exportálása - + Comma separated file (*.csv) Vesszővel elválasztott fájl (*.csv) - + Confirmed Megerősítve - + Date Dátum - + Type Típus - + Label Címke - + Address Cím - + Amount Összeg - + ID Azonosító - + Error exporting Hiba lépett fel exportálás közben - + Could not write to file %1. %1 fájlba való kiírás sikertelen. - + Range: Tartomány: - + to meddig @@ -1380,7 +1621,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Küldés ... @@ -1399,942 +1640,369 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind Parancs küldése a -serverhez vagy a bitcoindhez - List commands - + List commands Parancsok kilistázása - Get help for a command - + Get help for a command Segítség egy parancsról - Options: - + Options: Opciók - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Konfigurációs fájl (alapértelmezett: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) pid-fájl (alapértelmezett: bitcoind.pid) - Generate coins - + Generate coins Érmék generálása - Don't generate coins - + Don't generate coins Bitcoin-generálás leállítása - Start minimized - + Start minimized Indítás lekicsinyítve - Specify data directory - + Specify data directory Adatkönyvtár - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Csatlakozás időkerete (milliszekundumban) - Connect through socks4 proxy - + Connect through socks4 proxy Csatlakozás SOCKS4 proxyn keresztül - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect DNS-kikeresés engedélyezése az addnode-nál és a connect-nél - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to Elérendő csomópont megadása - - Connect only to the specified node - + + Connect only to the specified node Csatlakozás csak a megadott csomóponthoz - - Don't accept connections from outside - + + Don't accept connections from outside Külső csatlakozások elutasítása - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port UPnP-használat letiltása a figyelő port feltérképezésénél - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port UPnP-használat engedélyezése a figyelő port feltérképezésénél - - Fee per kB to add to transactions you send - - kB-onként felajánlandó díj az általad küldött tranzakciókhoz - + + Fee per kB to add to transactions you send + - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands Parancssoros és JSON-RPC parancsok elfogadása - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands Háttérben futtatás daemonként és parancsok elfogadása - - Use the test network - + + Use the test network Teszthálózat használata - - Username for JSON-RPC connections - + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections Felhasználói név JSON-RPC csatlakozásokhoz - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Jelszó JSON-RPC csatlakozásokhoz - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) JSON-RPC csatlakozásokhoz figyelendő <port> (alapértelmezett: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address JSON-RPC csatlakozások engedélyezése meghatározott IP-címről - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) Parancsok küldése <ip> címen működő csomóponthoz (alapértelmezett: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Kulcskarika mérete <n> (alapértelmezett: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions Blokklánc újraszkennelése hiányzó tárca-tranzakciók után - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) SSL-opciók: (lásd a Bitcoin Wiki SSL-beállítási instrukcióit) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections OpenSSL (https) használata JSON-RPC csatalkozásokhoz - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) Szervertanúsítvány-fájl (alapértelmezett: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Szerver titkos kulcsa (alapértelmezett: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Elfogadható rejtjelkulcsok (alapértelmezett: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH ) - - This help message - + + This help message Ez a súgó-üzenet - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. Az %s adatkönyvtár nem zárható. A Bitcoin valószínűleg fut már. - + Loading addresses... Címek betöltése... - - Error loading addr.dat - - Hiba az addr.dat betöltése közben - + + Error loading addr.dat + - - Loading block index... - Blokkindex betöltése... + + Error loading blkindex.dat + - - Error loading blkindex.dat - - Hiba a blkindex.dat betöltése közben - + + Error loading wallet.dat: Wallet corrupted + - - Loading wallet... - Tárca betöltése... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + - - Error loading wallet.dat: Wallet corrupted - - Hiba a wallet.dat betöltése közben: meghibásodott tárca - + + Wallet needed to be rewritten: restart Bitcoin to complete + - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Hiba a wallet.dat betöltése közben: ehhez a tárcához újabb verziójú Bitcoin-kliens szükséges - + + Error loading wallet.dat + - - Error loading wallet.dat - - Hiba a wallet.dat betöltése közben - + + Loading block index... + Blokkindex betöltése... - + + Loading wallet... + Tárca betöltése... + + + Rescanning... Újraszkennelés... - + Done loading Betöltés befejezve. - + Invalid -proxy address Érvénytelen -proxy cím - + Invalid amount for -paytxfee=<amount> Étvénytelen -paytxfee=<összeg> összeg - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Figyelem: a -paytxfee nagyon magas. Ennyi tranzakciós díjat fogsz fizetni, ha elküldöd a tranzakciót. - + Error: CreateThread(StartNode) failed Hiba: CreateThread(StartNode) sikertelen - + Warning: Disk space is low Figyelem: kevés a hely a lemezen. - + Unable to bind to port %d on this computer. Bitcoin is probably already running. A %d port nem elérhető ezen a gépen. A Bitcoin valószínűleg fut már. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Ez a tranzakció túllépi a mérethatárt, de %s tranzakciós díj ellenében így is elküldheted. Ezt a plusz összeget a tranzakcióidat feldolgozó csomópontok kapják, így magát a hálózatot támogatod vele. Hajlandó vagy megfizetni a díjat? - - - - Enter the current passphrase to the wallet. - Add meg a tárca jelenlegi jelszavát. - - - - Passphrase - Jelszó: - - - - Please supply the current wallet decryption passphrase. - Add meg a tárca jelenlegi dekódoló jelszavát. - - - - The passphrase entered for the wallet decryption was incorrect. - A megadott tárca-dekódoló jelszó helytelen. - - - - Status - Állapot - - - - Date - Dátum - - - - Description - Leírás - - - - Debit - Terhelés - - - - Credit - Jóváírás - - - Open for %d blocks - %d blokkra megnyitva - - - - Open until %s - %s-ig megnyitva - - - - %d/offline? - %d/offline? - - - - %d/unconfirmed - %d/megerősítetlen - - - - %d confirmations - %d megerősítés - - - - Generated - Legenerálva - - - - Generated (%s matures in %d more blocks) - Legenerálva (%s érett %d blokkból) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Legenerálva - Figyelem: Ezt a blokkot egyetlen másik csomópont sem kapta meg, így valószínűleg nem lesz elfogadva! - - - - Generated (not accepted) - Legenerálva (elutasítva) - - - - From: - Küldő: - - - - Received with: - Erre a címre: - - - - Payment to yourself - Magadnak kifizetve - - - - To: - Címzett: - - - - Generating - Generálás - - - - (not connected) - (nincs kapcsolat) - - - - %d connections %d blocks %d transactions - %d kapcsolat %d blokk %d tranzakció - - - - Wallet already encrypted. - A tárca már kódolt. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Add meg a tárca új jelszavát. -Használj 10 vagy több véletlenszerű karaktert, vagy nyolc vagy több szót. - - - - Error: The supplied passphrase was too short. - Hiba: a megadott jelszó túl rövid. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - FIGYELEM: Ha lekódolod a tárcátm és elveszíted a jelszavad, úgy AZ ÖSSZES BITCOINODAT IS EL FOGOD VESZÍTENI! -Valóban szeretnéd lekódolni a tárcádat? - - - - Please re-enter your new wallet passphrase. - Add meg az új jelszavadat a tárcádhoz. - - - - Error: the supplied passphrases didn't match. - Hiba: a megadott jelszavak nem egyeznek. - - - - Wallet encryption failed. - Tárcakódolás sikertelen. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Tárca lekódolva. -Ne feledd, hogy a gépedet megfertőző ártalmas programokkal szemben a tárcakódolás sem nyújt teljes védelmet. - - - - Wallet is unencrypted, please encrypt it first. - A tárca még nincs lekódolva. Előbb kódold le. - - - - Enter the new passphrase for the wallet. - Add meg a tárca új jelszavát. - - - - Re-enter the new passphrase for the wallet. - Add meg újra a tárca jelszavát. - - - - Wallet Passphrase Changed. - Tárca jelszava megváltoztatva. - - - - New Receiving Address - Új fogadó cím. - - - - You should use a new address for each payment you receive. - -Label - Érdemes minden fizetést új címmel fogadnod. - -Címke - - - - <b>Status:</b> - <b>Állapot</b> - - - - , has not been successfully broadcast yet - , még nem sikerült elküldeni. - - - - , broadcast through %d node - , elküldve %d csomóponton keresztül - - - - , broadcast through %d nodes - , elküldve %d csomóponton keresztül - - - - <b>Date:</b> - <b>Dátum:</b> - - - - <b>Source:</b> Generated<br> - <b>Forrás:</b> Legenerálva<br> - - - - <b>From:</b> - <b>Küldő:</b> - - - - unknown - ismeretlen - - - - <b>To:</b> - <b>Címzett:</b> - - - - (yours, label: - (tiéd, címke: - - - - (yours) - (tiéd) - - - - <b>Credit:</b> - <b>Jóváírás:</b> - - - - (%s matures in %d more blocks) - (%s, %d blokk múlva készül el) - - - - (not accepted) - (elutasítva) - - - - <b>Debit:</b> - <b>Terhelés:</b> - - - - <b>Transaction fee:</b> - <b>Tranzakciós díj:</b> - - - - <b>Net amount:</b> - <b>Nettó összeg:</b> - - - - Message: - Üzenet: - - - - Comment: - Megjegyzés: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - A frissen generált érméket csak 120 blokkal később tudod elkölteni. Ez a blokk nyomban szétküldésre került a hálózatba, amint legeneráltad, hogy hozzáadhassák a blokklánchoz. Ha nem kerül be a láncba, úgy az állapota "elutasítva"-ra módosul, és nem költheted el az érméket. Ez akkor következhet be időnként, ha egy másik csomópont mindössze néhány másodperc különbséggel generált le egy blokkot a tiédhez képest. - - - - Cannot write autostart/bitcoin.desktop file - Az autostart/bitcoin.desktop fájl nem írható. - - - - Main - Fő - - - - &Start Bitcoin on window system startup - A Bitcoin &indítása a rendszer indulásakor - - - - &Minimize on close - &Kicsinyítés záráskor - - - - version %s - %s verzió - - - - Error in amount - Hiba az összegben - - - - Send Coins - Érmék küldése - - - - Amount exceeds your balance - Nincs ennyi bitcoinod. - - - - Total exceeds your balance when the - Az összeg és a tranzakciós díj együtt - - - - transaction fee is included - meghaladja az egyenlegedet. - - - - Payment sent - Elküldve. - - - - Sending... - Küldés... - - - - Invalid address - Érvénytelen cím - - - - Sending %s to %s - %s küldése ide: %s - - - - CANCELLED - MEGSZAKÍTVA - - - - Cancelled - Megszakítva - - - - Transfer cancelled - Átutalás megszakítva - - - - Error: - Hiba: - - - - Insufficient funds - Nincs elég bitcoinod. - - - - Connecting... - Csatlakozás... - - - - Unable to connect - Csatlakozás sikertelen. - - - - Requesting public key... - Nyilvános kulcs kérése... - - - - Received public key... - Nyilvános kulcs fogadva... - - - - Recipient is not accepting transactions sent by IP address - A címzett nem fogad IP-címre küldött tranzakciókat. - - - - Transfer was not accepted - Az átutalást elutasították. - - - - Invalid response received - Érvénytelen válasz - - - - Creating transaction... - Tranzakció létrehozása... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Ehhez a tranzakcióhoz legalább %s díj szükséges az összege, az összetettsége vagy frissen kapott bitcoinok használata miatt. - - - - Transaction creation failed - Tranzakció létrehozása sikertelen. - - - - Transaction aborted - Tranzakció megszakítva. - - - - Lost connection, transaction cancelled - Megszakadt a kapcsolat, tranzakció megszakítva. - - - - Sending payment... - Küldés... - - - - 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. - A tranzakciót elutasították. Ezt az okozhatja, ha már elköltöttél valamennyi érmét a tárcádból - például ha a wallet.dat-od egy másolatát használtad, és így az elköltés csak abban lett jelölve, de itt nem. - - - - Waiting for confirmation... - Várakozás megerősítésre... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - A bitcoinok el lettek küldve, de a címzett nem tudta ellenőrizni. -A tranzakció feljegyzésre került és jóvá lesz írva a címzettnek, -de a megjegyzés-információ üres lesz. - - - - Payment was sent, but an invalid response was received - A bitcoinok el lettek küldve, de érvénytelen válasz érkezett a küldésre. - - - - Payment completed - Sikeresen elküldve. - - - - Name - Név - - - - Address - Cím - - - - Label - Címke - - - - Bitcoin Address - Bitcoin-cím - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Ez az egyik saját fogadó címed, ezért nem jegyezhető be a címtárba. - - - - Edit Address - Cím szerkesztése - - - - Edit Address Label - Cím címkéjének szerkesztése - - - - Add Address - Cím hozzáadása - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Bitcoin - generálás - - - - Bitcoin - (not connected) - Bitcoin - (nincs kapcsolat) - - - - &Open Bitcoin - Bitcoin megnyitása - - - - &Send Bitcoins - Küldés - - - - O&ptions... - O&pciók... - - - - E&xit - &Kilépés - - - - Program has crashed and will terminate. - A program összeomlott és kikapcsol. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Figyelem: Ellenőrizd, hogy helyesen van-e beállítva a gépeden a dátum és az idő. A Bitcoin nem fog megfelelően működni, ha rosszul van beállítvaaz órád. - + beta béta - - main - - - Bitcoin Qt - Bitcoin Qt - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts index 02d0baa..98dc47e 100644 --- a/src/qt/locale/bitcoin_it.ts +++ b/src/qt/locale/bitcoin_it.ts @@ -14,20 +14,20 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers Questo è un software sperimentale. -Distribuito sotto la licenza software MIT/X11, guarda il file license.txt incluso oppure su http://www.opensource.org/licenses/mit-license.php. +Distribuito sotto la licenza software MIT/X11, vedi il file license.txt incluso oppure su http://www.opensource.org/licenses/mit-license.php. -Questo prodotto include software sviluppato dal progetto OpenSSL per l&apos;uso del Toolkit OpenSSL (http://www.openssl.org/), software crittografico scritto da Eric Young (eay@cryptsoft.com) e software UPnP scritto da Thomas Bernard. +Questo prodotto include software sviluppato dal progetto OpenSSL per l'uso del Toolkit OpenSSL (http://www.openssl.org/), software crittografico scritto da Eric Young (eay@cryptsoft.com) e software UPnP scritto da Thomas Bernard. @@ -69,31 +69,66 @@ Questo prodotto include software sviluppato dal progetto OpenSSL per l&apos; + Show &QR Code + Mostra il codice &QR + + + + Sign a message to prove you own this address + Firma un messaggio per dimostrare di possedere questo indirizzo + + + + &Sign Message + &Firma il messaggio + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Cancella l'indirizzo attualmente selezionato dalla lista. Solo indirizzi d'invio possono essere cancellati. - + &Delete &Cancella - + + Copy address + Copia l'indirizzo + + + + Copy label + Copia l'etichetta + + + + Edit + Modifica + + + + Delete + Cancella + + + Export Address Book Data Esporta gli indirizzi della rubrica - + Comma separated file (*.csv) Testo CSV (*.csv) - + Error exporting Errore nell'esportazione - + Could not write to file %1. Impossibile scrivere sul file %1. @@ -125,125 +160,132 @@ Questo prodotto include software sviluppato dal progetto OpenSSL per l&apos; + TextLabel Etichetta - + Enter passphrase Inserisci la passphrase - + New passphrase Nuova passphrase - + Repeat new passphrase Ripeti la passphrase - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Inserisci la passphrase per il portamonete.<br/>Per piacere usare unapassphrase di <b>10 o più caratteri casuali</b>, o <b>otto o più parole</b>. - + Encrypt wallet Cifra il portamonete - + This operation needs your wallet passphrase to unlock the wallet. Quest'operazione necessita della passphrase per sbloccare il portamonete. - + Unlock wallet Sblocca il portamonete - + This operation needs your wallet passphrase to decrypt the wallet. Quest'operazione necessita della passphrase per decifrare il portamonete, - + Decrypt wallet Decifra il portamonete - + Change passphrase Cambia la passphrase - + Enter the old and new passphrase to the wallet. Inserisci la vecchia e la nuova passphrase per il portamonete. - + Confirm wallet encryption Conferma la cifratura del portamonete - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? - ATTENZIONE: se si cifra il portamonete e si perde la frase d'ordine, <b>SI PERDERANNO TUTTI I PROPRI BITCOIN</b>! + ATTENZIONE: se si cifra il portamonete e si perde la frase d'ordine, <b>SI PERDERANNO TUTTI I PROPRI BITCOIN</b>! Si è sicuri di voler cifrare il portamonete? - - + + Wallet encrypted Portamonete cifrato - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Ricorda che la cifratura del portamonete non protegge del tutto i tuoi bitcoin dal furto da parte di malware che infettasse il tuo computer. + + Bitcoin 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. + Bitcoin verrà ora chiuso per finire il processo di crittazione. Ricorda che criptare il tuo portamonete non può fornire una protezione totale contro furti causati da malware che dovessero infettare il tuo computer. - - - - + + + Warning: The Caps Lock key is on. + Attenzione: tasto Blocco maiuscole attivo. + + + + + + Wallet encryption failed Cifratura del portamonete fallita - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Cifratura del portamonete fallita a causa di un errore interno. Il portamonete non è stato cifrato. - - + + The supplied passphrases do not match. Le passphrase inserite non corrispondono. - + Wallet unlock failed Sblocco del portamonete fallito - - + + The passphrase entered for the wallet decryption was incorrect. La passphrase inserita per la decifrazione del portamonete è errata. - + Wallet decryption failed Decifrazione del portamonete fallita - + Wallet passphrase was succesfully changed. Passphrase del portamonete modificata con successo. @@ -251,247 +293,278 @@ Si è sicuri di voler cifrare il portamonete? BitcoinGUI - + Bitcoin Wallet Portamonete di bitcoin - + + Synchronizing with network... Sto sincronizzando con la rete... - + Block chain synchronization in progress sincronizzazione della catena di blocchi in corso - + &Overview &Sintesi - + Show general overview of wallet Mostra lo stato generale del portamonete - + &Transactions &Transazioni - + Browse transaction history Cerca nelle transazioni - + &Address Book &Rubrica - + Edit the list of stored addresses and labels Modifica la lista degli indirizzi salvati e delle etichette - + &Receive coins &Ricevi monete - + Show the list of addresses for receiving payments Mostra la lista di indirizzi su cui ricevere pagamenti - + &Send coins &Invia monete - + Send coins to a bitcoin address Invia monete ad un indirizzo bitcoin - + + Sign &message + Firma il &messaggio + + + + Prove you control an address + Dimostra di controllare un indirizzo + + + E&xit &Esci - + Quit application Chiudi applicazione - + &About %1 &Informazioni su %1 - + Show information about Bitcoin Mostra informazioni su Bitcoin - + + About &Qt + Informazioni su &Qt + + + + Show information about Qt + Mostra informazioni su Qt + + + &Options... &Opzioni... - + Modify configuration options for bitcoin Modifica configurazione opzioni per bitcoin - + Open &Bitcoin Apri &Bitcoin - + Show the Bitcoin window Mostra la finestra Bitcoin - + &Export... &Esporta... - - Export the current view to a file - Esporta la visualizzazione corrente su file + + Export the data in the current tab to a file + - + &Encrypt Wallet &Cifra il portamonete - + Encrypt or decrypt wallet Cifra o decifra il portamonete - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase &Cambia la passphrase - + Change the passphrase used for wallet encryption Cambia la passphrase per la cifratura del portamonete - + &File &File - + &Settings &Impostazioni - + &Help &Aiuto - + Tabs toolbar Barra degli strumenti "Tabs" - + Actions toolbar Barra degli strumenti "Azioni" - + [testnet] [testnet] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n connessione attiva alla rete Bitcoin%n connessioni attive alla rete Bitcoin - + Downloaded %1 of %2 blocks of transaction history. Scaricati %1 dei %2 blocchi dello storico transazioni. - + Downloaded %1 blocks of transaction history. Scaricati %1 blocchi dello storico transazioni. - + %n second(s) ago %n secondo fa%n secondi fa - + %n minute(s) ago %n minuto fa%n minuti fa - + %n hour(s) ago %n ora fa%n ore fa - + %n day(s) ago %n giorno fa%n giorni fa - + Up to date Aggiornato - + Catching up... In aggiornamento... - + Last received block was generated %1. L'ultimo blocco ricevuto è stato generato %1 - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Questa transazione è superiore al limite di dimensione. È comunque possibile inviarla con una commissione di %1, che va ai nodi che processano la tua transazione e contribuisce a sostenere la rete. Vuoi pagare la commissione? - + Sending... Invio... - + Sent transaction Transazione inviata - + Incoming transaction Transazione ricevuta - + Date: %1 Amount: %2 Type: %3 @@ -505,15 +578,35 @@ Indirizzo: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Il portamonete è <b>cifrato</b> e attualmente <b>sbloccato</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> Il portamonete è <b>cifrato</b> e attualmente <b>bloccato</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -581,22 +674,22 @@ Indirizzo: %4 Modifica indirizzo d'invio - + The entered address "%1" is already in the address book. L'indirizzo inserito "%1" è già in rubrica. - + The entered address "%1" is not a valid bitcoin address. L'indirizzo inserito "%1" non è un indirizzo bitcoin valido. - + Could not unlock wallet. Impossibile sbloccare il portamonete. - + New key generation failed. Generazione della nuova chiave non riuscita. @@ -675,8 +768,8 @@ Indirizzo: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Commissione di transazione per ogni kB; è opzionale e contribuisce ad assicurare che le transazioni siano elaborate velocemente. La maggior parte delle transazioni è 1kB. Commissione raccomandata 0,01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Commissione di transazione per kB; è opzionale e contribuisce ad assicurare che le transazioni siano elaborate velocemente. Le transazioni sono per la maggior parte da 1 kB. Commissione raccomandata 0,01. @@ -685,8 +778,98 @@ Indirizzo: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Commissione di transazione per ogni kB; è opzionale e contribuisce ad assicurare che le transazioni siano elaborate velocemente. La maggior parte delle transazioni è 1kB. Commissione raccomandata 0,01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Commissione di transazione per kB; è opzionale e contribuisce ad assicurare che le transazioni siano elaborate velocemente. Le transazioni sono per la maggior parte da 1 kB. Commissione raccomandata 0,01. + + + + MessagePage + + + Message + Messaggio + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + L'indirizzo del beneficiario cui inviare il pagamento (ad esempio 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Scegli l'indirizzo dalla rubrica + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Incollare l'indirizzo dagli appunti + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Inserisci qui il messaggio che vuoi firmare + + + + Click "Sign Message" to get signature + Clicca "Firma il messaggio" per ottenere la firma + + + + Sign a message to prove you own this address + Firma un messaggio per dimostrare di possedere questo indirizzo + + + + &Sign Message + &Firma il messaggio + + + + Copy the currently selected address to the system clipboard + Copia l'indirizzo attualmente selezionato nella clipboard + + + + &Copy to Clipboard + &Copia nella clipboard + + + + + + Error signing + Errore nel firmare + + + + %1 is not a valid address. + %1 non è un indirizzo valido. + + + + Private key for %1 is not available. + La chiave privata per %1 non è disponibile. + + + + Sign failed + Firma non riuscita @@ -754,7 +937,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">⏎ <html><head><meta name="qrichtext" content="1" /><style type="text/css">⏎ p, li { white-space: pre-wrap; }⏎ -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">⏎ +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">⏎ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> @@ -779,16 +962,69 @@ p, li { white-space: pre-wrap; }⏎ + QRCodeDialog + + + Dialog + Dialogo + + + + QR Code + Codice QR + + + + Request Payment + Richiedi pagamento + + + + Amount: + Importo: + + + + BTC + BTC + + + + Label: + Etichetta: + + + + Message: + Messaggio: + + + + &Save As... + &Salva come... + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Spedisci Bitcoin @@ -804,81 +1040,86 @@ p, li { white-space: pre-wrap; }⏎ + Remove all transaction fields + Rimuovi tutti i campi della transazione + + + Clear all Cancella tutto - + Balance: Saldo: - + 123.456 BTC 123,456 BTC - + Confirm the send action Conferma la spedizione - + &Send &Spedisci - + <b>%1</b> to %2 (%3) <b>%1</b> to %2 (%3) - + Confirm send coins Conferma la spedizione di bitcoin - + Are you sure you want to send %1? Si è sicuri di voler spedire %1? - + and e - + The recepient address is not valid, please recheck. L'indirizzo del beneficiario non è valido, per cortesia controlla. - + The amount to pay must be larger than 0. L'importo da pagare dev'essere maggiore di 0. - + Amount exceeds your balance L'importo è superiore al saldo attuale - + Total exceeds your balance when the %1 transaction fee is included Il totale è superiore al saldo attuale includendo la commissione %1 - + Duplicate address found, can only send to each address once in one send operation Trovato un indirizzo doppio, si può spedire solo una volta a ciascun indirizzo in una singola operazione. - + Error: Transaction creation failed Errore: creazione della transazione fallita - + Error: 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. Errore: la transazione è stata rifiutata. Ciò accade se alcuni bitcoin nel portamonete sono stati già spesi, ad esempio se è stata usata una copia del file wallet.dat e i bitcoin sono stati spesi dalla copia ma non segnati come spesi qui. @@ -950,135 +1191,140 @@ p, li { white-space: pre-wrap; }⏎ TransactionDesc - + Open for %1 blocks Aperto per %1 blocchi - + Open until %1 Aperto fino a %1 - + %1/offline? %1/offline? - + %1/unconfirmed %1/non confermato - + %1 confirmations %1 conferme - + <b>Status:</b> <b>Stato:</b> - + , has not been successfully broadcast yet , non è stato ancora trasmesso con successo - + , broadcast through %1 node , trasmesso attraverso %1 nodo - + , broadcast through %1 nodes , trasmesso attraverso %1 nodi - + <b>Date:</b> <b>Data:</b> - + <b>Source:</b> Generated<br> <b>Fonte:</b> Generato<br> - - + + <b>From:</b> <b>Da:</b> - + unknown sconosciuto - - - + + + <b>To:</b> <b>Per:</b> - + (yours, label: (vostro, etichetta: - + (yours) (vostro) - - - - + + + + <b>Credit:</b> <b>Credito:</b> - + (%1 matures in %2 more blocks) (%1 matura in altri %2 blocchi) - + (not accepted) (non accettate) - - - + + + <b>Debit:</b> <b>Debito:</b> - + <b>Transaction fee:</b> <b>Commissione:</b> - + <b>Net amount:</b> <b>Importo netto:</b> - + Message: Messaggio: - + Comment: Commento: - + + Transaction ID: + ID della transazione: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Bisogna attendere 120 blocchi prima di spendere I bitcoin generati. Quando è stato generato questo blocco, è stato trasmesso alla rete per aggiungerlo alla catena di blocchi. Se non riesce a entrare nella catena, verrà modificato in "non accettato" e non sarà spendibile. Questo può accadere a volte, se un altro nodo genera un blocco entro pochi secondi del tuo. @@ -1165,56 +1411,51 @@ p, li { white-space: pre-wrap; }⏎ - Received from IP - Ricevuto da IP + Received from + Ricevuto da - + Sent to Spedito a - - Sent to IP - Inviato a IP - - - + Payment to yourself Pagamento a te stesso - + Mined Ottenuto dal mining - + (n/a) (N / a) - + Transaction status. Hover over this field to show number of confirmations. Stato della transazione. Passare con il mouse su questo campo per vedere il numero di conferme. - + Date and time that the transaction was received. Data e ora in cui la transazione è stata ricevuta. - + Type of transaction. Tipo di transazione. - + Destination address of transaction. Indirizzo di destinazione della transazione. - + Amount removed from or added to balance. Importo rimosso o aggiunto al saldo. @@ -1293,16 +1534,21 @@ p, li { white-space: pre-wrap; }⏎ Importo minimo - + Copy address Copia l'indirizzo - + Copy label Copia l'etichetta + + Copy amount + Copia l'importo + + Edit label Modifica l'etichetta @@ -1313,67 +1559,67 @@ p, li { white-space: pre-wrap; }⏎ Mostra i dettagli... - + Export Transaction Data Esporta i dati della transazione - + Comma separated file (*.csv) Testo CSV (*.csv) - + Confirmed Confermato - + Date Data - + Type Tipo - + Label Etichetta - + Address Indirizzo - + Amount Importo - + ID ID - + Error exporting Errore nell'esportazione - + Could not write to file %1. Impossibile scrivere sul file %1. - + Range: Intervallo: - + to a @@ -1381,7 +1627,7 @@ p, li { white-space: pre-wrap; }⏎ WalletModel - + Sending... Invio... @@ -1400,941 +1646,369 @@ p, li { white-space: pre-wrap; }⏎ - Send command to -server or bitcoind - + Send command to -server or bitcoind Manda il comando a -server o bitcoind - List commands - + List commands Lista comandi - Get help for a command - + Get help for a command Aiuto su un comando - Options: - + Options: Opzioni: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Specifica il file di configurazione (di default: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) Specifica il file pid (default: bitcoind.pid) - Generate coins - + Generate coins Genera Bitcoin - Don't generate coins - + Don't generate coins Non generare Bitcoin - Start minimized - + Start minimized Parti in icona - Specify data directory - + Specify data directory Specifica la cartella dati - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Specifica il timeout di connessione (in millisecondi) - Connect through socks4 proxy - + Connect through socks4 proxy Connessione tramite socks4 proxy - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Consenti ricerche DNS per aggiungere nodi e collegare - Add a node to connect to - - Aggiungi un nodo e connetti a - + Listen for connections on <port> (default: 8333 or testnet: 18333) + Ascolta le connessioni JSON-RPC su <porta> (default: 8333 o testnet: 18333) - Connect only to the specified node - - Connetti solo al nodo specificato - + Maintain at most <n> connections to peers (default: 125) + Mantieni al massimo <n> connessioni ai peer (default: 125) - Don't accept connections from outside - - Non accettare connessioni dall'esterno + Add a node to connect to + Aggiungi un nodo e connetti a - Don't attempt to use UPnP to map the listening port - - Non usare l'UPnP per mappare la porta + Connect only to the specified node + Connetti solo al nodo specificato - Attempt to use UPnP to map the listening port - - Prova ad usare l'UPnp per mappare la porta + Don't accept connections from outside + Non accettare connessioni dall'esterno - Fee per kB to add to transactions you send - - Commissione al kB da aggiungere alle transazioni in uscita - + Don't bootstrap list of peers using DNS + Non avviare la lista dei peer usando il DNS - Accept command line and JSON-RPC commands - + Threshold for disconnecting misbehaving peers (default: 100) + Soglia di disconnessione dei peer di cattiva qualità (default: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Numero di secondi di sospensione che i peer di cattiva qualità devono trascorrere prima di riconnettersi (default: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Buffer di ricezione massimo per connessione, <n>*1000 byte (default: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Buffer di invio massimo per connessione, <n>*1000 byte (default: 10000) + + + + Don't attempt to use UPnP to map the listening port + Non usare l'UPnP per mappare la porta + + + + + Attempt to use UPnP to map the listening port + Prova ad usare l'UPnp per mappare la porta + + + + + Fee per kB to add to transactions you send + Commissione per kB da aggiungere alle transazioni in uscita + + + + Accept command line and JSON-RPC commands Accetta da linea di comando e da comandi JSON-RPC - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands Esegui in background come demone e accetta i comandi - - Use the test network - + + Use the test network Utilizza la rete di prova - - Username for JSON-RPC connections - + + Output extra debugging information + Produci informazioni extra utili al debug + + + + Prepend debug output with timestamp + Anteponi all'output di debug una marca temporale + + + + Send trace/debug info to console instead of debug.log file + Invia le informazioni di trace/debug alla console invece che al file debug.log + + + + Send trace/debug info to debugger + Invia le informazioni di trace/debug al debugger + + + + Username for JSON-RPC connections Nome utente per connessioni JSON-RPC - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Password per connessioni JSON-RPC - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) Attendi le connessioni JSON-RPC su <porta> (default: 8332) - - Allow JSON-RPC connections from specified IP address - - Consenti connessioni JSON-RPC dall'indirizzo IP specificato + + Allow JSON-RPC connections from specified IP address + Consenti connessioni JSON-RPC dall'indirizzo IP specificato - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) Inviare comandi al nodo in esecuzione su <ip> (default: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Impostare la quantità di chiavi di riserva a <n> (default: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions Ripeti analisi della catena dei blocchi per cercare le transazioni mancanti dal portamonete - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) Opzioni SSL: (vedi il wiki di Bitcoin per le istruzioni di configurazione SSL) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections Utilizzare OpenSSL (https) per le connessioni JSON-RPC - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) File certificato del server (default: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Chiave privata del server (default: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Cifrari accettabili (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message Questo messaggio di aiuto - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. Non è possibile ottenere i dati sulla directory %s. Probabilmente Bitcoin è già in esecuzione. - + Loading addresses... Caricamento indirizzi... - - Error loading addr.dat - - Errore nel caricamento di addr.dat - + + Error loading addr.dat + Errore caricamento addr.dat - - Loading block index... - Caricamento dell'indice del blocco... + + Error loading blkindex.dat + Errore caricamento blkindex.dat - - Error loading blkindex.dat - - Errore nel caricamento di blkindex.dat - + + Error loading wallet.dat: Wallet corrupted + Errore caricamento wallet.dat: Wallet corrotto - - Loading wallet... - Caricamento portamonete... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Errore caricamento wallet.dat: il wallet richiede una versione nuova di Bitcoin - - Error loading wallet.dat: Wallet corrupted - - Errore nel caricamento di wallet.dat: il portamonete è danneggiato - + + Wallet needed to be rewritten: restart Bitcoin to complete + Il portamonete deve essere riscritto: riavviare Bitcoin per completare - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Errore nel caricamento di wallet.dat: il portamonete richiede una versione più recente di Bitcoin - + + Error loading wallet.dat + Errore caricamento wallet.dat - - Error loading wallet.dat - - Errore nel caricamento di wallet.dat - + + Loading block index... + Caricamento dell'indice del blocco... - + + Loading wallet... + Caricamento portamonete... + + + Rescanning... Ripetere la scansione... - + Done loading Caricamento completato - + Invalid -proxy address Indirizzo -proxy non valido - + Invalid amount for -paytxfee=<amount> Importo non valido per -paytxfee=<amount> - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Attenzione: -paytxfee è molto alta. Questa è la commissione che si paga quando si invia una transazione. - + Error: CreateThread(StartNode) failed Errore: CreateThread(StartNode) non riuscito - + Warning: Disk space is low Attenzione: lo spazio su disco è scarso - + Unable to bind to port %d on this computer. Bitcoin is probably already running. Impossibile collegarsi alla porta %d su questo computer. Probabilmente Bitcoin è già in esecuzione. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - La dimensione della transazione è fuori limite. Puoi ancora spedirla con una commissione di %s, che andrà ai nodi che processano la tua transazione e aiuterà a supportare il network. Vuoi pagare la commissione? - - - - Enter the current passphrase to the wallet. - Inserisci la frase d'ordine attuale per il portamonete. - - - - Passphrase - Passphrase - - - - Please supply the current wallet decryption passphrase. - Si prega di fornire la passphrase per la decifrazione del portamonete attuale. - - - - The passphrase entered for the wallet decryption was incorrect. - La passphrase inserita per la decifrazione del portamonete è errata. - - - - Status - Stato - - - - Date - Data - - - - Description - Descrizione - - - - Debit - Debito - - - - Credit - Credito - - - Open for %d blocks - Aperto per %d blocchi - - - - Open until %s - Aperto fino a %s - - - - %d/offline? - %d/offline? - - - - %d/unconfirmed - %d/non confermati - - - - %d confirmations - %d conferme - - - - Generated - Generato - - - - Generated (%s matures in %d more blocks) - Generato (%s matura in altri %d blocchi) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Generato - Attenzione: questo blocco non è stato ricevuto da altri nodi e probabilmente non sarà accettato! - - - - Generated (not accepted) - Generato (non accettato) - - - - From: - Da: - - - - Received with: - Ricevuto su: - - - - Payment to yourself - Pagamento a te stesso - - - - To: - Per: - - - - Generating - Generazione - - - - (not connected) - (non collegato) - - - - %d connections %d blocks %d transactions - %d connessioni %d blocchi %d transazioni - - - - Wallet already encrypted. - Portamonete già codificato. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Inserisci una nuova passphrase per il portamonete. -Si prega di utilizzare una frase di 10 o più caratteri casuali, o di almeno otto parole. - - - - Error: The supplied passphrase was too short. - Errore: la passphrase è troppo breve. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - ATTENZIONE: se si cifra il portamonete e si perde la propria passphrase, si perdono tutti i BITCOIN! Sei sicuro di voler cifrare il portamonete? - - - - Please re-enter your new wallet passphrase. - Si prega di inserire ancora la nuova passphrase per il portamonete. - - - - Error: the supplied passphrases didn't match. - Errore: le passphrase fornite non coincidono. - - - - Wallet encryption failed. - Cifratura del portamonete fallita. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Portamonete cifrato. -Ricorda che cifrare il portamonete non protegge completamente i bitcoin dal furto ad opera di malware che infettassero il computer. - - - - Wallet is unencrypted, please encrypt it first. - Il portamonete non è cifrato, per piacere prima cifralo. - - - - Enter the new passphrase for the wallet. - Inserisci la nuova passphrase per il portamonete. - - - - Re-enter the new passphrase for the wallet. - Inserisci ancora la nuova passphrase per il portamonete. - - - - Wallet Passphrase Changed. - Passphrase del portamonete cambiata. - - - - New Receiving Address - Nuovo indirizzo di ricezione - - - - You should use a new address for each payment you receive. - -Label - Si dovrebbe usare un nuovo indirizzo per ciascun pagamento che si riceve. - -Etichetta - - - - <b>Status:</b> - <b>Stato:</b> - - - - , has not been successfully broadcast yet - , non è stato ancora trasmesso con successo - - - - , broadcast through %d node - , trasmesso attraverso %d nodo - - - - , broadcast through %d nodes - , trasmesso attraverso %d nodi - - - - <b>Date:</b> - <b>Data:</b> - - - - <b>Source:</b> Generated<br> - <b>Fonte:</b> Generato<br> - - - - <b>From:</b> - <b>Da:</b> - - - - unknown - sconosciuto - - - - <b>To:</b> - <b>Per:</b> - - - - (yours, label: - (vostro, etichetta: - - - - (yours) - ( vostro) - - - - <b>Credit:</b> - <b>Credito:</b> - - - - (%s matures in %d more blocks) - (%s matura in altri %d blocchi) - - - - (not accepted) - (non accettata) - - - - <b>Debit:</b> - <b>Debito:</b> - - - - <b>Transaction fee:</b> - <b>Commissione:</b> - - - - <b>Net amount:</b> - <b>Importo netto:</b> - - - - Message: - Messaggio: - - - - Comment: - Commento: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Bisogna aspettare 120 blocchi prima di spendere i bitcoin generati. Quando hai generato questo blocco, è stato trasmesso al network per aggiungerlo alla catena dei blocchi. Se non entra nella catena, sarà modificato in "non accettato" e non risulterà spendibile. Questo potrebbe accadere a volte, quando un altro nodo genera un blocco entro pochi secondi da quando l'hai generato tu. - - - - Cannot write autostart/bitcoin.desktop file - Impossibile scrivere sul file autostart/bitcoin.desktop - - - - Main - Principale - - - - &Start Bitcoin on window system startup - &Fai partire Bitcoin all'avvio del sistema - - - - &Minimize on close - &Minimizza alla chiusura del programma - - - - version %s - versione %s - - - - Error in amount - Errore nell'importo - - - - Send Coins - Spedisci Bitcoin - - - - Amount exceeds your balance - L'importo supera la tua disponibilità - - - - Total exceeds your balance when the - L'importo supera la tua disponibilità se - - - - transaction fee is included - si include la commissione di transazione - - - - Payment sent - Pagamento inviato - - - - Sending... - Invio... - - - - Invalid address - Indirizzo non valido - - - - Sending %s to %s - Invio di %s a %s - - - - CANCELLED - ANNULLATO - - - - Cancelled - Annullato - - - - Transfer cancelled - Trasferimento annullato - - - - Error: - Errore: - - - - Insufficient funds - Fondi insufficienti - - - - Connecting... - Collegamento... - - - - Unable to connect - Impossibile connettersi - - - - Requesting public key... - Richiesta chiave pubblica... - - - - Received public key... - chiave pubblica ricevuta... - - - - Recipient is not accepting transactions sent by IP address - Il destinatario non accetta transazioni effettuate dall'indirizzo IP - - - - Transfer was not accepted - L'invio non è stato accettato - - - - Invalid response received - Risposta non valida ricevuta - - - - Creating transaction... - Creazione della transazione... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Questa operazione richiede una commissione di transazione di almeno %s a causa del suo importo, della complessità, o per l'utilizzo di fondi ricevuti recentemente - - - - Transaction creation failed - Creazione transazione non riuscita - - - - Transaction aborted - Transazione interrotta - - - - Lost connection, transaction cancelled - Persa la connessione, operazione annullata - - - - Sending payment... - Invio del pagamento... - - - - 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. - La transazione è stata rifiutata. Ciò può accadere se alcuni dei bitcoin nel tuo portamonete erano stati già spesi, ad esempio se hai usato una copia del wallet.dat e i bitcoin sono stati spesi nella copia ma non nella versione corrente. - - - - Waiting for confirmation... - In attesa di conferma... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - Il pagamento è stato spedito ma il destinatario non è riuscito a verificarlo. -La transazione è registrata e sarà trasferita al destinatario, -ma le informazioni a commento saranno vuote. - - - - Payment was sent, but an invalid response was received - Il pagamento è stato inviato, ma è stata ricevuta una risposta non valida - - - - Payment completed - Pagamento completato - - - - Name - Nome - - - - Address - Indirizzo - - - - Label - Etichetta - - - - Bitcoin Address - Indirizzo Bitcoin - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Questo è uno dei tuoi indirizzi per ricevere pagamenti e non può essere inserito nella rubrica. - - - - Edit Address - Modifica indirizzo - - - - Edit Address Label - Modifica etichetta indirizzo - - - - Add Address - Aggiungi indirizzo - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Bitcoin - Generazione - - - - Bitcoin - (not connected) - Bitcoin - (non collegato) - - - - &Open Bitcoin - &Apri Bitcoin - - - - &Send Bitcoins - &Invia Bitcoin - - - - O&ptions... - O&pzioni... - - - - E&xit - &Esci - - - - Program has crashed and will terminate. - Il programma è andato in crash e si concluderà. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Attenzione: si prega di controllare che la data del computer e l'ora siano corrette. Se il vostro orologio è sbagliato Bitcoin non funziona correttamente. - + beta beta - - main - - - Bitcoin Qt - Bitcoin Qt - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts new file mode 100644 index 0000000..d733f1a --- /dev/null +++ b/src/qt/locale/bitcoin_lt.ts @@ -0,0 +1,1978 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + Apie Bitcoiną + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> versija + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + Autorystės teisės© 2009-2012 Bitcoin Developers +DĖMESIO: programa eksperimentinė! + +Platinama pagal licenziją MIT/X11, papildomą informaciją rasite faile license.txt arba dokumente pagal nuorodą: http://www.opensource.org/licenses/mit-license.php. + +Å iame produkte yra projekto OpenSSL (http://www.openssl.org/), Eriko Jango (eay@cryptsoft.com) paraÅ¡yti kriptografinės funkcijos ir algoritmai ir UPnP darbui skirtos funkcijos paraÅ¡ytos Tomo Bernardo. + + + + + AddressBookPage + + + Address Book + Adresų knygelė + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Čia yra JÅ«sų adresai skirti mokėjimams gauti. JÅ«s galite skirtingiems žmonėms duoti skirtingus adresus. Tai Jums palengvins kontroliuoti mokėjimus bei padidins anonimiÅ¡kumą. + + + + + Double-click to edit address or label + Tam, kad pakeisti ar redaguoti adresą arba žymę turite objektą dukart spragtelti pele. + + + + Create a new address + Sukurti naują adresą + + + + &New Address... + &Naujas adresas... + + + + Copy the currently selected address to the system clipboard + Kopijuoti esamą adresą į mainų atmintį + + + + &Copy to Clipboard + &C Kopijuoti į mainų atmintų + + + + Show &QR Code + Rodyti &QR kodą + + + + Sign a message to prove you own this address + Registruotis žinute įrodančia, kad turite šį adresą + + + + &Sign Message + &S Registruotis žinute + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + PaÅ¡alinti iÅ¡ sąraÅ¡o pažymėtą adresą(gali bÅ«ti paÅ¡alinti tiktai adresų knygelės įraÅ¡ai). + + + + &Delete + &D PaÅ¡alinti + + + + Copy address + Copijuoti adresą + + + + Copy label + Kopijuoti žymę + + + + Edit + Redaguoti + + + + Delete + PaÅ¡alinti + + + + Export Address Book Data + Eksportuoti adresų knygelės duomenis + + + + Comma separated file (*.csv) + Kableliais iÅ¡skirtas failas (*.csv) + + + + Error exporting + Eksportavimo klaida + + + + Could not write to file %1. + Nepavyko įraÅ¡yti į failą %1. + + + + AddressTableModel + + + Label + Žymė + + + + Address + Adresas + + + + (no label) + (nėra žymės) + + + + AskPassphraseDialog + + + Dialog + Dialogas + + + + + TextLabel + Teksto žymė + + + + Enter passphrase + Ä®vesti slaptažodį + + + + New passphrase + Naujas slaptažodis + + + + Repeat new passphrase + Pakartoti naują slaptažodį + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Ä®veskite naują slaptažodį piniginei <br/> PraÅ¡ome naudoti slaptažodį iÅ¡ <b> 10 ar daugiau atsitiktinių simbolių </b> arba <b> aÅ¡tuonių ar daugiau žodžių </b>. + + + + Encrypt wallet + Užšifruoti piniginę + + + + This operation needs your wallet passphrase to unlock the wallet. + Å i operacija reikalauja jÅ«sų piniginės slaptažodžio jai atrakinti. + + + + Unlock wallet + Atrakinti piniginę + + + + This operation needs your wallet passphrase to decrypt the wallet. + Å i operacija reikalauja jÅ«sų piniginės slaptažodžio jai iÅ¡Å¡ifruoti. + + + + Decrypt wallet + IÅ¡Å¡ifruoti piniginę + + + + Change passphrase + Pakeisti slaptažodį + + + + Enter the old and new passphrase to the wallet. + Ä®veskite seną ir naują piniginės slaptažodžius + + + + Confirm wallet encryption + Patvirtinkite piniginės užšifravimą + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + Ä®SPĖJIMAS: Jei užšifruosite savo piniginę ir prarasite savo slaptažodį, JÅ«s <b> PRARASITE VISUS SAVO BITKOINUS, </b>! +Ar jÅ«s tikrai norite užšifruoti savo piniginę? + + + + + Wallet encrypted + Piniginė užšifruota + + + + Bitcoin 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. + Bitcoin dabar užsidarys Å¡ifravimo proceso pabaigai. Atminkite, kad piniginės Å¡ifravimas negali pilnai apsaugoti bitcoinų vagysčių kai tinkle esančios kenkėjiÅ¡kos programos patenka į jÅ«sų kompiuterį. + + + + + Warning: The Caps Lock key is on. + Ä®SPĖJIMAS: Ä®jungtos didžiosios raidės + + + + + + + Wallet encryption failed + Nepavyko užšifruoti piniginę + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Dėl vidinės klaidos nepavyko užšifruoti piniginę.Piniginė neužšifruota. + + + + + The supplied passphrases do not match. + Ä®vestas slaptažodis nesutampa + + + + Wallet unlock failed + Nepavyko atrakinti piniginę + + + + + + The passphrase entered for the wallet decryption was incorrect. + Neteisingai įvestas slaptažodis piniginės iÅ¡Å¡ifravimui + + + + Wallet decryption failed + Nepavyko iÅ¡Å¡ifruoti piniginę + + + + Wallet passphrase was succesfully changed. + Sėkmingai pakeistas piniginės slaptažodis + + + + BitcoinGUI + + + Bitcoin Wallet + Bitkoinų piniginė + + + + + Synchronizing with network... + Sinchronizavimas su tinklu ... + + + + Block chain synchronization in progress + Vyksta blokų grandinės sinchronizavimas + + + + &Overview + &O Apžvalga + + + + Show general overview of wallet + Rodyti piniginės bendrą apžvalgą + + + + &Transactions + &T Sandoriai + + + + Browse transaction history + Apžvelgti sandorių istoriją + + + + &Address Book + &Adresų knygelė + + + + Edit the list of stored addresses and labels + Redaguoti iÅ¡saugotus adresus bei žymes + + + + &Receive coins + &R Gautos monetos + + + + Show the list of addresses for receiving payments + Parodyti adresų sąraÅ¡a mokėjimams gauti + + + + &Send coins + &Siųsti monetas + + + + Send coins to a bitcoin address + Siųsti monetas bitkoinų adresu + + + + Sign &message + Registruoti praneÅ¡i&mą + + + + Prove you control an address + Ä®rodyti, kad jÅ«s valdyti adresą + + + + E&xit + &x išėjimas + + + + Quit application + IÅ¡jungti programą + + + + &About %1 + &Apie %1 + + + + Show information about Bitcoin + Rodyti informaciją apie Bitkoiną + + + + About &Qt + Apie &Qt + + + + Show information about Qt + Rodyti informaciją apie Qt + + + + &Options... + &Opcijos... + + + + Modify configuration options for bitcoin + Keisti bitcoin konfigÅ«racijos galimybes + + + + Open &Bitcoin + Atidaryti &Bitcoin + + + + Show the Bitcoin window + Rodyti Bitcoin langą + + + + &Export... + &Eksportas... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + &E Užšifruoti piniginę + + + + Encrypt or decrypt wallet + Užšifruoti ar iÅ¡Å¡ifruoti piniginę + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + &C Pakeisti slaptažodį + + + + Change the passphrase used for wallet encryption + Pakeisti slaptažodį naudojamą piniginės užšifravimui + + + + &File + &Failas + + + + &Settings + Nu&Statymai + + + + &Help + &H Pagelba + + + + Tabs toolbar + Tabs įrankių juosta + + + + Actions toolbar + Veiksmų įrankių juosta + + + + [testnet] + [testavimotinklas] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n Bitcoin tinklo aktyvus ryÅ¡ys%n Bitcoin tinklo aktyvÅ«s ryÅ¡iai%n Bitcoin tinklo aktyvÅ«s ryÅ¡iai + + + + Downloaded %1 of %2 blocks of transaction history. + Atsisiuntė %1 iÅ¡ %2 sandorių istorijos blokų + + + + Downloaded %1 blocks of transaction history. + Atsisiuntė %1 iÅ¡ %2 sandorių istorijos blokų + + + + %n second(s) ago + PrieÅ¡ %n sekundęPrieÅ¡ %n sekundesPrieÅ¡ %n sekundžių + + + + %n minute(s) ago + PrieÅ¡ %n minutęPrieÅ¡ %n minutesPrieÅ¡ %n minutčių + + + + %n hour(s) ago + PrieÅ¡ %n valandąPrieÅ¡ %n valandasPrieÅ¡ %n valandų + + + + %n day(s) ago + PrieÅ¡ %n dienąPrieÅ¡ %n dienasPrieÅ¡ %n dienų + + + + Up to date + Iki Å¡iol + + + + Catching up... + Gaudo... + + + + Last received block was generated %1. + Paskutinis gautas blokas buvo sukurtas %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Å is sandoris virÅ¡ija leistiną dydį. JÅ«s galite įvykdyti jį papildomai sumokėję %1 mokesčių, kurie bus iÅ¡siųsti tais pačiais mazgais kuriais vyko sandoris ir padės palaikyti tinklą. Ar jÅ«s norite apmokėti papildomą mokestį? + + + + Sending... + Siunčiama... + + + + Sent transaction + Sandoris nusiųstas + + + + Incoming transaction + Ateinantis sandoris + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Data: %1 +Suma: %2 +Tipas: %3 +Adresas: %4 + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Piniginė <b>užšifruota</b> ir Å¡iuo metu <b>atrakinta</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Piniginė <b>užšifruota</b> ir Å¡iuo metu <b>užrakinta</b> + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &U vienetų rodyti sumas: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Rodomų ir siunčiamų monetų kiekio matavimo vienetai + + + + Display addresses in transaction list + Rodyti adresus sandorių sąraÅ¡e + + + + EditAddressDialog + + + Edit Address + Redaguoti adresą + + + + &Label + &L Žymė + + + + The label associated with this address book entry + Žymė yra susieta su Å¡ios adresų knygelęs turiniu + + + + &Address + &Adresas + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Adresas yra susietas su Å¡ios adresų knygelęs turiniu. Tai gali bÅ«ti keičiama tik siuntimo adresams. + + + + New receiving address + Naujas gavimo adresas + + + + New sending address + Naujas siuntimo adresas + + + + Edit receiving address + Taisyti gavimo adresą + + + + Edit sending address + Taisyti siuntimo adresą + + + + The entered address "%1" is already in the address book. + Ä®vestas adresas "%1"yra adresų knygelėje + + + + The entered address "%1" is not a valid bitcoin address. + Ä®vestas adresas "%1"nėra galiojantis bitkoinų adresas + + + + Could not unlock wallet. + Neįmanoma atrakinti piniginės + + + + New key generation failed. + Naujas raktas nesukurtas + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &S Paleisti Bitcoin programą su window sistemos paleidimu + + + + Automatically start Bitcoin after the computer is turned on + AutomatiÅ¡kai paleisti Bitkoin programą kai yra įjungiamas kompiuteris + + + + &Minimize to the tray instead of the taskbar + &M sumažinti langą bet ne užduočių juostą + + + + Show only a tray icon after minimizing the window + Po programos lango sumažinimo rodyti tik programos ikoną. + + + + Map port using &UPnP + Prievado struktÅ«ra naudojant & UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + AutomatiÅ¡kai atidaryti Bitcoin kliento marÅ¡rutizatoriaus prievadą. Tai veikia tik tada, kai jÅ«sų marÅ¡rutizatorius palaiko UPnP ir ji įjungta. + + + + M&inimize on close + &i Sumažinti uždarant + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Uždarant langą neuždaryti programos. Kai Å¡i parinktis įjungta, programa bus uždaryta tik pasirinkus meniu komandą Baigti. + + + + &Connect through SOCKS4 proxy: + &C Jungtis per socks4 proxy: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Jungtis į Bitkoin tinklą per socks4 proxy (pvz. jungiantis per Tor) + + + + Proxy &IP: + Proxy &IP: + + + + IP address of the proxy (e.g. 127.0.0.1) + IP adresas proxy (pvz. 127.0.0.1) + + + + &Port: + &Prievadas: + + + + Port of the proxy (e.g. 1234) + Proxy prievadas (pvz. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Neprivaloma sandorio mokestis už KB, kuris padeda įsitikinti, kad jÅ«sų sandoriai tvarkomi greitai. Daugelis sandorių yra tik 1KB dydžio. Rekomenduojamas 0,01 mokestis. + + + + Pay transaction &fee + &f Mokėti sandorio mokestį + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Neprivaloma sandorio mokestis už KB, kuris padeda įsitikinti, kad jÅ«sų sandoriai tvarkomi greitai. Daugelis sandorių yra tik 1KB dydžio. Rekomenduojamas 0,01 mokestis. + + + + MessagePage + + + Message + Žinutė + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Nurodyti adresą mokėjimui siųsti (pvz. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Pasirinkite adresą iÅ¡ adresų knygelės + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Ä®vesti adresą iÅ¡ mainų atminties + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Ä®veskite praneÅ¡imą, kurį norite pasiraÅ¡yti čia + + + + Click "Sign Message" to get signature + Spragtelėkite "Registruotis žinutę" tam, kad gauti parašą + + + + Sign a message to prove you own this address + Registruotis žinute įrodymuii, kad turite šį adresą + + + + &Sign Message + &S Registravimosi žinutė + + + + Copy the currently selected address to the system clipboard + Kopijuoti pasirinktą adresą į sistemos mainų atmintį + + + + &Copy to Clipboard + Kopijuoti į mainų atmintį + + + + + + Error signing + Klaida pasiraÅ¡ant + + + + %1 is not a valid address. + %1 tai negaliojantis adresas + + + + Private key for %1 is not available. + Privataus rakto %1 nėra + + + + Sign failed + Registravimas nepavyko + + + + OptionsDialog + + + Main + Pagrindinis + + + + Display + Ekranas + + + + Options + Opcijos + + + + OverviewPage + + + Form + Forma + + + + Balance: + Balansas + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Sandorių kiekis + + + + 0 + 0 + + + + Unconfirmed: + Nepatvirtinti: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Naujausi sandoris</b> + + + + Your current balance + JÅ«sų einamasis balansas + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + IÅ¡ viso sandorių, įskaitant tuos kurie dar turi bÅ«ti patvirtinti, ir jie dar nėra įskaičiuotii į einamosios sąskaitos balansą + + + + Total number of transactions in wallet + Bandras sandorių kiekis piniginėje + + + + QRCodeDialog + + + Dialog + Dialogas + + + + QR Code + QR kodas + + + + Request Payment + PraÅ¡au iÅ¡mokėti + + + + Amount: + Suma: + + + + BTC + BTC + + + + Label: + Žymė: + + + + Message: + Žinutė: + + + + &Save As... + &S iÅ¡saugoti kaip... + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Siųsti monetas + + + + Send to multiple recipients at once + Siųsti keliems gavėjams vienu metu + + + + &Add recipient... + &A Pridėti gavėją + + + + Remove all transaction fields + PaÅ¡alinti visus sandorio laukus + + + + Clear all + IÅ¡trinti viską + + + + Balance: + Balansas: + + + + 123.456 BTC + 123.456 BTC + + + + Confirm the send action + Patvirtinti siuntimo veiksmą + + + + &Send + &Siųsti + + + + <b>%1</b> to %2 (%3) + <b>%1</b> to %2 (%3) + + + + Confirm send coins + Patvirtinti siuntimui monetas + + + + Are you sure you want to send %1? + Ar esate įsitikinę, kad norite siųsti %1? + + + + and + ir + + + + The recepient address is not valid, please recheck. + Negaliojantis gavėjo adresas. Patikrinkite. + + + + The amount to pay must be larger than 0. + Apmokėjimo suma turi bÅ«ti didesnė negu 0. + + + + Amount exceeds your balance + Suma virÅ¡ija jÅ«sų balansą + + + + Total exceeds your balance when the %1 transaction fee is included + Jei pridedame sandorio mokestį %1 bendra suma virÅ¡ija jÅ«sų balansą + + + + Duplicate address found, can only send to each address once in one send operation + Rastas adreso dublikatas + + + + Error: Transaction creation failed + KLAIDA:nepavyko sudaryti sandorio + + + + Error: 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. + Klaida: sandoris buvo atmestas.Tai gali įvykti, jei kai kurios monetos iÅ¡ jÅ«sų piniginėje jau buvo panaudotos, pvz. jei naudojote wallet.dat kopiją ir monetos buvo iÅ¡leistos kopijoje, bet nepažymėtos kaip skirtos iÅ¡leisti čia. + + + + SendCoinsEntry + + + Form + Forma + + + + A&mount: + Su&ma: + + + + Pay &To: + Mokėti &T gavėjui: + + + + + Enter a label for this address to add it to your address book + Ä®veskite žymę Å¡iam adresui kad galėtumėte įtraukti ją į adresų knygelę + + + + &Label: + &L žymė: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresas mokėjimo siuntimui (pvz. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Pasirinkite adresą iÅ¡ adresų knygelės + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Ä®vesti adresą iÅ¡ mainų atminties + + + + Alt+P + Alt+P + + + + Remove this recipient + PaÅ¡alinti Å¡itą gavėją + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Ä®veskite bitkoinų adresą (pvz. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Atidaryta %1 blokams + + + + Open until %1 + Atidaryta iki %1 + + + + %1/offline? + %1/atjungtas? + + + + %1/unconfirmed + %1/nepatvirtintas + + + + %1 confirmations + %1 patvirtinimai + + + + <b>Status:</b> + <b>BÅ«sena:</b> + + + + , has not been successfully broadcast yet + , transliavimas dar nebuvo sėkmingas + + + + , broadcast through %1 node + , transliuota per %1 mazgą + + + + , broadcast through %1 nodes + , transliuota per %1 mazgus + + + + <b>Date:</b> + <b>Data:</b> + + + + <b>Source:</b> Generated<br> + <b>Å altinis:</b> Sukurta<br> + + + + + <b>From:</b> + <b>Nuo:</b> + + + + unknown + nežinomas + + + + + + <b>To:</b> + <b>Skirta:</b> + + + + (yours, label: + (jÅ«sų, žymė: + + + + (yours) + (jÅ«sų) + + + + + + + <b>Credit:</b> + <b>Kreditas:</b> + + + + (%1 matures in %2 more blocks) + (%1 apmokėtinas %2 daugiau blokais) + + + + (not accepted) + (nepriimta) + + + + + + <b>Debit:</b> + <b>Debitas:</b> + + + + <b>Transaction fee:</b> + <b>Sandorio mokestis:</b> + + + + <b>Net amount:</b> + <b>Neto suma:</b> + + + + Message: + Žinutė: + + + + Comment: + Komentaras: + + + + Transaction ID: + Sandorio ID: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + IÅ¡gautos monetos turi sulaukti 120 blokų, kol jos gali bÅ«ti naudojamos. Kai sukÅ«rėte šį bloką, jis buvo transliuojamas tinkle ir turėjo bÅ«ti įtrauktas į blokų grandinę. Jei nepavyksta patekti į grandinę, bus pakeista į "nepriėmė", o ne "vartojamas". Tai kartais gali atsitikti, jei kitas mazgas per keletą sekundžių sukuria bloką po jÅ«sų bloko. + + + + TransactionDescDialog + + + Transaction details + Sandorio iÅ¡sami informacija + + + + This pane shows a detailed description of the transaction + Å is langas sandorio detalų apraÅ¡ymą + + + + TransactionTableModel + + + Date + Data + + + + Type + Tipas + + + + Address + Adresas + + + + Amount + Suma + + + + Open for %n block(s) + Atidaryta %n blokuiAtidaryta %n blokamsAtidaryta %n blokų + + + + Open until %1 + Atidaryta kol %n + + + + Offline (%1 confirmations) + Atjungta (%1 patvirtinimai) + + + + Unconfirmed (%1 of %2 confirmations) + Nepatvirtintos (%1 iÅ¡ %2 patvirtinimų) + + + + Confirmed (%1 confirmations) + Patvirtinta (%1 patvirtinimai) + + + + Mined balance will be available in %n more blocks + IÅ¡gautas balansas bus pasiekiamas po %n blokoIÅ¡gautas balansas bus pasiekiamas po %n blokųIÅ¡gautas balansas bus pasiekiamas po %n blokų + + + + This block was not received by any other nodes and will probably not be accepted! + Å is blokas negautas nė vienu iÅ¡ mazgų ir matomai nepriimtas + + + + Generated but not accepted + IÅ¡gauta bet nepriimta + + + + Received with + Gauta su + + + + Received from + Gauta iÅ¡ + + + + Sent to + Siųsta + + + + Payment to yourself + Mokėjimas sau + + + + Mined + IÅ¡gauta + + + + (n/a) + nepasiekiama + + + + Transaction status. Hover over this field to show number of confirmations. + Sandorio bÅ«klė. Užvedus pelės žymeklį ant Å¡ios srities matysite patvirtinimų skaičių. + + + + Date and time that the transaction was received. + Sandorio gavimo data ir laikas + + + + Type of transaction. + Sandorio tipas + + + + Destination address of transaction. + Sandorio paskirties adresas + + + + Amount removed from or added to balance. + Suma pridėta ar iÅ¡skaičiuota iÅ¡ balanso + + + + TransactionView + + + + All + Visi + + + + Today + Å iandien + + + + This week + Å ią savaitę + + + + This month + Šį mėnesį + + + + Last month + Paskutinį mėnesį + + + + This year + Å iais metais + + + + Range... + Grupė + + + + Received with + Gauta su + + + + Sent to + IÅ¡siųsta + + + + To yourself + Skirta sau + + + + Mined + IÅ¡gauta + + + + Other + Kita + + + + Enter address or label to search + Ä®veskite adresą ar žymę į paieÅ¡ką + + + + Min amount + Minimali suma + + + + Copy address + Kopijuoti adresą + + + + Copy label + Kopijuoti žymę + + + + Copy amount + Kopijuoti sumą + + + + Edit label + Taisyti žymę + + + + Show details... + Parodyti iÅ¡samiai + + + + Export Transaction Data + Sandorio duomenų eksportavimas + + + + Comma separated file (*.csv) + Kableliais atskirtų duomenų failas (*.csv) + + + + Confirmed + Patvirtintas + + + + Date + Data + + + + Type + Tipas + + + + Label + Žymė + + + + Address + Adresas + + + + Amount + Suma + + + + ID + ID + + + + Error exporting + Eksportavimo klaida + + + + Could not write to file %1. + Neįmanoma įraÅ¡yti į failą %1. + + + + Range: + Grupė: + + + + to + skirta + + + + WalletModel + + + Sending... + Siunčiama + + + + bitcoin-core + + + Bitcoin version + Bitcoin versija + + + + Usage: + Naudojimas: + + + + Send command to -server or bitcoind + Siųsti komandą serveriui arba bitcoind + + + + List commands + Komandų sąraÅ¡as + + + + Get help for a command + Suteikti pagalba komandai + + + + Options: + Opcijos: + + + + Specify configuration file (default: bitcoin.conf) + Nurodyti konfigÅ«racijos failą (pagal nutylėjimąt: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + Nurodyti pid failą (pagal nutylėjimą: bitcoind.pid) + + + + Generate coins + Sukurti monetas + + + + Don't generate coins + NeiÅ¡gavinėti monetų + + + + Start minimized + Pradžia sumažinta + + + + Specify data directory + Nustatyti duomenų direktoriją + + + + Specify connection timeout (in milliseconds) + Nustatyti sujungimo trukmę (milisekundėmis) + + + + Connect through socks4 proxy + Prisijungti per socks4 proxy + + + + Allow DNS lookups for addnode and connect + Leisti DNS paieÅ¡ką sujungimui ir mazgo pridėjimui + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + Sujungimo klausymas prijungčiai <port> (pagal nutylėjimą: 8333 arba testnet: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Palaikyti ne daugiau <n> jungčių kolegoms (pagal nutylėjimą: 125) + + + + Add a node to connect to + Pridėti mazgą prie sujungti su + + + + Connect only to the specified node + Prisijungti tik prie nurodyto mazgo + + + + Don't accept connections from outside + Nepriimti iÅ¡orinio sujungimo + + + + Don't bootstrap list of peers using DNS + Neleisti kolegų sąraÅ¡o naudojant DNS + + + + Threshold for disconnecting misbehaving peers (default: 100) + Atjungimo dėl netinkamo kolegų elgesio riba (pagal nutylėjimą: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Sekundžių kiekis eikiamas palaikyti ryšį dėl lygiarangių nestabilumo (pagal nutylėjimą: 86.400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maksimalus buferis priėmimo sujungimui <n>*1000 bitų (pagal nutylėjimą: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maksimalus buferis siuntimo sujungimui <n>*1000 bitų (pagal nutylėjimą: 10000) + + + + Don't attempt to use UPnP to map the listening port + Nenaudoti UPnP klausymo prievado struktÅ«ros + + + + Attempt to use UPnP to map the listening port + Bandymas naudoti UPnP struktÅ«ra klausymosi prievadui + + + + Fee per kB to add to transactions you send + Ä®traukti mokestį už kB siunčiamiems sandoriams + + + + Accept command line and JSON-RPC commands + Priimti komandinę eilutę ir JSON-RPC komandas + + + + Run in the background as a daemon and accept commands + Dirbti fone kaip Å¡ešėlyje ir priimti komandas + + + + Use the test network + Naudoti testavimo tinklą + + + + Output extra debugging information + Išėjimo papildomas derinimo informacija + + + + Prepend debug output with timestamp + Prideėti laiko žymę derinimo rezultatams + + + + Send trace/debug info to console instead of debug.log file + Siųsti atsekimo/derinimo info į konsolę vietoj debug.log failo + + + + Send trace/debug info to debugger + Siųsti sekimo/derinimo info derintojui + + + + Username for JSON-RPC connections + Vartotojo vardas JSON-RPC jungimuisi + + + + Password for JSON-RPC connections + Slaptažodis JSON-RPC sujungimams + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Klausymas JSON-RPC sujungimui prijungčiai <port> (pagal nutylėjimą: 8332) + + + + Allow JSON-RPC connections from specified IP address + Leisti JSON-RPC tik iÅ¡ nurodytų IP adresų + + + + Send commands to node running on <ip> (default: 127.0.0.1) + Siųsti komandą mazgui dirbančiam <ip> (pagal nutylėjimą: 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + Nustatyti rakto apimties dydį <n> (pagal nutylėjimą: 100) + + + + Rescan the block chain for missing wallet transactions + IeÅ¡koti prarastų piniginės sandorių blokų grandinėje + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + SSL opcijos (žr.e Bitcoin Wiki for SSL setup instructions) + + + + Use OpenSSL (https) for JSON-RPC connections + Naudoti OpenSSL (https) jungimuisi JSON-RPC + + + + Server certificate file (default: server.cert) + Serverio sertifikato failas (pagal nutylėjimą: server.cert) + + + + Server private key (default: server.pem) + Serverio privatus raktas (pagal nutylėjimą: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Priimtini Å¡ifrai (pagal nutylėjimą: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Pagelbos žinutė + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Negali gauti duomenų katalogo %s rakto. Bitcoin tikriausiai jau veikia. + + + + Loading addresses... + Užkraunami adresai... + + + + Error loading addr.dat + addr.dat pakrovimo klaida + + + + Error loading blkindex.dat + blkindex.dat pakrovimo klaida + + + + Error loading wallet.dat: Wallet corrupted + wallet.dat pakrovimo klaida, wallet.dat sugadintas + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + wallet.dat pakrovimo klaida, wallet.dat reikalauja naujasnės Bitcoin versijos + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Piniginė turi bÅ«ti prraÅ¡yta: įvykdymui perkraukite Bitcoin + + + + Error loading wallet.dat + wallet.dat pakrovimo klaida + + + + Loading block index... + Užkraunami blokų indeksai... + + + + Loading wallet... + Užkraunama piniginė... + + + + Rescanning... + PeržiÅ«ra + + + + Done loading + Pakrovimas baigtas + + + + Invalid -proxy address + Neteisingas proxy adresas + + + + Invalid amount for -paytxfee=<amount> + Neteisinga suma -paytxfee=<amount> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Ä®spėjimas: -paytxfee yra nustatytas per didelis. Tai sandorio mokestis, kurį turėsite mokėti, jei siųsite sandorį. + + + + Error: CreateThread(StartNode) failed + Klaida: nepasileidžia CreateThread(StartNode) + + + + Warning: Disk space is low + Ä®spėjimas: nepakanka vietos diske + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Nepavyko susieti Å¡iame kompiuteryje prievado %d. Bitcoin tikriausiai jau veikia. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + Ä®spėjimas: Patikrinkite, kad kompiuterio data ir laikas yra teisingi.Jei JÅ«sų laikrodis neteisingai nustatytas Bitcoin, veiks netinkamai. + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts index aa5dd54..eac291c 100644 --- a/src/qt/locale/bitcoin_nb.ts +++ b/src/qt/locale/bitcoin_nb.ts @@ -14,20 +14,20 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Utviklerne Dette er eksperimentell programvare. -Distribuert under MIT/X11 programvarelisens. Se den medfølgende filen license.txt eller http://www.opensource.org/licenses/mit-license.php. +Distribuert under MIT/X11 programvarelisensen, se medfølgende fil license.txt eller http://www.opensource.org/licenses/mit-license.php. -Dette produktet inneholder programvare utviklet av OpenSSL Prosjektet for bruk i OpenSSL Toolkit (http://www.openssl.org/) og kryptografisk programvare skrevet av Eric Young (eay@cryptsoft.com) og UPnP programvare skrevet av Thomas Bernard. +Dette produktet inneholder programvare utviklet av OpenSSL prosjektet for bruk i OpenSSL Toolkit (http://www.openssl.org/) og kryptografisk programvare skrevet av Eric Young (eay@cryptsoft.com) og UPnP programvare skrevet av Thomas Bernard. @@ -69,31 +69,66 @@ Dette produktet inneholder programvare utviklet av OpenSSL Prosjektet for bruk i + Show &QR Code + Vis &QR Kode + + + + Sign a message to prove you own this address + Signér en melding for Ã¥ bevise at du eier denne adressen + + + + &Sign Message + &Signér Melding + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Slett den valgte adressen fra listen. Bare adresser for sending kan slettes. - + &Delete &Slett - + + Copy address + Kopier adresse + + + + Copy label + Kopier merkelapp + + + + Edit + Rediger + + + + Delete + Slett + + + Export Address Book Data Eksporter adressebok - + Comma separated file (*.csv) Kommaseparert fil (*.csv) - + Error exporting Feil ved eksportering - + Could not write to file %1. Kunne ikke skrive til filen %1. @@ -125,125 +160,132 @@ Dette produktet inneholder programvare utviklet av OpenSSL Prosjektet for bruk i + TextLabel Merkelapp - + Enter passphrase Angi adgangsfrase - + New passphrase Ny adgangsfrase - + Repeat new passphrase Gjenta ny adgangsfrase - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Skriv inn den nye adgangsfrasen for lommeboken.<br/>Vennligst bruk en adgangsfrase med <b>10 eller flere tilfeldige tegn</b>, eller <b>Ã¥tte eller flere ord</b>. - + Encrypt wallet Krypter lommebok - + This operation needs your wallet passphrase to unlock the wallet. Denne operasjonen krever adgangsfrasen til lommeboken for Ã¥ lÃ¥se den opp. - + Unlock wallet LÃ¥s opp lommebok - + This operation needs your wallet passphrase to decrypt the wallet. Denne operasjonen krever adgangsfrasen til lommeboken for Ã¥ dekryptere den. - + Decrypt wallet Dekrypter lommebok - + Change passphrase Endre adgangsfrase - + Enter the old and new passphrase to the wallet. Skriv inn gammel og ny adgangsfrase for lommeboken. - + Confirm wallet encryption Bekreft kryptering av lommebok - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? ADVARSEL: Hvis du krypterer lommeboken og mister adgangsfrasen vil du <b>MISTE ALLE DINE BITCOINS</b>! Er du sikker pÃ¥ at du vil kryptere lommeboken? - - + + Wallet encrypted Lommebok kryptert - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Husk at Ã¥ kryptere lommeboken ikke vil beskytte dine bitcoins fullstendig fra Ã¥ bli stjÃ¥let av skadevare som infiserer datamaskinen din. + + Bitcoin 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. + Bitcoin vil nÃ¥ lukkes for Ã¥ fullføre krypteringsprosessen. Husk at kryptering av lommeboken ikke fullt ut kan beskytte dine bitcoins fra Ã¥ bli stjÃ¥let om skadevare infiserer datamaskinen. - - - - + + + Warning: The Caps Lock key is on. + Advarsel: Caps lock tasten er pÃ¥. + + + + + + Wallet encryption failed Kryptering av lommebok feilet - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Kryptering av lommebok feilet pÃ¥ grunn av en intern feil. Din lommebok ble ikke kryptert. - - + + The supplied passphrases do not match. De angitte adgangsfrasene er ulike. - + Wallet unlock failed OpplÃ¥sing av lommebok feilet - - + + The passphrase entered for the wallet decryption was incorrect. Adgangsfrasen angitt for dekryptering av lommeboken var feil. - + Wallet decryption failed Dekryptering av lommebok feilet - + Wallet passphrase was succesfully changed. Lommebokens adgangsfrase ble endret. @@ -251,247 +293,278 @@ Er du sikker pÃ¥ at du vil kryptere lommeboken? BitcoinGUI - + Bitcoin Wallet Bitcoin Lommebok - + + Synchronizing with network... Synkroniserer med nettverk... - + Block chain synchronization in progress Synkronisering av blokk-kjede igang - + &Overview &Oversikt - + Show general overview of wallet Vis generell oversikt over lommeboken - + &Transactions &Transaksjoner - + Browse transaction history Vis transaksjonshistorikk - + &Address Book &Adressebok - + Edit the list of stored addresses and labels Rediger listen over adresser og deres merkelapper - + &Receive coins &Motta bitcoins - + Show the list of addresses for receiving payments Vis listen over adresser for mottak av betalinger - + &Send coins &Send bitcoins - + Send coins to a bitcoin address Send bitcoins til en adresse - + + Sign &message + Signér &melding + + + + Prove you control an address + Bevis at du kontrollerer en adresse + + + E&xit &Avslutt - + Quit application Avslutt applikasjonen - + &About %1 &Om %1 - + Show information about Bitcoin Vis informasjon om Bitcoin - + + About &Qt + Om &Qt + + + + Show information about Qt + Vis informasjon om Qt + + + &Options... &Innstillinger... - + Modify configuration options for bitcoin Endre innstillinger for bitcoin - + Open &Bitcoin Åpne &Bitcoin - + Show the Bitcoin window Vis Bitcoin-vinduet - + &Export... &Eksporter... - - Export the current view to a file - Eksporter visningen til en fil + + Export the data in the current tab to a file + - + &Encrypt Wallet &Krypter Lommebok - + Encrypt or decrypt wallet Krypter eller dekrypter lommebok - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase &Endre Adgangsfrase - + Change the passphrase used for wallet encryption Endre adgangsfrasen brukt for kryptering av lommebok - + &File &Fil - + &Settings &Innstillinger - + &Help &Hjelp - + Tabs toolbar Verktøylinje for faner - + Actions toolbar Verktøylinje for handlinger - + [testnet] [testnett] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network - %n aktiv forbindelse til Bitcoin nettverket%n aktive forbindelser to Bitcoin nettverket + %n aktiv forbindelse til Bitcoin-nettverket%n aktive forbindelser til Bitcoin-nettverket - + Downloaded %1 of %2 blocks of transaction history. Lastet ned %1 av %2 blokker med transaksjonshistorikk. - + Downloaded %1 blocks of transaction history. Lastet ned %1 blokker med transaksjonshistorikk. - + %n second(s) ago - %n sekund igjen%n sekunder igjen + for %n sekund sidenfor %n sekunder siden - + %n minute(s) ago - %n minutt siden%n minutter siden + for %n minutt sidenfor %n minutter siden - + %n hour(s) ago - %n time siden%n timer siden + for %n time sidenfor %n timer siden - + %n day(s) ago - %n dag siden%n dager siden + for %n dag sidenfor %n dager siden - + Up to date Ajour - + Catching up... Kommer ajour... - + Last received block was generated %1. Siste mottatte blokk ble generert %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Denne transaksjonen overstiger størrelsesbegrensningen. Du kan likevel sende den med et gebyr pÃ¥ %1, som gÃ¥r til nodene som prosesserer transaksjonen din og støtter nettverket. Vil du betale gebyret? - + Sending... Sender... - + Sent transaction Sendt transaksjon - + Incoming transaction Innkommende transaksjon - + Date: %1 Amount: %2 Type: %3 @@ -504,15 +577,35 @@ Adresse: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Lommeboken er <b>kryptert</b> og for tiden <b>ulÃ¥st</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> Lommeboken er <b>kryptert</b> og for tiden <b>lÃ¥st</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -580,22 +673,22 @@ Adresse: %4 Rediger utsendingsadresse - + The entered address "%1" is already in the address book. Den oppgitte adressen "%1" er allerede i adresseboken. - + The entered address "%1" is not a valid bitcoin address. en oppgitte adressen "%1" er ikke en gyldig bitcoin-adresse. - + Could not unlock wallet. Kunne ikke lÃ¥se opp lommeboken. - + New key generation failed. Generering av ny nøkkel feilet. @@ -674,8 +767,8 @@ Adresse: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Valgfritt transaksjonsgebyr per kB som hjelper for Ã¥ sikre at transaksjonene dine blir raskt prosessert. De fleste transaksjoner er 1kB. Et gebyr pÃ¥ 0.01 anbefales. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Valgfritt transaksjonsgebyr per kB som sikrer at dine transaksjoner blir raskt prosessert. De fleste transaksjoner er 1 kB. Et gebyr pÃ¥ 0.01 er anbefalt. @@ -684,8 +777,98 @@ Adresse: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Valgfritt transaksjonsgebyr per kB som hjelper for Ã¥ sikre at transaksjonene dine blir raskt prosessert. De fleste transaksjoner er 1kB. Et gebyr pÃ¥ 0.01 anbefales. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Valgfritt transaksjonsgebyr per kB som sikrer at dine transaksjoner blir raskt prosessert. De fleste transaksjoner er 1 kB. Et gebyr pÃ¥ 0.01 er anbefalt. + + + + MessagePage + + + Message + Melding + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adressen betalingen skal sendes til (f.eks. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Velg adresse fra adresseboken + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Lim inn adresse fra utklippstavlen + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Skriv inn meldingen du vil signere her + + + + Click "Sign Message" to get signature + Klikk "Signér Melding" for signatur + + + + Sign a message to prove you own this address + Signér en melding for Ã¥ bevise at du eier denne adressen + + + + &Sign Message + &Signér Melding + + + + Copy the currently selected address to the system clipboard + Kopier den valgte adressen til systemets utklippstavle + + + + &Copy to Clipboard + &Kopier til utklippstavle + + + + + + Error signing + Feil ved signering + + + + %1 is not a valid address. + %1 er ikke en gyldig adresse + + + + Private key for %1 is not available. + Privat nøkkel for %1 er ikke tilgjengelig. + + + + Sign failed + Signering feilet @@ -753,7 +936,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Lommebok</span></p></body></html> @@ -778,16 +961,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + QR Kode + + + + Request Payment + Etterspør Betaling + + + + Amount: + Beløp: + + + + BTC + BTC + + + + Label: + Merkelapp: + + + + Message: + Melding: + + + + &Save As... + &Lagre Som... + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Send Bitcoins @@ -803,81 +1039,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + Fjern alle transaksjonsfelter + + + Clear all Fjern alle - + Balance: Saldo: - + 123.456 BTC 123.456 BTC - + Confirm the send action Bekreft sending - + &Send &Send - + <b>%1</b> to %2 (%3) <b>%1</b> til %2 (%3) - + Confirm send coins Bekreft sending av bitcoins - + Are you sure you want to send %1? Er du sikker pÃ¥ at du vil sende %1? - + and og - + The recepient address is not valid, please recheck. Mottaksadressen er ugyldig, prøv igjen. - + The amount to pay must be larger than 0. Beløpen som skal betales mÃ¥ være over 0. - + Amount exceeds your balance Beløpet overstiger saldoen din - + Total exceeds your balance when the %1 transaction fee is included Totalen overgÃ¥r din saldo nÃ¥r transaksjonsgebyret pÃ¥ %1 tas med - + Duplicate address found, can only send to each address once in one send operation Duplikate adresser funnet, kan kun sende til hver adresse en gang i hver sendeoperasjon - + Error: Transaction creation failed Feil: Opprettelse av transaksjon feilet - + Error: 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. Feil: Transaksjonen ble avvist. Dette kan skje hvis noen av myntene i lommeboken allerede var brukt, f.eks. hvis du kopierte wallet.dat og mynter ble brukt i kopien uten Ã¥ bli markert brukt her. @@ -949,135 +1190,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Åpen for %1 blokker - + Open until %1 Åpen til %1 - + %1/offline? %1/frakoblet? - + %1/unconfirmed %1/ubekreftet - + %1 confirmations %1 bekreftelser - + <b>Status:</b> <b>Status:</b> - + , has not been successfully broadcast yet , har ikke blitt kringkastet uten problemer enda. - + , broadcast through %1 node , kringkast gjennom %1 node - + , broadcast through %1 nodes , kringkast gjennom %1 noder - + <b>Date:</b> <b>Dato:</b> - + <b>Source:</b> Generated<br> <b>Kilde:</b> Generert<br> - - + + <b>From:</b> <b>Fra:</b> - + unknown ukjent - - - + + + <b>To:</b> <b>Til:</b> - + (yours, label: (din, merkelapp: - + (yours) (din) - - - - + + + + <b>Credit:</b> <b>Kredit:</b> - + (%1 matures in %2 more blocks) (%1 modnes om %2 flere blokker) - + (not accepted) (ikke akseptert) - - - + + + <b>Debit:</b> <b>Debet:</b> - + <b>Transaction fee:</b> <b>Transaksjonsgebyr:</b> - + <b>Net amount:</b> <b>Nettobeløp:</b> - + Message: Melding: - + Comment: Kommentar: - + + Transaction ID: + Transaksjons-ID: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Genererte mynter mÃ¥ vente 120 blokker før de kan brukes. Da du genererte denne blokken ble den kringkastet pÃ¥ nettverket for Ã¥ bli lagt til i kjeden av blokker. Hvis den ikke kommer med i kjeden vil den endre seg til "ikke akseptert og pengene vil ikke kunne brukes. Dette vil noen ganger skje hvis en annen node genererer en blokk noen sekunder i tid fra din egen. @@ -1164,56 +1410,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Mottatt fra IP + Received from + Mottatt fra - + Sent to Sendt til - - Sent to IP - Sendt til IP - - - + Payment to yourself Betaling til deg selv - + Mined Utvunnet - + (n/a) - - + Transaction status. Hover over this field to show number of confirmations. Transaksjonsstatus. Hold muspekeren over dette feltet for Ã¥ se antall bekreftelser. - + Date and time that the transaction was received. Dato og tid for da transaksjonen ble mottat. - + Type of transaction. Type transaksjon. - + Destination address of transaction. Mottaksadresse for transaksjonen - + Amount removed from or added to balance. Beløp fjernet eller lagt til saldo. @@ -1292,16 +1533,21 @@ p, li { white-space: pre-wrap; } Minimumsbeløp - + Copy address Kopier adresse - + Copy label Kopier merkelapp + + Copy amount + Kopiér beløp + + Edit label Rediger merkelapp @@ -1312,67 +1558,67 @@ p, li { white-space: pre-wrap; } Vis detaljer... - + Export Transaction Data Eksporter transaksjonsdata - + Comma separated file (*.csv) Kommaseparert fil (*.csv) - + Confirmed Bekreftet - + Date Dato - + Type Type - + Label Merkelapp - + Address Adresse - + Amount Beløp - + ID ID - + Error exporting Feil ved eksport - + Could not write to file %1. Kunne ikke skrive til filen %1. - + Range: Intervall: - + to til @@ -1380,7 +1626,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Sender... @@ -1399,940 +1645,336 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - - Send kommando til -server eller bitcoind - + Send command to -server or bitcoind + Send kommando til -server eller bitcoind - List commands - - Vis liste over kommandoer - + List commands + List opp kommandoer - Get help for a command - - FÃ¥ hjelp til kommando - + Get help for a command + Vis hjelpetekst for en kommando - Options: - - Innstillinger: - + Options: + Innstillinger: - Specify configuration file (default: bitcoin.conf) - - Angi konfigurasjonsfil (standard: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) + Angi konfigurasjonsfil (standardverdi: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - - Angi pid-fil (standard: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) + Angi pid-fil (standardverdi: bitcoind.pid) - Generate coins - - Generer mynter - + Generate coins + Generér bitcoins - Don't generate coins - - Ikke generer mynter - - + Don't generate coins + Ikke generér bitcoins - Start minimized - + Start minimized Start minimert - Specify data directory - - Angi mappe for data - + Specify data directory + Angi mappe for datafiler - Specify connection timeout (in milliseconds) - - Angi tidsavbrudd for forbindelser (i millisekunder) - + Specify connection timeout (in milliseconds) + Angi tidsavbrudd for forbindelse (i millisekunder) - Connect through socks4 proxy - - Koble til gjennom sock4 mellomtjener - + Connect through socks4 proxy + Koble til gjennom socks4 proxy - Allow DNS lookups for addnode and connect - - Tillat DNS-oppslag for addnode og connect - + Allow DNS lookups for addnode and connect + Tillat DNS-oppslag for addnode og connect - Add a node to connect to - - Legg til node for tilkobling - + Listen for connections on <port> (default: 8333 or testnet: 18333) + Lytt etter tilkoblinger pÃ¥ <port> (standardverdi: 8333 eller testnet: 18333) - Connect only to the specified node - - Koble kun til en oppgitt node - + Maintain at most <n> connections to peers (default: 125) + Hold maks <n> koblinger Ã¥pne til andre noder (standardverdi: 125) - Don't accept connections from outside - - Ikke ta imot tilkoblinger fra utsiden - + Add a node to connect to + Legg til node for tilkobling - Don't attempt to use UPnP to map the listening port - - Ikke forsøk Ã¥ bruke UPnP for Ã¥ sette opp lytteport + Connect only to the specified node + Koble kun til angitt node - Attempt to use UPnP to map the listening port - - Forsøk Ã¥ bruke UPnP for Ã¥ sette opp lytteport + Don't accept connections from outside + Ikke ta imot tilkoblinger fra omverden - Fee per kB to add to transactions you send - - Gebyr per kB som skal legges til transaksjoner du sender - + Don't bootstrap list of peers using DNS + Ikke lag initiell nodeliste ved hjelp av DNS - Accept command line and JSON-RPC commands - - Ta imot kommandoer fra bÃ¥de kommandolinje og JSON-RPC - + Threshold for disconnecting misbehaving peers (default: 100) + Grenseverdi for Ã¥ koble fra noder med dÃ¥rlig oppførsel (standardverdi: 100) - Run in the background as a daemon and accept commands - - Kjør som bakgrunnsprosess og ta imot kommandoer - - - - - Use the test network - - Bruk testnettet - - - - - Username for JSON-RPC connections - - Brukernavn for JSON-RPC forbindelser - + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Antall sekunder noder med dÃ¥rlig oppførsel hindres fra Ã¥ koble til pÃ¥ nytt (standardverdi: 86400) - Password for JSON-RPC connections - - Passord for JSON-RPC forbindelser - + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maksimum mottaksbuffer per tilkobling, <n>*1000 bytes (standardverdi: 10000) - Listen for JSON-RPC connections on <port> (default: 8332) - - Lytt etter JSON-RPC forbindelser pÃ¥ <port> (standard: 8332) - + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maksimum sendebuffer per tilkobling, <n>*1000 bytes (standardverdi: 10000) - Allow JSON-RPC connections from specified IP address - - Tillat JSON-RPC forbindelser fra oppgitt IP-adresse - + Don't attempt to use UPnP to map the listening port + Ikke sett opp port vha. UPnP - Send commands to node running on <ip> (default: 127.0.0.1) - - Send kommandoer til noden som kjører pÃ¥ <ip> (standard: 127.0.0.1) - + Attempt to use UPnP to map the listening port + Sett opp port vha. UPnP - Set key pool size to <n> (default: 100) - - Sett størrelsen pÃ¥ lager for nye nøkler til <n> (standard: 100) - + Fee per kB to add to transactions you send + Gebyr per kB for transaksjoner du sender - Rescan the block chain for missing wallet transactions - - Se igjennom blokk-kjeden pÃ¥ nytt etter manglende lommebokstransaksjoner - + Accept command line and JSON-RPC commands + Ta imot kommandolinje- og JSON-RPC-kommandoer - -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - - SSL innstillinger: (se Bitcoin Wikien for instruksjoner for SSL-oppsett) - + Run in the background as a daemon and accept commands + Kjør i bakgrunnen som daemon og ta imot kommandoer + + + + Use the test network + Bruk testnettverket + + + + Output extra debugging information + Gi ut ekstra debuginformasjon - Use OpenSSL (https) for JSON-RPC connections - - Bruk OpenSSL (https) for JSON-RPC forbindelser - + Prepend debug output with timestamp + Sett tidsstempel pÃ¥ debugmeldinger - Server certificate file (default: server.cert) - - Fil for tjenersertifikat (standard: server.cert) - + Send trace/debug info to console instead of debug.log file + Send spor/debug informasjon til konsollet istedenfor debug.log filen - Server private key (default: server.pem) - - Privat nøkkel for tjener (standard: server.pem) - + Send trace/debug info to debugger + Send spor/debug informasjon til debugger - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - Akseptable krypteringsmetoder (standard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + Username for JSON-RPC connections + Brukernavn for JSON-RPC forbindelser + + + + Password for JSON-RPC connections + Passord for JSON-RPC forbindelser + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Lytt etter JSON-RPC tilkoblinger pÃ¥ <port> (standardverdi: 8332) - This help message - - Denne hjelpemeldingen - + Allow JSON-RPC connections from specified IP address + Tillat JSON-RPC tilkoblinger fra angitt IP-adresse - Cannot obtain a lock on data directory %s. Bitcoin is probably already running. - Kunne ikke lÃ¥se datamappen %s. Bitcoin kjører sannsynligvis allerede. + Send commands to node running on <ip> (default: 127.0.0.1) + Send kommandoer til node pÃ¥ <ip> (standardverdi: 127.0.0.1) - - Loading addresses... - Laster adresser... + + Set key pool size to <n> (default: 100) + Angi størrelse pÃ¥ nøkkel-lager til <n> (standardverdi: 100) - - Error loading addr.dat - - Feil ved lasting av addr.dat - + + Rescan the block chain for missing wallet transactions + Se gjennom blokk-kjeden etter manglende lommeboktransaksjoner - - Loading block index... - Laster blokkindeks... + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +SSL innstillinger: (se Bitcoin Wiki for instruksjoner om SSL oppsett) - Error loading blkindex.dat - - Feil ved lasting av blkindex.dat - + Use OpenSSL (https) for JSON-RPC connections + Bruk OpenSSL (https) for JSON-RPC forbindelser - Loading wallet... - Laster lommebok... + Server certificate file (default: server.cert) + Servers sertifikat (standardverdi: server.cert) - Error loading wallet.dat: Wallet corrupted - - Feil ved lasting av wallet.dat: Skadde data i lommeboken - + Server private key (default: server.pem) + Servers private nøkkel (standardverdi: server.pem) - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Feil ved lasting av wallet.dat: Lommeboken krever en nyere versjon av Bitcoin - - - - - Error loading wallet.dat - - Feil ved lasting av wallet.dat - + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Akseptable krypteringsmetoder (standardverdi: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - Rescanning... - Leser gjennom... + This help message + Denne hjelpemeldingen - Done loading - Ferdig med lasting - - - - Invalid -proxy address - Ugyldig -proxy adresse for mellomtjener - - - - Invalid amount for -paytxfee=<amount> - Ugyldig gebyrbeløp for -paytxfee=<beløp> + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Kunne ikke lÃ¥se datamappen %s. Bitcoin kjører sannsynligvis allerede. - Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. - Advarsel: -paytxfee er satt veldig høyt. Dette er transaksjonsgebyret du betaler nÃ¥r du sender en transaksjon. + Loading addresses... + Laster adresser... - - Error: CreateThread(StartNode) failed - Feil: CreateThread(StartNode) feilet + + Error loading addr.dat + Feil ved lasting av addr.dat - - Warning: Disk space is low - Advarsel: Lite ledig diskplass + + Error loading blkindex.dat + Feil ved lasting av blkindex.dat - Unable to bind to port %d on this computer. Bitcoin is probably already running. - Klarer ikke binde til port %d pÃ¥ denne datamaskinen. Bitcoin kjører sannsynligvis allerede. - - - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Denne transaksjonen er over maks-størrelsen. Du kan likevel sende med et gebyr pÃ¥ %s, som vil bli gitt til noder som prosesserer transaksjonen din og støtter nettverket. Vil du betale gebyret? - - - - Enter the current passphrase to the wallet. - Skriv inn nÃ¥værende adgangsfrase for lommeboken. - - - - Passphrase - Adgangsfrase - - - - Please supply the current wallet decryption passphrase. - Vennligst oppgÃ¥ nÃ¥værende adgangsfrase for dekryptering. - - - - The passphrase entered for the wallet decryption was incorrect. - Adgangsfrasen oppgitt for dekryptering av lommeboken var feil. - - - - Status - Status - - - - Date - Dato - - - - Description - Beskrivelse - - - - Debit - Debet - - - - Credit - Kredit - - - - Open for %d blocks - Åpen for %d blokker - - - - Open until %s - Åpen til %s - - - - %d/offline? - %d/frakoblet? - - - - %d/unconfirmed - %d/ubekreftet - - - - %d confirmations - %d bekreftelser - - - - Generated - Generert - - - - Generated (%s matures in %d more blocks) - Generert (%s modnes om %d blokker) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Generert - Advarsel: Denne blokken ble ikke mottatt av noen andre noder og vil sannsynligvis ikke bli akseptert! - - - - Generated (not accepted) - Generert (ikke akseptert) - - - - From: - Fra: - - - - Received with: - Mottatt med: - - - - Payment to yourself - Betaling til deg selv - - - - To: - Til: - - - - Generating - Genererer - - - - (not connected) - (ikke tilkoblet) - - - - %d connections %d blocks %d transactions - %d forbindelser %d blokker %d transaksjoner - - - - Wallet already encrypted. - Lommebok allerede kryptert. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Skriv inn adgangsfrasen for lommeboken. -Vennligst bruk en adgangsfrase pÃ¥ 10 eller flere tilfeldige tegn, eller Ã¥tte eller flere ord. - - - - Error: The supplied passphrase was too short. - Feil: Angitt adgangsfrase var for kort. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - ADVARSEL: Hvis du krypterer lommeboken din og mister adgangsfrasen vil du MISTE ALLE DINE BITCOINS! -Er du sikker pÃ¥ at du vil kryptere lommeboken? - - - - Please re-enter your new wallet passphrase. - Vennligst gjenta adgangsfrasen for lommeboken. - - - - Error: the supplied passphrases didn't match. - Feil: de angitte adgangsfrasene er ulike. - - - - Wallet encryption failed. - Kryptering av lommebok feilet. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Lommebok kryptert. -Husk at det Ã¥ kryptere lommeboken ikke kan beskytte dine bitcoins fullstendig fra Ã¥ bli stjÃ¥let av skadevare som infiserer datamaskinen din. - - - - Wallet is unencrypted, please encrypt it first. - Lommeboken er ukryptert, vennligst krypter den først. - - - - Enter the new passphrase for the wallet. - Skriv inn ny adgangsfrase for lommeboken. - - - - Re-enter the new passphrase for the wallet. - Gjenta adgangsfrasen for lommeboken. - - - - Wallet Passphrase Changed. - Adgangsfrasen for Lommeboken er Endret. - - - - New Receiving Address - Ny Mottaksadresse - - - - You should use a new address for each payment you receive. - -Label - Du bør bruke en ny adresse for hver betaling du mottar. - -Merkelapp - - - - <b>Status:</b> - <b>Status:</b> - - - - , has not been successfully broadcast yet - , har ikke blitt kringkastet uten problemer enda - - - - , broadcast through %d node - , kringkastet gjennom %d node - - - - , broadcast through %d nodes - , kringkastet gjennom %d noder - - - - <b>Date:</b> - <b>Dato:</b> - - - - <b>Source:</b> Generated<br> - <b>Kilde:</b> Generert<br> - - - - <b>From:</b> - <b>Fra:</b> - - - - unknown - ukjent - - - - <b>To:</b> - <b>Til:</b> - - - - (yours, label: - (din, merkelapp: - - - - (yours) - (din) - - - - <b>Credit:</b> - <b>Kredit:</b> - - - - (%s matures in %d more blocks) - (%s modnes om %d blokker) - - - - (not accepted) - (ikke akseptert) - - - - <b>Debit:</b> - <b>Debet:</b> - - - - <b>Transaction fee:</b> - <b>Transaksjonsgebyr:</b> - - - - <b>Net amount:</b> - <b>Nettobeløp:</b> - - - - Message: - Melding: - - - - Comment: - Kommentar: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Genererte mynter mÃ¥ vente 120 blokker før de kan brukes. Da du genererte denne blokken ble den kringkastet til nettverket for Ã¥ legges til i blokk-kjeden. Hvis den ikke kommer med i kjeden vil den endres til "ikke akseptert" og ikke kunne brukes. Dette vil skje noen ganger nÃ¥r en annen node genererer en blokk bare sekunder fra din egen i tid. - - - - Cannot write autostart/bitcoin.desktop file - Kan ikke skrive til autostart/bitcoin.desktop filen - - - - Main - Hoved - - - - &Start Bitcoin on window system startup - &Start Bitcoin nÃ¥r systemet starter - - - - &Minimize on close - &Minimer ved lukking - - - - version %s - versjon %s - - - - Error in amount - Feil i beløp - - - - Send Coins - Send bitcoins - - - - Amount exceeds your balance - Beløpet overstiger saldoen - - - - Total exceeds your balance when the - Totalbeløpet overstiger saldoen nÃ¥r - - - - transaction fee is included - transaksjonsgebyret tas med - - - - Payment sent - Betaling sendt - - - - Sending... - Sender... - - - - Invalid address - Ugyldig adresse - - - - Sending %s to %s - Sender %s til %s - - - - CANCELLED - AVBRUTT - - - - Cancelled - Avbrutt - - - - Transfer cancelled - Overføring avbrutt - - - - Error: - Feil: - - - - Insufficient funds - Utilstrekkelige midler - - - - Connecting... - Kobler til... - - - - Unable to connect - Kunne ikke koble til - - - - Requesting public key... - Ber om offentlig nøkkel... - - - - Received public key... - Mottok offentlig nøkkel... - - - - Recipient is not accepting transactions sent by IP address - Mottaker tar ikke imot transaksjoner sendt via IP-adresse - - - - Transfer was not accepted - Overføring ble ikke akseptert - - - - Invalid response received - Ugyldig svar mottatt - - - - Creating transaction... - Oppretter transaksjon... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Denne transaksjonen krever et gebyr pÃ¥ minst %s pga. beløpet, kompleksiteten, eller bruk av nylig mottatte midler - - - - Transaction creation failed - Opprettelse av transaksjon feilet - - - - Transaction aborted - Transaksjon avbrutt - - - - Lost connection, transaction cancelled - Mistet forbindelsen, transaksjonen avbrutt - - - - Sending payment... - Sender betaling... - - - - 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. - Transaksjonen ble avvist. Dette kan skje hvis noen av myntene i lommeboken allerede er brukt, f.eks. hvis du kopierte wallet.dat og mynter ble brukt i kopien uten Ã¥ bli markert som brukt her. - - - - Waiting for confirmation... - Venter pÃ¥ bekreftelse... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - Betalingen ble sendt, men mottaker kunne ikke verifisere den. -Transaksjonen er lagret og beløpet vil bli kreditert mottaker, -men kommentaren vil bli blank. - - - - Payment was sent, but an invalid response was received - Betaling ble sendt, men et ugyldig svar kom tilbake - - - - Payment completed - Betaling fullført - - - - Name - Navn - - - - Address - Adresse - - - - Label - Merkelapp + Error loading wallet.dat: Wallet corrupted + Feil ved lasting av wallet.dat: Lommeboken er skadet - - Bitcoin Address - Bitcoin-Adresse + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Feil ved lasting av wallet.dat: Lommeboken krever en nyere versjon av Bitcoin - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Dette er en av dine egne adresser for mottak av betalinger og kan ikke legges inn i adresseboken. + + Wallet needed to be rewritten: restart Bitcoin to complete + Lommeboken mÃ¥tte skrives om: start Bitcoin pÃ¥ nytt for Ã¥ fullføre - - Edit Address - Rediger Adresse + + Error loading wallet.dat + Feil ved lasting av wallet.dat - - Edit Address Label - Rediger Merkelapp + + Loading block index... + Laster blokkindeks... - - Add Address - Legg til Adresse + + Loading wallet... + Laster lommebok... - - Bitcoin - Bitcoin + + Rescanning... + Leser gjennom... - - Bitcoin - Generating - Bitcoin - Genererer + + Done loading + Ferdig med lasting - - Bitcoin - (not connected) - Bitcoin - (ikke tilkoblet) + + Invalid -proxy address + Ugyldig -proxy adresse for mellomtjener - - &Open Bitcoin - &Åpne Bitcoin + + Invalid amount for -paytxfee=<amount> + Ugyldig gebyrbeløp for -paytxfee=<beløp> - - &Send Bitcoins - &Send Bitcoins + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Advarsel: -paytxfee er satt veldig høyt. Dette er transaksjonsgebyret du betaler nÃ¥r du sender en transaksjon. - - O&ptions... - &Innstillinger... + + Error: CreateThread(StartNode) failed + Feil: CreateThread(StartNode) feilet - - E&xit - &Avslutt + + Warning: Disk space is low + Advarsel: Lite ledig diskplass - - Program has crashed and will terminate. - Programmet har kræsjet og vil avslutte. + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Klarer ikke binde til port %d pÃ¥ denne datamaskinen. Bitcoin kjører sannsynligvis allerede. - + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Advarsel: Vennligst sjekk at dato og klokke er riktig innstilt pÃ¥ datamaskinen. Hvis klokken er feil vil ikke Bitcoin fungere ordentlig. - + beta beta - - main - - - Bitcoin Qt - Bitcoin Qt - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts index 1db112b..7425d21 100644 --- a/src/qt/locale/bitcoin_nl.ts +++ b/src/qt/locale/bitcoin_nl.ts @@ -15,20 +15,20 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright © 2009-2011 Bitcoin-ontwikkelaars + Copyright © 2009-2012 Bitcoin Ontwikkelaars Dit is experimentele software. -Gedistributeerd onder de MIT/X11 software licentie, zie het bijgevoegde bestand license.txt of kijk op http://www.opensource.org/licenses/mit-license.php. +Gedistribueerd onder de MIT/X11 software licentie, zie het bijgevoegde bestand license.txt of http://www.opensource.org/licenses/mit-license.php. -Dit product bevat software ontwikkeld door het OpenSSL project voor gebruik in de OpenSSL Toolkit (http://www.openssl.org/), en cryptografische software geschreven door Eric Young (eay@cryptsoft.com) en UPnP software geschreven door Thomas Bernard. +Dit product bevat software ontwikkeld door het OpenSSL Project voor gebruik in de OpenSSL Toolkit (http://www.openssl.org/) en cryptografische software gemaakt door Eric Young (eay@cryptsoft.com) en UPnP software geschreven door Thomas Bernard. @@ -46,7 +46,7 @@ Dit product bevat software ontwikkeld door het OpenSSL project voor gebruik in d Double-click to edit address or label - Dubbelklik om adres of etiket te wijzigen + Dubbelklik om adres of label te wijzigen @@ -70,31 +70,66 @@ Dit product bevat software ontwikkeld door het OpenSSL project voor gebruik in d + Show &QR Code + Toon &QR-Code + + + + Sign a message to prove you own this address + Onderteken een bericht om te bewijzen dat u dit adres bezit + + + + &Sign Message + &Onderteken Bericht + + + Delete the currently selected address from the list. Only sending addresses can be deleted. - Verwijder het huidige geselecteerde adres van de lijst. Alleen afzenderadressen kunnen verwijderd worden. + Verwijder het huidige geselecteerde adres van de lijst. Alleen zend-adressen kunnen verwijderd worden, niet uw ontvangstadressen. - + &Delete &Verwijder - + + Copy address + Kopieer adres + + + + Copy label + Kopieer label + + + + Edit + Bewerk + + + + Delete + Verwijder + + + Export Address Book Data Exporteer Gegevens van het Adresboek - + Comma separated file (*.csv) Kommagescheiden bestand (*.csv) - + Error exporting Fout bij exporteren - + Could not write to file %1. Kon niet schrijven naar bestand %1. @@ -104,7 +139,7 @@ Dit product bevat software ontwikkeld door het OpenSSL project voor gebruik in d Label - Etiket + Label @@ -114,7 +149,7 @@ Dit product bevat software ontwikkeld door het OpenSSL project voor gebruik in d (no label) - (geen etiket) + (geen label) @@ -126,373 +161,411 @@ Dit product bevat software ontwikkeld door het OpenSSL project voor gebruik in d + TextLabel - TekstEtiket + TekstLabel - + Enter passphrase - Enter wachtwoord + Huidig wachtwoord - + New passphrase Nieuwe wachtwoord - + Repeat new passphrase Herhaal wachtwoord - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. - Vul een nieuw wachtwoord in voor uw portemonnee. <br/> Gebruik een wachtwoord van <b>10 of meer lukrake karakters</b>, of <8> acht of meer woorden</b> . + Vul een nieuw wachtwoord in voor uw portemonnee. <br/> Gebruik een wachtwoord van <b>10 of meer lukrake karakters</b>, of <b> acht of meer woorden</b> . - + Encrypt wallet Versleutel portemonnee - + This operation needs your wallet passphrase to unlock the wallet. Deze operatie vereist uw portemonneewachtwoord om de portemonnee te openen. - + Unlock wallet Open portemonnee - + This operation needs your wallet passphrase to decrypt the wallet. Deze operatie vereist uw portemonneewachtwoord om de portemonnee te ontsleutelen - + Decrypt wallet Ontsleutel portemonnee - + Change passphrase - Verander wachtwoord + Wijzig wachtwoord - + Enter the old and new passphrase to the wallet. - vul uw oude en nieuwe portemonneewachtwoord in. + Vul uw oude en nieuwe portemonneewachtwoord in. - + Confirm wallet encryption Bevestig versleuteling van de portemonnee - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? WAARSCHUWING: Wanneer uw portemonnee wordt versleuteld en u verliest uw wachtwoord, dan verliest u<b>AL UW BITCOINS</b>! Bent u er zeker van uw dat u uw portemonnee wilt versleutelen? - - + + Wallet encrypted Portemonnee versleuteld - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Onthoud dat het versleutelen van uw portemonnee uw bitcoins niet volledig kan beschermen tegen diefstal, bijvoorbeeld door malware die uw computer infecteert. + + Bitcoin 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. + Bitcoin zal nu afsluiten om het versleutelingsproces te voltooien. Onthoud dat het versleutelen van uw portemonnee u niet volledig kan beschermen: Malware kan uw computer infecteren en uw bitcoins stelen. - - - - + + + Warning: The Caps Lock key is on. + Waarschuwing: De Caps-Lock-toets staat aan. + + + + + + Wallet encryption failed Portemonneeversleuteling mislukt - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Portemonneeversleuteling mislukt door een interne fout, Uw portemonnee is niet versleuteld. - - + + The supplied passphrases do not match. Het opgegeven wachtwoord is niet correct - + Wallet unlock failed Portemonnee openen mislukt - - + + The passphrase entered for the wallet decryption was incorrect. Het opgegeven wachtwoord voor de portemonnee-ontsleuteling is niet correct. - + Wallet decryption failed Portemonnee-ontsleuteling mislukt - + Wallet passphrase was succesfully changed. - Portemonneewachtwoord is succesvol veranderd + Portemonneewachtwoord is succesvol gewijzigd BitcoinGUI - + Bitcoin Wallet Bitcoin-portemonnee - + + Synchronizing with network... Synchroniseren met netwerk... - + Block chain synchronization in progress - Bezig met blokkenketting-synchronisatie + Bezig met blokkenketen-synchronisatie - + &Overview &Overzicht - + Show general overview of wallet Toon algemeen overzicht van de portemonnee - + &Transactions &Transacties - + Browse transaction history Blader door transactieverleden - + &Address Book &Adresboek - + Edit the list of stored addresses and labels - Bewerk de lijst van opgeslagen adressen en etiketten + Bewerk de lijst van opgeslagen adressen en labels - + &Receive coins &Ontvang munten - + Show the list of addresses for receiving payments Toon lijst van adressen om betalingen mee te ontvangen - + &Send coins &Verstuur munten - + Send coins to a bitcoin address Verstuur munten naar een bitcoin-adres - + + Sign &message + &Onderteken Bericht + + + + Prove you control an address + Bewijs dat u een adres bezit + + + E&xit &Afsluiten - + Quit application Programma afsluiten - + &About %1 &Over %1 - + Show information about Bitcoin Laat informatie zien over Bitcoin - + + About &Qt + Over &Qt + + + + Show information about Qt + Toon informatie over Qt + + + &Options... &Opties... - + Modify configuration options for bitcoin - Verander instellingen van Bitcoin + Wijzig instellingen van Bitcoin - + Open &Bitcoin Open &Bitcoin - + Show the Bitcoin window Toon Bitcoin-venster - + &Export... &Exporteer... - - Export the current view to a file - Exporteer huidige overzicht naar een bestand + + Export the data in the current tab to a file + Exporteer de data in de huidige tab naar een bestand - + &Encrypt Wallet &Versleutel Portemonnee - + Encrypt or decrypt wallet Versleutel of ontsleutel portemonnee - + + &Backup Wallet + Backup &Portemonnee + + + + Backup wallet to another location + &Backup portemonnee naar een andere locatie + + + &Change Passphrase - &Verander wachtwoord + &Wijzig Wachtwoord - + Change the passphrase used for wallet encryption - Verander het wachtwoord voor uw portemonneversleuteling + wijzig het wachtwoord voor uw portemonneversleuteling - + &File &Bestand - + &Settings &Instellingen - + &Help &Hulp - + Tabs toolbar Tab-werkbalk - + Actions toolbar Actie-werkbalk - + [testnet] [testnetwerk] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network - %n actieve connectie(s) naar Bitcoinnetwerk%n actieve connectie(s) naar Bitcoinnetwerk + %n actieve connectie naar Bitcoinnetwerk%n actieve connecties naar Bitcoinnetwerk - + Downloaded %1 of %2 blocks of transaction history. - %1 van %2 blokken van transactiehistorie opgehaald + %1 van %2 blokken van transactiehistorie opgehaald. - + Downloaded %1 blocks of transaction history. %1 blokken van transactiehistorie opgehaald. - + %n second(s) ago - %n seconde(n) geleden%n seconde(n) geleden + %n seconde geleden%n seconden geleden - + %n minute(s) ago - %n minu(u)t(en) geleden%n minu(u)t(en) geleden + %n minuut geleden%n minuten geleden - + %n hour(s) ago - %n u(u)r(en) geleden%n u(u)r(en) geleden + %n uur geleden%n uur geleden - + %n day(s) ago - %n dag(en) geleden%n dag(en) geleden + %n dag geleden%n dagen geleden - + Up to date Bijgewerkt - + Catching up... Aan het bijwerken... - + Last received block was generated %1. - Laatst ontvangen blok gegenereerd is %1 + Laatst ontvangen blok is %1 gegenereerd. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Deze transactie overschrijdt de groottelimiet. Om de transactie alsnog te versturen kunt u transactiekosten betalen van %1. Deze transactiekosten gaan naar de nodes die uw transactie verwerken en het helpt op deze manier bij het ondersteunen van het netwerk. Wilt u de transactiekosten betalen? - + Sending... Versturen... - + Sent transaction Verzonden transactie - + Incoming transaction Binnenkomende transactie - + Date: %1 Amount: %2 Type: %3 @@ -505,15 +578,35 @@ Adres: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Portemonnee is <b>versleuteld</b> en momenteel <b>geopend</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> Portemonnee is <b>versleuteld</b> en momenteel <b>gesloten</b> + + + Backup Wallet + Backup Portemonnee + + + + Wallet Data (*.dat) + Portemonnee-data (*.dat) + + + + Backup Failed + Backup Mislukt + + + + There was an error trying to save the wallet data to the new location. + Er is een fout opgetreden bij het wegschrijven van de portemonnee-data naar de nieuwe locatie. + DisplayOptionsPage @@ -543,12 +636,12 @@ Adres: %4 &Label - &Etiket + &Label The label associated with this address book entry - Het etiket dat geassocieerd is met dit adres + Het label dat geassocieerd is met dit adres @@ -558,45 +651,45 @@ Adres: %4 The address associated with this address book entry. This can only be modified for sending addresses. - Het adres dat geassocieerd is met deze adresboek-opgave. Dit kan alleen worden veranderd voor afzenderadressen. + Het adres dat geassocieerd is met deze adresboek-opgave. Dit kan alleen worden veranderd voor zend-adressen. New receiving address - Nieuw ontvangst-adres + Nieuw ontvangstadres New sending address - Nieuw afzender-adres + Nieuw adres om naar te verzenden Edit receiving address - Bewerk ontvangst-adres + Bewerk ontvangstadres Edit sending address - Bewerk afzender-adres + Bewerk adres om naar te verzenden - + The entered address "%1" is already in the address book. Het opgegeven adres "%1" bestaat al in uw adresboek. - + The entered address "%1" is not a valid bitcoin address. Het opgegeven adres "%1" is een ongeldig bitcoinadres - + Could not unlock wallet. Kon de portemonnee niet openen. - + New key generation failed. Genereren nieuwe sleutel mislukt. @@ -606,7 +699,7 @@ Adres: %4 &Start Bitcoin on window system startup - &Start Bitcoin wanneer het systeem opstart + Start &Bitcoin wanneer het systeem opstart @@ -636,7 +729,7 @@ Adres: %4 M&inimize on close - &Minimaliseer bij sluiten van het venster + Minimaliseer bij &sluiten van het venster @@ -675,18 +768,108 @@ Adres: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Optionele transactiekosten per kB die helpen ervoor te zorgen dat uw transacties snel verwerkt worden. De meeste transacties zijn 1kB. Transactiekosten van 0.01 wordt aangeraden. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Optionele transactiekosten per kB die helpen om uw transacties snel te verwerken. De meeste transacties zijn 1 kB. Transactiekosten van 0,01 wordt aangeraden Pay transaction &fee - Betaal transactie&kosten + Betaal &transactiekosten - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Optionele transactiekosten per kB die helpen ervoor te zorgen dat uw transacties snel verwerkt worden. De meeste transacties zijn 1kB. Transactiekosten van 0.01 wordt aangeraden. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Optionele transactiekosten per kB die helpen om uw transacties snel te verwerken. De meeste transacties zijn 1 kB. Transactiekosten van 0,01 wordt aangeraden + + + + MessagePage + + + Message + Bericht + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + U kunt berichten ondertekenen met een van uw adressen om te bewijzen dat u dit adres bezit. Pas op dat u geen onduidelijke dingen ondertekent, want phishingaanvallen zouden u voor de gek kunnen houden om zo uw identiteit te stelen. Onderteken alleen berichten waarmee u het volledig eens bent. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Het adres waaraan u wilt betalen (bijv. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Kies adres uit adresboek + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Plak adres vanuit klembord + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Typ hier het bericht dat u wilt ondertekenen + + + + Click "Sign Message" to get signature + Klik "Onderteken Bericht" om de handtekening te verkrijgen + + + + Sign a message to prove you own this address + Onderteken een bericht om te bewijzen dat u dit adres bezit + + + + &Sign Message + &Onderteken Bericht + + + + Copy the currently selected address to the system clipboard + Kopieer het huidig geselecteerde adres naar het klembord + + + + &Copy to Clipboard + &Kopieer naar Klembord + + + + + + Error signing + Fout bij het ondertekenen + + + + %1 is not a valid address. + %1 is geen geldig adres. + + + + Private key for %1 is not available. + Geheime sleutel voor %1 is niet beschikbaar. + + + + Sign failed + Ondertekenen mislukt @@ -754,7 +937,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Portemonnee</span></p></body></html> @@ -779,16 +962,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Dialoog + + + + QR Code + QR-code + + + + Request Payment + Vraag betaling aan + + + + Amount: + Bedrag: + + + + BTC + BTC + + + + Label: + Label: + + + + Message: + Bericht: + + + + &Save As... + &Opslaan Als... + + + + Save Image... + Afbeelding Opslaan... + + + + PNG Images (*.png) + PNG-Afbeeldingen (*.png) + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Verstuur munten @@ -800,85 +1036,90 @@ p, li { white-space: pre-wrap; } &Add recipient... - &Voeg ontvanger toe... + Voeg &ontvanger toe... + Remove all transaction fields + Verwijder alle transactievelden + + + Clear all Verwijder alles - + Balance: Saldo: - + 123.456 BTC 123.456 BTC - + Confirm the send action Bevestig de verstuuractie - + &Send &Verstuur - + <b>%1</b> to %2 (%3) <b>%1</b> aan %2 (%3) - + Confirm send coins Bevestig versturen munten - + Are you sure you want to send %1? Weet u zeker dat u %1 wil versturen? - + and en - + The recepient address is not valid, please recheck. - Het ontvangstadres is niet geldig, controleer ingave. + Het ontvangstadres is niet geldig, controleer uw opgave. - + The amount to pay must be larger than 0. Het ingevoerde gedrag moet groter zijn dan 0. - + Amount exceeds your balance Bedrag overschrijdt uw huidige saldo - + Total exceeds your balance when the %1 transaction fee is included Totaal overschrijdt uw huidige saldo wanneer de %1 transactiekosten worden meegerekend - + Duplicate address found, can only send to each address once in one send operation Dubbel adres gevonden, u kunt slechts eenmaal naar een bepaald adres verzenden per verstuurtransactie - + Error: Transaction creation failed Fout: Aanmaak transactie mislukt - + Error: 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. Fout: De transactie was afgewezen. Dit kan gebeuren als u eerder uitgegeven munten opnieuw wilt versturen, zoals wanneer u een kopie van uw wallet.dat heeft gebruikt en in de kopie deze munten zijn gemarkeerd als uitgegeven, maar in de huidige nog niet. @@ -893,7 +1134,7 @@ p, li { white-space: pre-wrap; } A&mount: - B&edrag: + Bedra&g: @@ -904,12 +1145,12 @@ p, li { white-space: pre-wrap; } Enter a label for this address to add it to your address book - Vul een etiket in voor dit adres om het toe te voegen aan uw adresboek + Vul een label in voor dit adres om het toe te voegen aan uw adresboek &Label: - &Etiket: + &Label: @@ -950,137 +1191,142 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Openen voor %1 blokken - + Open until %1 Openen totdat %1 - + %1/offline? %1/niet verbonden? - + %1/unconfirmed %1/onbevestigd - + %1 confirmations %1 bevestigingen - + <b>Status:</b> <b>Status:</b> - + , has not been successfully broadcast yet - ,is nog niet succesvol uitgezonden + , is nog niet succesvol uitgezonden - + , broadcast through %1 node - , uitzending langs %1 node + , uitgezonden naar %1 node - + , broadcast through %1 nodes - ,uitzending langs %1 nodes + , uitgezonden naar %1 nodes - + <b>Date:</b> <b>Datum:</b> - + <b>Source:</b> Generated<br> <b>Bron:</b>Gegenereerd<br> - - + + <b>From:</b> <b>Van:</b> - + unknown onbekend - - - + + + <b>To:</b> <b> Aan:</b> - + (yours, label: - (Uw, etiket: + (Uw adres, label: - + (yours) (uw) - - - - + + + + <b>Credit:</b> - <b>Tegoed:</b> + <b>Bij:</b> - + (%1 matures in %2 more blocks) - (%1 verwezenlijkt in %2 meer blokken) + (%1 komt beschikbaar na %2 blokken) - + (not accepted) (niet geaccepteerd) - - - + + + <b>Debit:</b> - <b>Debet:</b> + <b>Af:</b> - + <b>Transaction fee:</b> <b>Transactiekosten:</b> - + <b>Net amount:</b> <b>Netto bedrag:</b> - + Message: Bericht: - + Comment: Opmerking: - + + Transaction ID: + Transactie-ID: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Gegeneerde munten moeten 120 blokken wachten voor ze kunnen worden uitgegeven. Je net gegenereerde blok is uitgezonden aan het netwerk om te worden toegevoegd aan de blokkenketting. Als het niet wordt geaccepteerd in de ketting, zal het blok als "ongeldig" worden aangemerkt en kan het niet worden uitgegeven. Dit kan soms gebeuren als een andere node net iets sneller een blok heeft gegenereerd; een paar seconden voor de uwe. + Gegeneerde munten moeten 120 blokken wachten voor ze kunnen worden uitgegeven. Uw net gegenereerde blok is uitgezonden aan het netwerk om te worden toegevoegd aan de blokkenketen. Als het niet wordt geaccepteerd in de keten, zal het blok als "ongeldig" worden aangemerkt en kan het niet worden uitgegeven. Dit kan soms gebeuren als een andere node net iets sneller een blok heeft gegenereerd; een paar seconden voor het uwe. @@ -1121,7 +1367,7 @@ p, li { white-space: pre-wrap; } Open for %n block(s) - Open gedurende %n blok(ken)Open gedurende %n blok(ken) + Open gedurende %n blokOpen gedurende %n blokken @@ -1146,7 +1392,7 @@ p, li { white-space: pre-wrap; } Mined balance will be available in %n more blocks - Ontgonnen saldo word beschikbaar na %n blokken meerOntgonnen saldo word beschikbaar na %n blokken meer + Ontgonnen saldo komt beschikbaar na %n blokOntgonnen saldo komt beschikbaar na %n blokken @@ -1165,56 +1411,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Ontvangen van IP + Received from + Ontvangen van - + Sent to Verzonden aan - - Sent to IP - Verzonden aan IP - - - + Payment to yourself Betaling aan uzelf - + Mined Ontgonnen - + (n/a) (nvt) - + Transaction status. Hover over this field to show number of confirmations. Transactiestatus. Houd de muiscursor boven dit veld om het aantal bevestigingen te laten zien. - + Date and time that the transaction was received. Datum en tijd waarop deze transactie is ontvangen. - + Type of transaction. Type transactie. - + Destination address of transaction. Ontvangend adres van transactie - + Amount removed from or added to balance. Bedrag verwijderd van of toegevoegd aan saldo @@ -1285,7 +1526,7 @@ p, li { white-space: pre-wrap; } Enter address or label to search - Vul adres of etiket in om te zoeken + Vul adres of label in om te zoeken @@ -1293,19 +1534,24 @@ p, li { white-space: pre-wrap; } Min. bedrag - + Copy address Kopieer adres - + Copy label - Kopieer etiket + Kopieer label + + + + Copy amount + Kopieer bedrag Edit label - Verander Etiket + Bewerk label @@ -1313,67 +1559,67 @@ p, li { white-space: pre-wrap; } Toon details... - + Export Transaction Data Exporteer transactiegegevens - + Comma separated file (*.csv) Kommagescheiden bestand (*.csv) - + Confirmed Bevestigd - + Date Datum - + Type Type - + Label - Etiket + Label - + Address Adres - + Amount Bedrag - + ID ID - + Error exporting Fout bij exporteren - + Could not write to file %1. Kon niet schrijven naar bestand %1. - + Range: Bereik: - + to naar @@ -1381,7 +1627,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Versturen... @@ -1400,938 +1646,367 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind Stuur commando naar -server of bitcoind - List commands - - List van commando's + List commands + List van commando's - Get help for a command - + Get help for a command Toon hulp voor een commando - Options: - + Options: Opties: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Specifieer configuratiebestand (standaard: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) Specifieer pid-bestand (standaard: bitcoind.pid) - Generate coins - + Generate coins Genereer munten - Don't generate coins - + Don't generate coins Genereer geen munten - Start minimized - + Start minimized Geminimaliseerd starten - Specify data directory - + Specify data directory Stel datamap in - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Specificeer de time-out tijd (in milliseconden) - Connect through socks4 proxy - + Connect through socks4 proxy Verbind via socks4 proxy - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Sta DNS-naslag toe voor addnode en connect - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + Luister voor verbindingen op <poort> (standaard: 8333 of testnet: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Onderhoud maximaal <n> verbindingen naar peers (standaard: 125) + + + + Add a node to connect to Voeg een node toe om mee te verbinden - - Connect only to the specified node - + + Connect only to the specified node Verbind alleen met deze node - - Don't accept connections from outside - + + Don't accept connections from outside Sta geen verbindingen van buitenaf toe - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + Gebruik geen DNS om de lijst met peers op te starten + + + + Threshold for disconnecting misbehaving peers (default: 100) + Drempel om verbinding te verbreken naar zich misdragende peers (standaard: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Aantal seconden dat zich misdragende peers niet opnieuw mogen verbinden (standaard: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maximale ontvangstbuffer per connectie, <n>*1000 bytes (standaard: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maximale zendbuffer per connectie, <n>*1000 bytes (standaard: 10000) + + + + Don't attempt to use UPnP to map the listening port Probeer geen UPnP te gebruiken om de poort waarop geluisterd wordt te mappen - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port Probeer UPnP te gebruiken om de poort waarop geluisterd wordt te mappen - - Fee per kB to add to transactions you send - - Kosten per kB om aan transacties toe te voegen die u verstuurt - + + Fee per kB to add to transactions you send + Transactiekosten per kB om toe te voegen aan transacties die u verzendt - - Accept command line and JSON-RPC commands - - Aanvaard commandoregel en JSON-RPC commando's + + Accept command line and JSON-RPC commands + Aanvaard commandoregel en JSON-RPC commando's - - Run in the background as a daemon and accept commands - - Draai in de achtergrond als daemon en aanvaard commando's + + Run in the background as a daemon and accept commands + Draai in de achtergrond als daemon en aanvaard commando's - - Use the test network - + + Use the test network Gebruik het testnetwerk - - Username for JSON-RPC connections - + + Output extra debugging information + Toon extra debuggingsinformatie + + + + Prepend debug output with timestamp + Voorzie de debuggingsuitvoer van een tijdsaanduiding + + + + Send trace/debug info to console instead of debug.log file + Stuur trace/debug-info naar de console in plaats van het debug.log bestand + + + + Send trace/debug info to debugger + Stuur trace/debug-info naar debugger + + + + Username for JSON-RPC connections Gebruikersnaam voor JSON-RPC verbindingen - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Wachtwoord voor JSON-RPC verbindingen - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) Luister voor JSON-RPC verbindingen op <poort> (standaard: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address Sta JSON-RPC verbindingen van opgegeven IP adres toe - - Send commands to node running on <ip> (default: 127.0.0.1) - - Verstuur commando's naar proces dat op <ip> draait (standaard: 127.0.0.1) + + Send commands to node running on <ip> (default: 127.0.0.1) + Verstuur commando's naar proces dat op <ip> draait (standaard: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Stel sleutelpoelgrootte in op <n> (standaard: 100) - - Rescan the block chain for missing wallet transactions - - Doorzoek de blokkenketting op ontbrekende portemonnee-transacties - + + Rescan the block chain for missing wallet transactions + Doorzoek de blokkenketen op ontbrekende portemonnee-transacties - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) SSL opties: (zie de Bitcoin wiki voor SSL instructies) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections Gebruik OpenSSL (https) voor JSON-RPC verbindingen - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) Certificaat-bestand voor server (standaard: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Geheime sleutel voor server (standaard: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Aanvaardbare ciphers (standaard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message Dit helpbericht - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. Kan geen lock op de gegevensdirectory %s verkrijgen. Bitcoin draait vermoedelijk reeds. - + Loading addresses... Adressen aan het laden... - - Error loading addr.dat - - Fout bij laden van bestand addr.dat - + + Error loading addr.dat + Fout bij laden addr.dat - - Loading block index... - Blokindex aan het laden... + + Error loading blkindex.dat + Fout bij laden blkindex.dat - - Error loading blkindex.dat - - Fout bij laden van bestand addr.dat - + + Error loading wallet.dat: Wallet corrupted + Fout bij laden wallet.dat: Portemonnee corrupt - - Loading wallet... - Portemonnee aan het laden... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Fout bij laden wallet.dat: Portemonnee vereist een nieuwere versie van Bitcoin - - Error loading wallet.dat: Wallet corrupted - - Fout bij het laden van wallet.dat: Portemonnee corrupt - + + Wallet needed to be rewritten: restart Bitcoin to complete + Portemonnee moest herschreven worden: Herstart Bitcoin om te voltooien - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Fout bij het laden van wallet.dat: Portemonnee vereist nieuwere versie van Bitcoin + + Error loading wallet.dat + Fout bij laden wallet.dat - - Error loading wallet.dat - - Fout bij laden van bestand wallet.dat - + + Loading block index... + Blokindex aan het laden... - + + Loading wallet... + Portemonnee aan het laden... + + + Rescanning... Opnieuw aan het scannen ... - + Done loading Klaar met laden - + Invalid -proxy address Foutief -proxy adres - + Invalid amount for -paytxfee=<amount> Ongeldig bedrag voor -paytxfee=<bedrag> - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Waarschuwing: -paytxfee is zeer hoog ingesteld. Dit zijn de transactiekosten die u betaalt bij het versturen van een transactie. - + Error: CreateThread(StartNode) failed Fout: CreateThread(StartNode) is mislukt - + Warning: Disk space is low Waarschuwing: Weinig schijfruimte over - + Unable to bind to port %d on this computer. Bitcoin is probably already running. Kan niet binden aan poort %d op deze computer. Bitcoin draait vermoedelijk reeds. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Deze transactie overschrijdt de groottelimiet. Om de transactie alsnog te versturen kunt u transactiekosten betalen van %s. Deze transactiekosten gaan naar de nodes die uw transactie verwerken en het helpt op deze manier bij het ondersteunen van het netwerk. Wilt u de transactiekosten betalen? - - - - Enter the current passphrase to the wallet. - Voer het huidige portemonneewachtwoord in. - - - - Passphrase - Wachtwoordzin - - - - Please supply the current wallet decryption passphrase. - Voer het huidige portemonnee-ontsleutel-wachtwoord in. - - - - The passphrase entered for the wallet decryption was incorrect. - Het wachtwoord voor de portemonnee-ontsleuteling was incorrect. - - - - Status - Status - - - - Date - Datum - - - - Description - Omschrijving - - - - Debit - Debet - - - - Credit - Credit - - - Open for %d blocks - Open voor %d blokken - - - - Open until %s - Open tot %s - - - - %d/offline? - %d/niet verbonden? - - - - %d/unconfirmed - %d/onbevestigd - - - - %d confirmations - %d bevestigingen - - - - Generated - Gegenereerd - - - - Generated (%s matures in %d more blocks) - Gegenereerd (%s wordt volwassen in %d meer blokken) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Gegenereerd - Waarschuwing: Dit blok werd door geen enkele andere node ontvangen en zal waarschijnlijk niet worden geaccepteerd! - - - - Generated (not accepted) - Gegenereerd (niet geaccepteerd) - - - - From: - Van: - - - - Received with: - Ontvangen met: - - - - Payment to yourself - Betaling aan uzelf - - - - To: - Aan: - - - - Generating - Aan het genereren - - - - (not connected) - (Niet verbonden) - - - - %d connections %d blocks %d transactions - %d verbindingen %d blokken %d transacties - - - - Wallet already encrypted. - Portemonnee reeds versleuteld. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Voer het nieuwe portemonneewachtwoord in. Gebruik een wachtwoord van 10 of meer willekeurige tekens, of acht of meer woorden. - - - - Error: The supplied passphrase was too short. - Fout: Het opgegeven wachtwoord was te kort. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - WAARSCHUWING: Als u uw portemonnee versleutelt en uw wachtwoord verliest, verliest u AL UW BITCOINS! Bent u er zeker van dat u uw portemonnee wilt versleutelen? - - - - Please re-enter your new wallet passphrase. - Voer uw nieuwe portemonneewachtwoord nogmaals in. - - - - Error: the supplied passphrases didn't match. - Fout: De opgegeven wachtwoorden kwamen niet overeen. - - - - Wallet encryption failed. - Portemonneeversleuteling mislukt. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Portemonnee versleuteld. -Onthoud dat het versleutelen van uw portemonnee uw bitcoins niet volledig kan beschermen tegen diefstal, bijvoorbeeld door malware die uw computer infecteert. - - - - Wallet is unencrypted, please encrypt it first. - Portemonnee is onversleuteld, gelieve deze eerst te versleutelen. - - - - Enter the new passphrase for the wallet. - Voer het nieuwe portemonneewachtwoord in. - - - - Re-enter the new passphrase for the wallet. - Voer het nieuwe portemonneewachtwoord opnieuw in. - - - - Wallet Passphrase Changed. - Portemonnewachtwoord veranderd. - - - - New Receiving Address - Nieuw Ontvangstadres - - - - You should use a new address for each payment you receive. - -Label - Het is aan te raden om een nieuw adres te gebruiken voor elke betaling die u ontvangt. - -Etiket - - - - <b>Status:</b> - <b>Status:</b> - - - - , has not been successfully broadcast yet - , is nog niet succesvol uitgezonden - - - - , broadcast through %d node - , uitgezonden door %d node - - - - , broadcast through %d nodes - , uitgezonden door %d nodes - - - - <b>Date:</b> - <b>Datum:</b> - - - - <b>Source:</b> Generated<br> - <b>Bron:</b> Gegenereerd <br> - - - - <b>From:</b> - <b>Uit:</b> - - - - unknown - onbekend - - - - <b>To:</b> - <b>Aan:</b> - - - - (yours, label: - (uw, etiket: - - - - (yours) - (uw) - - - - <b>Credit:</b> - <b>Credit:</b> - - - - (%s matures in %d more blocks) - (%s wordt verwezenlijkt in %d meer blokken) - - - - (not accepted) - (Niet geaccepteerd) - - - - <b>Debit:</b> - <b>Debet:</b> - - - - <b>Transaction fee:</b> - <b>Transactiekosten:</b> - - - - <b>Net amount:</b> - <b>Netto bedrag:</b> - - - - Message: - Bericht: - - - - Comment: - Commentaar: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Gegeneerde munten moeten 120 blokken wachten voor ze kunnen worden uitgegeven. Je net gegenereerde blok is uitgezonden aan het netwerk om te worden toegevoegd aan de blokkenketting. Als het niet wordt geaccepteerd in de ketting, zal het blok als "ongeldig" worden aangemerkt en kan het niet worden uitgegeven. Dit kan soms gebeuren als een andere node net iets sneller een blok heeft gegenereerd; een paar seconden voor de uwe. - - - - Cannot write autostart/bitcoin.desktop file - Kan niet schrijven naar bestand autostart/bitcoin.desktop - - - - Main - Algemeen - - - - &Start Bitcoin on window system startup - &Start Bitcoin bij het opstarten van het systeem - - - - &Minimize on close - &Minimaliseer bij afsluiten - - - - version %s - versie %s - - - - Error in amount - Fout in bedrag - - - - Send Coins - Verstuur munten - - - - Amount exceeds your balance - Bedrag is hoger dan uw saldo - - - - Total exceeds your balance when the - Totaal is hoger dan uw saldo als de - - - - transaction fee is included - transactiekosten zijn meegerekend - - - - Payment sent - Betaling verzonden - - - - Sending... - Aan het versturen... - - - - Invalid address - Ongeldig adres - - - - Sending %s to %s - %s aan het versturen naar %s - - - - CANCELLED - GEANNULEERD - - - - Cancelled - Geannuleerd - - - - Transfer cancelled - Overschrijving geannuleerd - - - - Error: - Fout: - - - - Insufficient funds - Ontoereikend saldo - - - - Connecting... - Aan het verbinden... - - - - Unable to connect - Kan geen verbinding maken - - - - Requesting public key... - Publieke sleutel aan het aanvragen ... - - - - Received public key... - Publieke sleutel ontvangen... - - - - Recipient is not accepting transactions sent by IP address - Ontvanger accepteert geen transacties verzonden per IP-adres - - - - Transfer was not accepted - Overschrijving was niet geaccepteerd - - - - Invalid response received - Ongeldig antwoord ontvangen - - - - Creating transaction... - Transactie aan het creëren... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Deze transactie vereist transactiekosten van tenminste %s vanwege het bedrag, de complexiteit, of het gebruik van recentelijk ontvangen munten - - - - Transaction creation failed - Transactiecreatie mislukt - - - - Transaction aborted - Transactie geannuleerd - - - - Lost connection, transaction cancelled - Verbinding verbroken, transactie geannuleerd - - - - Sending payment... - Betaling aan het versturen... - - - - 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. - De transactie was afgewezen. Dit kan gebeuren als u eerder uitgegeven munten opnieuw wilt versturen, zoals wanneer u een kopie van uw wallet.dat heeft gebruikt en in de kopie deze munten zijn gemarkeerd als uitgegeven, maar in de huidige nog niet. - - - - Waiting for confirmation... - Aan het wachten voor bevestiging... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - De betaling was verzonden, maar de ontvanger was niet in staat om deze te verifiëren. -De transactie is opgeslagen en zal ten goede komen aan de ontvanger, -maar het commentaarveld zal leeg zijn - - - - Payment was sent, but an invalid response was received - Betaling is verzonden, maar een ongeldig antwoord was ontvangen - - - - Payment completed - Betaling voltooid - - - - Name - Naam - - - - Address - Adres - - - - Label - Etiket - - - - Bitcoin Address - Bitcoinadres - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Dit is een van uw eigen adressen voor het ontvangen van betalingen en kan niet worden ingevoerd in het adresboek. - - - - Edit Address - Bewerk Adres - - - - Edit Address Label - Bewerk Adresetiket - - - - Add Address - Voeg Adres Toe - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Bitcoin - Aan het genereren - - - - Bitcoin - (not connected) - Bitcoin - (niet verbonden) - - - - &Open Bitcoin - &Open Bitcoin - - - - &Send Bitcoins - &Verstuur Bitcoins - - - - O&ptions... - O&pties... - - - - E&xit - A&fsluiten - - - - Program has crashed and will terminate. - Het programma is gecrasht en zal worden beëindigd. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Waarschuwing: Controleer dat de datum en tijd op uw computer correct zijn ingesteld. Als uw klok fout staat zal Bitcoin niet correct werken. - + beta beta - - main - - - Bitcoin Qt - Bitcoin Qt - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts new file mode 100644 index 0000000..af42dc0 --- /dev/null +++ b/src/qt/locale/bitcoin_pl.ts @@ -0,0 +1,1984 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + O Bitcoin + + + + <b>Bitcoin</b> version + Wersja <b>Bitcoin</b> + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + Copyright © 2009-2012 Bitcoin Developers + +Oprogramowanie eksperymentalne. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + +Pomóż w tłumaczeniu: +www.transifex.net/projects/p/bitcoin/ + + + + AddressBookPage + + + Address Book + Adresy + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Tutaj znajdują się twoje adresy Bitcoin do odbioru płatności. Możesz nadać oddzielne adresy dla każdego z wysyłających monety, żeby śledzić oddzielnie ich opłaty. + + + + Double-click to edit address or label + Kliknij dwukrotnie, aby edytować adres lub etykietę + + + + Create a new address + Utwórz nowy adres + + + + &New Address... + &Nowy adres... + + + + Copy the currently selected address to the system clipboard + Skopiuj aktualnie wybrany adres do schowka + + + + &Copy to Clipboard + &Kopiuj do schowka + + + + Show &QR Code + Pokaż Kod &QR + + + + Sign a message to prove you own this address + Podpisz wiadomość aby dowieść, że ten adres jest twój + + + + &Sign Message + Podpi&sz Wiadomość + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Usuń aktualnie wybrany adres z listy. Tylko adresy nadawcze mogą być usunięte. + + + + &Delete + &Usuń + + + + Copy address + Kopiuj adres + + + + Copy label + Kopiuj etykietę + + + + Edit + Edytuj + + + + Delete + Usuń + + + + Export Address Book Data + Eksportuj książkę adresową + + + + Comma separated file (*.csv) + CSV (rozdzielany przecinkami) + + + + Error exporting + Błąd podczas eksportowania + + + + Could not write to file %1. + Błąd zapisu do pliku %1. + + + + AddressTableModel + + + Label + Etykieta + + + + Address + Adres + + + + (no label) + (bez etykiety) + + + + AskPassphraseDialog + + + Dialog + Dialog + + + + + TextLabel + TekstEtykiety + + + + Enter passphrase + Wpisz hasło + + + + New passphrase + Nowe hasło + + + + Repeat new passphrase + Powtórz nowe hasło + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Wprowadź nowe hasło dla portfela.<br/>Proszę użyć hasła składającego się z <b>10 lub więcej losowych znaków</b> lub <b>ośmiu lub więcej słów</b>. + + + + Encrypt wallet + Zaszyfruj portfel + + + + This operation needs your wallet passphrase to unlock the wallet. + Ta operacja wymaga hasła do portfela ażeby odblokować portfel. + + + + Unlock wallet + Odblokuj portfel + + + + This operation needs your wallet passphrase to decrypt the wallet. + Ta operacja wymaga hasła do portfela ażeby odszyfrować portfel. + + + + Decrypt wallet + Odszyfruj portfel + + + + Change passphrase + Zmień hasło + + + + Enter the old and new passphrase to the wallet. + Podaj stare i nowe hasło do portfela. + + + + Confirm wallet encryption + Potwierdź szyfrowanie portfela + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + OSTRZEÅ»ENIE: Jeśli zaszyfrujesz portfel i zgubisz hasło, wtedy <b>STRACISZ WSZYSTKIE SWOJE BITMONETY</b> +Czy na pewno chcesz zaszyfrować swój portfel? + + + + + Wallet encrypted + Portfel zaszyfrowany + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + Ostrzeżenie: Caps Lock jest włączony. + + + + + + + Wallet encryption failed + Szyfrowanie portfela nie powiodło się + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Szyfrowanie portfela nie powiodło się z powodu wewnętrznego błędu. Twój portfel nie został zaszyfrowany. + + + + + The supplied passphrases do not match. + Podane hasła nie są takie same. + + + + Wallet unlock failed + Odblokowanie portfela nie powiodło się + + + + + + The passphrase entered for the wallet decryption was incorrect. + Wprowadzone hasło do odszyfrowania portfela jest niepoprawne. + + + + Wallet decryption failed + Odszyfrowywanie portfela nie powiodło się + + + + Wallet passphrase was succesfully changed. + Hasło do portfela zostało pomyślnie zmienione. + + + + BitcoinGUI + + + Bitcoin Wallet + Portfel Bitcoin + + + + + Synchronizing with network... + Synchronizacja z siecią... + + + + Block chain synchronization in progress + Synchronizacja bloku łańcucha w toku. + + + + &Overview + P&odsumowanie + + + + Show general overview of wallet + Pokazuje ogólny zarys portfela + + + + &Transactions + &Transakcje + + + + Browse transaction history + Przeglądaj historię transakcji + + + + &Address Book + Książka &adresowa + + + + Edit the list of stored addresses and labels + Edytuj listę zapisanych adresów i i etykiet + + + + &Receive coins + Odbie&rz monety + + + + Show the list of addresses for receiving payments + Pokaż listę adresów do otrzymywania płatności + + + + &Send coins + Wy&syłka monet + + + + Send coins to a bitcoin address + Wyślij monety na adres bitcoin + + + + Sign &message + Podpisz wiado&mość + + + + Prove you control an address + Udowodnij, że kontrolujesz adres + + + + E&xit + &Zakończ + + + + Quit application + Zamknij program + + + + &About %1 + &O %1 + + + + Show information about Bitcoin + Pokaż informację o Bitcoin + + + + About &Qt + O &Qt + + + + Show information about Qt + Pokazuje informacje o Qt + + + + &Options... + &Opcje... + + + + Modify configuration options for bitcoin + Zmienia opcje konfiguracji bitcoina + + + + Open &Bitcoin + Otwórz &Bitcoin + + + + Show the Bitcoin window + Pokaż okno Bitcoin + + + + &Export... + &Eksportuj... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + Zaszyfruj portf&el + + + + Encrypt or decrypt wallet + Zaszyfruj lub odszyfruj portfel + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + Zmień h&asło + + + + Change the passphrase used for wallet encryption + Zmień hasło użyte do szyfrowania portfela + + + + &File + &Plik + + + + &Settings + P&referencje + + + + &Help + Pomo&c + + + + Tabs toolbar + Pasek zakładek + + + + Actions toolbar + Pasek akcji + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n aktywne połączenie do sieci Bitcoin%n aktywne połączenia do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin + + + + Downloaded %1 of %2 blocks of transaction history. + Pobrano %1 z %2 bloków z historią transakcji. + + + + Downloaded %1 blocks of transaction history. + Pobrano %1 bloków z historią transakcji. + + + + %n second(s) ago + %n sekundę temu%n sekundy temu%n sekund temu + + + + %n minute(s) ago + %n minutę temu%n minuty temu%n minut temu + + + + %n hour(s) ago + %n godzinę temu%n godziny temu%n godzin temu + + + + %n day(s) ago + %n dzień temu%n dni temu%n dni temu + + + + Up to date + Aktualny + + + + Catching up... + Łapanie bloków... + + + + Last received block was generated %1. + Ostatnio otrzymany blok została wygenerowany %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + + + + + Sending... + Wysyłanie... + + + + Sent transaction + Transakcja wysłana + + + + Incoming transaction + Transakcja przychodząca + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Data: %1 +Kwota: %2 +Typ: %3 +Adres: %4 + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Portfel jest <b>zaszyfrowany</b> i obecnie <b>niezablokowany</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Portfel jest <b>zaszyfrowany</b> i obecnie <b>zablokowany</b> + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Jednostka pokazywana przy kwocie: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Wybierz podział jednostki pokazywany w interfejsie oraz podczas wysyłania monet + + + + Display addresses in transaction list + Wyświetlaj adresy w liście transakcji + + + + EditAddressDialog + + + Edit Address + Edytuj adres + + + + &Label + &Etykieta + + + + The label associated with this address book entry + Etykieta skojarzona z tym wpisem w książce adresowej + + + + &Address + &Adres + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Ten adres jest skojarzony z wpisem w książce adresowej. Może być zmodyfikowany jedynie dla adresów wysyłających. + + + + New receiving address + Nowy adres odbiorczy + + + + New sending address + Nowy adres wysyłania + + + + Edit receiving address + Edytuj adres odbioru + + + + Edit sending address + Edytuj adres wysyłania + + + + The entered address "%1" is already in the address book. + Wprowadzony adres "%1" już istnieje w książce adresowej. + + + + The entered address "%1" is not a valid bitcoin address. + Wprowadzony adres "%1" nie jest prawidłowym adresem bitcoin. + + + + Could not unlock wallet. + Nie można było odblokować portfela. + + + + New key generation failed. + Tworzenie nowego klucza nie powiodło się. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + Uruchom Bitcoin wraz ze &startem systemu okien + + + + Automatically start Bitcoin after the computer is turned on + Automatyczne uruchamia Bitcoin po włączeniu komputera + + + + &Minimize to the tray instead of the taskbar + &Minimalizuj do paska przy zegarku zamiast do paska zadań + + + + Show only a tray icon after minimizing the window + Pokazuje tylko ikonę przy zegarku po zminimalizowaniu okna + + + + Map port using &UPnP + Mapuj port używając &UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Automatycznie otwiera port klienta Bitcoin na routerze. Ta opcja dzieła tylko jeśli twój router wspiera UPnP i jest ono włączone. + + + + M&inimize on close + M&inimalizuj przy zamykaniu + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Minimalizuje zamiast zakończyć działanie programu przy zamykaniu okna. Kiedy ta opcja jest włączona, program zakończy działanie po wybieraniu Zamknij w menu. + + + + &Connect through SOCKS4 proxy: + Połącz przez proxy SO&CKS4: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Łączy się z siecią Bitcoin przez proxy SOCKS4 (np. kiedy łączysz się przez Tor) + + + + Proxy &IP: + Proxy &IP: + + + + IP address of the proxy (e.g. 127.0.0.1) + Adres IP serwera proxy (np. 127.0.0.1) + + + + &Port: + &Port: + + + + Port of the proxy (e.g. 1234) + Port proxy (np. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Opcjonalna prowizja za transakcje za kB, wspomaga ona szybkość przebiegu transakcji. Większość transakcji jest 1 kB. Zalecana prowizja 0.01 . + + + + Pay transaction &fee + Płać prowizję za t&ransakcje + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Opcjonalna prowizja za transakcje za kB, wspomaga ona szybkość przebiegu transakcji. Większość transakcji jest 1 kB. Zalecana prowizja 0.01 . + + + + MessagePage + + + Message + Wiadomość + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adres do wysłania należności do (np. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Wybierz adres z książki adresowej + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Wklej adres ze schowka + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Wprowadź wiadomość, którą chcesz podpisać, tutaj + + + + Click "Sign Message" to get signature + Kliknij "Podpisz Wiadomość" żeby uzyskać podpis + + + + Sign a message to prove you own this address + Podpisz wiadomość aby dowieść, że ten adres jest twój + + + + &Sign Message + Podpi&sz Wiadomość + + + + Copy the currently selected address to the system clipboard + Skopiuj aktualnie wybrany adres do schowka + + + + &Copy to Clipboard + &Kopiuj do schowka + + + + + + Error signing + Błąd podpisywania + + + + %1 is not a valid address. + %1 nie jest poprawnym adresem. + + + + Private key for %1 is not available. + Klucz prywatny dla %1 jest niedostępny. + + + + Sign failed + Podpisywanie nie powiodło się. + + + + OptionsDialog + + + Main + Główny + + + + Display + Wyświetlanie + + + + Options + Opcje + + + + OverviewPage + + + Form + Formularz + + + + Balance: + Saldo: + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Liczba transakcji: + + + + 0 + 0 + + + + Unconfirmed: + Niepotwierdzony: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Portfel</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Ostatnie transakcje</b> + + + + Your current balance + Twoje obecne saldo + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Suma transakcji, które nie zostały jeszcze potwierdzone, i które nie zostały wliczone do twojego obecnego salda + + + + Total number of transactions in wallet + Całkowita liczba transakcji w portfelu + + + + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + Kod QR + + + + Request Payment + Prośba o płatność + + + + Amount: + Kwota: + + + + BTC + BTC + + + + Label: + Etykieta: + + + + Message: + Wiadomość: + + + + &Save As... + Zapi&sz jako... + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Wyślij płatność + + + + Send to multiple recipients at once + Wyślij do wielu odbiorców na raz + + + + &Add recipient... + Dod&aj odbiorcę... + + + + Remove all transaction fields + Wyczyść wszystkie pola transakcji + + + + Clear all + Wyczyść wszystko + + + + Balance: + Saldo: + + + + 123.456 BTC + 123.456 BTC + + + + Confirm the send action + Potwierdź akcję wysyłania + + + + &Send + Wy&syłka + + + + <b>%1</b> to %2 (%3) + <b>%1</b> do %2 (%3) + + + + Confirm send coins + Potwierdź wysyłanie monet + + + + Are you sure you want to send %1? + Czy na pewno chcesz wysłać %1? + + + + and + i + + + + The recepient address is not valid, please recheck. + Adres odbiorcy jest niepoprawny, proszę go sprawdzić. + + + + The amount to pay must be larger than 0. + Kwota do zapłacenie musi być większa od 0. + + + + Amount exceeds your balance + Kwota przekracza twoje saldo + + + + Total exceeds your balance when the %1 transaction fee is included + Suma przekracza twoje saldo, gdy doliczymy %1 prowizji transakcyjnej + + + + Duplicate address found, can only send to each address once in one send operation + Znaleziono powtórzony adres, można wysłać tylko raz na adres, w jednej operacji wysyłania + + + + Error: Transaction creation failed + Błąd: Tworzenie transakcji nie powiodło się + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + Formularz + + + + A&mount: + Su&ma: + + + + Pay &To: + Płać &Do: + + + + + Enter a label for this address to add it to your address book + Wprowadź etykietę dla tego adresu by dodać go do książki adresowej + + + + &Label: + &Etykieta: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adres do wysłania należności do (np. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Wybierz adres z książki adresowej + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Wklej adres ze schowka + + + + Alt+P + Alt+P + + + + Remove this recipient + Usuń tego odbiorce + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Wprowadź adres Bitcoin (np. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Otwórz dla %1 bloków + + + + Open until %1 + Otwórz do %1 + + + + %1/offline? + %1/offline? + + + + %1/unconfirmed + %1/niezatwierdzone + + + + %1 confirmations + %1 potwierdzeń + + + + <b>Status:</b> + <b>Status:</b> + + + + , has not been successfully broadcast yet + , nie został jeszcze pomyślnie wyemitowany + + + + , broadcast through %1 node + , emitowany przez %1 węzeł + + + + , broadcast through %1 nodes + , emitowany przez %1 węzły + + + + <b>Date:</b> + <b>Data:</b> + + + + <b>Source:</b> Generated<br> + <b>Źródło:</b> Wygenerowano<br> + + + + + <b>From:</b> + <b>Od:</b> + + + + unknown + nieznany + + + + + + <b>To:</b> + <b>Do:</b> + + + + (yours, label: + (twoje, etykieta: + + + + (yours) + (twoje) + + + + + + + <b>Credit:</b> + <b>Przypisy:</b> + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + (niezaakceptowane) + + + + + + <b>Debit:</b> + <b>Debet:</b> + + + + <b>Transaction fee:</b> + <b>Prowizja transakcyjna:</b> + + + + <b>Net amount:</b> + <b>Kwota netto:</b> + + + + Message: + Wiadomość: + + + + Comment: + Komentarz: + + + + Transaction ID: + ID transakcji: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Wygenerowane monety muszą zaczekać 120 bloków zanim będzie można je wydać. Kiedy wygenerowałeś ten blok, został on wyemitowany do sieci, aby dodać go do łańcucha bloków. Jeśli to się nie powiedzie nie zostanie on zaakceptowany i wygenerowanych monet nie będzie można wysyłać. Może się to czasami zdarzyć jeśli inny węzeł wygeneruje blok tuż przed tobą. + + + + TransactionDescDialog + + + Transaction details + Szczegóły transakcji + + + + This pane shows a detailed description of the transaction + Ten panel pokazuje szczegółowy opis transakcji + + + + TransactionTableModel + + + Date + Data + + + + Type + Typ + + + + Address + Adres + + + + Amount + Kwota + + + + Open for %n block(s) + Otwórz dla %n blokuOtwórz dla %n blokówOtwórz dla %n bloków + + + + Open until %1 + Otwórz do %1 + + + + Offline (%1 confirmations) + Offline (%1 potwierdzeń) + + + + Unconfirmed (%1 of %2 confirmations) + Niezatwierdzony (%1 z %2 potwierdzeń) + + + + Confirmed (%1 confirmations) + Zatwierdzony (%1 potwierdzeń) + + + + Mined balance will be available in %n more blocks + Wydobyta kwota będzie dostępna za %n blokWydobyta kwota będzie dostępna za %n blokówWydobyta kwota będzie dostępna za %n bloki + + + + This block was not received by any other nodes and will probably not be accepted! + Ten blok nie został odebrany przez jakikolwiek inny węzeł i prawdopodobnie nie zostanie zaakceptowany! + + + + Generated but not accepted + Wygenerowano ale nie zaakceptowano + + + + Received with + Otrzymane przez + + + + Received from + Odebrano od + + + + Sent to + Wysłano do + + + + Payment to yourself + Płatność do siebie + + + + Mined + Wydobyto + + + + (n/a) + (brak) + + + + Transaction status. Hover over this field to show number of confirmations. + Status transakcji. Najedź na pole, aby zobaczyć liczbę potwierdzeń. + + + + Date and time that the transaction was received. + Data i czas odebrania transakcji. + + + + Type of transaction. + Rodzaj transakcji. + + + + Destination address of transaction. + Adres docelowy transakcji. + + + + Amount removed from or added to balance. + Kwota usunięta z lub dodana do konta. + + + + TransactionView + + + + All + Wszystko + + + + Today + Dzisiaj + + + + This week + W tym tygodniu + + + + This month + W tym miesiącu + + + + Last month + W zeszłym miesiącu + + + + This year + W tym roku + + + + Range... + Zakres... + + + + Received with + Otrzymane przez + + + + Sent to + Wysłano do + + + + To yourself + Do siebie + + + + Mined + Wydobyto + + + + Other + Inne + + + + Enter address or label to search + Wprowadź adres albo etykietę żeby wyszukać + + + + Min amount + Min suma + + + + Copy address + Kopiuj adres + + + + Copy label + Kopiuj etykietę + + + + Copy amount + Kopiuj kwotę + + + + Edit label + Edytuj etykietę + + + + Show details... + Pokaż szczegóły... + + + + Export Transaction Data + Eksportuj Dane Transakcyjne + + + + Comma separated file (*.csv) + CSV (rozdzielany przecinkami) + + + + Confirmed + Potwierdzony + + + + Date + Data + + + + Type + Typ + + + + Label + Etykieta + + + + Address + Adres + + + + Amount + Kwota + + + + ID + ID + + + + Error exporting + Błąd podczas eksportowania + + + + Could not write to file %1. + Błąd zapisu do pliku %1. + + + + Range: + Zakres: + + + + to + do + + + + WalletModel + + + Sending... + Wysyłanie... + + + + bitcoin-core + + + Bitcoin version + Wersja Bitcoin + + + + Usage: + Użycie: + + + + Send command to -server or bitcoind + Wyślij polecenie do -server lub bitcoind + + + + List commands + Lista poleceń + + + + Get help for a command + Uzyskaj pomoc do polecenia + + + + Options: + Opcje: + + + + Specify configuration file (default: bitcoin.conf) + Wskaż plik konfiguracyjny (domyślnie: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + Wskaż plik pid (domyślnie: bitcoin.pid) + + + + Generate coins + Generuj monety + + + + Don't generate coins + Nie generuj monet + + + + Start minimized + Uruchom zminimalizowany + + + + Specify data directory + Wskaż folder danych + + + + Specify connection timeout (in milliseconds) + Wskaż czas oczekiwania bezczynności połączenia (w milisekundach) + + + + Connect through socks4 proxy + Łączy przez proxy socks4 + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + Nasłuchuj połączeń na <port> (domyślnie: 8333 lub testnet: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Utrzymuj maksymalnie <n> połączeń z peerami (domyślnie: 125) + + + + Add a node to connect to + Dodaj węzeł do łączenia się + + + + Connect only to the specified node + Łącz tylko do wskazanego węzła + + + + Don't accept connections from outside + Nie akceptuj połączeń zewnętrznych + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maksymalny bufor odbioru na połączenie, <n>*1000 bajtów (domyślnie: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maksymalny bufor wysyłu na połączenie, <n>*1000 bajtów (domyślnie: 10000) + + + + Don't attempt to use UPnP to map the listening port + Nie próbuj używać UPnP do mapowania portu nasłuchu + + + + Attempt to use UPnP to map the listening port + Próbuj używać UPnP do mapowania portu nasłuchu + + + + Fee per kB to add to transactions you send + Prowizja za kB dodawana do wysyłanej transakcji + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + Uruchom w tle jako daemon i przyjmuj polecenia + + + + Use the test network + Użyj sieci testowej + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + Nazwa użytkownika dla połączeń JSON-RPC + + + + Password for JSON-RPC connections + Hasło do połączeń JSON-RPC + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Nasłuchuj połączeń JSON-RPC na <port> (domyślnie: 8332) + + + + Allow JSON-RPC connections from specified IP address + Przyjmuj połączenia JSON-RPC ze wskazanego adresu IP + + + + Send commands to node running on <ip> (default: 127.0.0.1) + Wysyłaj polecenia do węzła działającego na <ip> (domyślnie: 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + Ustaw rozmiar puli kluczy na <n> (domyślnie: 100) + + + + Rescan the block chain for missing wallet transactions + Przeskanuj blok łańcuchów żeby znaleźć zaginione transakcje portfela + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +opcje SSL: (sprawdź Bitcoin Wiki dla instrukcje konfiguracji SSL) + + + + Use OpenSSL (https) for JSON-RPC connections + Użyj OpenSSL (https) do połączeń JSON-RPC + + + + Server certificate file (default: server.cert) + Plik certyfikatu serwera (domyślnie: server.cert) + + + + Server private key (default: server.pem) + Klucz prywatny serwera (domyślnie: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Aceptowalne szyfry (domyślnie: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Ta wiadomość pomocy + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Nie można zablokować folderu danych %s. Bitcoin prawdopodobnie już działa. + + + + Loading addresses... + Wczytywanie adresów... + + + + Error loading addr.dat + Błąd ładowania addr.dat + + + + Error loading blkindex.dat + Błąd ładownia blkindex.dat + + + + Error loading wallet.dat: Wallet corrupted + Błąd ładowania wallet.dat: Uszkodzony portfel + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Błąd ładowania wallet.dat: Portfel wymaga nowszej wersji Bitcoin + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Portfel wymaga przepisania: zrestartuj Bitcoina żeby ukończyć + + + + Error loading wallet.dat + Błąd ładowania wallet.dat + + + + Loading block index... + Ładowanie indeksu bloku... + + + + Loading wallet... + Wczytywanie portfela... + + + + Rescanning... + Ponowne skanowanie... + + + + Done loading + Wczytywanie zakończone + + + + Invalid -proxy address + Nieprawidłowy adres -proxy + + + + Invalid amount for -paytxfee=<amount> + Nieprawidłowa kwota dla -paytxfee=<amount> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Ostrzeżenie: -paytxfee jest bardzo duży. To jest prowizja za transakcje, którą płacisz, gdy wysyłasz monety. + + + + Error: CreateThread(StartNode) failed + Błąd: CreateThread(StartNode) nie powiodło się + + + + Warning: Disk space is low + Ostrzeżenie: kończy się miejsce na dysku + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Nie można przywiązać portu %d na tym komputerze. Bitcoin prawdopodobnie już działa. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + Ostrzeżenie: Proszę sprawdzić poprawność czasu i daty na tym komputerze. Jeśli czas jest zły Bitcoin może nie działać prawidłowo. + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts index 68bd057..69568f4 100644 --- a/src/qt/locale/bitcoin_pt_BR.ts +++ b/src/qt/locale/bitcoin_pt_BR.ts @@ -1,6 +1,4 @@ - - - + UTF-8 AboutDialog @@ -16,14 +14,14 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - + @@ -51,7 +49,7 @@ This product includes software developed by the OpenSSL Project for use in the O &New Address... - &Novo endereço ... + &amp; Novo endereço ... @@ -61,37 +59,72 @@ This product includes software developed by the OpenSSL Project for use in the O &Copy to Clipboard - &Copie para a área de transferência do sistema + &amp; Copie para a área de transferência do sistema + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Excluir o endereço selecionado da lista. Apenas endereços de envio podem ser excluídos. - + &Delete - &Excluir + &amp; Excluir + + + + Copy address + Copy address - + + Copy label + Copy label + + + + Edit + + + + + Delete + + + + Export Address Book Data Exportação de dados do Catálogo de Endereços - + Comma separated file (*.csv) Arquivo separado por vírgulas (*. csv) - + Error exporting Erro ao exportar - + Could not write to file %1. - + Could not write to file %1. @@ -121,124 +154,131 @@ This product includes software developed by the OpenSSL Project for use in the O + TextLabel TextoDoRótulo - + Enter passphrase Digite a frase de segurança - + New passphrase Nova frase de segurança - + Repeat new passphrase Repita a nova frase de segurança - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Digite a nova frase de seguraça da sua carteira. <br/> Por favor, use uma frase de <b>10 ou mais caracteres aleatórios,</b> ou <b>oito ou mais palavras.</b> - + Encrypt wallet Criptografar carteira - + This operation needs your wallet passphrase to unlock the wallet. Esta operação precisa de sua frase de segurança para desbloquear a carteira. - + Unlock wallet Desbloquear carteira - + This operation needs your wallet passphrase to decrypt the wallet. Esta operação precisa de sua frase de segurança para descriptografar a carteira. - + Decrypt wallet Descriptografar carteira - + Change passphrase Alterar frase de segurança - + Enter the old and new passphrase to the wallet. Digite a frase de segurança antiga e nova para a carteira. - + Confirm wallet encryption Confirmar criptografia da carteira - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? AVISO: Se você criptografar sua carteira e perder sua senha, você vai <b>perder todos os seus BITCOINS!</b> Tem certeza de que deseja criptografar sua carteira? - - + + Wallet encrypted Carteira criptografada - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Lembre-se que sua carteira criptografada não poderá proteger totalmente os seus bitcoins de serem roubados por softwares maldosos que infectem seu computador. + + Bitcoin 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. + - - - - + + + Warning: The Caps Lock key is on. + + + + + + + Wallet encryption failed A criptografia da carteira falhou - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. A criptografia da carteira falhou devido a um erro interno. Sua carteira não estava criptografada. - - + + The supplied passphrases do not match. A frase de segurança fornecida não confere. - + Wallet unlock failed A abertura da carteira falhou - - + + The passphrase entered for the wallet decryption was incorrect. A frase de segurança digitada para a descriptografia da carteira estava incorreta. - + Wallet decryption failed A descriptografia da carteira falhou - + Wallet passphrase was succesfully changed. A frase de segurança da carteira foi alterada com êxito. @@ -246,283 +286,318 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet Carteira Bitcoin - + + Synchronizing with network... Sincronizando com a rede... - + Block chain synchronization in progress Sincronização da corrente de blocos em andamento - + &Overview &Visão geral - + Show general overview of wallet Mostrar visão geral da carteira - + &Transactions &Transações - + Browse transaction history Navegar pelo histórico de transações - + &Address Book &Catálogo de endereços - + Edit the list of stored addresses and labels Editar a lista de endereços e rótulos - + &Receive coins &Receber moedas - + Show the list of addresses for receiving payments Mostrar a lista de endereços para receber pagamentos - + &Send coins &Enviar moedas - + Send coins to a bitcoin address Enviar moedas para um endereço bitcoin - + + Sign &message + + + + + Prove you control an address + + + + E&xit E&xit - + Quit application Sair da aplicação - + &About %1 &About %1 - + Show information about Bitcoin Mostrar informação sobre Bitcoin - + + About &Qt + + + + + Show information about Qt + + + + &Options... &Opções... - + Modify configuration options for bitcoin Modificar opções de configuração para bitcoin - + Open &Bitcoin Abrir &Bitcoin - + Show the Bitcoin window Mostrar a janela Bitcoin - + &Export... &Exportar... - - Export the current view to a file - Export para arquivo + + Export the data in the current tab to a file + - + &Encrypt Wallet &Criptografar Carteira - + Encrypt or decrypt wallet Criptografar ou decriptogravar carteira - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase &Mudar frase de segurança - + Change the passphrase used for wallet encryption Mudar a frase de segurança utilizada na criptografia da carteira - + &File - &Arquivo + &amp; Arquivo - + &Settings E configurações - + &Help - &Ajuda + &amp; Ajuda - + Tabs toolbar Barra de ferramentas - + Actions toolbar Barra de ações - + [testnet] [testnet] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network - - %n conexão ativa na rede Bitcoin - %n conexões ativas na rede Bitcoin - + %n conexão ativa na rede Bitcoin%n conexões ativas na rede Bitcoin - + Downloaded %1 of %2 blocks of transaction history. Carregados %1 de %2 blocos do histórico de transações. - + Downloaded %1 blocks of transaction history. Carregados %1 blocos do histórico de transações. - + %n second(s) ago - - %n segundo atrás - %n segundos atrás - + %n segundo atrás%n segundos atrás - + %n minute(s) ago - - %n minutos atrás - %n minutos atrás - + %n minutos atrás%n minutos atrás - + %n hour(s) ago - - %n hora atrás - %n horas atrás - + %n hora atrás%n horas atrás - + %n day(s) ago - - %n dia atrás - %n dias atrás - + %n dia atrás%n dias atrás - + Up to date Atualizado - + Catching up... Recuperando o atraso ... - + Last received block was generated %1. Last received block was generated %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - + Sending... Sending... - + Sent transaction Sent transaction - + Incoming transaction Incoming transaction - + Date: %1 Amount: %2 Type: %3 Address: %4 - Date: %1 -Amount: %2 -Type: %3 -Address: %4 - + Data: %1 +Quantidade: %2 +Tipo: %3 +Endereço: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Wallet is <b>encrypted</b> and currently <b>unlocked</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> Wallet is <b>encrypted</b> and currently <b>locked</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -590,22 +665,22 @@ Address: %4 Edit sending address - + The entered address "%1" is already in the address book. The entered address "%1" is already in the address book. - + The entered address "%1" is not a valid bitcoin address. The entered address "%1" is not a valid bitcoin address. - + Could not unlock wallet. Could not unlock wallet. - + New key generation failed. New key generation failed. @@ -684,8 +759,8 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + @@ -694,8 +769,98 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Escolher endereço + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Paste address from clipboard + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Copie o endereço selecionado para a área de transferência do sistema + + + + &Copy to Clipboard + &amp; Copie para a área de transferência do sistema + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + @@ -758,7 +923,7 @@ Address: %4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> @@ -788,16 +953,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Diálogo + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + Message: + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Send Coins @@ -813,81 +1031,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + + + + Clear all Clear all - + Balance: Balance: - + 123.456 BTC 123.456 BTC - + Confirm the send action Confirm the send action - + &Send &Send - + <b>%1</b> to %2 (%3) <b>%1</b> to %2 (%3) - + Confirm send coins Confirm send coins - + Are you sure you want to send %1? Are you sure you want to send %1? - + and and - + The recepient address is not valid, please recheck. The recepient address is not valid, please recheck. - + The amount to pay must be larger than 0. The amount to pay must be larger than 0. - + Amount exceeds your balance Amount exceeds your balance - + Total exceeds your balance when the %1 transaction fee is included Total exceeds your balance when the %1 transaction fee is included - + Duplicate address found, can only send to each address once in one send operation Duplicate address found, can only send to each address once in one send operation - + Error: Transaction creation failed Error: Transaction creation failed - + Error: 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. Error: 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. @@ -959,135 +1182,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Open for %1 blocks - + Open until %1 Open until %1 - + %1/offline? %1/offline? - + %1/unconfirmed %1/unconfirmed - + %1 confirmations %1 confirmations - + <b>Status:</b> <b>Status:</b> - + , has not been successfully broadcast yet , has not been successfully broadcast yet - + , broadcast through %1 node , broadcast through %1 node - + , broadcast through %1 nodes , broadcast through %1 nodes - + <b>Date:</b> <b>Date:</b> - + <b>Source:</b> Generated<br> <b>Source:</b> Generated<br> - - + + <b>From:</b> <b>From:</b> - + unknown unknown - - - + + + <b>To:</b> <b>To:</b> - + (yours, label: (yours, label: - + (yours) (yours) - - - - + + + + <b>Credit:</b> <b>Credit:</b> - + (%1 matures in %2 more blocks) (%1 matures in %2 more blocks) - + (not accepted) (not accepted) - - - + + + <b>Debit:</b> <b>Debit:</b> - + <b>Transaction fee:</b> <b>Transaction fee:</b> - + <b>Net amount:</b> <b>Net amount:</b> - + Message: Message: - + Comment: Comment: - + + Transaction ID: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. @@ -1130,10 +1358,7 @@ p, li { white-space: pre-wrap; } Open for %n block(s) - - Open for %n block - Open for %n blocks - + Open for %n blockOpen for %n blocks @@ -1158,10 +1383,7 @@ p, li { white-space: pre-wrap; } Mined balance will be available in %n more blocks - - Mined balance will be available in %n more block - Mined balance will be available in %n more blocks - + Mined balance will be available in %n more blockMined balance will be available in %n more blocks @@ -1180,56 +1402,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Received from IP + Received from + - + Sent to Sent to - - Sent to IP - Sent to IP - - - + Payment to yourself Payment to yourself - + Mined Mined - + (n/a) (n/a) - + Transaction status. Hover over this field to show number of confirmations. Transaction status. Hover over this field to show number of confirmations. - + Date and time that the transaction was received. Date and time that the transaction was received. - + Type of transaction. Type of transaction. - + Destination address of transaction. Destination address of transaction. - + Amount removed from or added to balance. Amount removed from or added to balance. @@ -1308,16 +1525,21 @@ p, li { white-space: pre-wrap; } Min amount - + Copy address Copy address - + Copy label Copy label + + Copy amount + + + Edit label Edit label @@ -1328,67 +1550,67 @@ p, li { white-space: pre-wrap; } Show details... - + Export Transaction Data Export Transaction Data - + Comma separated file (*.csv) Comma separated file (*.csv) - + Confirmed Confirmed - + Date Date - + Type Type - + Label Label - + Address Address - + Amount Amount - + ID ID - + Error exporting Error exporting - + Could not write to file %1. Could not write to file %1. - + Range: Range: - + to to @@ -1396,7 +1618,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Sending... @@ -1415,942 +1637,369 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind Send command to -server or bitcoind - List commands - + List commands List commands - Get help for a command - + Get help for a command Get help for a command - Options: - + Options: Options: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Specify configuration file (default: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) Specify pid file (default: bitcoind.pid) - Generate coins - + Generate coins Generate coins - Don't generate coins - + Don't generate coins Don't generate coins - Start minimized - + Start minimized Start minimized - Specify data directory - + Specify data directory Specify data directory - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Specify connection timeout (in milliseconds) - Connect through socks4 proxy - + Connect through socks4 proxy Connect through socks4 proxy - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Allow DNS lookups for addnode and connect - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to Add a node to connect to - - Connect only to the specified node - + + Connect only to the specified node Connect only to the specified node - - Don't accept connections from outside - + + Don't accept connections from outside Don't accept connections from outside - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port Don't attempt to use UPnP to map the listening port - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port Attempt to use UPnP to map the listening port - - Fee per kB to add to transactions you send - - Fee per kB to add to transactions you send - + + Fee per kB to add to transactions you send + - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands Accept command line and JSON-RPC commands - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands Run in the background as a daemon and accept commands - - Use the test network - + + Use the test network Use the test network - - Username for JSON-RPC connections - + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections Username for JSON-RPC connections - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Password for JSON-RPC connections - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) Listen for JSON-RPC connections on <port> (default: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address Allow JSON-RPC connections from specified IP address - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) Send commands to node running on <ip> (default: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Set key pool size to <n> (default: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions Rescan the block chain for missing wallet transactions - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) SSL options: (see the Bitcoin Wiki for SSL setup instructions) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections Use OpenSSL (https) for JSON-RPC connections - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) Server certificate file (default: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Server private key (default: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message This help message - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. Cannot obtain a lock on data directory %s. Bitcoin is probably already running. - + Loading addresses... Loading addresses... - - Error loading addr.dat - - Error loading addr.dat - + + Error loading addr.dat + - - Loading block index... - Loading block index... + + Error loading blkindex.dat + - - Error loading blkindex.dat - - Error loading blkindex.dat - + + Error loading wallet.dat: Wallet corrupted + - - Loading wallet... - Loading wallet... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + - - Error loading wallet.dat: Wallet corrupted - - Error loading wallet.dat: Wallet corrupted - + + Wallet needed to be rewritten: restart Bitcoin to complete + - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - + + Error loading wallet.dat + - - Error loading wallet.dat - - Error loading wallet.dat - + + Loading block index... + Loading block index... - + + Loading wallet... + Loading wallet... + + + Rescanning... Rescanning... - + Done loading Done loading - + Invalid -proxy address Invalid -proxy address - + Invalid amount for -paytxfee=<amount> Invalid amount for -paytxfee=<amount> - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. - + Error: CreateThread(StartNode) failed Error: CreateThread(StartNode) failed - + Warning: Disk space is low Warning: Disk space is low - + Unable to bind to port %d on this computer. Bitcoin is probably already running. Unable to bind to port %d on this computer. Bitcoin is probably already running. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - - - - Enter the current passphrase to the wallet. - Enter the current passphrase to the wallet. - - - - Passphrase - Passphrase - - - - Please supply the current wallet decryption passphrase. - Please supply the current wallet decryption passphrase. - - - - The passphrase entered for the wallet decryption was incorrect. - The passphrase entered for the wallet decryption was incorrect. - - - - Status - Status - - - - Date - Date - - - - Description - Description - - - - Debit - Debit - - - - Credit - Credit - - - Open for %d blocks - Open for %d blocks - - - - Open until %s - Open until %s - - - - %d/offline? - %d/offline? - - - - %d/unconfirmed - %d/unconfirmed - - - - %d confirmations - %d confirmations - - - - Generated - Generated - - - - Generated (%s matures in %d more blocks) - Generated (%s matures in %d more blocks) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - - - - Generated (not accepted) - Generated (not accepted) - - - - From: - From: - - - - Received with: - Received with: - - - - Payment to yourself - Payment to yourself - - - - To: - To: - - - - Generating - Generating - - - - (not connected) - (not connected) - - - - %d connections %d blocks %d transactions - %d connections %d blocks %d transactions - - - - Wallet already encrypted. - Wallet already encrypted. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - - - - Error: The supplied passphrase was too short. - Error: The supplied passphrase was too short. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - - - - Please re-enter your new wallet passphrase. - Please re-enter your new wallet passphrase. - - - - Error: the supplied passphrases didn't match. - Error: the supplied passphrases didn't match. - - - - Wallet encryption failed. - Wallet encryption failed. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - - - - Wallet is unencrypted, please encrypt it first. - Wallet is unencrypted, please encrypt it first. - - - - Enter the new passphrase for the wallet. - Enter the new passphrase for the wallet. - - - - Re-enter the new passphrase for the wallet. - Re-enter the new passphrase for the wallet. - - - - Wallet Passphrase Changed. - Wallet Passphrase Changed. - - - - New Receiving Address - New Receiving Address - - - - You should use a new address for each payment you receive. - -Label - You should use a new address for each payment you receive. - -Label - - - - <b>Status:</b> - <b>Status:</b> - - - - , has not been successfully broadcast yet - , has not been successfully broadcast yet - - - - , broadcast through %d node - , broadcast through %d node - - - - , broadcast through %d nodes - , broadcast through %d nodes - - - - <b>Date:</b> - <b>Date:</b> - - - - <b>Source:</b> Generated<br> - <b>Source:</b> Generated<br> - - - - <b>From:</b> - <b>From:</b> - - - - unknown - unknown - - - - <b>To:</b> - <b>To:</b> - - - - (yours, label: - (yours, label: - - - - (yours) - (yours) - - - - <b>Credit:</b> - <b>Credit:</b> - - - - (%s matures in %d more blocks) - (%s matures in %d more blocks) - - - - (not accepted) - (not accepted) - - - - <b>Debit:</b> - <b>Debit:</b> - - - - <b>Transaction fee:</b> - <b>Transaction fee:</b> - - - - <b>Net amount:</b> - <b>Net amount:</b> - - - - Message: - Message: - - - - Comment: - Comment: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - - - - Cannot write autostart/bitcoin.desktop file - Cannot write autostart/bitcoin.desktop file - - - - Main - Main - - - - &Start Bitcoin on window system startup - &Start Bitcoin on window system startup - - - - &Minimize on close - &Minimize on close - - - - version %s - version %s - - - - Error in amount - Error in amount - - - - Send Coins - Send Coins - - - - Amount exceeds your balance - Amount exceeds your balance - - - - Total exceeds your balance when the - Total exceeds your balance when the - - - - transaction fee is included - transaction fee is included - - - - Payment sent - Payment sent - - - - Sending... - Sending... - - - - Invalid address - Invalid address - - - - Sending %s to %s - Sending %s to %s - - - - CANCELLED - CANCELLED - - - - Cancelled - Cancelled - - - - Transfer cancelled - Transfer cancelled - - - - Error: - Error: - - - - Insufficient funds - Insufficient funds - - - - Connecting... - Connecting... - - - - Unable to connect - Unable to connect - - - - Requesting public key... - Requesting public key... - - - - Received public key... - Received public key... - - - - Recipient is not accepting transactions sent by IP address - Recipient is not accepting transactions sent by IP address - - - - Transfer was not accepted - Transfer was not accepted - - - - Invalid response received - Invalid response received - - - - Creating transaction... - Creating transaction... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - - - - Transaction creation failed - Transaction creation failed - - - - Transaction aborted - Transaction aborted - - - - Lost connection, transaction cancelled - Lost connection, transaction cancelled - - - - Sending payment... - Sending payment... - - - - 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. - 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. - - - - Waiting for confirmation... - Waiting for confirmation... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - - - - Payment was sent, but an invalid response was received - Payment was sent, but an invalid response was received - - - - Payment completed - Payment completed - - - - Name - Name - - - - Address - Address - - - - Label - Label - - - - Bitcoin Address - Bitcoin Address - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - This is one of your own addresses for receiving payments and cannot be entered in the address book. - - - - Edit Address - Edit Address - - - - Edit Address Label - Edit Address Label - - - - Add Address - Add Address - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Bitcoin - Generating - - - - Bitcoin - (not connected) - Bitcoin - (not connected) - - - - &Open Bitcoin - &Open Bitcoin - - - - &Send Bitcoins - &Send Bitcoins - - - - O&ptions... - O&ptions... - - - - E&xit - E&xit - - - - Program has crashed and will terminate. - Program has crashed and will terminate. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. - + beta beta - - main - - - Bitcoin Qt - Bitcoin Qt - - - + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_ro_RO.ts b/src/qt/locale/bitcoin_ro_RO.ts new file mode 100644 index 0000000..17c71e4 --- /dev/null +++ b/src/qt/locale/bitcoin_ro_RO.ts @@ -0,0 +1,1968 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + Despre Bitcoin + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> versiunea + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + Listă de adrese + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Acestea sunt adresele dumneavoastră Bitcoin pentru a primi plăţi. Dacă doriÅ£i, puteți da o adresa diferită fiecărui expeditor, pentru a putea Å£ine evidenÅ£a plăţilor. + + + + Double-click to edit address or label + Dublu-click pentru a edita adresa sau eticheta + + + + Create a new address + CreaÅ£i o adresă nouă + + + + &New Address... + &Adresă nouă... + + + + Copy the currently selected address to the system clipboard + Copiați adresa selectată în clipboard + + + + &Copy to Clipboard + &Copiere în Clipboard + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Ștergeți adresa selectată din listă. Doar adresele de trimitere pot fi șterse. + + + + &Delete + &Șterge + + + + Copy address + Copiază adresa + + + + Copy label + Copiază eticheta + + + + Edit + + + + + Delete + + + + + Export Address Book Data + Exportă Lista de adrese + + + + Comma separated file (*.csv) + Fisier csv: valori separate prin virgulă (*.csv) + + + + Error exporting + Eroare la exportare. + + + + Could not write to file %1. + Eroare la scrierea în fişerul %1. + + + + AddressTableModel + + + Label + Etichetă + + + + Address + Adresă + + + + (no label) + (fără etichetă) + + + + AskPassphraseDialog + + + Dialog + Dialog + + + + + TextLabel + Textul etichetei + + + + Enter passphrase + Introduceți fraza de acces. + + + + New passphrase + Frază de acces nouă + + + + Repeat new passphrase + RepetaÅ£i noua frază de acces + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + IntroduceÅ£i noua parolă a portofelului electronic.<br/>Vă rugăm să folosiÅ£i <b>minimum 10 caractere aleatoare</b>, sau <b>minimum 8 cuvinte</b>. + + + + Encrypt wallet + Criptează portofelul + + + + This operation needs your wallet passphrase to unlock the wallet. + Aceasta operație are nevoie de un portofel deblocat. + + + + Unlock wallet + Deblochează portofelul + + + + This operation needs your wallet passphrase to decrypt the wallet. + Această operaÅ£iune necesită parola pentru decriptarea portofelului electronic. + + + + Decrypt wallet + Decriptează portofelul. + + + + Change passphrase + Schimbă fraza de acces + + + + Enter the old and new passphrase to the wallet. + IntroduceÅ£i vechea parola a portofelului eletronic şi apoi pe cea nouă. + + + + Confirm wallet encryption + Confirmă criptarea portofelului. + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + ATENÅ¢IE: Dacă pierdeÅ£i parola portofelului electronic dupa criptare, <b>VEÅ¢I PIERDE ÎNTREAGA SUMĂ DE BITCOIN ACUMULATĂ</b>! +SunteÅ£i sigur că doriÅ£i să criptaÅ£i portofelul electronic? + + + + + Wallet encrypted + Portofel criptat + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + Criptarea portofelului a eșuat. + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Criptarea portofelului a eșuat din cauza unei erori interne. Portofelul tău nu a fost criptat. + + + + + The supplied passphrases do not match. + Fraza de acces introdusă nu se potrivește. + + + + Wallet unlock failed + Deblocarea portofelului electronic a eşuat. + + + + + + The passphrase entered for the wallet decryption was incorrect. + Parola introdusă pentru decriptarea portofelului electronic a fost incorectă. + + + + Wallet decryption failed + Decriptarea portofelului electronic a eşuat. + + + + Wallet passphrase was succesfully changed. + Parola portofelului electronic a fost schimbată. + + + + BitcoinGUI + + + Bitcoin Wallet + Portofel electronic Bitcoin + + + + + Synchronizing with network... + Se sincronizează cu reÅ£eaua... + + + + Block chain synchronization in progress + Se sincronizează blocurile. + + + + &Overview + &Detalii + + + + Show general overview of wallet + Afişează detalii despre portofelul electronic + + + + &Transactions + &TranzacÅ£ii + + + + Browse transaction history + Istoricul tranzacÅ£iilor + + + + &Address Book + &Lista de adrese + + + + Edit the list of stored addresses and labels + EditaÅ£i lista de adrese şi etichete. + + + + &Receive coins + &PrimiÅ£i Bitcoin + + + + Show the list of addresses for receiving payments + Lista de adrese pentru recepÅ£ionarea plăţilor + + + + &Send coins + &TrimiteÅ£i Bitcoin + + + + Send coins to a bitcoin address + &TrimiteÅ£i Bitcoin către o anumită adresă + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + + + + + Quit application + PărăsiÅ£i aplicaÅ£ia + + + + &About %1 + + + + + Show information about Bitcoin + InformaÅ£ii despre Bitcoin + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + &Setări... + + + + Modify configuration options for bitcoin + Modifică setările pentru Bitcoin + + + + Open &Bitcoin + Deschide &Bitcoin + + + + Show the Bitcoin window + Afişează fereastra Bitcoin + + + + &Export... + &Exportă... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + Criptează portofelul electronic + + + + Encrypt or decrypt wallet + Criptează şi decriptează portofelul electronic + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + &Schimbă parola + + + + Change the passphrase used for wallet encryption + &Schimbă parola folosită pentru criptarea portofelului electronic + + + + &File + &Fişier + + + + &Settings + &Setări + + + + &Help + &Ajutor + + + + Tabs toolbar + Bara de ferestre de lucru + + + + Actions toolbar + Bara de acÅ£iuni + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n active connections to Bitcoin network%n active connections to Bitcoin network%n active connections to Bitcoin network + + + + Downloaded %1 of %2 blocks of transaction history. + S-au descărcat %1 din %2 blocuri din istoricul tranzaciilor. + + + + Downloaded %1 blocks of transaction history. + S-au descărcat %1 blocuri din istoricul tranzaciilor. + + + + %n second(s) ago + %n seconds ago%n seconds ago%n seconds ago + + + + %n minute(s) ago + Acum %n minutAcum %n minuteAcum %n minute + + + + %n hour(s) ago + Acum %n orăAcum %n oreAcum %n ore + + + + %n day(s) ago + Acum %n ziAcum %n zileAcum %n zile + + + + Up to date + Actualizat + + + + Catching up... + Se actualizează... + + + + Last received block was generated %1. + Ultimul bloc primit a fost generat %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Această tranzacÅ£ie depăşeşte limita. PuteÅ£i iniÅ£ia tranzacÅ£ia platind un comision de %1, de care vor beneficia nodurile care procesează tranzacÅ£ia şi ajută la menÅ£inerea reÅ£elei. AcceptaÅ£i plata comisionului? + + + + Sending... + Expediază... + + + + Sent transaction + TranzacÅ£ie expediată + + + + Incoming transaction + TranzacÅ£ie recepÅ£ionată + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Portofelul electronic este <b>criptat</b> iar in momentul de faţă este <b>deblocat</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Portofelul electronic este <b>criptat</b> iar in momentul de faţă este <b>blocat</b> + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Unitatea de măsură pentru afişarea sumelor: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Alege subdiviziunea folosită la afişarea interfeÅ£ei şi la trimiterea de bitcoin. + + + + Display addresses in transaction list + Afişează adresele în lista de tranzacÅ£ii + + + + EditAddressDialog + + + Edit Address + Editează adresa + + + + &Label + &Eticheta + + + + The label associated with this address book entry + Eticheta asociată cu această înregistrare în Lista de adrese + + + + &Address + &Adresă + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Adresa asociată cu această înregistrare în Lista de adrese. Aceasta poate fi modificată doar pentru expediere. + + + + New receiving address + Noua adresă de primire + + + + New sending address + Noua adresă de trimitere + + + + Edit receiving address + Editează adresa de primire + + + + Edit sending address + Editează adresa de trimitere + + + + The entered address "%1" is already in the address book. + Adresa introdusă "%1" se află deja în Lista de adrese. + + + + The entered address "%1" is not a valid bitcoin address. + Adresa introdusă "%1" nu este o adresă bitcoin valabilă. + + + + Could not unlock wallet. + Portofelul electronic nu a putut fi deblocat . + + + + New key generation failed. + New key generation failed. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &S Porneşte Bitcoin la pornirea sistemului + + + + Automatically start Bitcoin after the computer is turned on + Porneşte automat programul Bitcoin la pornirea computerului. + + + + &Minimize to the tray instead of the taskbar + &M Ascunde în tray în loc de taskbar + + + + Show only a tray icon after minimizing the window + Afişează doar un icon in tray la ascunderea ferestrei + + + + Map port using &UPnP + Mapeaza portul folosind &UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Deschide automat în router portul aferent clientului Bitcoin. FuncÅ£ionează doar în cazul în care routerul e compatibil UPnP şi opÅ£iunea e activată. + + + + M&inimize on close + &i Ascunde fereastra în locul închiderii programului + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Ascunde fereastra în locul părăsirii programului în momentul închiderii ferestrei. Când acestă opÅ£iune e activă, aplicaÅ£ia se va opri doar în momentul selectării comenzii Quit din menu. + + + + &Connect through SOCKS4 proxy: + &Conectează prin proxy SOCKS4: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Conectare la reÅ£eaua Bitcoin folosind un proxy SOCKS4 (de exemplu, când conexiunea se stabileşte prin reÅ£eaua Tor) + + + + Proxy &IP: + Proxy &IP: + + + + IP address of the proxy (e.g. 127.0.0.1) + Adresa de IP a proxy serverului (de exemplu: 127.0.0.1) + + + + &Port: + &Port: + + + + Port of the proxy (e.g. 1234) + Portul pe care se concetează proxy serverul (de exemplu: 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + Plăteşte comision pentru tranzacÅ£ie &f + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresa către care se va face plata (de exemplu: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + AlegeÅ£i adresa din Listă + + + + Alt+A + Alt+A + + + + Paste address from clipboard + LipiÅ£i adresa copiată in clipboard. + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Copiați adresa selectată în clipboard + + + + &Copy to Clipboard + &Copiere în Clipboard + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + Principal + + + + Display + Afişare + + + + Options + Setări + + + + OverviewPage + + + Form + Form + + + + Balance: + Balanţă: + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Număr total de tranzacÅ£ii: + + + + 0 + 0 + + + + Unconfirmed: + Neconfirmat: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Ultimele tranzacÅ£ii</b> + + + + Your current balance + Soldul contul + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Totalul tranzacÅ£iilor care aşteaptă să fie confirmate şi care nu sunt încă luate în calcul la afişarea soldului contului. + + + + Total number of transactions in wallet + Numărul total de tranzacÅ£ii din portofelul electronic + + + + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + Mesaj: + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Trimite Bitcoin + + + + Send to multiple recipients at once + Trimite simultan către mai mulÅ£i destinatari + + + + &Add recipient... + &Adaugă destinatar... + + + + Remove all transaction fields + + + + + Clear all + Şterge tot + + + + Balance: + Balanţă: + + + + 123.456 BTC + 123.456 BTC + + + + Confirm the send action + Confirmă operaÅ£iunea de trimitere + + + + &Send + &S Trimite + + + + <b>%1</b> to %2 (%3) + <b>%1</b> la %2 (%3) + + + + Confirm send coins + ConfirmaÅ£i trimiterea de bitcoin + + + + Are you sure you want to send %1? + SunteÅ£i sigur că doriÅ£i să trimiteÅ£i %1? + + + + and + şi + + + + The recepient address is not valid, please recheck. + Adresa destinatarului nu este validă, vă rugăm să o verificaÅ£i. + + + + The amount to pay must be larger than 0. + Suma de plată trebuie să fie mai mare decât 0. + + + + Amount exceeds your balance + Suma depăşeşte soldul contului. + + + + Total exceeds your balance when the %1 transaction fee is included + Total depăşeşte soldul contului in cazul plăţii comisionului de %1. + + + + Duplicate address found, can only send to each address once in one send operation + S-a descoperit o adresă care figurează de două ori. Expedierea se poate realiza către fiecare adresă doar o singură dată pe operaÅ£iune. + + + + Error: Transaction creation failed + Eroare: TranyacÅ£ia nu a putut fi iniÅ£iată + + + + Error: 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. + Eroare: TranyacÅ£ia a fost respinsă. Acesta poate fi rezultatul cheltuirii prealabile a unei sume de bitcoin din portofelul electronic, ca în cazul folosirii unei copii a fisierului wallet.dat, în care s-au efectuat tranzacÅ£ii neînregistrate în fisierul curent. + + + + SendCoinsEntry + + + Form + Form + + + + A&mount: + Su&mă : + + + + Pay &To: + Plăteşte Că&tre: + + + + + Enter a label for this address to add it to your address book + Adaugă o etichetă acestei adrese pentru a o trece în Lista de adrese + + + + &Label: + &L Etichetă: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresa către care se va face plata (de exemplu: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + + + + + Alt+A + Alt+A + + + + Paste address from clipboard + LipiÅ£i adresa copiată in clipboard. + + + + Alt+P + Alt+P + + + + Remove this recipient + Şterge destinatarul + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + IntroduceÅ£i o adresă Bitcoin (de exemplu: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Deschis pentru %1 blocuri + + + + Open until %1 + Deschis până la %1 + + + + %1/offline? + %1/offline? + + + + %1/unconfirmed + %1/neconfirmat + + + + %1 confirmations + %1 confirmări + + + + <b>Status:</b> + <b>Stare:</b> + + + + , has not been successfully broadcast yet + , nu s-a propagat încă + + + + , broadcast through %1 node + , se propagă prin %1 nod + + + + , broadcast through %1 nodes + , se propagă prin %1 noduri + + + + <b>Date:</b> + <b>Data:</b> + + + + <b>Source:</b> Generated<br> + <b>Sursă:</b> Generat<br> + + + + + <b>From:</b> + <b>De la:</b> + + + + unknown + necunoscut + + + + + + <b>To:</b> + <b>Către:</b> + + + + (yours, label: + (propriu, etichetă: + + + + (yours) + (propriu) + + + + + + + <b>Credit:</b> + <b>Credit:</b> + + + + (%1 matures in %2 more blocks) + (%1 se definitivează peste %2 blocuri) + + + + (not accepted) + (nu este acceptat) + + + + + + <b>Debit:</b> + <b>Debit:</b> + + + + <b>Transaction fee:</b> + <b>Comisionul tranzacÅ£iei:</b> + + + + <b>Net amount:</b> + <b>Suma netă:</b> + + + + Message: + Mesaj: + + + + Comment: + Comentarii: + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Monedele bitcoin generate se pot cheltui dupa parcurgerea a 120 de blocuri. După ce a fost generat, s-a propagat în reÅ£ea, urmând să fie adăugat lanÅ£ului de blocuri. Dacă nu poate fi inclus in lanÅ£, starea sa va deveni "neacceptat" si nu va putea fi folosit la tranzacÅ£ii. Acest fenomen se întâmplă atunci cand un alt nod a generat un bloc la o diferenÅ£a de câteva secunde. + + + + TransactionDescDialog + + + Transaction details + Detaliile tranzacÅ£iei + + + + This pane shows a detailed description of the transaction + Afişează detalii despre tranzacÅ£ie + + + + TransactionTableModel + + + Date + Data + + + + Type + Tipul + + + + Address + Adresa + + + + Amount + Cantitate + + + + Open for %n block(s) + Deschis pentru for %n blocDeschis pentru %n blocuriDeschis pentru %n blocuri + + + + Open until %1 + Deschis până la %1 + + + + Offline (%1 confirmations) + Neconectat (%1 confirmări) + + + + Unconfirmed (%1 of %2 confirmations) + Neconfirmat (%1 din %2 confirmări) + + + + Confirmed (%1 confirmations) + Confirmat (%1 confirmări) + + + + Mined balance will be available in %n more blocks + Soldul de bitcoin produs va fi disponibil după încă %n blocSoldul de bitcoin produs va fi disponibil după încă %n blocuriSoldul de bitcoin produs va fi disponibil după încă %n blocuri + + + + This block was not received by any other nodes and will probably not be accepted! + Blocul nu a fost recepÅ£ionat de niciun alt nod şi e probabil că nu va fi acceptat. + + + + Generated but not accepted + Generat, dar neacceptat + + + + Received with + RecepÅ£ionat cu + + + + Received from + + + + + Sent to + Trimis către + + + + Payment to yourself + Plată către un cont propriu + + + + Mined + Produs + + + + (n/a) + (n/a) + + + + Transaction status. Hover over this field to show number of confirmations. + Starea tranzacÅ£iei. TreceÅ£i cu mouse-ul peste acest câmp pentru afişarea numărului de confirmări. + + + + Date and time that the transaction was received. + Data şi ora la care a fost recepÅ£ionată tranzacÅ£ia. + + + + Type of transaction. + Tipul tranzacÅ£iei. + + + + Destination address of transaction. + Adresa de destinaÅ£ie a tranzacÅ£iei. + + + + Amount removed from or added to balance. + Suma extrasă sau adăugată la sold. + + + + TransactionView + + + + All + Toate + + + + Today + Astăzi + + + + This week + Săptămâna aceasta + + + + This month + Luna aceasta + + + + Last month + Luna trecută + + + + This year + Anul acesta + + + + Range... + Între... + + + + Received with + RecepÅ£ionat cu... + + + + Sent to + Trimis către + + + + To yourself + Către propriul cont + + + + Mined + Produs + + + + Other + Altele + + + + Enter address or label to search + IntroduceÅ£i adresa sau eticheta pentru căutare + + + + Min amount + Cantitatea produsă + + + + Copy address + Copiază adresa + + + + Copy label + Copiază eticheta + + + + Copy amount + + + + + Edit label + Editează eticheta + + + + Show details... + Afişează detalii... + + + + Export Transaction Data + Exportă tranzacÅ£iile + + + + Comma separated file (*.csv) + Fişier text cu valori separate prin virgulă (*.csv) + + + + Confirmed + Confirmat + + + + Date + Data + + + + Type + Tipul + + + + Label + Etichetă + + + + Address + Adresă + + + + Amount + Sumă + + + + ID + ID + + + + Error exporting + Eroare în timpul exportului + + + + Could not write to file %1. + Fisierul %1 nu a putut fi accesat pentru scriere. + + + + Range: + Interval: + + + + to + către + + + + WalletModel + + + Sending... + Se expediază... + + + + bitcoin-core + + + Bitcoin version + versiunea Bitcoin + + + + Usage: + Uz: + + + + Send command to -server or bitcoind + Trimite comanda la -server sau bitcoind + + + + List commands + Listă de comenzi + + + + Get help for a command + Ajutor pentru o comandă + + + + Options: + Setări: + + + + Specify configuration file (default: bitcoin.conf) + + + + + Specify pid file (default: bitcoind.pid) + + + + + Generate coins + + + + + Don't generate coins + + + + + Start minimized + + + + + Specify data directory + + + + + Specify connection timeout (in milliseconds) + + + + + Connect through socks4 proxy + + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + + + + + Connect only to the specified node + + + + + Don't accept connections from outside + + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + Încarc adrese... + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + Încarc indice bloc... + + + + Loading wallet... + Încarc portofel... + + + + Rescanning... + Rescanez... + + + + Done loading + Încărcare terminată + + + + Invalid -proxy address + + + + + Invalid amount for -paytxfee=<amount> + + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts index a87ec11..d706b33 100644 --- a/src/qt/locale/bitcoin_ru.ts +++ b/src/qt/locale/bitcoin_ru.ts @@ -5,29 +5,29 @@ About Bitcoin - О Bitcoin'е + О Bitcoin <b>Bitcoin</b> version - Версия Bitcoin'а + <b>Bitcoin</b> версия - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Copyright © 2009-2011 Разработчики сети Bitcoin + Все права защищены © 2009-2012 Разработчики Bitcoin -ВНИМАНИЕ: этот софт является экспериментальным! +Это экспериментальная программа. -Распространяется под лицензией MIT/X11, за дополнительной информацией обращайтесь к прилагающемуся файлу license.txt или документу по данной ссылке: http://www.opensource.org/licenses/mit-license.php. +Распространяется на правах лицензии MIT/X11, см. файл license.txt или http://www.opensource.org/licenses/mit-license.php. -Данный продукт включает в себя разработки проекта OpenSSL (http://www.openssl.org/), криптографические функции и алгоритмы, написанные Эриком Янгом (eay@cryptsoft.com) и функции для работы с UPnP за авторством Томаса Бернарда. +Этот продукт включате ПО, разработанное OpenSSL Project для использования в OpenSSL Toolkit (http://www.openssl.org/) и криптографическое ПО, написанное Eric Young (eay@cryptsoft.com) и ПО для работы с UPnP, написанное Thomas Bernard. @@ -69,31 +69,66 @@ This product includes software developed by the OpenSSL Project for use in the O + Show &QR Code + Показать &QR код + + + + Sign a message to prove you own this address + Подпишите сообщение для доказательства + + + + &Sign Message + &Подписать сообщение + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Удалить выделенный адрес из списка (могут быть удалены только записи из адресной книги). - + &Delete &Удалить - + + Copy address + Копировать адрес + + + + Copy label + Копировать метку + + + + Edit + Правка + + + + Delete + Удалить + + + Export Address Book Data Экспортировать адресную книгу - + Comma separated file (*.csv) Текст, разделённый запятыми (*.csv) - + Error exporting Ошибка экспорта - + Could not write to file %1. Невозможно записать в файл %1. @@ -125,125 +160,132 @@ This product includes software developed by the OpenSSL Project for use in the O + TextLabel TextLabel - + Enter passphrase Введите пароль - + New passphrase Новый пароль - + Repeat new passphrase Повторите новый пароль - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Введите новый пароль для бумажника. <br/> Пожалуйста, используйте фразы из <b>10 или более случайных символов,</b> или <b>восьми и более слов.</b> - + Encrypt wallet Зашифровать бумажник - + This operation needs your wallet passphrase to unlock the wallet. Для выполнения операции требуется пароль вашего бумажника. - + Unlock wallet Разблокировать бумажник - + This operation needs your wallet passphrase to decrypt the wallet. Для выполнения операции требуется пароль вашего бумажника. - + Decrypt wallet Расшифровать бумажник - + Change passphrase Сменить пароль - + Enter the old and new passphrase to the wallet. Введите старый и новый пароль для бумажника. - + Confirm wallet encryption Подтвердите шифрование бумажника - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? ВНИМАНИЕ: Если вы зашифруете бумажник и потеряете свой ​​пароль, вы <b>ПОТЕРЯЕТЕ ВСЕ ВАШИ БИТКОИНЫ!</b> Вы действительно хотите зашифровать ваш бумажник? - - + + Wallet encrypted Бумажник зашифрован - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Помните, что шифрование вашего бумажника не может полностью защитить ваши биткоины от кражи вредоносными программами, заражающими компьютер. + + Bitcoin 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. + Сейчас программа закроется для завершения процесса шифрования. Помните, что шифрование вашего бумажника не может полностью защитить ваши биткоины от кражи с помощью инфицирования вашего компьютера вредоносным ПО. - - - - + + + Warning: The Caps Lock key is on. + Внимание: Caps Lock включен. + + + + + + Wallet encryption failed Не удалось зашифровать бумажник - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Шифрование бумажника не удалось из-за внутренней ошибки. Ваш бумажник не был зашифрован. - - + + The supplied passphrases do not match. Введённые пароли не совпадают. - + Wallet unlock failed Разблокировка бумажника не удалась - - + + The passphrase entered for the wallet decryption was incorrect. Указанный пароль не подходит. - + Wallet decryption failed Расшифрование бумажника не удалось - + Wallet passphrase was succesfully changed. Пароль бумажника успешно изменён. @@ -251,247 +293,278 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet Bitcoin-бумажник - + + Synchronizing with network... Синхронизация с сетью... - + Block chain synchronization in progress Идёт синхронизация цепочки блоков - + &Overview О&бзор - + Show general overview of wallet Показать общий обзор действий с бумажником - + &Transactions &Транзакции - + Browse transaction history Показать историю транзакций - + &Address Book &Адресная книга - + Edit the list of stored addresses and labels Изменить список сохранённых адресов и меток к ним - + &Receive coins - &Получение + &Получение монет - + Show the list of addresses for receiving payments Показать список адресов для получения платежей - + &Send coins - Отп&равка + Отп&равка монет - + Send coins to a bitcoin address Отправить монеты на указанный адрес - + + Sign &message + Подписать &сообщение + + + + Prove you control an address + Доказать, что вы владеете адресом + + + E&xit В&ыход - + Quit application Закрыть приложение - + &About %1 &О %1 - + Show information about Bitcoin Показать информацию о Bitcoin'е - + + About &Qt + О &Qt + + + + Show information about Qt + Показать информацию о Qt + + + &Options... Оп&ции... - + Modify configuration options for bitcoin Изменить настройки - + Open &Bitcoin &Показать бумажник - + Show the Bitcoin window Показать окно бумажника - + &Export... &Экспорт... - - Export the current view to a file - Экспортировать в файл + + Export the data in the current tab to a file + - + &Encrypt Wallet &Зашифровать бумажник - + Encrypt or decrypt wallet Зашифровать или расшифровать бумажник - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase &Изменить пароль - + Change the passphrase used for wallet encryption Изменить пароль шифрования бумажника - + &File &Файл - + &Settings &Настройки - + &Help &Помощь - + Tabs toolbar Панель вкладок - + Actions toolbar Панель действий - + [testnet] [тестовая сеть] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n активное соединение с сетью%n активных соединений с сетью%n активных соединений с сетью - + Downloaded %1 of %2 blocks of transaction history. Загружено %1 из %2 блоков истории транзакций. - + Downloaded %1 blocks of transaction history. Загружено %1 блоков истории транзакций. - + %n second(s) ago %n секунду назад%n секунды назад%n секунд назад - + %n minute(s) ago %n минуту назад%n минуты назад%n минут назад - + %n hour(s) ago %n час назад%n часа назад%n часов назад - + %n day(s) ago %n день назад%n дня назад%n дней назад - + Up to date Синхронизированно - + Catching up... Синхронизируется... - + Last received block was generated %1. Последний полученный блок был сгенерирован %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Данная транзакция превышает предельно допустимый размер. Но Вы можете всё равно совершить ей, добавив комиссию в %1, которая отправится тем узлам, которые обработают Вашу транзакцию и поможет поддержать сеть. Вы хотите добавить комиссию? - + Sending... Отправка... - + Sent transaction Исходящая транзакция - + Incoming transaction Входящая транзакция - + Date: %1 Amount: %2 Type: %3 @@ -504,15 +577,35 @@ Address: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Бумажник <b>зашифрован</b> и в настоящее время <b>разблокирован</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> Бумажник <b>зашифрован</b> и в настоящее время <b>заблокирован</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + Данные Кошелька (*.dat) + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -580,22 +673,22 @@ Address: %4 Изменение адреса для отправки - + The entered address "%1" is already in the address book. Введённый адрес «%1» уже находится в адресной книге. - + The entered address "%1" is not a valid bitcoin address. Введённый адрес «%1» не является правильным Bitcoin-адресом. - + Could not unlock wallet. Не удается разблокировать бумажник. - + New key generation failed. Генерация нового ключа не удалась. @@ -674,8 +767,8 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Опциональная комиссия за кадый kB транзакции, которое позволяет быть уверенным, что Ваша транзакция будет обработана быстро. Большинство транзакций занимают 1 kB. Рекомендованная комиссия: 0.01 BTC. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Опциональная комиссия за каждый КБ транзакции, которая позволяет быть уверенным, что Ваша транзакция будет обработано быстро. Большинство транзакций занимают 1КБ. Рекомендуется комиссия 0.01. @@ -684,8 +777,98 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Опциональная комиссия за кадый kB транзакции, которая позволяет быть уверенным, что Ваша транзакция будет обработана быстро. Большинство транзакций занимают 1 kB. Рекомендованная комиссия: 0.01 BTC. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Опциональная комиссия за каждый КБ транзакции, которая позволяет быть уверенным, что Ваша транзакция будет обработано быстро. Большинство транзакций занимают 1КБ. Рекомендуется комиссия 0.01. + + + + MessagePage + + + Message + Сообщение + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Адрес получателя платежа (например 1LA5FtQhnnWnkK6zjFfutR7Stiit4wKd63) + + + + Choose adress from address book + Выбрать адрес из адресной книги + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Вставить адрес из буфера обмена + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Введите сообщение для подписи + + + + Click "Sign Message" to get signature + Для создания подписи нажмите на "Подписать сообщение" + + + + Sign a message to prove you own this address + Подпишите сообщение для доказательства + + + + &Sign Message + &Подписать сообщение + + + + Copy the currently selected address to the system clipboard + Копировать текущий выделенный адрес в буфер обмена + + + + &Copy to Clipboard + &Kопировать + + + + + + Error signing + Ошибка создания подписи + + + + %1 is not a valid address. + %1 не является правильным адресом. + + + + Private key for %1 is not available. + Секретный ключ для %1 не доступен + + + + Sign failed + Подписание не удалось. @@ -753,7 +936,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Бумажник</span></p></body></html> @@ -774,20 +957,73 @@ p, li { white-space: pre-wrap; } Total number of transactions in wallet - Общая количество транзакций в Вашем бумажнике + Общее количество транзакций в Вашем бумажнике + + + + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + QR код + + + + Request Payment + Запросить платёж + + + + Amount: + Количество: + + + + BTC + BTC + + + + Label: + Метка: + + + + Message: + Сообщение: + + + + &Save As... + &Сохранить как... + + + + Save Image... + Сохранить изображение... + + + + PNG Images (*.png) + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Отправка @@ -803,81 +1039,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + Удалить все поля транзакции + + + Clear all Очистить всё - + Balance: Баланс: - + 123.456 BTC 123.456 BTC - + Confirm the send action Подтвердить отправку - + &Send &Отправить - + <b>%1</b> to %2 (%3) <b>%1</b> адресату %2 (%3) - + Confirm send coins Подтвердите отправку монет - + Are you sure you want to send %1? Вы уверены, что хотите отправить %1? - + and и - + The recepient address is not valid, please recheck. Адрес получателя неверный, пожалуйста, перепроверьте. - + The amount to pay must be larger than 0. Количество монет для отправки должно быть больше 0. - + Amount exceeds your balance Количество отправляемых монет превышает Ваш баланс - + Total exceeds your balance when the %1 transaction fee is included Сумма превысит Ваш баланс, если комиссия в %1 будет добавлена к транзакции - + Duplicate address found, can only send to each address once in one send operation Обнаружен дублирующийся адрес. Отправка на один и тот же адрес возможна только один раз за одну операцию отправки - + Error: Transaction creation failed Ошибка: Создание транзакции не удалось - + Error: 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. Ошибка: В транзакции отказано. Такое может произойти, если некоторые монеты уже были потрачены, например, если Вы используете одну копию бумажника (wallet.dat), а монеты были потрачены из другой копии, но не были отмечены как потраченные в этой. Или в случае кражи (компрометации) Вашего бумажника. @@ -918,7 +1159,7 @@ p, li { white-space: pre-wrap; } Choose address from address book - Выбрать адрес из адресной книги + Выберите адрес из адресной книги @@ -949,135 +1190,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Открыто до получения %1 блоков - + Open until %1 Открыто до %1 - + %1/offline? %1/оффлайн? - + %1/unconfirmed %1/не подтверждено - + %1 confirmations %1 подтверждений - + <b>Status:</b> <b>Статус:</b> - + , has not been successfully broadcast yet , ещё не было успешно разослано - + , broadcast through %1 node , разослано через %1 узел - + , broadcast through %1 nodes , разослано через %1 узлов - + <b>Date:</b> <b>Дата:</b> - + <b>Source:</b> Generated<br> <b>Источник:</b> [сгенерированно]<br> - - + + <b>From:</b> <b>Отправитель:</b> - + unknown неизвестно - - - + + + <b>To:</b> <b>Получатель:</b> - + (yours, label: (Ваш, метка: - + (yours) (ваш) - - - - + + + + <b>Credit:</b> <b>Кредит:</b> - + (%1 matures in %2 more blocks) (%1 станет доступно через %2 блоков) - + (not accepted) (не принято) - - - + + + <b>Debit:</b> <b>Дебет:</b> - + <b>Transaction fee:</b> <b>Комиссия:</b> - + <b>Net amount:</b> <b>Общая сумма:</b> - + Message: Сообщение: - + Comment: Комментарий: - + + Transaction ID: + Идентификатор транзакции: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Сгенерированные монеты должны подождать 120 блоков прежде, чем они смогут быть отправлены. Когда Вы сгенерировали этот блок он был отправлен в сеть, чтобы он был добавлен к цепочке блоков. Если данная процедура не удастся, статус изменится на «не подтверждено» и монеты будут непередаваемыми. Такое может случайно происходить в случае, если другой узел сгенерирует блок на несколько секунд раньше. @@ -1164,56 +1410,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Получено с IP-адреса + Received from + Получено от - + Sent to Отправлено - - Sent to IP - Отправлено на IP-адрес - - - + Payment to yourself Отправлено себе - + Mined Добыто - + (n/a) [не доступно] - + Transaction status. Hover over this field to show number of confirmations. Статус транзакции. Подведите курсор к нужному полю для того, чтобы увидеть количество подтверждений. - + Date and time that the transaction was received. Дата и время, когда транзакция была получена. - + Type of transaction. Тип транзакции. - + Destination address of transaction. Адрес назначения транзакции. - + Amount removed from or added to balance. Сумма, добавленная, или снятая с баланса. @@ -1292,16 +1533,21 @@ p, li { white-space: pre-wrap; } Мин. сумма - + Copy address Копировать адрес - + Copy label Копировать метку + + Copy amount + Скопировать сумму + + Edit label Изменить метку @@ -1312,67 +1558,67 @@ p, li { white-space: pre-wrap; } Показать детали... - + Export Transaction Data Экспортировать данные транзакций - + Comma separated file (*.csv) Текс, разделённый запятыми (*.csv) - + Confirmed Подтверждено - + Date Дата - + Type Тип - + Label Метка - + Address Адрес - + Amount Количество - + ID ID - + Error exporting Ошибка экспорта - + Could not write to file %1. Невозможно записать в файл %1. - + Range: Промежуток от: - + to до @@ -1380,7 +1626,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Отправка.... @@ -1399,939 +1645,336 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - - Отправить команду на сервер ( -server ) или демону - + Send command to -server or bitcoind + Отправить команду на -server или bitcoind - List commands - + List commands Список команд - Get help for a command - + Get help for a command Получить помощь по команде - Options: - - Опции: - + Options: + Опции: - Specify configuration file (default: bitcoin.conf) - - Указать конфигурационный файл вместо используемого по умолчанию (bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) + Указать конфигурационный файл (по умолчанию: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - - Указать pid-файл вместо используемого по умолчанию (bitcoin.pid) - + Specify pid file (default: bitcoind.pid) + Указать pid-файл (по умолчанию: bitcoin.pid) - Generate coins - - Включить добычу монет - + Generate coins + Генерировать монеты - Don't generate coins - - Выключить добычу монет - + Don't generate coins + Не генерировать монеты - Start minimized - - Запускать минимизированным - + Start minimized + Запускать свёрнутым - Specify data directory - - Указать рабочую директорию - + Specify data directory + Укажите каталог данных - Specify connection timeout (in milliseconds) - - Указать таймаут соединения (в миллисекундах) - + Specify connection timeout (in milliseconds) + Укажите таймаут соединения (в миллисекундах) - Connect through socks4 proxy - - Соединяться через socks4-прокси - + Connect through socks4 proxy + Подключаться через socks4 прокси - Allow DNS lookups for addnode and connect - - Разрешить поиск в DNS для комманд "addnode" и "connect" - + Allow DNS lookups for addnode and connect + Разрешить обращения к DNS для addnode и подключения - Add a node to connect to - - Добавить узел для соединения - + Listen for connections on <port> (default: 8333 or testnet: 18333) + Принимать входящие подключения на <port> (по умолчанию: 8333 или 18333 в тестовой сети) - Connect only to the specified node - - Соединяться только с указанным узлом - + Maintain at most <n> connections to peers (default: 125) + Поддерживать не более <n> подключений к узлам (по умолчанию: 125) - Don't accept connections from outside - - Не принимать внешние соединения - + Add a node to connect to + Добавить узел для подключения - Don't attempt to use UPnP to map the listening port - - Не пытаться использовать UPnP - + Connect only to the specified node + Подключаться только к указанному узлу - Attempt to use UPnP to map the listening port - - Попытаться использовать UPnP для проброса прослушиваемого порта на роутере - + Don't accept connections from outside + Не принимать входящие подключения - Fee per kB to add to transactions you send - - Комиссия (за каждый kB транзакции) - + Don't bootstrap list of peers using DNS + Не получать начальный список узлов через DNS - Accept command line and JSON-RPC commands - - Принимать команды из командной строки и через JSON-RPC - + Threshold for disconnecting misbehaving peers (default: 100) + Порог для отключения неправильно ведущих себя узлов (по умолчанию: 100) - Run in the background as a daemon and accept commands - - Запустить в бекграунде (как демон) и принимать команды - - - - - Use the test network - - Использовать тестовую сеть - - - - - Username for JSON-RPC connections - - Имя пользователя для JSON-RPC соединений - + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Число секунд блокирования неправильно ведущих себя узлов (по умолчанию: 86400) - Password for JSON-RPC connections - - Пароль для JSON-RPC соединений - + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Максимальный размер буфера приёма на соединение, <n>*1000 байт (по умолчанию: 10000) - Listen for JSON-RPC connections on <port> (default: 8332) - - Слушать <порт> для JSON-RPC соединений (по умолчанию: 8332) - + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Максимальный размер буфера отправки на соединение, <n>*1000 байт (по умолчанию: 10000) - Allow JSON-RPC connections from specified IP address - - Разрешить JSON-RPC соединения с указанного адреса - + Don't attempt to use UPnP to map the listening port + Не пытаться использовать UPnP для назначения входящего порта - Send commands to node running on <ip> (default: 127.0.0.1) - - Отправлять команды на узел,запущенный на <IP> (по умолчанию: 127.0.0.1) - + Attempt to use UPnP to map the listening port + Пытаться использовать UPnP для назначения входящего порта - Set key pool size to <n> (default: 100) - - Установить размер key pool'а в <n> (по умолчанию: 100) - + Fee per kB to add to transactions you send + Комиссия на Кб, добавляемая к вашим переводам - Rescan the block chain for missing wallet transactions - - Просканировать цепочку блоков в поисках пропущенных транзакций для бумажника - + Accept command line and JSON-RPC commands + Принимать командную строку и команды JSON-RPC - -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - - Опции SSL: (см. Bitcoin Wiki для инструкций) - + Run in the background as a daemon and accept commands + Запускаться в фоне как демон и принимать команды + + + + Use the test network + Использовать тестовую сеть + + + + Output extra debugging information + Выводить дополнительную отладочную информацию - Use OpenSSL (https) for JSON-RPC connections - - Использовать OpenSSL (https) для JSON-RPC соединений - + Prepend debug output with timestamp + Дописывать отметки времени к отладочному выводу - Server certificate file (default: server.cert) - - Сертификат (публичный ключ) сервера (по умолчанию: server.cert) - + Send trace/debug info to console instead of debug.log file + Выводить информацию трассировки/отладки на консоль вместо файла debug.log - Server private key (default: server.pem) - - Закрытый ключ сервера (по умолчанию: server.pem) - + Send trace/debug info to debugger + Отправлять информацию трассировки/отладки в отладчик - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - Допустимые Cipher'ы для сервера (по умолчанию: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + Username for JSON-RPC connections + Имя для подключений JSON-RPC + + + + Password for JSON-RPC connections + Пароль для подключений JSON-RPC + + + + Listen for JSON-RPC connections on <port> (default: 8332) + Ожидать подключения JSON-RPC на <порт> (по умолчанию: 8332) - This help message - - Данная справка - + Allow JSON-RPC connections from specified IP address + Разрешить подключения JSON-RPC с указанного IP - Cannot obtain a lock on data directory %s. Bitcoin is probably already running. - Невозможно установить блокировку на рабочую директорию %s. Возможно, бумажник уже запущен. + Send commands to node running on <ip> (default: 127.0.0.1) + Посылать команды узлу, запущенному на <ip> (по умолчанию: 127.0.0.1) - - Loading addresses... - Загрузка адресов... + + Set key pool size to <n> (default: 100) + Установить размер запаса ключей в <n> (по умолчанию: 100) - - Error loading addr.dat - - Ошибка при загрузке addr.dat - + + Rescan the block chain for missing wallet transactions + Перепроверить цепь блоков на предмет отсутствующих в кошельке транзакций - - Loading block index... - Загрузка индекса блоков... + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +Параметры SSL: (см. Bitcoin Wiki для инструкций по настройке SSL) - Error loading blkindex.dat - - Ошибка при загрузке blkindex.dat - + Use OpenSSL (https) for JSON-RPC connections + Использовать OpenSSL (https) для подключений JSON-RPC - Loading wallet... - Загрузка бумажника... + Server certificate file (default: server.cert) + Файл серверного сертификата (по умолчанию: server.cert) - Error loading wallet.dat: Wallet corrupted - - Ошибка загрузки wallet.dat: Бумажник повреждён + Server private key (default: server.pem) + Приватный ключ сервера (по умолчанию: server.pem) - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Ошибка загрузки wallet.dat: Для данного бумажника требуется более новая версия Bitcoin - - - - - Error loading wallet.dat - - Ошибка при загрузке wallet.dat - + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Разрешённые алгоритмы (по умолчанию: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - Rescanning... - Сканирование... + This help message + Эта справка - Done loading - Загрузка завершена - - - - Invalid -proxy address - Ошибка в адресе прокси - - - - Invalid amount for -paytxfee=<amount> - Ошибка в сумме комиссии + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + Невозможно установить блокировку на рабочую директорию %s. Возможно, бумажник уже запущен. - Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. - ВНИМАНИЕ: Установлена слишком большая комиссия (-paytxfee=). Данный параметр отвечает за комиссию, которую Вы будете добавлять к сумме при осуществлении транзакций. + Loading addresses... + Загрузка адресов... - - Error: CreateThread(StartNode) failed - Ошибка: Созданиние потока (запуск узла) не удался + + Error loading addr.dat + Ошибка загрузки addr.dat - - Warning: Disk space is low - ВНИМАНИЕ: На диске заканчивается свободное пространство + + Error loading blkindex.dat + Ошибка чтения blkindex.dat - Unable to bind to port %d on this computer. Bitcoin is probably already running. - Невозможно забиндить порт %d на данном компьютере. Возможно, бумажник ужк запущен. - - - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Данная транзакция превышает предельно допустимый размер. Но Вы можете всё равно совершить ей, добавив комиссию в %s, которая отправится тем узлам, которые обработают Вашу транзакцию и поможет поддержать сеть. Вы хотите добавить комиссию? - - - - Enter the current passphrase to the wallet. - Введите текущий пароль от бумажника. - - - - Passphrase - Пароль - - - - Please supply the current wallet decryption passphrase. - Пожалуйста, укажите текущий пароль для расшифровки бумажника. - - - - The passphrase entered for the wallet decryption was incorrect. - Указанный пароль не подходит. - - - - Status - Статус - - - - Date - Дата - - - - Description - Описание - - - - Debit - Дебет - - - - Credit - Кредит - - - - Open for %d blocks - Открыто до получения %d блоков - - - - Open until %s - Открыто до %s - - - - %d/offline? - %d/оффлайн? - - - - %d/unconfirmed - %d/не подтверждено - - - - %d confirmations - %d подтверждений - - - - Generated - Сгенерированно - - - - Generated (%s matures in %d more blocks) - Сгенерированно (%s «созреет» через %d блоков) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Сгенерированно - ВНИМАНИЕ: Данный блок не был получен ни одним другим узлом и, возможно, не будет подтверждён! - - - - Generated (not accepted) - Сгенерированно (не подтверждено) - - - - From: - Отправитель: - - - - Received with: - Получатель: - - - - Payment to yourself - Отправлено себе - - - - To: - Получатель: - - - - Generating - Генерация - - - - (not connected) - (не подключено) - - - - %d connections %d blocks %d transactions - %d подключений %d блоков %d транзакций - - - - Wallet already encrypted. - Бумажник уже зашифрован. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Введите новый пароль для бумажника. -Пожалуйста, используейте пароль из 10 и более случайных символов или из 8 и более слов. - - - - Error: The supplied passphrase was too short. - ОШИБКА: Указанный пароль слишком короткий. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - ВНИМАНИЕ: Если Вы зашифруете Ваш бумажник и потеряете Ваш пароль — Вы ПОТЕРЯЕТЕ ВСЕ ВАШИ БИТКОИНЫ!!! -Вы уверены, что хотите зашифровать бумажник? - - - - Please re-enter your new wallet passphrase. - Пожалуйста, повторите ввод нового пароля. - - - - Error: the supplied passphrases didn't match. - ОШИБКА: указанные пароли не совпадают. - - - - Wallet encryption failed. - Шифрование бумажника не удалось. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Бумажник зашифрован. -Запомните, что шифрование Вашего бумажника не может ПОЛНОСТЬЮ гарантировать защиту Ваших биткоинов от того, чтобы быть украденными с помощью шпионского ПО на Вашем компьютере. Пожалуйста, следите за безопасностью Вашего компьютера самостоятельно. + Error loading wallet.dat: Wallet corrupted + Ошибка загрузки wallet.dat: Бумажник поврежден - - Wallet is unencrypted, please encrypt it first. - Бумажник не зашифрован. Сначала зашифруйте его. + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Ошибка загрузки wallet.dat: бумажник требует более новую версию Bitcoin - - Enter the new passphrase for the wallet. - Введите новый пароль для бумажника. + + Wallet needed to be rewritten: restart Bitcoin to complete + Необходимо перезаписать бумажник, перезапустите Bitcoin для завершения операции. - - Re-enter the new passphrase for the wallet. - Пожалуйста, повторите ввод нового пароля. - - - - Wallet Passphrase Changed. - Пароль от бумажника изменён. - - - - New Receiving Address - Новый адрес для получения - - - - You should use a new address for each payment you receive. - -Label - Вы должны использовать новый адрес для каждого платежа, который Вы получаете. - -Метка - - - - <b>Status:</b> - <b>Статус:</b> - - - - , has not been successfully broadcast yet - , ещё не было успешно разослано - - - - , broadcast through %d node - , разослано через %d узел - - - - , broadcast through %d nodes - , разослано через %d узлов - - - - <b>Date:</b> - <b>Дата:</b> - - - - <b>Source:</b> Generated<br> - <b>Источник:</b> [сгенерированно]<br> - - - - <b>From:</b> - <b>Отправитель:</b> - - - - unknown - неизвестно - - - - <b>To:</b> - <b>Получатель:</b> - - - - (yours, label: - (Ваш, метка: - - - - (yours) - (ваш) - - - - <b>Credit:</b> - <b>Кредит:</b> - - - - (%s matures in %d more blocks) - (%s «созреет» через %d блоков) - - - - (not accepted) - (не принято) - - - - <b>Debit:</b> - <b>Дебет:</b> - - - - <b>Transaction fee:</b> - <b>Комиссия:</b> - - - - <b>Net amount:</b> - <b>Общая сумма:</b> - - - - Message: - Сообщение: - - - - Comment: - Комментарий: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Сгенерированные монеты должны подождать 120 блоков прежде, чем они смогут быть отправлены. Когда Вы сгенерировали этот блок он был отправлен в сеть, чтобы он был добавлен к цепочке блоков. Если данная процедура не удастся, статус изменится на «не подтверждено» и монеты будут непередаваемыми. Такое может случайно происходить в случае, если другой узел сгенерирует блок на несколько секунд раньше. - - - - Cannot write autostart/bitcoin.desktop file - Не возможно записать файл autostart/bitcoin.desktop - - - - Main - Основное - - - - &Start Bitcoin on window system startup - &Запускать бумажник при входе в систему - - - - &Minimize on close - С&ворачивать вместо закрытия - - - - version %s - версия %s - - - - Error in amount - Ошибка в количестве - - - - Send Coins - Отправка - - - - Amount exceeds your balance - Сумма превышает Ваш баланс - - - - Total exceeds your balance when the - Общая сумма превысит Ваш баланс, если к транзакции будет добавлено ещё - - - - transaction fee is included - в качестве комиссии - - - - Payment sent - Платёж отправлен - - - - Sending... - Отправка... - - - - Invalid address - Ошибочный адрес - - - - Sending %s to %s - Отправка %s адресату %s - - - - CANCELLED - ОТМЕНЕНО - - - - Cancelled - Отменено - - - - Transfer cancelled - Транзакция отменена - - - - Error: - ОШИБКА: - - - - Insufficient funds - Недостаточно монет - - - - Connecting... - Подключение... - - - - Unable to connect - Невозможно подключиться - - - - Requesting public key... - Запрашивается открытый ключ... - - - - Received public key... - Получается публичный ключ... - - - - Recipient is not accepting transactions sent by IP address - Получатель не принимает транзакции, отправленные на IP адрес - - - - Transfer was not accepted - Передача была отвергнута - - - - Invalid response received - Получен неверный ответ - - - - Creating transaction... - Создание транзакции... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Данная транзакция требует добавления комиссии (по крайней мере в %s) из-за её размера, сложности, или из-за использования недавно полученных монет - - - - Transaction creation failed - Создание транзакции провалилось - - - - Transaction aborted - Транзакция отменена - - - - Lost connection, transaction cancelled - Потеряно соединение, транзакция отменена - - - - Sending payment... - Отправка платежа... - - - - 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. - В транзакции отказано. Такое может произойти, если некоторые монеты уже были потрачены, например, если Вы используете одну копию бумажника (wallet.dat), а монеты были потрачены из другой копии, но не были отмечены как потраченные в этой. Или в случае кражи (компрометации) Вашего бумажника. - - - - Waiting for confirmation... - Ожидание подтверждения... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - Платёж был отправлен, но получатель не смог подтвердить его. -Транзакция записана и будет зачислена получателю, -но комментарий к платежу будет пустым. - - - - Payment was sent, but an invalid response was received - Платёж был отправлен, но был получен неверный ответ - - - - Payment completed - Платёж завершён - - - - Name - Имя - - - - Address - Адрес - - - - Label - Метка - - - - Bitcoin Address - Bitcoin-адрес - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Это один из Ваших личных адресов для получения платежей. Он не может быть добавлен в адресную книгу. - - - - Edit Address - Изменить адрес + + Error loading wallet.dat + Ошибка при загрузке wallet.dat - - Edit Address Label - Изменить метку + + Loading block index... + Загрузка индекса блоков... - - Add Address - Добавить адрес + + Loading wallet... + Загрузка бумажника... - - Bitcoin - Биткоин + + Rescanning... + Сканирование... - - Bitcoin - Generating - Bitcoin - Генерация + + Done loading + Загрузка завершена - - Bitcoin - (not connected) - Bitcoin - (нет связи) + + Invalid -proxy address + Ошибка в адресе прокси - - &Open Bitcoin - &Показать бумажник + + Invalid amount for -paytxfee=<amount> + Ошибка в сумме комиссии - - &Send Bitcoins - Отп&равка + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + ВНИМАНИЕ: Установлена слишком большая комиссия (-paytxfee=). Данный параметр отвечает за комиссию, которую Вы будете добавлять к сумме при осуществлении транзакций. - - O&ptions... - Оп&ции... + + Error: CreateThread(StartNode) failed + Ошибка: Созданиние потока (запуск узла) не удался - - E&xit - Вы&ход + + Warning: Disk space is low + ВНИМАНИЕ: На диске заканчивается свободное пространство - - Program has crashed and will terminate. - Программа экстренно завершилась и будет уничтожена. + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + Невозможно забиндить порт %d на данном компьютере. Возможно, бумажник ужк запущен. - + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. ВНИМАНИЕ: Проверьте дату и время, установленные на Вашем компьютере. Если Ваши часы идут не правильно Bitcoin может наботать не корректно. - + beta бета - - main - - - Bitcoin Qt - Bitcoin Qt - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts new file mode 100644 index 0000000..c8b49a1 --- /dev/null +++ b/src/qt/locale/bitcoin_sk.ts @@ -0,0 +1,1967 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + O Bitcoin + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> verzia + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + Adresár + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Toto sú VaÅ¡e Bitcoin adresy pre prijímanie platieb. Môžete daÅ¥ každému odosielateľovi inú rôznu adresu a tak udržiavaÅ¥ prehľad o platbách. + + + + Double-click to edit address or label + Dvojklikom editovaÅ¥ adresu alebo popis + + + + Create a new address + VytvoriÅ¥ novú adresu + + + + &New Address... + &Nová adresa... + + + + Copy the currently selected address to the system clipboard + KopírovaÅ¥ práve zvolenú adresu do systémového klipbordu + + + + &Copy to Clipboard + &KopírovaÅ¥ do klipbordu + + + + Show &QR Code + Zobraz &QR Kód + + + + Sign a message to prove you own this address + PodpísaÅ¥ správu a dokázaÅ¥ že vlastníte túto adresu + + + + &Sign Message + &PodpísaÅ¥ Správu + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + ZmazaÅ¥ práve zvolená adresu zo zoznamu. Len adresy pre odosielanie sa dajú zmazaÅ¥. + + + + &Delete + &ZmazaÅ¥ + + + + Copy address + KopírovaÅ¥ adresu + + + + Copy label + KopírovaÅ¥ popis + + + + Edit + UpraviÅ¥ + + + + Delete + ZmazaÅ¥ + + + + Export Address Book Data + ExportovaÅ¥ dáta z adresára + + + + Comma separated file (*.csv) + Čiarkou oddelený súbor (*.csv) + + + + Error exporting + Chyba exportu. + + + + Could not write to file %1. + Nedalo sa zapisovaÅ¥ do súboru %1. + + + + AddressTableModel + + + Label + Popis + + + + Address + Adresa + + + + (no label) + (bez popisu) + + + + AskPassphraseDialog + + + Dialog + Dialóg + + + + + TextLabel + TextovýPopis + + + + Enter passphrase + Zadajte heslo + + + + New passphrase + Nové heslo + + + + Repeat new passphrase + Zopakujte nové heslo + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Zadajte nové heslo k peňaženke.<br/>Prosím použite heslo s dĺžkou aspon <b>10 alebo viac náhodných znakov</b>, alebo <b>8 alebo viac slov</b>. + + + + Encrypt wallet + ZaÅ¡ifrovaÅ¥ peňaženku + + + + This operation needs your wallet passphrase to unlock the wallet. + Táto operácia potrebuje heslo k vaÅ¡ej peňaženke aby ju mohla deÅ¡ifrovaÅ¥. + + + + Unlock wallet + Odomknúť peňaženku + + + + This operation needs your wallet passphrase to decrypt the wallet. + Táto operácia potrebuje heslo k vaÅ¡ej peňaženke na deÅ¡ifrovanie peňaženky. + + + + Decrypt wallet + DeÅ¡ifrovaÅ¥ peňaženku + + + + Change passphrase + Zmena hesla + + + + Enter the old and new passphrase to the wallet. + Zadajte staré a nové heslo k peňaženke. + + + + Confirm wallet encryption + Potvrďte Å¡ifrovanie peňaženky + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + VAROVANIE: Ak zaÅ¡ifrujete peňaženku a stratíte heslo, <b>STRATÍTE VÅ ETKY VAÅ E BITCOINY</b>!⏎ +Ste si istí, že si želáte zaÅ¡ifrovaÅ¥ peňaženku? + + + + + Wallet encrypted + Peňaženka zaÅ¡ifrovaná + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + Varovanie: Caps Lock je zapnutý + + + + + + + Wallet encryption failed + Å ifrovanie peňaženky zlyhalo + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Å ifrovanie peňaženky zlyhalo kôli internej chybe. VaÅ¡a peňaženka nebola zaÅ¡ifrovaná. + + + + + The supplied passphrases do not match. + Zadané heslá nesúhlasia. + + + + Wallet unlock failed + Odomykanie peňaženky zlyhalo + + + + + + The passphrase entered for the wallet decryption was incorrect. + Zadané heslo pre deÅ¡ifrovanie peňaženky bolo nesprávne. + + + + Wallet decryption failed + Zlyhalo Å¡ifrovanie peňaženky. + + + + Wallet passphrase was succesfully changed. + Heslo k peňaženke bolo úspeÅ¡ne zmenené. + + + + BitcoinGUI + + + Bitcoin Wallet + Bitcoin peňaženka + + + + + Synchronizing with network... + Synchronizácia so sieÅ¥ou... + + + + Block chain synchronization in progress + Prebieha synchronizácia blockchain. + + + + &Overview + &Prehľad + + + + Show general overview of wallet + ZobraziÅ¥ celkový prehľad o peňaženke + + + + &Transactions + &Preklady + + + + Browse transaction history + PrechádzaÅ¥ históriu transakcií + + + + &Address Book + &Adresár + + + + Edit the list of stored addresses and labels + EditovaÅ¥ zoznam uložených adries a popisov + + + + &Receive coins + &PrijaÅ¥ bitcoins + + + + Show the list of addresses for receiving payments + ZobraziÅ¥ zoznam adries pre prijímanie platieb. + + + + &Send coins + &PoslaÅ¥ bitcoins + + + + Send coins to a bitcoin address + PoslaÅ¥ bitcoins na adresu + + + + Sign &message + PodpísaÅ¥ &správu + + + + Prove you control an address + DokázaÅ¥ že kontrolujete adresu + + + + E&xit + U&končiÅ¥ + + + + Quit application + UkončiÅ¥ program + + + + &About %1 + &O %1 + + + + Show information about Bitcoin + ZobraziÅ¥ informácie o Bitcoin + + + + About &Qt + O &Qt + + + + Show information about Qt + Zobrazit informácie o Qt + + + + &Options... + &Možnosti... + + + + Modify configuration options for bitcoin + UpraviÅ¥ možnosti nastavenia pre bitcoin + + + + Open &Bitcoin + OtvoriÅ¥ &Bitcoin + + + + Show the Bitcoin window + ZobraziÅ¥ okno Bitcoin + + + + &Export... + &Export... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + &ZaÅ¡ifrovaÅ¥ Peňaženku + + + + Encrypt or decrypt wallet + ZaÅ¡ifrovaÅ¥ alebo deÅ¡ifrovaÅ¥ peňaženku + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + &Zmena Hesla + + + + Change the passphrase used for wallet encryption + ZmeniÅ¥ heslo použité na Å¡ifrovanie peňaženky + + + + &File + &Súbor + + + + &Settings + &Nastavenia + + + + &Help + &Pomoc + + + + Tabs toolbar + LiÅ¡ta záložiek + + + + Actions toolbar + LiÅ¡ta aktvivít + + + + [testnet] + [testovacia sieÅ¥] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + + + + + Downloaded %1 of %2 blocks of transaction history. + + + + + Downloaded %1 blocks of transaction history. + + + + + %n second(s) ago + + + + + %n minute(s) ago + + + + + %n hour(s) ago + + + + + %n day(s) ago + + + + + Up to date + Aktualizovaný + + + + Catching up... + + + + + Last received block was generated %1. + Posledný prijatý blok bol generovaný %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + + + + + Sending... + Odosielanie... + + + + Sent transaction + Odoslané transakcie + + + + Incoming transaction + Prijaté transakcie + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Dátum: %1 +Suma: %2 +Typ: %3 +Adresa: %4 + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &ZobrazovaÅ¥ hodnoty v jednotkách: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + + + + + Display addresses in transaction list + ZobraziÅ¥ adresy zo zoznamu transakcií. + + + + EditAddressDialog + + + Edit Address + UpraviÅ¥ adresu + + + + &Label + &Popis + + + + The label associated with this address book entry + Popis priradený k tomuto záznamu v adresári + + + + &Address + &Adresa + + + + The address associated with this address book entry. This can only be modified for sending addresses. + + + + + New receiving address + Nová adresa pre prijímanie + + + + New sending address + Nová adresa pre odoslanie + + + + Edit receiving address + UpraviÅ¥ prijímacie adresy + + + + Edit sending address + UpraviÅ¥ odosielaciu adresu + + + + The entered address "%1" is already in the address book. + Vložená adresa "%1" sa už nachádza v adresári. + + + + The entered address "%1" is not a valid bitcoin address. + Vložená adresa "%1" nieje platnou adresou bitcoin. + + + + Could not unlock wallet. + Nepodarilo sa odomknúť peňaženku. + + + + New key generation failed. + Generovanie nového kľúča zlyhalo. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &SpustiÅ¥ Bitcoin pri spustení systému správy okien + + + + Automatically start Bitcoin after the computer is turned on + Automaticky spustiÅ¥ Bitcoin po zapnutí počítača + + + + &Minimize to the tray instead of the taskbar + + + + + Show only a tray icon after minimizing the window + ZobraziÅ¥ len ikonu na liÅ¡te po minimalizovaní okna. + + + + Map port using &UPnP + MapovaÅ¥ port pomocou &UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Automaticky otvorit port pre Bitcoin na routeri. Toto funguje len ak router podporuje UPnP a je táto podpora aktivovaná. + + + + M&inimize on close + M&inimalizovaÅ¥ pri zavretí + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Minimalizovat namiesto ukončenia aplikácie keď sa okno zavrie. Keď je zvolená táto možnosÅ¥, aplikácia sa zavrie len po zvolení UkončiÅ¥ v menu. + + + + &Connect through SOCKS4 proxy: + &PripojiÅ¥ cez SOCKS4 proxy: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + PripojiÅ¥ do siete Bitcoin cez SOCKS4 proxy (napr. keď sa pripájate cez Tor) + + + + Proxy &IP: + Proxy &IP: + + + + IP address of the proxy (e.g. 127.0.0.1) + IP addresa proxy (napr. 127.0.0.1) + + + + &Port: + &Port: + + + + Port of the proxy (e.g. 1234) + Port proxy (napr. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Voliteľný transakčný poplatok za kB ktorý pomôže rýchlemu spracovaniu transakcie. Väčšina transakcií má 1 kB. Poplatok 0.01 je odporúčaný. + + + + Pay transaction &fee + ZaplatiÅ¥ transakčné &poplatky + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Voliteľný transakčný poplatok za kB ktorý pomôže rýchlemu spracovaniu transakcie. Väčšina transakcií má 1 kB. Poplatok 0.01 je odporúčaný. + + + + MessagePage + + + Message + Správa + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresa pre odoslanie platby je (napr. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Vyberte adresu z adresára + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Vložte adresu z klipbordu + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Sem vložte správu ktorú chcete podpísaÅ¥ + + + + Click "Sign Message" to get signature + Kliknite "PodpísaÅ¥ Správu" na získanie podpisu + + + + Sign a message to prove you own this address + Podpíšte správu aby ste dokázali že vlastníte túto adresu + + + + &Sign Message + &PodpísaÅ¥ Správu + + + + Copy the currently selected address to the system clipboard + KopírovaÅ¥ práve zvolenú adresu do systémového klipbordu + + + + &Copy to Clipboard + &KopírovaÅ¥ do klipbordu + + + + + + Error signing + Chyba podpisovania + + + + %1 is not a valid address. + %1 nieje platná adresa. + + + + Private key for %1 is not available. + Súkromný kľúč pre %1 nieje k dispozícii. + + + + Sign failed + Podpisovanie neúspeÅ¡né + + + + OptionsDialog + + + Main + Hlavné + + + + Display + Displej + + + + Options + Možnosti + + + + OverviewPage + + + Form + Forma + + + + Balance: + Zostatok: + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Počet transakcií: + + + + 0 + 0 + + + + Unconfirmed: + Nepotvrdené: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + + <b>Recent transactions</b> + <b>Nedávne transakcie</b> + + + + Your current balance + Váš súčasný zostatok + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Suma transakcií ktoré eÅ¡te neboli potvrdené a nezapočítavaju sa do celkového zostatku. + + + + Total number of transactions in wallet + Celkový počet transakcií v peňaženke + + + + QRCodeDialog + + + Dialog + Dialóg + + + + QR Code + QR kód + + + + Request Payment + VyžiadaÅ¥ platbu + + + + Amount: + Suma: + + + + BTC + BTC + + + + Label: + Popis: + + + + Message: + Správa: + + + + &Save As... + &UložiÅ¥ ako... + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + PoslaÅ¥ Bitcoins + + + + Send to multiple recipients at once + PoslaÅ¥ viacerým príjemcom naraz + + + + &Add recipient... + &PridaÅ¥ príjemcu... + + + + Remove all transaction fields + OdobraÅ¥ vÅ¡etky políčka transakcie + + + + Clear all + ZmazaÅ¥ vÅ¡etko + + + + Balance: + Zostatok: + + + + 123.456 BTC + 123.456 BTC + + + + Confirm the send action + Potvrďte odoslanie + + + + &Send + &OdoslaÅ¥ + + + + <b>%1</b> to %2 (%3) + <b>%1</b> do %2 (%3) + + + + Confirm send coins + PotvrdiÅ¥ odoslanie bitcoins + + + + Are you sure you want to send %1? + Ste si istí, že chcete odoslaÅ¥ %1? + + + + and + a + + + + The recepient address is not valid, please recheck. + Adresa príjemcu je neplatná, prosím, overte ju. + + + + The amount to pay must be larger than 0. + Suma na úhradu musí byÅ¥ väčšia ako 0. + + + + Amount exceeds your balance + Suma je vyÅ¡Å¡ia ako Váš zostatok + + + + Total exceeds your balance when the %1 transaction fee is included + Suma celkom prevyÅ¡uje Váš zostatok ak sú započítané %1 transakčné poplatky + + + + Duplicate address found, can only send to each address once in one send operation + Duplikát adresy objavený, je možné poslaÅ¥ na každú adresu len raz v jednej odchádzajúcej transakcii. + + + + Error: Transaction creation failed + Chyba: Zlyhalo vytvorenie transakcie + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + Forma + + + + A&mount: + Su&ma: + + + + Pay &To: + Zapla&tiÅ¥: + + + + + Enter a label for this address to add it to your address book + Vložte popis pre túto adresu aby sa pridala do adresára + + + + &Label: + &Popis: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adresa pre odoslanie platby je (napr. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Zvoľte adresu z adresára + + + + Alt+A + Alt+A + + + + Paste address from clipboard + VložiÅ¥ adresu z klipbordu + + + + Alt+P + Alt+P + + + + Remove this recipient + OdstrániÅ¥ tohto príjemcu + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Zadajte Bitcoin adresu (napr. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + + + + + Open until %1 + + + + + %1/offline? + + + + + %1/unconfirmed + %1/nepotvrdené + + + + %1 confirmations + %1 potvrdení + + + + <b>Status:</b> + <b>Stav:</b> + + + + , has not been successfully broadcast yet + , eÅ¡te nebola úspeÅ¡ne odoslaná + + + + , broadcast through %1 node + , odoslaná cez %1 nódu + + + + , broadcast through %1 nodes + , odoslaná cez %1 nód + + + + <b>Date:</b> + <b>Dátum:</b> + + + + <b>Source:</b> Generated<br> + <b>Zdroj:</b> Generovaný<br> + + + + + <b>From:</b> + <b>od:</b> + + + + unknown + neznámy + + + + + + <b>To:</b> + <b>Komu:</b> + + + + (yours, label: + (vaÅ¡e, popis: + + + + (yours) + (vaÅ¡e) + + + + + + + <b>Credit:</b> + <b>Kredit:</b> + + + + (%1 matures in %2 more blocks) + (%1 dospeje o %2 blokov) + + + + (not accepted) + (neprijaté) + + + + + + <b>Debit:</b> + <b>Debet:</b> + + + + <b>Transaction fee:</b> + <b>Transakčný poplatok:</b> + + + + <b>Net amount:</b> + <b>Suma netto:</b> + + + + Message: + Správa: + + + + Comment: + Komentár: + + + + Transaction ID: + ID transakcie: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + + + + + TransactionDescDialog + + + Transaction details + Detaily transakcie + + + + This pane shows a detailed description of the transaction + Táto časÅ¥ obrazovky zobrazuje detailný popis transakcie + + + + TransactionTableModel + + + Date + Dátum + + + + Type + Typ + + + + Address + Adresa + + + + Amount + Hodnota + + + + Open for %n block(s) + + + + + Open until %1 + + + + + Offline (%1 confirmations) + + + + + Unconfirmed (%1 of %2 confirmations) + Nepotvrdené (%1 z %2 potvrdení) + + + + Confirmed (%1 confirmations) + Potvrdené (%1 potvrdení) + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + Ten blok nebol prijatý žiadnou inou nódou a pravdepodobne nebude akceptovaný! + + + + Generated but not accepted + Vypočítané ale neakceptované + + + + Received with + Prijaté s + + + + Received from + Prijaté od: + + + + Sent to + Odoslané na + + + + Payment to yourself + Platba sebe samému + + + + Mined + Vyfárané + + + + (n/a) + (n/a) + + + + Transaction status. Hover over this field to show number of confirmations. + Status transakcie. Pohybujte myÅ¡ou nad týmto poľom a zjaví sa počet potvrdení. + + + + Date and time that the transaction was received. + Dátum a čas prijatia transakcie. + + + + Type of transaction. + Typ transakcie. + + + + Destination address of transaction. + Cieľová adresa transakcie. + + + + Amount removed from or added to balance. + Suma pridaná alebo odobraná k zostatku. + + + + TransactionView + + + + All + VÅ¡etko + + + + Today + Dnes + + + + This week + Tento týždeň + + + + This month + Tento mesiac + + + + Last month + Minulý mesiac + + + + This year + Tento rok + + + + Range... + Rozsah... + + + + Received with + Prijaté s + + + + Sent to + Odoslané na + + + + To yourself + Samému sebe + + + + Mined + Vyfárané + + + + Other + Iné + + + + Enter address or label to search + Vložte adresu alebo popis pre vyhľadávanie + + + + Min amount + Min množstvo + + + + Copy address + KopírovaÅ¥ adresu + + + + Copy label + KopírovaÅ¥ popis + + + + Copy amount + KopírovaÅ¥ sumu + + + + Edit label + EditovaÅ¥ popis + + + + Show details... + UkázaÅ¥ detaily... + + + + Export Transaction Data + ExportovaÅ¥ transakčné dáta + + + + Comma separated file (*.csv) + Čiarkou oddelovaný súbor (*.csv) + + + + Confirmed + Potvrdené + + + + Date + Dátum + + + + Type + Typ + + + + Label + Popis + + + + Address + Adresa + + + + Amount + Suma + + + + ID + ID + + + + Error exporting + Chyba exportu + + + + Could not write to file %1. + Nedalo sa zapisovaÅ¥ do súboru %1. + + + + Range: + Rozsah: + + + + to + do + + + + WalletModel + + + Sending... + Odosielanie... + + + + bitcoin-core + + + Bitcoin version + Bitcoin verzia + + + + Usage: + Použitie: + + + + Send command to -server or bitcoind + OdoslaÅ¥ príkaz -server alebo bitcoind + + + + List commands + Zoznam príkazov + + + + Get help for a command + DostaÅ¥ pomoc pre príkaz + + + + Options: + Možnosti: + + + + Specify configuration file (default: bitcoin.conf) + UrčiÅ¥ súbor s nastaveniami (predvolené: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + UrčiÅ¥ súbor pid (predvolené: bitcoind.pid) + + + + Generate coins + Počítaj bitcoins + + + + Don't generate coins + Nepočítaj bitcoins + + + + Start minimized + SpustiÅ¥ minimalizované + + + + Specify data directory + UrčiÅ¥ priečinok s dátami + + + + Specify connection timeout (in milliseconds) + UrčiÅ¥ aut spojenia (v milisekundách) + + + + Connect through socks4 proxy + Pripojenie cez socks4 proxy + + + + Allow DNS lookups for addnode and connect + PovoliÅ¥ vyhľadávanie DNS pre pridanie nódy a spojenie + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + NačúvaÅ¥ spojeniam na <port> (prednastavené: 8333 alebo testovacia sieÅ¥: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + UdržiavaÅ¥ maximálne <n> spojení (predvolené: 125) + + + + Add a node to connect to + PridaÅ¥ nódu a pripojiÅ¥ sa + + + + Connect only to the specified node + PripojiÅ¥ sa len k určenej nóde + + + + Don't accept connections from outside + NeprijímaÅ¥ spojenia z vonku + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + NeskúsiÅ¥ použiÅ¥ UPnP pre mapovanie počúvajúceho portu + + + + Attempt to use UPnP to map the listening port + SkúsiÅ¥ použiÅ¥ UPnP pre mapovanie počúvajúceho portu + + + + Fee per kB to add to transactions you send + Poplatok za kB ktorý treba pridaÅ¥ k odoslanej transakcii + + + + Accept command line and JSON-RPC commands + PrijímaÅ¥ príkazy z príkazového riadku a JSON-RPC + + + + Run in the background as a daemon and accept commands + BežaÅ¥ na pozadí ako démon a prijímaÅ¥ príkazy + + + + Use the test network + PoužiÅ¥ testovaciu sieÅ¥ + + + + Output extra debugging information + ProdukovaÅ¥ extra ladiace informácie + + + + Prepend debug output with timestamp + PridaÅ¥ na začiatok ladiaceho výstupu časový údaj + + + + Send trace/debug info to console instead of debug.log file + OdoslaÅ¥ trace/debug informácie na konzolu namiesto debug.info žurnálu + + + + Send trace/debug info to debugger + OdoslaÅ¥ trace/debug informácie do ladiaceho programu + + + + Username for JSON-RPC connections + Užívateľské meno pre JSON-RPC spojenia + + + + Password for JSON-RPC connections + Heslo pre JSON-rPC spojenia + + + + Listen for JSON-RPC connections on <port> (default: 8332) + PočúvaÅ¥ JSON-RPC spojeniam na <port> (predvolené: 8332) + + + + Allow JSON-RPC connections from specified IP address + PovoliÅ¥ JSON-RPC spojenia z určenej IP adresy. + + + + Send commands to node running on <ip> (default: 127.0.0.1) + PoslaÅ¥ príkaz nóde bežiacej na <ip> (predvolené: 127.0.0.1) + + + + Set key pool size to <n> (default: 100) + NastaviÅ¥ zásobu adries na <n> (predvolené: 100) + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + SSL možnosÅ¥: (pozrite Bitcoin Wiki pre návod na nastavenie SSL) + + + + Use OpenSSL (https) for JSON-RPC connections + PoužiÅ¥ OpenSSL (https) pre JSON-RPC spojenia + + + + Server certificate file (default: server.cert) + Súbor s certifikátom servra (predvolené: server.cert) + + + + Server private key (default: server.pem) + Súkromný kľúč servra (predvolené: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Prijateľné Å¡ifry (predvolené: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Táto pomocná správa + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + Načítavanie adries... + + + + Error loading addr.dat + Chyba načítania addr.dat + + + + Error loading blkindex.dat + Chyba načítania blkindex.dat + + + + Error loading wallet.dat: Wallet corrupted + Chyba načítania wallet.dat: Peňaženka je poÅ¡kodená + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Chyba načítania wallet.dat: Peňaženka vyžaduje novÅ¡iu verziu Bitcoin + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Bolo potrebné prepísaÅ¥ peňaženku: dokončite reÅ¡tartovaním Bitcoin + + + + Error loading wallet.dat + Chyba načítania wallet.dat + + + + Loading block index... + Načítavanie zoznamu blokov... + + + + Loading wallet... + Načítavam peňaženku... + + + + Rescanning... + + + + + Done loading + Dokončené načítavanie + + + + Invalid -proxy address + Neplatná adresa proxy + + + + Invalid amount for -paytxfee=<amount> + Neplatná suma pre -paytxfee=<amount> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Varovanie: -paytxfee je nastavené veľmi vysoko. Toto sú transakčné poplatky ktoré zaplatíte ak odoÅ¡lete transakciu. + + + + Error: CreateThread(StartNode) failed + Chyba: zlyhalo CreateThread(StartNode) + + + + Warning: Disk space is low + Varovanie: Málo voľného miesta na disku + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts new file mode 100644 index 0000000..59c0c99 --- /dev/null +++ b/src/qt/locale/bitcoin_sr.ts @@ -0,0 +1,1968 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + О Bitcoin-у + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> верзија + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + Адресар + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Ово су Ваше Bitcoin адресе за примање уплата. Можете да сваком пошиљаоцу дате другачију адресу да би пратили ко је вршио уплате. + + + + Double-click to edit address or label + Кликните два пута да промените адресу и/или етикету + + + + Create a new address + Прави нову адресу + + + + &New Address... + &Нова адреса... + + + + Copy the currently selected address to the system clipboard + Копира изабрану адресу на системски клипборд + + + + &Copy to Clipboard + Ис&копирај на клипборд + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Брише изабрану адресу. Могуће је брисати само адресе са којих се шаље. + + + + &Delete + &Избриши + + + + Copy address + + + + + Copy label + + + + + Edit + + + + + Delete + + + + + Export Address Book Data + Извоз података из адресара + + + + Comma separated file (*.csv) + Зарезом одвојене вредности (*.csv) + + + + Error exporting + Грешка током извоза + + + + Could not write to file %1. + Није могуће писати у фајл %1. + + + + AddressTableModel + + + Label + Етикета + + + + Address + Адреса + + + + (no label) + (без етикете) + + + + AskPassphraseDialog + + + Dialog + Дијалог + + + + + TextLabel + TextLabel + + + + Enter passphrase + Унесите лозинку + + + + New passphrase + Нова лозинка + + + + Repeat new passphrase + Поновите нову лозинку + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Унесите нову лозинку за приступ новчанику.<br/>Молимо Вас да лозинка буде <b>10 или више насумице одабраних знакова</b>, или <b>осам или више речи</b>. + + + + Encrypt wallet + Шифровање новчаника + + + + This operation needs your wallet passphrase to unlock the wallet. + Ова акција захтева лозинку Вашег новчаника да би га откључала. + + + + Unlock wallet + Откључавање новчаника + + + + This operation needs your wallet passphrase to decrypt the wallet. + Ова акција захтева да унесете лозинку да би дешифловала новчаник. + + + + Decrypt wallet + Дешифровање новчаника + + + + Change passphrase + Промена лозинке + + + + Enter the old and new passphrase to the wallet. + Унесите стару и нову лозинку за шифровање новчаника. + + + + Confirm wallet encryption + Одобрите шифровање новчаника + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + УПОЗОРЕЊЕ: Ако се ваш новчаник шифрује а потом изгубите лозинкзу, ви ћете <b>ИЗГУБИТИ СВЕ BITCOIN-Е</b>! +Да ли сте сигурни да желите да се новчаник шифује? + + + + + Wallet encrypted + Новчаник је шифрован + + + + Bitcoin 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. + + + + + + Warning: The Caps Lock key is on. + + + + + + + + Wallet encryption failed + Неуспело шифровање новчаника + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Настала је унутрашња грешка током шифровања новчаника. Ваш новчаник није шифрован. + + + + + The supplied passphrases do not match. + Лозинке које сте унели се не подударају. + + + + Wallet unlock failed + Неуспело откључавање новчаника + + + + + + The passphrase entered for the wallet decryption was incorrect. + Лозинка коју сте унели за откључавање новчаника је нетачна. + + + + Wallet decryption failed + Неуспело дешифровање новчаника + + + + Wallet passphrase was succesfully changed. + Лозинка за приступ новчанику је успешно промењена. + + + + BitcoinGUI + + + Bitcoin Wallet + Bitcoin новчаник + + + + + Synchronizing with network... + Синхронизација са мрежом у току... + + + + Block chain synchronization in progress + Синхронизовање ланца блоква је у току + + + + &Overview + &Општи преглед + + + + Show general overview of wallet + Погледајте општи преглед новчаника + + + + &Transactions + &Трансакције + + + + Browse transaction history + Претражите историјат трансакција + + + + &Address Book + &Адресар + + + + Edit the list of stored addresses and labels + Уредите запамћене адресе и њихове етикете + + + + &Receive coins + П&римање новца + + + + Show the list of addresses for receiving payments + Прегледајте листу адреса на којима прихватате уплате + + + + &Send coins + &Слање новца + + + + Send coins to a bitcoin address + Пошаљите новац на bitcoin адресу + + + + Sign &message + + + + + Prove you control an address + + + + + E&xit + + + + + Quit application + Напустите програм + + + + &About %1 + + + + + Show information about Bitcoin + Прегледајте информације о Bitcoin-у + + + + About &Qt + + + + + Show information about Qt + + + + + &Options... + П&оставке... + + + + Modify configuration options for bitcoin + Изаберите могућности bitcoin-а + + + + Open &Bitcoin + Отвори &Bitcoin + + + + Show the Bitcoin window + Приказује прозор Bitcoin-а + + + + &Export... + &Извоз... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + &Шифровање новчаника + + + + Encrypt or decrypt wallet + Шифровање и дешифровање новчаника + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + Промени &лозинку + + + + Change the passphrase used for wallet encryption + Мењање лозинке којом се шифрује новчаник + + + + &File + &Фајл + + + + &Settings + &Подешавања + + + + &Help + П&омоћ + + + + Tabs toolbar + Трака са картицама + + + + Actions toolbar + Трака са алаткама + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n активна веза са Bitcoin мрежом%n активне везе са Bitcoin мрежом%n активних веза са Bitcoin мрежом + + + + Downloaded %1 of %2 blocks of transaction history. + Преузето је %1 од укупно %2 блокова историјата трансакција. + + + + Downloaded %1 blocks of transaction history. + Преузето је %1 блокова историјата трансакција. + + + + %n second(s) ago + пре %n секундпре %n секундепре %n секунди + + + + %n minute(s) ago + пре %n минутпре %n минутапре %n минута + + + + %n hour(s) ago + пре %n сатпре %n сатапре %n сати + + + + %n day(s) ago + пре %n данпре %n данапре %n дана + + + + Up to date + Ажурно + + + + Catching up... + Ажурирање у току... + + + + Last received block was generated %1. + Последњи примљени блок је направљен %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Ова трансакција је превелика. И даље је можете послати уз накнаду од %1, која ће отићи чвору који прерађује трансакцију и помаже издржавању целе мреже. Да ли желите да дате напојницу? + + + + Sending... + Слање... + + + + Sent transaction + Послана трансакција + + + + Incoming transaction + Придошла трансакција + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Новчаник јс <b>шифрован</b> и тренутно <b>откључан</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Новчаник јс <b>шифрован</b> и тренутно <b>закључан</b> + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Јединица за приказивање износа: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + + + + + Display addresses in transaction list + + + + + EditAddressDialog + + + Edit Address + + + + + &Label + + + + + The label associated with this address book entry + + + + + &Address + + + + + The address associated with this address book entry. This can only be modified for sending addresses. + + + + + New receiving address + + + + + New sending address + + + + + Edit receiving address + + + + + Edit sending address + + + + + The entered address "%1" is already in the address book. + + + + + The entered address "%1" is not a valid bitcoin address. + + + + + Could not unlock wallet. + Немогуће откључати новчаник. + + + + New key generation failed. + + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + + + + + Automatically start Bitcoin after the computer is turned on + + + + + &Minimize to the tray instead of the taskbar + + + + + Show only a tray icon after minimizing the window + + + + + Map port using &UPnP + + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + + + + + M&inimize on close + + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + + + + + &Connect through SOCKS4 proxy: + + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + + + + + Proxy &IP: + + + + + IP address of the proxy (e.g. 127.0.0.1) + + + + + &Port: + + + + + Port of the proxy (e.g. 1234) + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose adress from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + + + + + Copy the currently selected address to the system clipboard + Копира изабрану адресу на системски клипборд + + + + &Copy to Clipboard + Ис&копирај на клипборд + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + + + + + Display + + + + + Options + + + + + OverviewPage + + + Form + + + + + Balance: + + + + + 123.456 BTC + + + + + Number of transactions: + + + + + 0 + + + + + Unconfirmed: + + + + + 0 BTC + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Новчаник</span></p></body></html> + + + + <b>Recent transactions</b> + + + + + Your current balance + + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + + + + + Total number of transactions in wallet + Укупан број трансакција у новчанику + + + + QRCodeDialog + + + Dialog + Дијалог + + + + QR Code + + + + + Request Payment + + + + + Amount: + + + + + BTC + + + + + Label: + + + + + Message: + + + + + &Save As... + + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + + + + + Send to multiple recipients at once + + + + + &Add recipient... + + + + + Remove all transaction fields + + + + + Clear all + + + + + Balance: + + + + + 123.456 BTC + + + + + Confirm the send action + + + + + &Send + &Пошаљи + + + + <b>%1</b> to %2 (%3) + + + + + Confirm send coins + + + + + Are you sure you want to send %1? + Да ли сте сигурни да желите да пошаљете %1? + + + + and + + + + + The recepient address is not valid, please recheck. + + + + + The amount to pay must be larger than 0. + + + + + Amount exceeds your balance + + + + + Total exceeds your balance when the %1 transaction fee is included + + + + + Duplicate address found, can only send to each address once in one send operation + + + + + Error: Transaction creation failed + + + + + Error: 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. + + + + + SendCoinsEntry + + + Form + + + + + A&mount: + + + + + Pay &To: + + + + + + Enter a label for this address to add it to your address book + + + + + &Label: + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + Choose address from address book + + + + + Alt+A + + + + + Paste address from clipboard + + + + + Alt+P + + + + + Remove this recipient + + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + + TransactionDesc + + + Open for %1 blocks + + + + + Open until %1 + + + + + %1/offline? + + + + + %1/unconfirmed + + + + + %1 confirmations + + + + + <b>Status:</b> + + + + + , has not been successfully broadcast yet + + + + + , broadcast through %1 node + + + + + , broadcast through %1 nodes + + + + + <b>Date:</b> + + + + + <b>Source:</b> Generated<br> + + + + + + <b>From:</b> + + + + + unknown + + + + + + + <b>To:</b> + + + + + (yours, label: + + + + + (yours) + + + + + + + + <b>Credit:</b> + + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + + + + + + + <b>Debit:</b> + + + + + <b>Transaction fee:</b> + + + + + <b>Net amount:</b> + + + + + Message: + + + + + Comment: + + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + + + + + TransactionDescDialog + + + Transaction details + + + + + This pane shows a detailed description of the transaction + + + + + TransactionTableModel + + + Date + + + + + Type + + + + + Address + Адреса + + + + Amount + + + + + Open for %n block(s) + + + + + Open until %1 + + + + + Offline (%1 confirmations) + + + + + Unconfirmed (%1 of %2 confirmations) + + + + + Confirmed (%1 confirmations) + + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + + + + + Generated but not accepted + + + + + Received with + + + + + Received from + + + + + Sent to + + + + + Payment to yourself + + + + + Mined + + + + + (n/a) + + + + + Transaction status. Hover over this field to show number of confirmations. + + + + + Date and time that the transaction was received. + + + + + Type of transaction. + + + + + Destination address of transaction. + + + + + Amount removed from or added to balance. + + + + + TransactionView + + + + All + + + + + Today + + + + + This week + + + + + This month + + + + + Last month + + + + + This year + + + + + Range... + + + + + Received with + + + + + Sent to + + + + + To yourself + + + + + Mined + + + + + Other + + + + + Enter address or label to search + + + + + Min amount + + + + + Copy address + + + + + Copy label + + + + + Copy amount + + + + + Edit label + + + + + Show details... + + + + + Export Transaction Data + + + + + Comma separated file (*.csv) + Зарезом одвојене вредности (*.csv) + + + + Confirmed + + + + + Date + + + + + Type + + + + + Label + Етикета + + + + Address + Адреса + + + + Amount + + + + + ID + + + + + Error exporting + Грешка током извоза + + + + Could not write to file %1. + Није могуће писати у фајл %1. + + + + Range: + + + + + to + + + + + WalletModel + + + Sending... + Слање у току... + + + + bitcoin-core + + + Bitcoin version + + + + + Usage: + + + + + Send command to -server or bitcoind + + + + + List commands + + + + + Get help for a command + + + + + Options: + + + + + Specify configuration file (default: bitcoin.conf) + + + + + Specify pid file (default: bitcoind.pid) + + + + + Generate coins + + + + + Don't generate coins + + + + + Start minimized + + + + + Specify data directory + + + + + Specify connection timeout (in milliseconds) + + + + + Connect through socks4 proxy + + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + + + + + Connect only to the specified node + + + + + Don't accept connections from outside + + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + + + + + Wallet needed to be rewritten: restart Bitcoin to complete + + + + + Error loading wallet.dat + + + + + Loading block index... + + + + + Loading wallet... + Новчаник се учитава... + + + + Rescanning... + + + + + Done loading + + + + + Invalid -proxy address + + + + + Invalid amount for -paytxfee=<amount> + + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts new file mode 100644 index 0000000..7e5d127 --- /dev/null +++ b/src/qt/locale/bitcoin_sv.ts @@ -0,0 +1,1975 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + Om Bitcoin + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> version + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + + + + + AddressBookPage + + + Address Book + Adressbok + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Detta är dina Bitcoin-adresser för att ta emot betalningar. Du kan ge varje avsändare en egen adress sÃ¥ att du kan hÃ¥lla reda pÃ¥ vem som betalar dig. + + + + Double-click to edit address or label + Dubbelklicka för att ändra adress eller etikett + + + + Create a new address + Skapa ny adress + + + + &New Address... + &Ny adress... + + + + Copy the currently selected address to the system clipboard + Kopiera den markerade adressen till systemets Urklipp + + + + &Copy to Clipboard + &amp; Kopiera till Urklipp + + + + Show &QR Code + + + + + Sign a message to prove you own this address + + + + + &Sign Message + &Signera meddelande + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Ta bort den markerade adressen frÃ¥n listan. Endast sändningsadresser kan tas bort. + + + + &Delete + &amp; Radera + + + + Copy address + Kopiera adress + + + + Copy label + Kopiera etikett + + + + Edit + Editera + + + + Delete + Ta bort + + + + Export Address Book Data + Exportera Adressboksinformation + + + + Comma separated file (*.csv) + Kommaseparerad fil (*. csv) + + + + Error exporting + Fel vid export + + + + Could not write to file %1. + Kunde inte skriva till filen %1. + + + + AddressTableModel + + + Label + Etikett + + + + Address + Adress + + + + (no label) + (Ingen etikett) + + + + AskPassphraseDialog + + + Dialog + Dialog + + + + + TextLabel + TextLabel + + + + Enter passphrase + Ange lösenord + + + + New passphrase + Nytt lösenord + + + + Repeat new passphrase + Upprepa nytt lösenord + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Ange plÃ¥nbokens nya lösenfras. <br/> Använd ett lösenord pÃ¥ <b>10 eller fler slumpmässiga tecken,</b> eller <b>Ã¥tta eller fler ord.</b> + + + + Encrypt wallet + Kryptera plÃ¥nbok + + + + This operation needs your wallet passphrase to unlock the wallet. + Denna operation behöver din plÃ¥nboks lösenfras för att lÃ¥sa upp plÃ¥nboken. + + + + Unlock wallet + LÃ¥s upp plÃ¥nbok + + + + This operation needs your wallet passphrase to decrypt the wallet. + Denna operation behöver din plÃ¥nboks lösenfras för att dekryptera plÃ¥nboken. + + + + Decrypt wallet + Dekryptera plÃ¥nbok + + + + Change passphrase + Ändra lösenfras + + + + Enter the old and new passphrase to the wallet. + Ange plÃ¥nbokens gamla och nya lösenfras. + + + + Confirm wallet encryption + Bekräfta kryptering av plÃ¥nbok + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + VARNING: Om du krypterar din plÃ¥nbok och glömmer din lösenfras, kommer du att <b>förlora alla dina BITCOINS!</b> Är du säker pÃ¥ att du vill kryptera din plÃ¥nbok? + + + + + Wallet encrypted + PlÃ¥nboken är krypterad + + + + Bitcoin 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. + Programmet kommer nu att stänga ner för att göra färdigt krypteringen. Notera att en krypterat konto inte skyddar mot all form av stöld pÃ¥ en infekterad dator. + + + + + Warning: The Caps Lock key is on. + Varning: Caps Lock är pÃ¥slaget + + + + + + + Wallet encryption failed + Kryptering av plÃ¥nbok misslyckades + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Kryptering av plÃ¥nbok misslyckades pÃ¥ grund av ett internt fel. Din plÃ¥nbok blev inte krypterad. + + + + + The supplied passphrases do not match. + De angivna lösenfraserna överensstämmer inte. + + + + Wallet unlock failed + UpplÃ¥sning av plÃ¥nbok misslyckades + + + + + + The passphrase entered for the wallet decryption was incorrect. + Lösenfrasen för dekryptering av plÃ¥nbok var felaktig. + + + + Wallet decryption failed + Dekryptering av plÃ¥nbok misslyckades + + + + Wallet passphrase was succesfully changed. + PlÃ¥nbokens lösenfras har ändrats. + + + + BitcoinGUI + + + Bitcoin Wallet + Bitcoin-plÃ¥nbok + + + + + Synchronizing with network... + Synkroniserar med nätverk ... + + + + Block chain synchronization in progress + Synkronisering av blockkedja pÃ¥gÃ¥r + + + + &Overview + &amp; Översikt + + + + Show general overview of wallet + Visa översiktsvy av plÃ¥nbok + + + + &Transactions + &Transaktioner + + + + Browse transaction history + Bläddra i transaktionshistorik + + + + &Address Book + &Adressbok + + + + Edit the list of stored addresses and labels + Redigera listan med lagrade adresser och etiketter + + + + &Receive coins + &amp; Ta emot bitcoins + + + + Show the list of addresses for receiving payments + Visa listan med adresser för att ta emot betalningar + + + + &Send coins + &amp; Skicka bitcoins + + + + Send coins to a bitcoin address + Skicka bitcoins till en bitcoinadress + + + + Sign &message + Signera &meddelande + + + + Prove you control an address + + + + + E&xit + &Avsluta + + + + Quit application + Avsluta programmet + + + + &About %1 + &Om %1 + + + + Show information about Bitcoin + Visa information om Bitcoin + + + + About &Qt + Om &Qt + + + + Show information about Qt + Visa information om Qt + + + + &Options... + &amp; Alternativ ... + + + + Modify configuration options for bitcoin + Ändra konfigurationsalternativ för bitcoin + + + + Open &Bitcoin + Öppna &amp;Bitcoin + + + + Show the Bitcoin window + Visa Bitcoin-fönster + + + + &Export... + &amp;Exportera ... + + + + Export the data in the current tab to a file + + + + + &Encrypt Wallet + &amp;Kryptera plÃ¥nbok + + + + Encrypt or decrypt wallet + Kryptera eller dekryptera plÃ¥nbok + + + + &Backup Wallet + + + + + Backup wallet to another location + + + + + &Change Passphrase + &amp;Byt lösenfras + + + + Change the passphrase used for wallet encryption + Byt lösenfras för kryptering av plÃ¥nbok + + + + &File + &Arkiv + + + + &Settings + &Inställningar + + + + &Help + &Hjälp + + + + Tabs toolbar + Verktygsfält för Tabbar + + + + Actions toolbar + Verktygsfältet för Handlingar + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + %n aktiv anslutning till Bitcoin-nätverket.%n aktiva anslutningar till Bitcoin-nätverket. + + + + Downloaded %1 of %2 blocks of transaction history. + Laddat ner %1 av %2 block frÃ¥n transaktionshistoriken. + + + + Downloaded %1 blocks of transaction history. + Laddat ner %1 block frÃ¥n transaktionshistoriken. + + + + %n second(s) ago + %n sekund sedan%n sekunder sedan + + + + %n minute(s) ago + %n minut sedan%n minuter sedan + + + + %n hour(s) ago + %n timme sedan%n timmar sedan + + + + %n day(s) ago + %n dag sedan%n dagar sedan + + + + Up to date + Uppdaterad + + + + Catching up... + Hämtar senaste + + + + Last received block was generated %1. + Senast mottagna blocked genererades %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Transaktionen överskrider storleksgränsen. + +Du kan dock fortfarande skicka den mot en kostnad av %1. Denna avgift gÃ¥r till noderna som behandlar din transaktion och bidrar till nätverket. + +Vill du betala denna avgift? + + + + Sending... + Skickar... + + + + Sent transaction + Transaktion skickad + + + + Incoming transaction + Inkommande transaktion + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Datum: %1 +Belopp: %2 +Typ: %3 +Adress:%4 + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Denna plÃ¥nbok är <b>krypterad</b> och för närvarande <b>olÃ¥st</b>. + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Denna plÃ¥nbok är <b>krypterad</b> och för närvarande <b>lÃ¥st</b>. + + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + + + + DisplayOptionsPage + + + &Unit to show amounts in: + &Enhet att visa belopp i: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Välj en standard för enhets mÃ¥tt, att visa när du skickar mynt + + + + Display addresses in transaction list + Visa adresser i transaktionslistan + + + + EditAddressDialog + + + Edit Address + Redigera adress + + + + &Label + &Etikett + + + + The label associated with this address book entry + Den etikett som är associerad med detta adressboksinlägg + + + + &Address + &Adress + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Adressen som är associerad med detta adressboksinlägg. Detta kan enbart ändras för sändande adresser. + + + + New receiving address + Ny mottagaradress + + + + New sending address + Ny avsändaradress + + + + Edit receiving address + Redigera mottagaradress + + + + Edit sending address + Redigera avsändaradress + + + + The entered address "%1" is already in the address book. + Den angivna adressen "%1" finns redan i adressboken. + + + + The entered address "%1" is not a valid bitcoin address. + Den angivna adressen "%1" är inte en giltig Bitcoin-adress. + + + + Could not unlock wallet. + PlÃ¥nboken kunde inte lÃ¥sas upp. + + + + New key generation failed. + Misslyckades med generering av ny nyckel. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + &Starta Bitcoin vid systemstart + + + + Automatically start Bitcoin after the computer is turned on + Starta Bitcoin automatiskt när datorn startas. + + + + &Minimize to the tray instead of the taskbar + &Minimera till systemfältet istället för aktivitetsfältet + + + + Show only a tray icon after minimizing the window + Visa endast en systemfältsikon vid minimering + + + + Map port using &UPnP + Tilldela port med hjälp av &UPnP + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Öppna automatiskt Bitcoin-klientens port pÃ¥ routern. Detta fungerar endast om din router har UPnP aktiverat. + + + + M&inimize on close + M&inimera vid stängning + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Minimera applikationen istället för att stänga ner den när fönstret stängs. Detta innebär att programmet fotrsätter att köras tills du väljer Avsluta i menyn. + + + + &Connect through SOCKS4 proxy: + &Anslut via SOCKS4 proxy: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Anslut till Bitcoin-nätverket genom en SOCKS4-proxy (t.ex. när du ansluter genom Tor). + + + + Proxy &IP: + Proxy &IP: + + + + IP address of the proxy (e.g. 127.0.0.1) + Proxyns IP-adress (t.ex. 127.0.0.1). + + + + &Port: + &Port: + + + + Port of the proxy (e.g. 1234) + Proxyns port (t.ex. 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + Pay transaction &fee + Betala överförings &avgift + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + + + + + MessagePage + + + Message + + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adressen som betalningen skall skickas till (t.ex. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Välj adress frÃ¥n adressboken + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Klistra in adress frÃ¥n Urklipp + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + + + + + Click "Sign Message" to get signature + + + + + Sign a message to prove you own this address + + + + + &Sign Message + &Signera meddelande + + + + Copy the currently selected address to the system clipboard + Kopiera den markerade adressen till systemets Urklipp + + + + &Copy to Clipboard + &amp; Kopiera till Urklipp + + + + + + Error signing + + + + + %1 is not a valid address. + + + + + Private key for %1 is not available. + + + + + Sign failed + + + + + OptionsDialog + + + Main + Allmänt + + + + Display + Visa + + + + Options + Alternativ + + + + OverviewPage + + + Form + Formulär + + + + Balance: + Saldo: + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Antal transaktioner: + + + + 0 + 0 + + + + Unconfirmed: + Obekräftade: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Nyligen genomförda transaktioner</b> + + + + Your current balance + Ditt nuvarande saldo + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Totalt antal transaktioner som ännu inte bekräftats, och som ännu inte räknas med i aktuellt saldo + + + + Total number of transactions in wallet + Totalt antal transaktioner i plÃ¥nboken + + + + QRCodeDialog + + + Dialog + Dialog + + + + QR Code + + + + + Request Payment + + + + + Amount: + Belopp: + + + + BTC + BTC + + + + Label: + Etikett: + + + + Message: + Meddelande: + + + + &Save As... + &Spara som... + + + + Save Image... + + + + + PNG Images (*.png) + + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Skicka pengar + + + + Send to multiple recipients at once + Skicka till flera mottagare samtidigt + + + + &Add recipient... + &Lägg till mottagare... + + + + Remove all transaction fields + + + + + Clear all + Rensa alla + + + + Balance: + Balans: + + + + 123.456 BTC + 123,456 BTC + + + + Confirm the send action + Bekräfta sänd ordern + + + + &Send + &Skicka + + + + <b>%1</b> to %2 (%3) + <b>%1</b> till %2 (%3) + + + + Confirm send coins + Bekräfta skickade mynt + + + + Are you sure you want to send %1? + Är du säker pÃ¥ att du vill skicka %1? + + + + and + and + + + + The recepient address is not valid, please recheck. + Mottagarens adress är inte giltig, vänligen kontrollera igen. + + + + The amount to pay must be larger than 0. + Det betalade beloppet mÃ¥ste vara större än 0. + + + + Amount exceeds your balance + Värdet överstiger ditt saldo + + + + Total exceeds your balance when the %1 transaction fee is included + Totalt överstiger det ditt saldo när transaktionsavgiften %1 ingÃ¥r + + + + Duplicate address found, can only send to each address once in one send operation + Dublett av adress funnen, kan bara skicka till varje adress en gÃ¥ng per sändning + + + + Error: Transaction creation failed + Fel: Transaktionen gick inte att skapa + + + + Error: 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. + Fel: Transaktionen avslogs. Detta kan hända om nÃ¥gra av mynten i plÃ¥nboken redan spenderats, som om du använde en kopia av wallet.dat och mynt spenderades i kopian men inte markerats som spenderas här. + + + + SendCoinsEntry + + + Form + Formulär + + + + A&mount: + &Belopp + + + + Pay &To: + Betala & Till: + + + + + Enter a label for this address to add it to your address book + Ange ett namn för den här adressen och lägg till den i din adressbok + + + + &Label: + &Etikett: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Adressen som betalningen skall skickas till (t.ex. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Välj adress frÃ¥n adresslistan + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Klistra in adress frÃ¥n Urklipp + + + + Alt+P + Alt+P + + + + Remove this recipient + Ta bort denna mottagare + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Ange en Bitcoin adress (t.ex. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + Öppen för %1 block + + + + Open until %1 + Öppet till %1 + + + + %1/offline? + %1/nerkopplad? + + + + %1/unconfirmed + %1/okonfirmerad + + + + %1 confirmations + %1 bekräftelser + + + + <b>Status:</b> + <b>Status:</b> + + + + , has not been successfully broadcast yet + , har inte lyckats skickas ännu + + + + , broadcast through %1 node + , sänd genom %1 nod + + + + , broadcast through %1 nodes + , sänd genom %1 noder + + + + <b>Date:</b> + <b>Datum:</b> + + + + <b>Source:</b> Generated<br> + <b>Källa:</b> Genererade<br> + + + + + <b>From:</b> + <b>FrÃ¥n:</b> + + + + unknown + okänd + + + + + + <b>To:</b> + <b>Till:</b> + + + + (yours, label: + (din, etikett: + + + + (yours) + (dina) + + + + + + + <b>Credit:</b> + <b>Kredit:</b> + + + + (%1 matures in %2 more blocks) + + + + + (not accepted) + (inte accepterad) + + + + + + <b>Debit:</b> + <b>Debet:</b> + + + + <b>Transaction fee:</b> + <b>Transaktionsavgift:</b> + + + + <b>Net amount:</b> + <b>Nettobelopp:</b> + + + + Message: + Meddelande: + + + + Comment: + Kommentar: + + + + Transaction ID: + + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Genererade mynt mÃ¥ste vänta 120 block innan de kan användas. När du skapade detta block sändes det till nätverket för att läggas till i blockkedjan. Om blocket inte kommer in i kedjan kommer det att ändras till "accepteras inte" och kommer ej att gÃ¥ att spendera. Detta kan ibland hända om en annan nod genererar ett block nästan samtidigt som dig. + + + + TransactionDescDialog + + + Transaction details + Transaktionsdetaljer + + + + This pane shows a detailed description of the transaction + Den här panelen visar en detaljerad beskrivning av transaktionen + + + + TransactionTableModel + + + Date + Datum + + + + Type + Typ + + + + Address + Adress + + + + Amount + Mängd + + + + Open for %n block(s) + + + + + Open until %1 + Öppet till %1 + + + + Offline (%1 confirmations) + Offline (%1 bekräftelser) + + + + Unconfirmed (%1 of %2 confirmations) + Obekräftad (%1 av %2 bekräftelser) + + + + Confirmed (%1 confirmations) + Bekräftad (%1 bekräftelser) + + + + Mined balance will be available in %n more blocks + + + + + This block was not received by any other nodes and will probably not be accepted! + Det här blocket togs inte emot av nÃ¥gra andra noder och kommer antagligen inte att bli godkänt. + + + + Generated but not accepted + Genererad men inte accepterad + + + + Received with + Mottagen med + + + + Received from + + + + + Sent to + Skickad till + + + + Payment to yourself + Betalning till dig själv + + + + Mined + Skapad + + + + (n/a) + (n/a) + + + + Transaction status. Hover over this field to show number of confirmations. + Transaktionsstatus. HÃ¥ll muspekaren över för att se antal bekräftelser. + + + + Date and time that the transaction was received. + Tidpunkt dÃ¥ transaktionen mottogs + + + + Type of transaction. + Transaktionstyp. + + + + Destination address of transaction. + Transaktionens destinationsadress. + + + + Amount removed from or added to balance. + + + + + TransactionView + + + + All + Alla + + + + Today + Idag + + + + This week + Denna vecka + + + + This month + Denna mÃ¥nad + + + + Last month + FöregÃ¥ende mÃ¥nad + + + + This year + Det här Ã¥ret + + + + Range... + Period... + + + + Received with + Mottagen med + + + + Sent to + Skickad till + + + + To yourself + Till dig själv + + + + Mined + Skapad + + + + Other + Övriga + + + + Enter address or label to search + Sök efter adress eller etikett + + + + Min amount + Minsta mängd + + + + Copy address + Kopiera adress + + + + Copy label + Kopiera etikett + + + + Copy amount + + + + + Edit label + Editera etikett + + + + Show details... + Visa detaljer... + + + + Export Transaction Data + Exportera Transaktions Data + + + + Comma separated file (*.csv) + Kommaseparerad fil (*. csv) + + + + Confirmed + Bekräftad + + + + Date + Datum + + + + Type + Typ + + + + Label + Etikett + + + + Address + Adress + + + + Amount + Mängd + + + + ID + ID + + + + Error exporting + Fel vid export + + + + Could not write to file %1. + Kunde inte skriva till filen %1. + + + + Range: + Intervall: + + + + to + till + + + + WalletModel + + + Sending... + Skickar... + + + + bitcoin-core + + + Bitcoin version + Bitcoin version + + + + Usage: + Användning: + + + + Send command to -server or bitcoind + Skicka kommando till -server eller bitcoind + + + + List commands + Lista kommandon + + + + Get help for a command + FÃ¥ hjälp med ett kommando + + + + Options: + Inställningar: + + + + Specify configuration file (default: bitcoin.conf) + Ange konfigurationsfil (standard:bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + Ange pid fil (standard:bitcoind.pid) + + + + Generate coins + Generera mynt + + + + Don't generate coins + Generera ej mynt + + + + Start minimized + Starta som minimerad + + + + Specify data directory + Ange katalog för data + + + + Specify connection timeout (in milliseconds) + Ange timeout för uppkoppling (i millisekunder) + + + + Connect through socks4 proxy + Koppla upp genom socks4 proxy + + + + Allow DNS lookups for addnode and connect + + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + + + + + Maintain at most <n> connections to peers (default: 125) + + + + + Add a node to connect to + Lägg till en nod att koppla upp mot + + + + Connect only to the specified node + Koppla enbart upp till den specifierade noden + + + + Don't accept connections from outside + Acceptera ej anslutningar utifrÃ¥n + + + + Don't bootstrap list of peers using DNS + + + + + Threshold for disconnecting misbehaving peers (default: 100) + + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + + + + + Don't attempt to use UPnP to map the listening port + + + + + Attempt to use UPnP to map the listening port + + + + + Fee per kB to add to transactions you send + + + + + Accept command line and JSON-RPC commands + + + + + Run in the background as a daemon and accept commands + + + + + Use the test network + Använd test nätverket + + + + Output extra debugging information + + + + + Prepend debug output with timestamp + + + + + Send trace/debug info to console instead of debug.log file + + + + + Send trace/debug info to debugger + + + + + Username for JSON-RPC connections + + + + + Password for JSON-RPC connections + + + + + Listen for JSON-RPC connections on <port> (default: 8332) + + + + + Allow JSON-RPC connections from specified IP address + + + + + Send commands to node running on <ip> (default: 127.0.0.1) + + + + + Set key pool size to <n> (default: 100) + + + + + Rescan the block chain for missing wallet transactions + Sök i block-kedjan efter saknade wallet transaktioner + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + + + + + Use OpenSSL (https) for JSON-RPC connections + + + + + Server certificate file (default: server.cert) + + + + + Server private key (default: server.pem) + + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + + This help message + Det här hjälp medelandet + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + + + + + Loading addresses... + Laddar adresser... + + + + Error loading addr.dat + + + + + Error loading blkindex.dat + + + + + Error loading wallet.dat: Wallet corrupted + Fel vid inläsningen av wallet.dat: Kontofilen verkar skadad + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Fel vid inläsningen av wallet.dat: Kontofilen kräver en senare version av Bitcoin + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Kontot behöver sparas om: Starta om Programmet + + + + Error loading wallet.dat + Fel vid inläsning av kontofilen wallet.dat + + + + Loading block index... + Laddar block index... + + + + Loading wallet... + Laddar konto... + + + + Rescanning... + Söker igen... + + + + Done loading + Klar med laddning + + + + Invalid -proxy address + Ogiltig proxyadress + + + + Invalid amount for -paytxfee=<amount> + Ogiltigt belopp för -paytxfee=<belopp> + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + + + + + Error: CreateThread(StartNode) failed + + + + + Warning: Disk space is low + + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts new file mode 100644 index 0000000..89e2102 --- /dev/null +++ b/src/qt/locale/bitcoin_tr.ts @@ -0,0 +1,1979 @@ + +UTF-8 + + AboutDialog + + + About Bitcoin + Bitcoin hakkında + + + + <b>Bitcoin</b> version + <b>Bitcoin</b> sürüm + + + + Copyright © 2009-2012 Bitcoin Developers + +This is experimental software. + +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. + +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. + Telif hakkı © 2009-2012 Bitcoin geliştiricileri + +Bu yazılım deneme safhasındadır. + +MIT/X11 yazılım lisansı kapsamında yayınlanmıştır, license.txt dosyasına ya da http://www.opensource.org/licenses/mit-license.php sayfasına bakınız. + +Bu ürün OpenSSL projesi tarafından OpenSSL Toolkit (http://www.openssl.org/) için geliştirilen yazılımlar, Eric Young (eay@cryptsoft.com) tarafından yazılmış şifreleme yazılımları ve Thomas Bernard tarafından yazılmış UPnP yazılımı içerir. + + + + AddressBookPage + + + Address Book + Adres defteri + + + + These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. + Bunlar, ödemeleri almak için Bitcoin adresleridir. Kimin ödeme yaptığını izleyebilmek için her ödeme yollaması gereken kişiye değişik bir adres verebilirsiniz. + + + + Double-click to edit address or label + Adresi ya da etiketi düzenlemek için çift tıklayınız + + + + Create a new address + Yeni bir adres oluştur + + + + &New Address... + &Yeni adres... + + + + Copy the currently selected address to the system clipboard + Şu anda seçili olan adresi panoya kopyalar + + + + &Copy to Clipboard + Panoya &kopyala + + + + Show &QR Code + &QR kodunu göster + + + + Sign a message to prove you own this address + Bu adresin sizin olduğunu ispatlamak için mesaj imzalayın + + + + &Sign Message + Mesaj &imzala + + + + Delete the currently selected address from the list. Only sending addresses can be deleted. + Seçilen adresi listeden siler. Sadece gönderi adresleri silinebilir. + + + + &Delete + &Sil + + + + Copy address + Adresi kopyala + + + + Copy label + Etiketi kopyala + + + + Edit + Düzenle + + + + Delete + Sil + + + + Export Address Book Data + Adres defteri verilerini dışa aktar + + + + Comma separated file (*.csv) + Virgülle ayrılmış değerler dosyası (*.csv) + + + + Error exporting + Dışa aktarımda hata oluştu + + + + Could not write to file %1. + %1 dosyasına yazılamadı. + + + + AddressTableModel + + + Label + Etiket + + + + Address + Adres + + + + (no label) + (boş etiket) + + + + AskPassphraseDialog + + + Dialog + Diyalog + + + + + TextLabel + Metin Etiketi + + + + Enter passphrase + Parolayı giriniz + + + + New passphrase + Yeni parola + + + + Repeat new passphrase + Yeni parolayı tekrarlayınız + + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. + Cüzdanınız için yeni parolayı giriniz.<br/>Lütfen <b>10 ya da daha fazla rastgele karakter</b> veya <b>sekiz ya da daha fazla kelime</b> içeren bir parola seçiniz. + + + + Encrypt wallet + Cüzdanı şifrele + + + + This operation needs your wallet passphrase to unlock the wallet. + Bu işlem cüzdan kilidini açmak için cüzdan parolanızı gerektirir. + + + + Unlock wallet + Cüzdan kilidini aç + + + + This operation needs your wallet passphrase to decrypt the wallet. + Bu işlem, cüzdan şifresini açmak için cüzdan parolasını gerektirir. + + + + Decrypt wallet + Cüzdan şifresini aç + + + + Change passphrase + Parolayı değiştir + + + + Enter the old and new passphrase to the wallet. + Cüzdan için eski ve yeni parolaları giriniz. + + + + Confirm wallet encryption + Cüzdan şifrelenmesini teyit eder + + + + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! +Are you sure you wish to encrypt your wallet? + UYARI: Eğer cüzdanınızı şifrelerseniz ve parolanızı kaybederseniz, <b>TÜM BÄ°TCOÄ°NLERÄ°NÄ°ZÄ° KAYBEDERSÄ°NÄ°Z</b>! +Cüzdanınızı şifrelemek istediğinizden emin misiniz? + + + + + Wallet encrypted + Cüzdan şifrelendi + + + + Bitcoin 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. + Şifreleme işlemini tamamlamak için Bitcoin şimdi kapanacaktır. Cüzdanınızı şifrelemenin, bitcoinlerinizin bilgisayara bulaşan kötücül bir yazılım tarafından çalınmaya karşı tamamen koruyamayacağını unutmayınız. + + + + + Warning: The Caps Lock key is on. + Uyarı: Caps Lock tuşu etkin durumda. + + + + + + + Wallet encryption failed + Cüzdan şifrelemesi başarısız oldu + + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Dahili bir hata sebebiyle cüzdan şifrelemesi başarısız oldu. Cüzdanınız şifrelenmedi. + + + + + The supplied passphrases do not match. + Girilen parolalar birbirleriyle uyumlu değil. + + + + Wallet unlock failed + Cüzdan kilidinin açılması başarısız oldu + + + + + + The passphrase entered for the wallet decryption was incorrect. + Cüzdan şifresinin açılması için girilen parola yanlıştı. + + + + Wallet decryption failed + Cüzdan şifresinin açılması başarısız oldu + + + + Wallet passphrase was succesfully changed. + Cüzdan parolası başarılı bir şekilde değiştirildi. + + + + BitcoinGUI + + + Bitcoin Wallet + Bitcoin cüzdanı + + + + + Synchronizing with network... + Şebeke ile senkronizasyon... + + + + Block chain synchronization in progress + Blok zinciri senkronizasyonu sürüyor + + + + &Overview + &Genel bakış + + + + Show general overview of wallet + Cüzdana genel bakışı gösterir + + + + &Transactions + &Muameleler + + + + Browse transaction history + Muamele tarihçesini tara + + + + &Address Book + &Adres defteri + + + + Edit the list of stored addresses and labels + Saklanan adres ve etiket listesini düzenler + + + + &Receive coins + Para &al + + + + Show the list of addresses for receiving payments + Ödeme alma adreslerinin listesini gösterir + + + + &Send coins + Para &yolla + + + + Send coins to a bitcoin address + Bir bitcoin adresine para (bitcoin) yollar + + + + Sign &message + &Mesaj imzala + + + + Prove you control an address + Bu adresin kontrolünüz altında olduğunu ispatlayın + + + + E&xit + &Çık + + + + Quit application + Uygulamadan çıkar + + + + &About %1 + %1 &hakkında + + + + Show information about Bitcoin + Bitcoin hakkında bilgi gösterir + + + + About &Qt + &Qt hakkında + + + + Show information about Qt + Qt hakkında bilgi görüntüler + + + + &Options... + &Seçenekler... + + + + Modify configuration options for bitcoin + Bitcoin seçeneklerinin yapılandırmasını değiştirir + + + + Open &Bitcoin + &Bitcoin'i aç + + + + Show the Bitcoin window + Bitcoin penceresini gösterir + + + + &Export... + &Dışa aktar... + + + + Export the data in the current tab to a file + Güncel sekmedeki verileri bir dosyaya aktar + + + + &Encrypt Wallet + Cüzdanı &şifrele + + + + Encrypt or decrypt wallet + Cüzdanı şifreler ya da şifreyi açar + + + + &Backup Wallet + Cüzdanı &yedekle + + + + Backup wallet to another location + Cüzdanı diğer bir konumda yedekle + + + + &Change Passphrase + &Parolayı değiştir + + + + Change the passphrase used for wallet encryption + Cüzdan şifrelemesi için kullanılan parolayı değiştirir + + + + &File + &Dosya + + + + &Settings + &Ayarlar + + + + &Help + &Yardım + + + + Tabs toolbar + Sekme araç çubuğu + + + + Actions toolbar + Faaliyet araç çubuğu + + + + [testnet] + [testnet] + + + + bitcoin-qt + bitcoin-qt + + + + %n active connection(s) to Bitcoin network + Bitcoin şebekesine %n etkin bağlantı + + + + Downloaded %1 of %2 blocks of transaction history. + Muamele tarihçesinin %2 sayıda blokundan %1 adet blok indirildi. + + + + Downloaded %1 blocks of transaction history. + Muamele tarihçesinin %1 adet bloku indirildi. + + + + %n second(s) ago + %n saniye önce + + + + %n minute(s) ago + %n dakika önce + + + + %n hour(s) ago + %n saat önce + + + + %n day(s) ago + %n gün önce + + + + Up to date + Güncel + + + + Catching up... + Aralık kapatılıyor... + + + + Last received block was generated %1. + Son alınan blok şu vakit oluşturulmuştu: %1. + + + + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? + Bu muamele boyut sınırlarını aşmıştır. Gene de %1 ücret ödeyerek gönderebilirsiniz, ki bu ücret muamelenizi işleyen ve şebekeye yardım eden düğümlere ödenecektir. Ücreti ödemek istiyor musunuz? + + + + Sending... + Yollanıyor... + + + + Sent transaction + Muamele yollandı + + + + Incoming transaction + Gelen muamele + + + + Date: %1 +Amount: %2 +Type: %3 +Address: %4 + + Tarih: %1 +Miktar: %2 +Tür: %3 +Adres: %4 + + + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + Cüzdan <b>şifrelenmiştir</b> ve şu anda <b>kilidi açılmıştır</b> + + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + Cüzdan <b>şifrelenmiştir</b> ve şu anda <b>kilitlidir</b> + + + + Backup Wallet + Cüzdanı yedekle + + + + Wallet Data (*.dat) + Cüzdan verileri (*.dat) + + + + Backup Failed + Yedekleme başarısız oldu + + + + There was an error trying to save the wallet data to the new location. + Cüzdan verilerinin başka bir konumda kaydedilmesi sırasında bir hata meydana geldi. + + + + DisplayOptionsPage + + + &Unit to show amounts in: + Miktarı göstermek için &birim: + + + + Choose the default subdivision unit to show in the interface, and when sending coins + Para (coin) gönderildiğinde arayüzde gösterilecek varsayılan alt birimi seçiniz + + + + Display addresses in transaction list + Muamele listesinde adresleri göster + + + + EditAddressDialog + + + Edit Address + Adresi düzenle + + + + &Label + &Etiket + + + + The label associated with this address book entry + Bu adres defteri unsuru ile ilişkili etiket + + + + &Address + &Adres + + + + The address associated with this address book entry. This can only be modified for sending addresses. + Bu adres defteri unsuru ile ilişkili adres. Bu, sadece gönderi adresi için değiştirilebilir. + + + + New receiving address + Yeni alım adresi + + + + New sending address + Yeni gönderi adresi + + + + Edit receiving address + Alım adresini düzenle + + + + Edit sending address + Gönderi adresini düzenle + + + + The entered address "%1" is already in the address book. + Girilen "%1" adresi hâlihazırda adres defterinde mevcuttur. + + + + The entered address "%1" is not a valid bitcoin address. + Girilen "%1" adresi geçerli bir bitcoin adresi değildir. + + + + Could not unlock wallet. + Cüzdan kilidi açılamadı. + + + + New key generation failed. + Yeni anahtar oluşturulması başarısız oldu. + + + + MainOptionsPage + + + &Start Bitcoin on window system startup + Bitcoin'i pencere sistemi ile &başlat + + + + Automatically start Bitcoin after the computer is turned on + Bitcoin'i bilgisayar başlatıldığında başlatır + + + + &Minimize to the tray instead of the taskbar + İşlem çubuğu yerine sistem çekmesine &küçült + + + + Show only a tray icon after minimizing the window + Küçültüldükten sonra sadece çekmece ikonu gösterir + + + + Map port using &UPnP + Portları &UPnP kullanarak haritala + + + + Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Yönlendiricide Bitcoin istemci portlarını otomatik olarak açar. Bu, sadece yönlendiricinizin UPnP desteği bulunuyorsa ve etkinse çalışabilir. + + + + M&inimize on close + Kapatma sırasında k&üçült + + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. + Pencere kapatıldığında uygulamadan çıkmak yerine uygulamayı küçültür. Bu seçenek etkinleştirildiğinde, uygulama sadece menüden çıkış seçildiğinde kapanacaktır. + + + + &Connect through SOCKS4 proxy: + SOCKS4 vekil sunucusu vasıtasıyla ba&ğlan: + + + + Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) + Bitcoin şebekesine SOCKS4 vekil sunucusu vasıtasıyla bağlanır (mesela Tor ile bağlanıldığında) + + + + Proxy &IP: + Vekil &Ä°P: + + + + IP address of the proxy (e.g. 127.0.0.1) + Vekil sunucunun Ä°P adresi (mesela 127.0.0.1) + + + + &Port: + &Port: + + + + Port of the proxy (e.g. 1234) + Vekil sunucun portu (örneğin 1234) + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Muamelelerin hızlı işlenmesini garantilemeye yardım eden, seçime dayalı kB başı muamele ücreti. Muamelelerin çoğunluğunun boyutu 1 kB'dir. 0.01 ücreti önerilir. + + + + Pay transaction &fee + Muamele ücreti &öde + + + + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Muamelelerin hızlı işlenmesini garantilemeye yardım eden, seçime dayalı kB başı muamele ücreti. Muamelelerin çoğunluğunun boyutu 1 kB'dir. 0.01 ücreti önerilir. + + + + MessagePage + + + Message + Mesaj + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + Bir adresin sizin olduğunu ispatlamak için adresinizle mesaj imzalayabilirsiniz. Oltalama saldırılarının kimliğinizi imzanızla elde etmeyi deneyebilecekleri için belirsiz hiçbir şey imzalamamaya dikkat ediniz. Sadece ayrıntılı açıklaması olan ve tümüne katıldığınız ifadeleri imzalayın. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Ödemenin gönderileceği adres (mesela 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Adres defterinden adres seç + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Panodan adres yapıştır + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Ä°mzalamak istediğiniz mesajı burada giriniz + + + + Click "Sign Message" to get signature + Ä°mza elde etmek için "Mesaj Ä°mzala" unsurunu tıklayın + + + + Sign a message to prove you own this address + Bu adresin sizin olduğunu ispatlamak için bir mesaj imzalayın + + + + &Sign Message + Mesaj &Ä°mzala + + + + Copy the currently selected address to the system clipboard + Şu anda seçili olan adresi panoya kopyalar + + + + &Copy to Clipboard + Panoya &kopyala + + + + + + Error signing + Ä°mza sırasında hata meydana geldi + + + + %1 is not a valid address. + %1 geçerli bir adres değildir. + + + + Private key for %1 is not available. + %1 için özel anahtar mevcut değil. + + + + Sign failed + Ä°mzalama başarısız oldu + + + + OptionsDialog + + + Main + Ana menü + + + + Display + Görünüm + + + + Options + Seçenekler + + + + OverviewPage + + + Form + Form + + + + Balance: + Bakiye: + + + + 123.456 BTC + 123.456 BTC + + + + Number of transactions: + Muamele sayısı: + + + + 0 + 0 + + + + Unconfirmed: + Doğrulanmamış: + + + + 0 BTC + 0 BTC + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Cüzdan</span></p></body></html> + + + + <b>Recent transactions</b> + <b>Son muameleler</b> + + + + Your current balance + Güncel bakiyeniz + + + + Total of transactions that have yet to be confirmed, and do not yet count toward the current balance + Doğrulanması beklenen ve henüz güncel bakiyeye ilâve edilmemiş muamelelerin toplamı + + + + Total number of transactions in wallet + Cüzdandaki muamelelerin toplam sayısı + + + + QRCodeDialog + + + Dialog + Diyalog + + + + QR Code + QR Kod + + + + Request Payment + Ödeme isteği + + + + Amount: + Miktar: + + + + BTC + BTC + + + + Label: + Etiket: + + + + Message: + Mesaj: + + + + &Save As... + &Farklı kaydet... + + + + Save Image... + Resmi kaydet... + + + + PNG Images (*.png) + PNG resimleri (*.png) + + + + SendCoinsDialog + + + + + + + + + + Send Coins + Para (coin) yolla + + + + Send to multiple recipients at once + Birçok alıcıya aynı anda gönder + + + + &Add recipient... + &Alıcı ekle... + + + + Remove all transaction fields + Bütün muamele alanlarını kaldır + + + + Clear all + Tümünü temizle + + + + Balance: + Bakiye: + + + + 123.456 BTC + 123.456 BTC + + + + Confirm the send action + Yollama etkinliğini teyit ediniz + + + + &Send + &Gönder + + + + <b>%1</b> to %2 (%3) + <b>%1</b> şu adrese: %2 (%3) + + + + Confirm send coins + Gönderiyi teyit ediniz + + + + Are you sure you want to send %1? + %1 tutarını göndermek istediğinizden emin misiniz? + + + + and + ve + + + + The recepient address is not valid, please recheck. + Alıcı adresi geçerli değildir, lütfen denetleyiniz. + + + + The amount to pay must be larger than 0. + Ödeyeceğiniz tutarın sıfırdan yüksek olması gerekir. + + + + Amount exceeds your balance + Tutar bakiyenizden yüksektir + + + + Total exceeds your balance when the %1 transaction fee is included + Toplam, %1 muamele ücreti ilâve edildiğinde bakiyenizi geçmektedir + + + + Duplicate address found, can only send to each address once in one send operation + Çift adres bulundu, belli bir gönderi sırasında her adrese sadece tek bir gönderide bulunulabilir + + + + Error: Transaction creation failed + Hata: Muamele oluşturması başarısız oldu + + + + Error: 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. + Hata: Muamele reddedildi. Cüzdanınızdaki madenî paraların bazıları zaten harcanmış olduğunda bu meydana gelebilir. Örneğin wallet.dat dosyasının bir kopyasını kullandıysanız ve kopyada para harcandığında ancak burada harcandığı işaretlenmediğinde. + + + + SendCoinsEntry + + + Form + Form + + + + A&mount: + M&iktar: + + + + Pay &To: + &Şu kişiye öde: + + + + + Enter a label for this address to add it to your address book + Adres defterinize eklemek için bu adres için bir etiket giriniz + + + + &Label: + &Etiket: + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Ödemenin gönderileceği adres (mesela 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose address from address book + Adres defterinden adres seç + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Panodan adres yapıştır + + + + Alt+P + Alt+P + + + + Remove this recipient + Bu alıcıyı kaldır + + + + Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Bitcoin adresi giriniz (mesela 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + TransactionDesc + + + Open for %1 blocks + %1 blok için açık + + + + Open until %1 + %1 değerine dek açık + + + + %1/offline? + %1/çevrimdışı mı? + + + + %1/unconfirmed + %1/doğrulanmadı + + + + %1 confirmations + %1 doğrulama + + + + <b>Status:</b> + <b>Durum:</b> + + + + , has not been successfully broadcast yet + , henüz başarılı bir şekilde yayınlanmadı + + + + , broadcast through %1 node + , %1 düğüm vasıtasıyla yayınlandı + + + + , broadcast through %1 nodes + , %1 düğüm vasıtasıyla yayınlandı + + + + <b>Date:</b> + <b>Tarih:</b> + + + + <b>Source:</b> Generated<br> + <b>Kaynak:</b> Oluşturuldu<br> + + + + + <b>From:</b> + <b>Gönderen:</b> + + + + unknown + bilinmiyor + + + + + + <b>To:</b> + <b>Alıcı:</b> + + + + (yours, label: + (sizin, etiket: + + + + (yours) + (sizin) + + + + + + + <b>Credit:</b> + <b>Gelir:</b> + + + + (%1 matures in %2 more blocks) + (%1, %2 ek blok sonrasında olgunlaşacak) + + + + (not accepted) + (kabul edilmedi) + + + + + + <b>Debit:</b> + <b>Gider:</b> + + + + <b>Transaction fee:</b> + <b>Muamele ücreti:<b> + + + + <b>Net amount:</b> + <b>Net miktar:</b> + + + + Message: + Mesaj: + + + + Comment: + Yorum: + + + + Transaction ID: + Muamele kimliği: + + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Oluşturulan paraların (coin) harcanabilmelerinden önce 120 blok beklemeleri gerekmektedir. Bu blok, oluşturduğunuzda, blok zincirine eklenmesi için ağda yayınlandı. Zincire eklenmesi başarısız olursa, "kabul edilmedi" olarak değiştirilecek ve harcanamayacaktır. Bu, bazen başka bir düğüm sizden birkaç saniye önce ya da sonra blok oluşturursa meydana gelebilir. + + + + TransactionDescDialog + + + Transaction details + Muamele detayları + + + + This pane shows a detailed description of the transaction + Bu pano muamelenin ayrıntılı açıklamasını gösterir + + + + TransactionTableModel + + + Date + Tarih + + + + Type + Tür + + + + Address + Adres + + + + Amount + Miktar + + + + Open for %n block(s) + %n blok için açık + + + + Open until %1 + %1 değerine dek açık + + + + Offline (%1 confirmations) + Çevrimdışı (%1 doğrulama) + + + + Unconfirmed (%1 of %2 confirmations) + Doğrulanmadı (%1 (toplam %2 üzerinden) doğrulama) + + + + Confirmed (%1 confirmations) + Doğrulandı (%1 doğrulama) + + + + Mined balance will be available in %n more blocks + Madenden çıkarılan bakiye %n ek blok sonrasında kullanılabilecektir + + + + This block was not received by any other nodes and will probably not be accepted! + Bu blok başka hiçbir düğüm tarafından alınmamıştır ve muhtemelen kabul edilmeyecektir! + + + + Generated but not accepted + Oluşturuldu ama kabul edilmedi + + + + Received with + Şununla alınan + + + + Received from + Alındığı kişi + + + + Sent to + Gönderildiği adres + + + + Payment to yourself + Kendinize ödeme + + + + Mined + Madenden çıkarılan + + + + (n/a) + (mevcut değil) + + + + Transaction status. Hover over this field to show number of confirmations. + Muamele durumu. Doğrulama sayısını görüntülemek için imleci bu alanda tutunuz. + + + + Date and time that the transaction was received. + Muamelenin alındığı tarih ve zaman. + + + + Type of transaction. + Muamele türü. + + + + Destination address of transaction. + Muamelenin alıcı adresi. + + + + Amount removed from or added to balance. + Bakiyeden alınan ya da bakiyeye eklenen miktar. + + + + TransactionView + + + + All + Hepsi + + + + Today + Bugün + + + + This week + Bu hafta + + + + This month + Bu ay + + + + Last month + Geçen ay + + + + This year + Bu sene + + + + Range... + Aralık... + + + + Received with + Şununla alınan + + + + Sent to + Gönderildiği adres + + + + To yourself + Kendinize + + + + Mined + Oluşturulan + + + + Other + Diğer + + + + Enter address or label to search + Aranacak adres ya da etiket giriniz + + + + Min amount + Asgari miktar + + + + Copy address + Adresi kopyala + + + + Copy label + Etiketi kopyala + + + + Copy amount + Miktarı kopyala + + + + Edit label + Etiketi düzenle + + + + Show details... + Detayları göster... + + + + Export Transaction Data + Muamele verilerini dışa aktar + + + + Comma separated file (*.csv) + Virgülle ayrılmış değerler dosyası (*.csv) + + + + Confirmed + Doğrulandı + + + + Date + Tarih + + + + Type + Tür + + + + Label + Etiket + + + + Address + Adres + + + + Amount + Miktar + + + + ID + Kimlik + + + + Error exporting + Dışa aktarımda hata oluştu + + + + Could not write to file %1. + %1 dosyasına yazılamadı. + + + + Range: + Aralık: + + + + to + ilâ + + + + WalletModel + + + Sending... + Gönderiliyor... + + + + bitcoin-core + + + Bitcoin version + Bitcoin sürümü + + + + Usage: + Kullanım: + + + + Send command to -server or bitcoind + -server ya da bitcoind'ye komut gönder + + + + List commands + Komutları listele + + + + Get help for a command + Bir komut için yardım al + + + + Options: + Seçenekler: + + + + Specify configuration file (default: bitcoin.conf) + Yapılandırma dosyası belirt (varsayılan: bitcoin.conf) + + + + Specify pid file (default: bitcoind.pid) + Pid dosyası belirt (varsayılan: bitcoind.pid) + + + + Generate coins + Madenî para (coin) oluştur + + + + Don't generate coins + Para oluşturma + + + + Start minimized + Küçültülmüş olarak başla + + + + Specify data directory + Veri dizinini belirt + + + + Specify connection timeout (in milliseconds) + Bağlantı zaman aşım süresini milisaniye olarak belirt + + + + Connect through socks4 proxy + Socks4 vekil sunucusu vasıtasıyla bağlan + + + + Allow DNS lookups for addnode and connect + Düğüm ekleme ve bağlantı için DNS aramalarına izin ver + + + + Listen for connections on <port> (default: 8333 or testnet: 18333) + Bağlantılar için dinlenecek <port> (varsayılan: 8333 ya da testnet: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Eşler ile en çok <n> adet bağlantı kur (varsayılan: 125) + + + + Add a node to connect to + Bağlanılacak düğüm ekle + + + + Connect only to the specified node + Sadece belirtilen düğüme bağlan + + + + Don't accept connections from outside + Dışarıdan bağlantıları reddet + + + + Don't bootstrap list of peers using DNS + Eş listesini DNS kullanarak başlatma + + + + Threshold for disconnecting misbehaving peers (default: 100) + Aksaklık gösteren eşlerle bağlantıyı kesme sınırı (varsayılan: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Aksaklık gösteren eşlerle yeni bağlantıları engelleme süresi, saniye olarak (varsayılan: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Her bağlantı için alım tamponu, <n>*1000 bayt (varsayılan: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Her bağlantı için yollama tamponu, <n>*1000 bayt (varsayılan: 10000) + + + + Don't attempt to use UPnP to map the listening port + Dinlenilecek portu haritalamak için UPnP kullanma + + + + Attempt to use UPnP to map the listening port + Dinlenilecek portu haritalamak için UPnP kullan + + + + Fee per kB to add to transactions you send + Yolladığınız muameleler için eklenecek kB başı ücret + + + + Accept command line and JSON-RPC commands + Konut satırı ve JSON-RPC komutlarını kabul et + + + + Run in the background as a daemon and accept commands + Arka planda daemon (servis) olarak çalış ve komutları kabul et + + + + Use the test network + Deneme şebekesini kullan + + + + Output extra debugging information + Ä°lâve hata ayıklama verisi çıkar + + + + Prepend debug output with timestamp + Hata ayıklama çıktısına tarih ön ekleri ilâve et + + + + Send trace/debug info to console instead of debug.log file + Trace/hata ayıklama verilerini debug.log dosyası yerine konsola gönder + + + + Send trace/debug info to debugger + Hata ayıklayıcıya -debugger- trace/hata ayıklama verileri gönder + + + + Username for JSON-RPC connections + JSON-RPC bağlantıları için kullanıcı ismi + + + + Password for JSON-RPC connections + JSON-RPC bağlantıları için parola + + + + Listen for JSON-RPC connections on <port> (default: 8332) + JSON-RPC bağlantıları için dinlenecek <port> (varsayılan: 8332) + + + + Allow JSON-RPC connections from specified IP address + Belirtilen Ä°P adresinden JSON-RPC bağlantılarını kabul et + + + + Send commands to node running on <ip> (default: 127.0.0.1) + Şu <ip> adresinde (varsayılan: 127.0.0.1) çalışan düğüme komut yolla + + + + Set key pool size to <n> (default: 100) + Anahtar alan boyutunu <n> değerine ayarla (varsayılan: 100) + + + + Rescan the block chain for missing wallet transactions + Blok zincirini eksik cüzdan muameleleri için tekrar tara + + + + +SSL options: (see the Bitcoin Wiki for SSL setup instructions) + +SSL seçenekleri: (SSL kurulum bilgisi için Bitcoin vikisine bakınız) + + + + Use OpenSSL (https) for JSON-RPC connections + JSON-RPC bağlantıları için OpenSSL (https) kullan + + + + Server certificate file (default: server.cert) + Sunucu sertifika dosyası (varsayılan: server.cert) + + + + Server private key (default: server.pem) + Sunucu özel anahtarı (varsayılan: server.pem) + + + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + Kabul edilebilir şifreler (varsayılan: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) + + + + This help message + Bu yardım mesajı + + + + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. + %s veri dizininde kilit elde edilemedi. Bitcoin muhtemelen hâlihazırda çalışmaktadır. + + + + Loading addresses... + Adresler yükleniyor... + + + + Error loading addr.dat + addr.dat dosyasının yüklenmesinde hata oluştu + + + + Error loading blkindex.dat + blkindex.dat dosyasının yüklenmesinde hata oluştu + + + + Error loading wallet.dat: Wallet corrupted + wallet.dat dosyasının yüklenmesinde hata oluştu: bozuk cüzdan + + + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + wallet.dat dosyasının yüklenmesinde hata oluştu: cüzdanın daha yeni bir Bitcoin sürümüne ihtiyacı var + + + + Wallet needed to be rewritten: restart Bitcoin to complete + Cüzdanın tekrar yazılması gerekiyordu: işlemi tamamlamak için Bitcoin'i yeniden başlatınız + + + + Error loading wallet.dat + wallet.dat dosyasının yüklenmesinde hata oluştu + + + + Loading block index... + Blok indeksi yükleniyor... + + + + Loading wallet... + Cüzdan yükleniyor... + + + + Rescanning... + Yeniden tarama... + + + + Done loading + Yükleme tamamlandı + + + + Invalid -proxy address + Geçersiz -proxy adresi + + + + Invalid amount for -paytxfee=<amount> + -paytxfee=<miktar> için geçersiz miktar + + + + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. + Uyarı: -paytxfee çok yüksek bir değere ayarlanmış. Bu, muamele gönderirseniz ödeyeceğiniz muamele ücretidir. + + + + Error: CreateThread(StartNode) failed + Hata: CreateThread(StartNode) başarısız oldu + + + + Warning: Disk space is low + Uyarı: Disk alanı düşük + + + + Unable to bind to port %d on this computer. Bitcoin is probably already running. + %d sayılı porta bu bilgisayarda bağlanılamadı. Bitcoin muhtemelen hâlihazırda çalışmaktadır. + + + + Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. + Uyarı: Lütfen bilgisayarınızın tarih ve saatinin doğru olup olmadığını kontrol ediniz. Saatiniz doğru değilse Bitcoin gerektiği gibi çalışamaz. + + + + beta + beta + + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts index 6cbb516..006c225 100644 --- a/src/qt/locale/bitcoin_uk.ts +++ b/src/qt/locale/bitcoin_uk.ts @@ -14,20 +14,20 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - Авторське право © 2009-2011 Розробники Bitcoin + Авторське право © 2009-2012 Розробники Bitcoin Це програмне забезпечення є експериментальним. Поширюється за ліцензією MIT/X11, додаткова інформація міститься у файлі license.txt, а також за адресою http://www.opensource.org/licenses/mit-license.php. -Цей продукт включає в себе програмне забезпечення, розроблене в рамках проекту OpenSSL (http://www.openssl.org/), криптографічне програмне забезпечення, написане Еріком Янгом (eay@cryptsoft.com) та функції для роботи з UPnP, написані Томасом Бернардом. +Цей продукт включає в себе програмне забезпечення, розроблене в рамках проекту OpenSSL (http://www.openssl.org/), криптографічне програмне забезпечення, написане Еріком Янгом (eay@cryptsoft.com), та функції для роботи з UPnP, написані Томасом Бернардом. @@ -69,31 +69,66 @@ This product includes software developed by the OpenSSL Project for use in the O + Show &QR Code + Показати QR-&Код + + + + Sign a message to prove you own this address + Підпишіть повідомлення щоб довести, що ви є власником цієї адреси + + + + &Sign Message + &Підписати повідомлення + + + Delete the currently selected address from the list. Only sending addresses can be deleted. Видалити виділену адресу зі списку. Лише адреси з адресної книги можуть бути видалені. - + &Delete &Видалити - + + Copy address + Скопіювати адресу + + + + Copy label + Скопіювати мітку + + + + Edit + Редагувати + + + + Delete + Видалити + + + Export Address Book Data Експортувати адресну книгу - + Comma separated file (*.csv) Файли відділені комами (*.csv) - + Error exporting Помилка при експортуванні - + Could not write to file %1. Неможливо записати у файл %1. @@ -125,125 +160,132 @@ This product includes software developed by the OpenSSL Project for use in the O + TextLabel Текстова мітка - + Enter passphrase Введіть пароль - + New passphrase Новий пароль - + Repeat new passphrase Повторіть пароль - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. Введіть новий пароль для гаманця.<br/>Будь ласка, використовуйте паролі що містять <b> як мінімум 10 випадкових символів </b> або <b> як мінімум 8 слів</b>. - + Encrypt wallet Зашифрувати гаманець - + This operation needs your wallet passphrase to unlock the wallet. Ця операція потребує пароль для розблокування гаманця. - + Unlock wallet Розблокувати гаманець - + This operation needs your wallet passphrase to decrypt the wallet. Ця операція потребує пароль для дешифрування гаманця. - + Decrypt wallet Дешифрувати гаманець - + Change passphrase Змінити пароль - + Enter the old and new passphrase to the wallet. Ввести старий та новий паролі для гаманця. - + Confirm wallet encryption Підтвердити шифрування гаманця - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? УВАГА: Якщо ви зашифруєте гаманець і забудете пароль, ви <b>ВТРАТИТЕ ВСІ СВОЇ БІТКОІНИ</b>! Ви дійсно хочете зашифрувати свій гаманець? - - + + Wallet encrypted Гаманець зашифровано - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Пам’ятайте, що шифрування гаманця не може повністю захистити ваші біткоіни від кражі, у випадку якщо ваш комп’ютер буде інфіковано шкідливими програмами. + + Bitcoin 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. + Біткоін-клієнт буде закрито для завершення процесу шифрування. Пам’ятайте, що шифрування гаманця не може повністю захистити ваші біткоіни від кражі, у випадку якщо ваш комп’ютер буде інфіковано шкідливими програмами. - - - - + + + Warning: The Caps Lock key is on. + Увага: Ввімкнено Caps Lock + + + + + + Wallet encryption failed Не вдалося зашифрувати гаманець - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. Виникла помилка під час шифрування гаманця. Ваш гаманець не було зашифровано. - - + + The supplied passphrases do not match. Введені паролі не співпадають. - + Wallet unlock failed Не вдалося розблокувати гаманець - - + + The passphrase entered for the wallet decryption was incorrect. Введений пароль є невірним. - + Wallet decryption failed Не вдалося розшифрувати гаманець - + Wallet passphrase was succesfully changed. Пароль було успішно змінено. @@ -251,247 +293,278 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet Гаманець - + + Synchronizing with network... Синхронізація з мережею... - + Block chain synchronization in progress Відбувається синхронізація ланцюжка блоків... - + &Overview &Огляд - + Show general overview of wallet Показати загальний огляд гаманця - + &Transactions Пе&реклади - + Browse transaction history Переглянути історію переказів - + &Address Book &Адресна книга - + Edit the list of stored addresses and labels Редагувати список збережених адрес та міток - + &Receive coins О&тримати - + Show the list of addresses for receiving payments Показати список адрес для отримання платежів - + &Send coins В&ідправити - + Send coins to a bitcoin address Відправити монети на вказану адресу - + + Sign &message + &Підписати повідомлення + + + + Prove you control an address + Доведіть, що це ваша адреса + + + E&xit &Вихід - + Quit application Вийти - + &About %1 П&ро %1 - + Show information about Bitcoin Показати інформацію про Bitcoin - + + About &Qt + &Про Qt + + + + Show information about Qt + Показати інформацію про Qt + + + &Options... &Параметри... - + Modify configuration options for bitcoin Редагувати параметри - + Open &Bitcoin Показати &гаманець - + Show the Bitcoin window Показати вікно гаманця - + &Export... &Експорт... - - Export the current view to a file - Експортувати в файл + + Export the data in the current tab to a file + - + &Encrypt Wallet &Шифрування гаманця - + Encrypt or decrypt wallet Зашифрувати чи розшифрувати гаманець - + + &Backup Wallet + + + + + Backup wallet to another location + + + + &Change Passphrase Змінити парол&ь - + Change the passphrase used for wallet encryption Змінити пароль, який використовується для шифрування гаманця - + &File &Файл - + &Settings &Налаштування - + &Help &Довідка - + Tabs toolbar Панель вкладок - + Actions toolbar Панель дій - + [testnet] [тестова мережа] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n активне з’єднання з мережею%n активні з’єднання з мережею%n активних з’єднань з мережею - + Downloaded %1 of %2 blocks of transaction history. Завантажено %1 з %2 блоків історії переказів. - + Downloaded %1 blocks of transaction history. Завантажено %1 блоків історії транзакцій. - + %n second(s) ago %n секунду тому%n секунди тому%n секунд тому - + %n minute(s) ago %n хвилину тому%n хвилини тому%n хвилин тому - + %n hour(s) ago %n годину тому%n години тому%n годин тому - + %n day(s) ago %n день тому%n дня тому%n днів тому - + Up to date Синхронізовано - + Catching up... Синхронізується... - + Last received block was generated %1. Останній отриманий блок було згенеровано %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? Цей переказ перевищує максимально допустимий розмір. Проте ви можете здійснити її, додавши комісію в %1, яка відправиться тим вузлам що оброблять ваш переказ, та допоможе підтримати мережу. Ви хочете додати комісію? - + Sending... Відправлення... - + Sent transaction Надіслані перекази - + Incoming transaction Отримані перекази - + Date: %1 Amount: %2 Type: %3 @@ -504,15 +577,35 @@ Address: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> <b>Зашифрований</b> гаманець <b>розблоковано</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> <b>Зашифрований</b> гаманець <b>заблоковано</b> + + + Backup Wallet + + + + + Wallet Data (*.dat) + + + + + Backup Failed + + + + + There was an error trying to save the wallet data to the new location. + + DisplayOptionsPage @@ -580,22 +673,22 @@ Address: %4 Редагувати адресу для відправлення - + The entered address "%1" is already in the address book. Введена адреса «%1» вже присутня в адресній книзі. - + The entered address "%1" is not a valid bitcoin address. Введена адреса «%1» не є коректною адресою в мережі Bitcoin. - + Could not unlock wallet. Неможливо розблокувати гаманець. - + New key generation failed. Не вдалося згенерувати нові ключі. @@ -674,8 +767,8 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Опціональна комісія за кожен Кб переказу, яка дозволяє бути впевненим у тому, що ваш переказ буде оброблено швидко. Розмір більшості переказів рівен 1 Кб. Рекомендована комісія: 0,01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Добровільна комісія за кожен Кб переказу, яка дозволяє бути впевненим у тому, що ваш переказ буде оброблено швидко. Розмір більшості переказів рівен 1 Кб. Рекомендована комісія: 0,01. @@ -684,8 +777,98 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - Опціональна комісія за кожен Кб переказу, яка дозволяє бути впевненим у тому, що ваш переказ буде оброблено швидко. Розмір більшості переказів рівен 1 Кб. Рекомендована комісія: 0,01. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + Добровільна комісія за кожен Кб переказу, яка дозволяє бути впевненим у тому, що ваш переказ буде оброблено швидко. Розмір більшості переказів рівен 1 Кб. Рекомендована комісія: 0,01. + + + + MessagePage + + + Message + Повідомлення + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + Адреса для отримувача платежу (наприклад, 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + Вибрати адресу з адресної книги + + + + Alt+A + Alt+A + + + + Paste address from clipboard + Вставити адресу + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + Введіть повідомлення, яке ви хочете підписати тут + + + + Click "Sign Message" to get signature + Натисніть кнопку "Підписати повідомлення", для отриманя підпису + + + + Sign a message to prove you own this address + Підпишіть повідомлення щоб довести, що ви є власником цієї адреси + + + + &Sign Message + &Підписати повідомлення + + + + Copy the currently selected address to the system clipboard + Копіювати виділену адресу в буфер обміну + + + + &Copy to Clipboard + &Копіювати + + + + + + Error signing + Помилка при підписуванні + + + + %1 is not a valid address. + "%1" не є коректною адресою в мережі Bitcoin. + + + + Private key for %1 is not available. + Приватний ключ для %1 недоступний. + + + + Sign failed + Не вдалось підписати @@ -753,7 +936,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Гаманець</span></p></body></html> @@ -778,16 +961,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + Діалог + + + + QR Code + QR-Код + + + + Request Payment + Запросити Платіж + + + + Amount: + Кількість: + + + + BTC + BTC + + + + Label: + Мітка: + + + + Message: + Повідомлення: + + + + &Save As... + &Зберегти як... + + + + Save Image... + + + + + PNG Images (*.png) + + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins Відправити @@ -803,81 +1039,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + Видалити всі поля транзакції + + + Clear all Очистити все - + Balance: Баланс: - + 123.456 BTC 123.456 BTC - + Confirm the send action Підтвердити відправлення - + &Send &Відправити - + <b>%1</b> to %2 (%3) <b>%1</b> адресату %2 (%3) - + Confirm send coins Підтвердіть відправлення - + Are you sure you want to send %1? Ви впевнені що хочете відправити %1 - + and і - + The recepient address is not valid, please recheck. Адреса отримувача невірна, будьласка перепровірте. - + The amount to pay must be larger than 0. Кількість монет для відправлення повинна бути більшою 0. - + Amount exceeds your balance Кількість монет для відправлення перевищує ваш баланс - + Total exceeds your balance when the %1 transaction fee is included Сума перевищить ваш баланс, якщо комісія %1 буде додана до вашого переказу - + Duplicate address found, can only send to each address once in one send operation Знайдено адресу що дублюється. Відправлення на кожну адресу дозволяється лише один раз на кожну операцію переказу. - + Error: Transaction creation failed Помилка: не вдалося створити переказ - + Error: 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. Помилка: переказ було відхилено. Це може статись, якщо декілька монет з вашого гаманця вже використані, наприклад, якщо ви використовуєте одну копію гаманця (wallet.dat), а монети були використані з іншої копії, але не позначені як використані в цій. @@ -949,135 +1190,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks Відкрити для %1 блоків - + Open until %1 Відкрити до %1 - + %1/offline? %1/поза інтернетом? - + %1/unconfirmed %1/не підтверджено - + %1 confirmations %1 підтверджень - + <b>Status:</b> <b>Статус:</b> - + , has not been successfully broadcast yet , ще не було успішно розіслано - + , broadcast through %1 node , розіслано через %1 вузол - + , broadcast through %1 nodes , розіслано через %1 вузлів - + <b>Date:</b> <b>Дата:</b> - + <b>Source:</b> Generated<br> <b>Джерело:</b> згенеровано<br> - - + + <b>From:</b> <b>Відправник:</b> - + unknown невідомий - - - + + + <b>To:</b> <b>Одержувач:</b> - + (yours, label: (Ваша, мітка: - + (yours) (ваша) - - - - + + + + <b>Credit:</b> <b>Кредит:</b> - + (%1 matures in %2 more blocks) (%1 «дозріє» через %2 блоків) - + (not accepted) (не прийнято) - - - + + + <b>Debit:</b> <b>Дебет:</b> - + <b>Transaction fee:</b> <b>Комісія за переказ:</b> - + <b>Net amount:</b> <b>Загальна сума:</b> - + Message: Повідомлення: - + Comment: Коментар: - + + Transaction ID: + ID транзакції: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. Після генерації монет, потрібно зачекати 120 блоків, перш ніж їх можна буде використати. Коли ви згенерували цей блок, його було відправлено в мережу для того, щоб він був доданий до ланцюжка блоків. Якщо ця процедура не вдасться, статус буде змінено на «не підтверджено» і ви не зможете потратити згенеровані монету. Таке може статись, якщо хтось інший згенерував блок на декілька секунд раніше. @@ -1164,56 +1410,51 @@ p, li { white-space: pre-wrap; } - Received from IP - Отримано з IP-адреси + Received from + Отримано від - + Sent to Відправлено - - Sent to IP - Відправлено на IP-адресу - - - + Payment to yourself Відправлено собі - + Mined Добуто - + (n/a) (недоступно) - + Transaction status. Hover over this field to show number of confirmations. Статус переказу. Наведіть вказівник на це поле, щоб показати кількість підтверджень. - + Date and time that the transaction was received. Дата і час, коли переказ було отримано. - + Type of transaction. Тип переказу. - + Destination address of transaction. Адреса отримувача - + Amount removed from or added to balance. Сума, додана чи знята з балансу. @@ -1292,16 +1533,21 @@ p, li { white-space: pre-wrap; } Мінімальна сума - + Copy address Скопіювати адресу - + Copy label Скопіювати мітку + + Copy amount + Копіювати кількість + + Edit label Редагувати мітку @@ -1312,67 +1558,67 @@ p, li { white-space: pre-wrap; } Показати деталі... - + Export Transaction Data Експортувати дані переказів - + Comma separated file (*.csv) Файли, розділені комою (*.csv) - + Confirmed Підтверджені - + Date Дата - + Type Тип - + Label Мітка - + Address Адреса - + Amount Кількість - + ID Ідентифікатор - + Error exporting Помилка експорту - + Could not write to file %1. Неможливо записати у файл %1 - + Range: Діапазон від: - + to до @@ -1380,7 +1626,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... Відправка... @@ -1399,941 +1645,369 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind Відправити команду серверу -server чи демону - List commands - + List commands Список команд - Get help for a command - + Get help for a command Отримати довідку по команді - Options: - + Options: Параметри: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) Вкажіть файл конфігурації (за промовчуванням: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) Вкажіть pid-файл (за промовчуванням: bitcoind.pid) - Generate coins - + Generate coins Генерувати монети - Don't generate coins - + Don't generate coins Не генерувати монети - Start minimized - + Start minimized Запускати згорнутим - Specify data directory - + Specify data directory Вкажіть робочий каталог - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) Вкажіть таймаут з’єднання (в мілісекундах) - Connect through socks4 proxy - + Connect through socks4 proxy Підключитись через SOCKS4-проксі - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect Дозволити пошук в DNS для команд «addnode» і «connect» - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + Чекати на з'єднання на порту (по замовченню 8333 або тестова мережа 18333) + + + + Maintain at most <n> connections to peers (default: 125) + Підтримувати не більше <n> зв'язків з колегами (за замовчуванням: 125) + + + + Add a node to connect to Додати вузол для підключення - - Connect only to the specified node - + + Connect only to the specified node Підключитись лише до вказаного вузла - - Don't accept connections from outside - + + Don't accept connections from outside Не приймати підключення ззовні - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + Не завантажувати список пірів за допомогою DNS + + + + Threshold for disconnecting misbehaving peers (default: 100) + Поріг відключення неправильно підєднаних пірів (за замовчуванням: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Максимальній розмір вхідного буферу на одне з'єднання (за замовчуванням 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Максимальоий буфер , <n> * 1000 байт (за умовчанням: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Максимальній розмір виіхідного буферу на одне з'єднання (за замовчуванням 10000) + + + + Don't attempt to use UPnP to map the listening port Не намагатись використовувати UPnP для відображення порту що прослуховується на роутері - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port Намагатись використовувати UPnP для відображення порту що прослуховується на роутері - - Fee per kB to add to transactions you send - - Комісія за Кб - + + Fee per kB to add to transactions you send + Комісія за Кб - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands Приймати команди із командного рядка та команди JSON-RPC - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands Запустити в фоновому режимі (як демон) та приймати команди - - Use the test network - + + Use the test network Використовувати тестову мережу - - Username for JSON-RPC connections - + + Output extra debugging information + Виводити більше налагоджувальної інформації + + + + Prepend debug output with timestamp + Доповнювати налагоджувальний вивід відміткою часу + + + + Send trace/debug info to console instead of debug.log file + Відсилаті налагоджувальну інформацію на консоль, а не у файл debug.log + + + + Send trace/debug info to debugger + Відсилаті налагоджувальну інформацію до налагоджувача + + + + Username for JSON-RPC connections Ім’я користувача для JSON-RPC-з’єднань - - Password for JSON-RPC connections - + + Password for JSON-RPC connections Пароль для JSON-RPC-з’єднань - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) Прослуховувати <port> для JSON-RPC-з’єднань (за промовчуванням: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address Дозволити JSON-RPC-з’єднання з вказаної IP-адреси - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) Відправляти команди на вузол, запущений на <ip> (за промовчуванням: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) Встановити розмір пулу ключів <n> (за промовчуванням: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions Пересканувати ланцюжок блоків, в пошуку втрачених переказів - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) Параметри SSL: (див. Bitcoin Wiki) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections Використовувати OpenSSL (https) для JSON-RPC-з’єднань - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) Сертифікату сервера (за промовчуванням: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) Закритий ключ сервера (за промовчуванням: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) Допустимі шифри (за промовчуванням: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message Дана довідка - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. Неможливо встановити блокування на робочий каталог %s. Можливо, гаманець вже запущено. - + Loading addresses... Завантаження адрес... - - Error loading addr.dat - - Помилка при завантаженні addr.dat - + + Error loading addr.dat + Помилка при завантаженні addr.dat - - Loading block index... - Завантаження індексу блоків... + + Error loading blkindex.dat + Помилка при завантаженні blkindex.dat - - Error loading blkindex.dat - - Помилка при завантаженні blkindex.dat - + + Error loading wallet.dat: Wallet corrupted + Помилка при завантаженні wallet.dat: Гаманець пошкоджено - - Loading wallet... - Завантаження гаманця... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + Помилка при завантаженні wallet.dat: Гаманець потребує новішої версії Біткоін-клієнта - - Error loading wallet.dat: Wallet corrupted - - Помилка при завантаженні wallet.dat: Гаманець пошкоджено - + + Wallet needed to be rewritten: restart Bitcoin to complete + Потрібно перезаписати гаманець: перезапустіть Біткоін-клієнт для завершення - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - Помилка при завантаженні wallet.dat: Гаманець потребує новішої версії Bitcoin'а - + + Error loading wallet.dat + Помилка при завантаженні wallet.dat - - Error loading wallet.dat - - Помилка при завантаженні wallet.dat - + + Loading block index... + Завантаження індексу блоків... - + + Loading wallet... + Завантаження гаманця... + + + Rescanning... Сканування... - + Done loading Завантаження завершене - + Invalid -proxy address Помилка в адресі проксі-сервера - + Invalid amount for -paytxfee=<amount> Помилка у величині комісії - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. Увага: встановлено занадто велику комісію (-paytxfee). Комісія зніматиметься кожен раз коли ви проводитимете перекази. - + Error: CreateThread(StartNode) failed Помилка: CreateThread(StartNode) дала збій - + Warning: Disk space is low Увага: На диску мало вільного місця - + Unable to bind to port %d on this computer. Bitcoin is probably already running. Неможливо прив’язати до порту %d на цьому комп’ютері. Молживо гаманець вже запущено. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - Цей переказ перевищує максимально допустимий розмір. Проте ви можете здійснити її, додавши комісію в %s, яка відправиться тим вузлам що оброблять ваш переказ, та допоможе підтримати мережу. Ви хочете додати комісію? - - - - Enter the current passphrase to the wallet. - Введіть пароль від гаманця. - - - - Passphrase - Пароль - - - - Please supply the current wallet decryption passphrase. - Будь ласка, вкажіть пароль для дешиврування гаманця. - - - - The passphrase entered for the wallet decryption was incorrect. - Пароль вказано невірно. - - - - Status - Статус - - - - Date - Дата - - - - Description - Опис - - - - Debit - Дебет - - - - Credit - Кредит - - - Open for %d blocks - Відкрито до отримання %d блоків - - - - Open until %s - Відкрито до %s - - - - %d/offline? - %d/поза інтернетом? - - - - %d/unconfirmed - %d/не підтверджено - - - - %d confirmations - %d підтверджень - - - - Generated - Згенеровано - - - - Generated (%s matures in %d more blocks) - Згенеровано (%s «дозріє» через %d блоків) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - Згенеровано — увага: цей блок не був отриманий жодними іншими вузлами і, ймовірно, не буде прийнятий! - - - - Generated (not accepted) - Згенеровано (не підтверджено) - - - - From: - Відправник: - - - - Received with: - Отримувач: - - - - Payment to yourself - Відправлено собі - - - - To: - Отримувач: - - - - Generating - Генерація - - - - (not connected) - (не підключено) - - - - %d connections %d blocks %d transactions - %d з’єднань %d блоків %d переказів - - - - Wallet already encrypted. - Гаманець уже зашифровано. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - Введіть новий пароль для гаманця. -Будь ласка використовуйте пароль із як мінімум 10-и випадкових символів, або як мінімум із 8-и слів. - - - - Error: The supplied passphrase was too short. - Помилка: Вказаний пароль занадто короткий. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - УВАГА: Якщо ви зашифруєте гаманець і забудете пароль, ви ВТРАТИТЕ ВСІ СВОЇ БІТКОІНИ! -Ви дійсно хочете зашифрувати свій гаманець? - - - - Please re-enter your new wallet passphrase. - Будь ласка, повторіть новий пароль. - - - - Error: the supplied passphrases didn't match. - Помилка: введені паролі не співпадають. - - - - Wallet encryption failed. - Не вдалося зашифрувати гаманець. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - Гаманець зашифровано. -Пам’ятайте, що шифрування гаманця не може повністю захистити ваші біткоіни від кражі, у випадку якщо ваш комп’ютер буде інфіковано шкідливими програмами. - - - - Wallet is unencrypted, please encrypt it first. - Гаманець не зашифровано, спочатку зашифруйте його. - - - - Enter the new passphrase for the wallet. - Введіть новий пароль для гаманця. - - - - Re-enter the new passphrase for the wallet. - Повторіть ввід нового пароля. - - - - Wallet Passphrase Changed. - Змінено пароль від гаманця. - - - - New Receiving Address - Нова адреса для отримання - - - - You should use a new address for each payment you receive. - -Label - Ви повинні використовувати нову адресу для кожного переказу, який ви отримуєте. -Мітка - - - - <b>Status:</b> - <b>Статус:</b> - - - - , has not been successfully broadcast yet - , ще не було розіслано - - - - , broadcast through %d node - , розсилати через %d вузол - - - - , broadcast through %d nodes - , розсилати через %d вузлів - - - - <b>Date:</b> - <b>Дата:</b> - - - - <b>Source:</b> Generated<br> - <b>Джерело:</b> згенеровано<br> - - - - <b>From:</b> - <b>Відправник:</b> - - - - unknown - невідомо - - - - <b>To:</b> - <b>Отримувач:</b> - - - - (yours, label: - (ваша мітка: - - - - (yours) - (ваш) - - - - <b>Credit:</b> - <b>Кредит:</b> - - - - (%s matures in %d more blocks) - (%s «дозріє» через %d блоків) - - - - (not accepted) - (не прийнято) - - - - <b>Debit:</b> - <b>Дебет:</b> - - - - <b>Transaction fee:</b> - <b>Комісія:</b> - - - - <b>Net amount:</b> - <b>Загальна сума:</b> - - - - Message: - Повідомлення: - - - - Comment: - Коментар: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Після генерації монет, потрібно зачекати 120 блоків, перш ніж їх можна буде використати. Коли ви згенерували цей блок, його було відправлено в мережу для того, щоб він був доданий до ланцюжка блоків. Якщо ця процедура не вдасться, статус буде змінено на «не підтверджено» і ви не зможете потратити згенеровані монету. Таке може статись, якщо хтось інший згенерував блок на декілька секунд раніше. - - - - Cannot write autostart/bitcoin.desktop file - Неможливо записати файл autostart/bitcoin.desktop - - - - Main - Головне - - - - &Start Bitcoin on window system startup - &Запускати гаманець при вході в систему - - - - &Minimize on close - З&гортати замість закриття - - - - version %s - версія %s - - - - Error in amount - Помилка в кількості - - - - Send Coins - Відправка - - - - Amount exceeds your balance - Кількість монет для відправлення перевищує ваш баланс - - - - Total exceeds your balance when the - Сума перевищить ваш баланс, якщо комісія - - - - transaction fee is included - буде додана до вашого переказу - - - - Payment sent - Оплата відправлена - - - - Sending... - Відправлення... - - - - Invalid address - Помилкова адреса - - - - Sending %s to %s - Відправлення %s адресату %s - - - - CANCELLED - ВІДМІНЕНО - - - - Cancelled - Відмінено - - - - Transfer cancelled - Переказ відмінено - - - - Error: - Помилка: - - - - Insufficient funds - Недостатньо коштів - - - - Connecting... - Підключення... - - - - Unable to connect - Неможливо підключитись - - - - Requesting public key... - Запит публічного ключа... - - - - Received public key... - Отримання публічного ключа... - - - - Recipient is not accepting transactions sent by IP address - Одержувач не приймає перекази, відправлені на IP-адресу - - - - Transfer was not accepted - Переказ не підтверджено - - - - Invalid response received - Отримана помилкова відповідь - - - - Creating transaction... - Створення переказу... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - Цей переказ потребує додавання комісії як мінімум в %s, через його розмір, складність, або внаслідок використання недавно отриманих коштів - - - - Transaction creation failed - Не вдалося створити переказ - - - - Transaction aborted - Переказ відмінено - - - - Lost connection, transaction cancelled - Втрачено з’єднання, переказ відмінено - - - - Sending payment... - Відправка оплати... - - - - 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. - Переказ було відхилено. Це може статись, якщо декілька монет з вашого гаманця вже використані, наприклад, якщо ви використовуєте одну копію гаманця (wallet.dat), а монети були використані з іншої копії, але не позначені як використані в цій. - - - - Waiting for confirmation... - Очікування підтвердження... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - Оплата була відправлена, але отримувач не зміг підтвердити її. -Переказ було записано і він буде нарахований отримувачу, -але коментар буде порожнім. - - - - Payment was sent, but an invalid response was received - Оплата була відправлена, але отримано неправильну відповідь - - - - Payment completed - Оплата завершена - - - - Name - Ім’я - - - - Address - Адреса - - - - Label - Мітка - - - - Bitcoin Address - Bitcoin-адреса - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - Це одина із ваших власних адрес для отримання платежів. Вона не може бути додана в адресну книгу. - - - - Edit Address - Редагувати адресу - - - - Edit Address Label - Редагувати мітку - - - - Add Address - Додати адресу - - - - Bitcoin - Bitcoin - - - - Bitcoin - Generating - Генерація - - - - Bitcoin - (not connected) - Bitcoin - (не підключений) - - - - &Open Bitcoin - &Показати гаманець - - - - &Send Bitcoins - &Відправка - - - - O&ptions... - &Налаштування - - - - E&xit - &Вихід - - - - Program has crashed and will terminate. - Внаслідок виникнення помилки, програма буде закрита. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. Увага: будь ласка, перевірте дату і час на свому комп’ютері. Якщо ваш годинник йде неправильно, Bitcoin може працювати некоректно. - + beta бета - - main - - - Bitcoin Qt - Bitcoin Qt - - \ 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 832a86e..d059aa0 100644 --- a/src/qt/locale/bitcoin_zh_CN.ts +++ b/src/qt/locale/bitcoin_zh_CN.ts @@ -14,20 +14,20 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - 版权所有 © 2009-2011 比特币开发团队 + 版权归比特币开发者所有 © 2009-2012 -本软件目前尚属测试阶段 +这是一个实验性软件。 -本软件遵循 MIT/X11 软件协议,详细请查阅附带的 license.txt 文件,或访问 http://www.opensource.org/licenses/mit-license.php. +Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. -本软件包含 OpenSSL 项目开发的 OpenSSL Toolkit 组件(http://www.openssl.org/), Eric Young (eay@cryptsoft.com) 开发的加密软件以及 Thomas Bernard 开发的UPnP软件 +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. @@ -69,31 +69,66 @@ This product includes software developed by the OpenSSL Project for use in the O + Show &QR Code + 显示二维码 + + + + Sign a message to prove you own this address + 发送签名消息以证明您是该比特币地址的拥有者 + + + + &Sign Message + &发送签名消息 + + + Delete the currently selected address from the list. Only sending addresses can be deleted. 从列表中删除当前选中地址。只有发送地址可以被删除。 - + &Delete &删除 - + + Copy address + 复制地址 + + + + Copy label + 复制标签 + + + + Edit + 编辑 + + + + Delete + 删除 + + + Export Address Book Data 导出地址薄数据 - + Comma separated file (*.csv) 逗号分隔文件 (*.csv) - + Error exporting 导出错误 - + Could not write to file %1. 无法写入文件 %1。 @@ -125,125 +160,132 @@ This product includes software developed by the OpenSSL Project for use in the O + TextLabel 文本标签 - + Enter passphrase 输入口令 - + New passphrase 新口令 - + Repeat new passphrase 重复新口令 - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. 输入钱包的新口令。<br/>使用的口令请至少包含<b>10个以上随机字符</>,或者是<b>8个以上的单词</b>。 - + Encrypt wallet 加密钱包 - + This operation needs your wallet passphrase to unlock the wallet. 该操作需要您首先使用口令解锁钱包。 - + Unlock wallet 解锁钱包 - + This operation needs your wallet passphrase to decrypt the wallet. 该操作需要您首先使用口令解密钱包。 - + Decrypt wallet 解密钱包 - + Change passphrase 修改口令 - + Enter the old and new passphrase to the wallet. 请输入钱包的旧口令与新口令。 - + Confirm wallet encryption 确认加密钱包 - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? 警告:如果您加密了您的钱包之后忘记了口令,您将会<b>失去所有的比特币</b>! 确定要加密钱包吗? - - + + Wallet encrypted 钱包已加密 - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - 请注意,当您的计算机感染恶意软件时,加密钱包并不能完全规避您的比特币被偷窃的可能。 + + Bitcoin 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. + 将关闭软件以完成加密过程。 请您谨记:钱包加密并不是万能的,电脑中毒,您的比特币还是有可能丢失。 - - - - + + + Warning: The Caps Lock key is on. + 警告:大写锁定键CapsLock开启 + + + + + + Wallet encryption failed 钱包加密失败 - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. 由于一个本地错误,加密钱包操作已经失败。您的钱包没有被加密。 - - + + The supplied passphrases do not match. 口令不匹配。 - + Wallet unlock failed 钱包解锁失败 - - + + The passphrase entered for the wallet decryption was incorrect. 用于解密钱包的口令不正确。 - + Wallet decryption failed 钱包解密失败。 - + Wallet passphrase was succesfully changed. 钱包口令修改成功 @@ -251,247 +293,278 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet 比特币钱包 - + + Synchronizing with network... 正在与网络同步... - + Block chain synchronization in progress 正在同步区域锁链 - + &Overview &概况 - + Show general overview of wallet 显示钱包概况 - + &Transactions &交易 - + Browse transaction history 查看交易历史 - + &Address Book &地址薄 - + Edit the list of stored addresses and labels 修改存储的地址和标签列表 - + &Receive coins &接收货币 - + Show the list of addresses for receiving payments 显示接收支付的地址列表 - + &Send coins &发送货币 - + Send coins to a bitcoin address 将货币发送到一个比特币地址 - + + Sign &message + 发送签名 &消息 + + + + Prove you control an address + 证明您拥有某个比特币地址 + + + E&xit 退出 - + Quit application 退出程序 - + &About %1 &关于 %1 - + Show information about Bitcoin 显示比特币的相关信息 - + + About &Qt + 关于 &Qt + + + + Show information about Qt + 显示Qt相关信息 + + + &Options... &选项... - + Modify configuration options for bitcoin 修改比特币配置选项 - + Open &Bitcoin 打开 &比特币 - + Show the Bitcoin window 显示比特币窗口 - + &Export... &导出... - - Export the current view to a file - 导出当前视图到指定文件 + + Export the data in the current tab to a file + 导出当前数据到文件 - + &Encrypt Wallet &加密钱包 - + Encrypt or decrypt wallet 加密或解密钱包 - + + &Backup Wallet + &备份钱包 + + + + Backup wallet to another location + 备份钱包到其它文件夹 + + + &Change Passphrase &修改口令 - + Change the passphrase used for wallet encryption 修改钱包加密口令 - + &File &文件 - + &Settings &设置 - + &Help &帮助 - + Tabs toolbar 分页工具栏 - + Actions toolbar 动作工具栏 - + [testnet] [testnet] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network %n 个到比特币网络的活动连接 - + Downloaded %1 of %2 blocks of transaction history. %1 / %2 个交易历史的区块已下载 - + Downloaded %1 blocks of transaction history. %1 个交易历史的区块已下载 - + %n second(s) ago %n 秒前 - + %n minute(s) ago %n 分种前 - + %n hour(s) ago %n 小时前 - + %n day(s) ago %n 天前 - + Up to date 最新状态 - + Catching up... 更新中... - + Last received block was generated %1. 最新收到的区块产生于 %1。 - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? 该笔交易的数据量超限.您可以选择支付 %1 交易费, 交易费将支付给处理该笔交易的网络节点,有助于维持比特币网络的运行. 您愿意支付交易费用吗? - + Sending... 发送中 - + Sent transaction 已发送交易 - + Incoming transaction 流入交易 - + Date: %1 Amount: %2 Type: %3 @@ -504,15 +577,35 @@ Address: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> 钱包已被<b>加密</b>,当前为<b>解锁</b>状态 - + Wallet is <b>encrypted</b> and currently <b>locked</b> 钱包已被<b>加密</b>,当前为<b>锁定</b>状态 + + + Backup Wallet + 备份钱包 + + + + Wallet Data (*.dat) + 钱包文件(*.dat) + + + + Backup Failed + 备份失败 + + + + There was an error trying to save the wallet data to the new location. + 备份钱包到其它文件夹失败. + DisplayOptionsPage @@ -580,22 +673,22 @@ Address: %4 编辑发送地址 - + The entered address "%1" is already in the address book. 输入的地址 "%1" 已经存在于地址薄。 - + The entered address "%1" is not a valid bitcoin address. 输入的地址 "%1" 并不是一个有效的比特币地址 - + Could not unlock wallet. 无法解锁钱包 - + New key generation failed. 密钥创建失败. @@ -674,8 +767,8 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - 为每1kB交易数据支付交易费将保证您的交易尽快被处理.大部分交易数据都小于1kB. 建议支付0.01个比特币的交易费. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + 建议支付交易费用,有助于您的交易得到尽快处理. 绝大多数交易的字节数为 1 kB. 建议支付0.01个比特币. @@ -684,8 +777,98 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - 为每1kB交易数据支付交易费将保证您的交易尽快被处理.大部分交易数据都小于1kB. 建议支付0.01个比特币的交易费. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + 建议支付交易费用,有助于您的交易得到尽快处理. 绝大多数交易的字节数为 1 kB. 建议支付0.01个比特币. + + + + MessagePage + + + Message + 消息 + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + 您可以用你的地址对消息进行签名,以证明您是该地址的所有人。注意不要对模棱两可的消息签名,以免遭受钓鱼式攻击。请确保消息真实明确的表达了您的意愿。 + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + 付款地址 (例如: 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + 从地址簿选择地址 + + + + Alt+A + Alt+A + + + + Paste address from clipboard + 从剪贴板粘贴地址 + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + 请输入您要发送的签名消息 + + + + Click "Sign Message" to get signature + 单击“发送签名消息"获取签名 + + + + Sign a message to prove you own this address + 发送签名消息以证明您是该比特币地址的拥有者 + + + + &Sign Message + &发送签名消息 + + + + Copy the currently selected address to the system clipboard + 复制当前选中地址到系统剪贴板 + + + + &Copy to Clipboard + &复制到剪贴板 + + + + + + Error signing + 签名错误 + + + + %1 is not a valid address. + %1 不是合法的比特币地址。 + + + + Private key for %1 is not available. + %1 的秘钥不可用。 + + + + Sign failed + 签名失败 @@ -753,7 +936,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">钱包</span></p></body></html> @@ -778,16 +961,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + 会话 + + + + QR Code + 二维码 + + + + Request Payment + 请求付款 + + + + Amount: + 金额: + + + + BTC + BTC + + + + Label: + 标签: + + + + Message: + 消息: + + + + &Save As... + &另存为 + + + + Save Image... + 保存图像... + + + + PNG Images (*.png) + PNG图像文件(*.png) + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins 发送货币 @@ -803,81 +1039,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + 移除所有交易项 + + + Clear all 清除全部 - + Balance: 余额 - + 123.456 BTC 123.456 BTC - + Confirm the send action 确认并发送货币 - + &Send &发送 - + <b>%1</b> to %2 (%3) <b>%1</b> 到 %2 (%3) - + Confirm send coins 确认发送货币 - + Are you sure you want to send %1? 确定您要发送 %1? - + and 和 - + The recepient address is not valid, please recheck. 接收者地址不合法,请检查。 - + The amount to pay must be larger than 0. 支付金额必须大于0. - + Amount exceeds your balance 余额不足。 - + Total exceeds your balance when the %1 transaction fee is included 计入 %1 的交易费后,您的余额不足以支付总价。 - + Duplicate address found, can only send to each address once in one send operation 发现重复地址,一次操作中只可以给每个地址发送一次 - + Error: Transaction creation failed 错误:交易创建失败。 - + Error: 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. 错误:交易被拒绝。这种情况通常发生在您钱包中的一些货币已经被消费之后,比如您使用了一个wallet.dat的副本,而货币在那个副本中已经被消费,但在当前钱包中未被标记为已消费。 @@ -949,135 +1190,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks 开启 %1 个数据块 - + Open until %1 至 %1 个数据块时开启 - + %1/offline? %1/离线? - + %1/unconfirmed %1/未确认 - + %1 confirmations %1 确认项 - + <b>Status:</b> <b>状态:</b> - + , has not been successfully broadcast yet , 未被成功广播 - + , broadcast through %1 node ,同过 %1 节点广播 - + , broadcast through %1 nodes ,同过 %1 节点组广播 - + <b>Date:</b> <b>日期:</b> - + <b>Source:</b> Generated<br> <b>来源:</b> 生成<br> - - + + <b>From:</b> <b>从:</b> - + unknown 未知 - - - + + + <b>To:</b> <b>到:</b> - + (yours, label: (您的, 标签: - + (yours) (您的) - - - - + + + + <b>Credit:</b> <b>到帐:</b> - + (%1 matures in %2 more blocks) (%1 成熟于 %2 以上数据块) - + (not accepted) (未接受) - - - + + + <b>Debit:</b> 支出 - + <b>Transaction fee:</b> 交易费 - + <b>Net amount:</b> <b>网络金额:</b> - + Message: 消息: - + Comment: 备注 - + + Transaction ID: + 交易ID: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. 新生产的比特币必须等待120个数据块之后才能被使用. 当您生产出此数据块,它将被广播至比特币网络并添加至数据链. 如果添加到数据链失败, 它的状态将变成"不被接受",生产的比特币将不能使用. 在您生产新数据块的几秒钟内, 如果其它节点也生产出同样的数据块,有可能会发生这种情况. @@ -1164,56 +1410,51 @@ p, li { white-space: pre-wrap; } - Received from IP - 从IP接收 + Received from + 收款来自 - + Sent to 发送到 - - Sent to IP - 发送到IP - - - + Payment to yourself 付款给自己 - + Mined 挖矿所得 - + (n/a) (n/a) - + Transaction status. Hover over this field to show number of confirmations. 交易状态。 鼠标移到此区域上可显示确认消息项的数目。 - + Date and time that the transaction was received. 接收交易的时间 - + Type of transaction. 交易类别。 - + Destination address of transaction. 交易目的地址。 - + Amount removed from or added to balance. 从余额添加或移除的金额 @@ -1292,16 +1533,21 @@ p, li { white-space: pre-wrap; } 最小金额 - + Copy address 复制地址 - + Copy label 复制标签 + + Copy amount + 复制金额 + + Edit label 编辑标签 @@ -1312,67 +1558,67 @@ p, li { white-space: pre-wrap; } 显示细节... - + Export Transaction Data 导出交易数据 - + Comma separated file (*.csv) 逗号分隔文件(*.csv) - + Confirmed 已确认 - + Date 日期 - + Type 类别 - + Label 标签 - + Address 地址 - + Amount 金额 - + ID ID - + Error exporting 导出错误 - + Could not write to file %1. 无法写入文件 %1。 - + Range: 范围: - + to 到 @@ -1380,7 +1626,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... 发送中... @@ -1399,940 +1645,368 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind 发送命令到服务器或者 bitcoind - List commands - + List commands 列出命令 - Get help for a command - + Get help for a command 获得某条命令的帮助 - Options: - + Options: 选项: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) 指定配置文件 (默认为 bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) 指定 pid 文件 (默认为 bitcoind.pid) - Generate coins - + Generate coins 生成货币 - Don't generate coins - + Don't generate coins 不要生成货币 - Start minimized - + Start minimized 启动时最小化 - Specify data directory - + Specify data directory 指定数据目录 - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) 指定连接超时时间 (微秒) - Connect through socks4 proxy - + Connect through socks4 proxy 通过 socks4 代理连接 - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect 连接节点时允许DNS查找 - Add a node to connect to - - 连接到指定节点 + Listen for connections on <port> (default: 8333 or testnet: 18333) + 监听端口连接 <port> (缺省: 8333 or testnet: 18333) - Connect only to the specified node - + Maintain at most <n> connections to peers (default: 125) + 最大连接数 <n> (缺省: 125) + + + + Add a node to connect to + 连接到指定节点 + + + + Connect only to the specified node 只连接到指定节点 - - Don't accept connections from outside - + + Don't accept connections from outside 禁止接收外部连接 - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + 不要用DNS启动 + + + + Threshold for disconnecting misbehaving peers (default: 100) + Threshold for disconnecting misbehaving peers (缺省: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + Number of seconds to keep misbehaving peers from reconnecting (缺省: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + Maximum per-connection receive buffer, <n>*1000 bytes (缺省: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + Maximum per-connection send buffer, <n>*1000 bytes (缺省: 10000) + + + + Don't attempt to use UPnP to map the listening port 禁止使用 UPnP 映射监听端口 - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port 尝试使用 UPnP 映射监听端口 - - Fee per kB to add to transactions you send - - 每发送1kB交易所需的费用 + + Fee per kB to add to transactions you send + 为付款交易支付比特币(每kb) - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands 接受命令行和 JSON-RPC 命令 - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands 在后台运行并接受命令 - - Use the test network - + + Use the test network 使用测试网络 - - Username for JSON-RPC connections - + + Output extra debugging information + 输出调试信息 + + + + Prepend debug output with timestamp + 为调试输出信息添加时间戳 + + + + Send trace/debug info to console instead of debug.log file + 跟踪/调试信息输出到控制台,不输出到debug.log文件 + + + + Send trace/debug info to debugger + 跟踪/调试信息输出到 调试器debugger + + + + Username for JSON-RPC connections JSON-RPC连接用户名 - - Password for JSON-RPC connections - + + Password for JSON-RPC connections JSON-RPC连接密码 - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) JSON-RPC连接监听<端口> (默认为 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address 允许从指定IP接受到的JSON-RPC连接 - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) 向IP地址为 <ip> 的节点发送指令 (缺省: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) 设置密钥池大小为 <n> (缺省: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions 重新扫描数据链以查找遗漏的交易 - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) SSL 选项: (SSL 安装教程具体见比特币维基百科) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections 为 JSON-RPC 连接使用 OpenSSL (https)连接 - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) 服务器证书 (默认为 server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) 服务器私钥 (默认为 server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) 可接受的加密器 (默认为 TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message 该帮助信息 - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. 无法给数据目录 %s 加锁。比特币进程可能已在运行。 - + Loading addresses... 正在加载地址... - - Error loading addr.dat - - 加载 addr.dat 错误 - + + Error loading addr.dat + addr.dat文件加载错误 - - Loading block index... - 加载区块索引... + + Error loading blkindex.dat + blkindex.dat文件加载错误 - - Error loading blkindex.dat - - 加载 blkindex.dat 失败 - + + Error loading wallet.dat: Wallet corrupted + wallet.dat钱包文件加载错误:钱包损坏 - - Loading wallet... - 正在加载钱包... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + wallet.dat钱包文件加载错误:请升级到最新Bitcoin客户端 - - Error loading wallet.dat: Wallet corrupted - - 加载 wallet.dat 失败:钱包崩溃 - + + Wallet needed to be rewritten: restart Bitcoin to complete + 钱包文件需要重写:请退出并重新启动Bitcoin客户端 - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - 加载 wallet.dat 失败:运行钱包需要一个更新版本的比特币软件 - + + Error loading wallet.dat + wallet.dat钱包文件加载错误 - - Error loading wallet.dat - - 加载 wallet.dat 失败 - + + Loading block index... + 加载区块索引... - + + Loading wallet... + 正在加载钱包... + + + Rescanning... 正在重新扫描... - + Done loading 加载完成 - + Invalid -proxy address 代理地址不合法 - + Invalid amount for -paytxfee=<amount> 不合适的交易费 -paytxfee=<amount> - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. 警告: -paytxfee 交易费设置过高. 每进行一笔交易您都将支付该数量的交易费. - + Error: CreateThread(StartNode) failed 错误:线程创建(StartNode)失败 - + Warning: Disk space is low 警告:磁盘空间不足 - + Unable to bind to port %d on this computer. Bitcoin is probably already running. 无法绑定端口 %d 到这台计算机。比特币进程可能已在运行。 - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - 交易超出大小限制。你可以继续以 %s 的费用发送。这笔费用将被发送到处理此次交易的节点用以帮助支持这个网络。你想要支付此笔费用吗? - - - - Enter the current passphrase to the wallet. - 输入当前钱包口令 - - - - Passphrase - 口令 - - - - Please supply the current wallet decryption passphrase. - 请提供当前钱包解密口令 - - - - The passphrase entered for the wallet decryption was incorrect. - 当前钱包解密口令不正确。 - - - - Status - 状态 - - - - Date - 日期 - - - - Description - 描述 - - - - Debit - 支出 - - - - Credit - 收入 - - - Open for %d blocks - 开启 %d 个数据块 - - - - Open until %s - 至 %s 个数据块时开启 - - - - %d/offline? - %d/ 离线? - - - - %d/unconfirmed - %d/未确认 - - - - %d confirmations - %d 确认项 - - - - Generated - 生成 - - - - Generated (%s matures in %d more blocks) - (%s 成熟于 %d 以上数据块) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - 已生成 - 警告:此区块未被其他接收并可能不被接受 - - - - Generated (not accepted) - 已生成(未接受) - - - - From: - 从: - - - - Received with: - 接收于 - - - - Payment to yourself - 支付给自己 - - - - To: - 到: - - - - Generating - 生成中 - - - - (not connected) - (未连接) - - - - %d connections %d blocks %d transactions - %d 个连接 %d 个数据块 %d 笔交易 - - - - Wallet already encrypted. - 钱包已被加密。 - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - 请输入新的钱包密码. -密码须包含10个以上字符,或8个以上单词. - - - - Error: The supplied passphrase was too short. - 错误:提供的口令过短。 - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - 警告:如果您在加密钱包后忘记密码, 你将会丢失钱包中所有的比特币! -您确定要对钱包进行加密吗? - - - - Please re-enter your new wallet passphrase. - 请重新输入您的新钱包口令 - - - - Error: the supplied passphrases didn't match. - 错误:提供的口令不匹配。 - - - - Wallet encryption failed. - 钱包加密失败。 - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - 钱包加密成功. -谨记:如果您的电脑感染病毒或木马,即使钱包已经加密,也不能保证您的比特币不被窃,请做好电脑防毒工作. - - - - Wallet is unencrypted, please encrypt it first. - 钱包未加密,请先加密. - - - - Enter the new passphrase for the wallet. - 为钱包输入新口令 - - - - Re-enter the new passphrase for the wallet. - 请再次输入新口令。 - - - - Wallet Passphrase Changed. - 钱包口令已改变 - - - - New Receiving Address - 新接收地址 - - - - You should use a new address for each payment you receive. - -Label - 你应该为每一笔支付使用一条新地址 - -标签 - - - - <b>Status:</b> - <b>状态:</b> - - - - , has not been successfully broadcast yet - ,还未被成功广播。 - - - - , broadcast through %d node - ,通过%d个节点广播 - - - - , broadcast through %d nodes - ,通过%d个节点组广播 - - - - <b>Date:</b> - <b>日期:</b> - - - - <b>Source:</b> Generated<br> - <b>来源:</b> 生成<br> - - - - <b>From:</b> - <b>从:</b> - - - - unknown - 未知 - - - - <b>To:</b> - <b>到:</b> - - - - (yours, label: - (您的,标签: - - - - (yours) - (你的) - - - - <b>Credit:</b> - <b>收入:</b> - - - - (%s matures in %d more blocks) - (%s 成熟于 %d 以上数据块) - - - - (not accepted) - (拒绝) - - - - <b>Debit:</b> - <b>支出:</b> - - - - <b>Transaction fee:</b> - <b>交易费:</b> - - - - <b>Net amount:</b> - <b>网络金额:</b> - - - - Message: - 消息: - - - - Comment: - 备注: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - 新生产的比特币必须等待120个数据块之后才能被使用. 当您生产出此数据块,它将被广播至比特币网络并添加至数据链. 如果添加到数据链失败, 它的状态将变成"不被接受",生产的比特币将不能使用. 在您生产新数据块的几秒钟内, 如果其它节点也生产出同样的数据块,有可能会发生这种情况. - - - - Cannot write autostart/bitcoin.desktop file - 无法写入 autostart/bitcoin.desktop 文件 - - - - Main - 主要的 - - - - &Start Bitcoin on window system startup - &系统启动时运行比特币 - - - - &Minimize on close - &关闭时最小化 - - - - version %s - 版本 %s - - - - Error in amount - 金额错误 - - - - Send Coins - 已发送的货币 - - - - Amount exceeds your balance - 余额不足 - - - - Total exceeds your balance when the - 总价超出您的余额: - - - - transaction fee is included - 已包含交易费 - - - - Payment sent - 支付已发送 - - - - Sending... - 正在发送... - - - - Invalid address - 地址不合法 - - - - Sending %s to %s - 正在发送 %s 到 %s - - - - CANCELLED - 已取消 - - - - Cancelled - 已取消 - - - - Transfer cancelled - 传输已取消 - - - - Error: - 错误: - - - - Insufficient funds - 金额不足 - - - - Connecting... - 正在连接... - - - - Unable to connect - 无法连接 - - - - Requesting public key... - 正在请求公钥... - - - - Received public key... - 公钥已接收... - - - - Recipient is not accepting transactions sent by IP address - 接收者拒绝接收该 IP 地址发送的交易 - - - - Transfer was not accepted - 传输被拒绝 - - - - Invalid response received - 收到非法应答 - - - - Creating transaction... - 创建交易... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - 由于交易量、复杂度或涉及新收到的比特币的原因,您需要为该笔交易支付至少 %s 个比特币的交易费. - - - - Transaction creation failed - 交易创建失败 - - - - Transaction aborted - 交易终止 - - - - Lost connection, transaction cancelled - 连接丢失,交易已被取消 - - - - Sending payment... - 发送支付... - - - - 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. - 交易被拒绝. 有时会发生这种错误, 愿因是您钱包中的一些钱已经被花掉了. 比如说您复制了钱包文件 wallet.dat, 然后用复制的钱包花掉了钱, 您现在所用的原始钱包中却没有该笔交易记录. - - - - Waiting for confirmation... - 等待确认... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - 已付款, 但是无法验证收款人. -这笔交易已经被记录了, 金额也会被记入至收款人的账户, -但附注信息将会是空白. - - - - Payment was sent, but an invalid response was received - 支付已发送,但收到了一个非法应答。 - - - - Payment completed - 支付已完成 - - - - Name - 姓名 - - - - Address - 地址 - - - - Label - 标签 - - - - Bitcoin Address - 比特币地址 - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - 这是一条您自己的用于接收支付的地址,不可以填入地址薄。 - - - - Edit Address - 编辑地址 - - - - Edit Address Label - 编辑地址标签 - - - - Add Address - 添加地址 - - - - Bitcoin - 比特币 - - - - Bitcoin - Generating - 比特币 - 生成中 - - - - Bitcoin - (not connected) - 比特币 - (未连接) - - - - &Open Bitcoin - &打开比特币 - - - - &Send Bitcoins - &发送比特币 - - - - O&ptions... - 选项 - - - - E&xit - 退出 - - - - Program has crashed and will terminate. - 程序崩溃,即将终止。 - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. 警告:请确定您当前计算机的日期和时间是正确的。比特币将无法在错误的时间下正常工作。 - + beta 测试 - - main - - - Bitcoin Qt - 比特币 Qt - - \ 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 fb5e533..83c3028 100644 --- a/src/qt/locale/bitcoin_zh_TW.ts +++ b/src/qt/locale/bitcoin_zh_TW.ts @@ -14,20 +14,20 @@ - Copyright © 2009-2011 Bitcoin Developers + Copyright © 2009-2012 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - 版權為位元幣開發人員自公元 2009 至 2011 年起所有 + 版權為 Bitcoin 開發人員自西元 2009 至 2012 年起所有 -這是個實驗性質的軟體. +這是個實驗性的軟體. -這個軟體在 MIT/X11 執照規範下發行散佈, 詳情請見附帶的 license.txt 檔案, 或網站 http://www.opensource.org/licenses/mit-license.php. +此軟體依據 MIX/X11 軟體授權條款散布, 詳情請見附帶的 license.txt 檔案, 或是以下網站: http://www.opensource.org/licenses/mit-license.php. -這個產品中包含了 OpenSSL 專案所開發的 OpenSSL Toolkit 軟體 (http://www.openssl.org/), Eric Young (eay@cryptsoft.com) 所寫的加解密軟體, 以及 Thomas Bernard 所寫的 UPnP 軟體. +此產品也包含了由 OpenSSL Project 所開發的 OpenSSL Toolkit (http://www.openssl.org/) 軟體, 由 Eric Young (eay@cryptsoft.com) 撰寫的加解密軟體, 以及由 Thomas Bernard 所撰寫的 UPnP 軟體. @@ -69,31 +69,66 @@ This product includes software developed by the OpenSSL Project for use in the O + Show &QR Code + 顯示 &QR 條碼 + + + + Sign a message to prove you own this address + 簽署一則訊息來證明你擁有這個位址 + + + + &Sign Message + 簽署訊息 + + + Delete the currently selected address from the list. Only sending addresses can be deleted. 從列表中刪除目前選取的位址. 只能夠刪除付款位址. - + &Delete 刪除 - + + Copy address + 複製位址 + + + + Copy label + 複製標記 + + + + Edit + 編輯 + + + + Delete + 刪除 + + + Export Address Book Data 匯出位址簿資料 - + Comma separated file (*.csv) 逗號區隔資料檔 (*.csv) - + Error exporting 資料匯出有誤 - + Could not write to file %1. 無法寫入檔案 %1. @@ -125,125 +160,132 @@ This product includes software developed by the OpenSSL Project for use in the O + TextLabel 文字標籤 - + Enter passphrase 輸入密碼 - + New passphrase 新的密碼 - + Repeat new passphrase 重複新密碼 - + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>10 or more random characters</b>, or <b>eight or more words</b>. 輸入錢包的新密碼.<br/>請用<b>10個以上的字元</b>, 或是<b>8個以上的字詞</b>. - + Encrypt wallet 錢包加密 - + This operation needs your wallet passphrase to unlock the wallet. 這個動作需要用你的錢包密碼來解鎖 - + Unlock wallet 錢包解鎖 - + This operation needs your wallet passphrase to decrypt the wallet. 這個動作需要用你的錢包密碼來解密 - + Decrypt wallet 錢包解密 - + Change passphrase 變更密碼 - + Enter the old and new passphrase to the wallet. 輸入錢包的新舊密碼. - + Confirm wallet encryption 錢包加密確認 - + WARNING: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! Are you sure you wish to encrypt your wallet? 警告: 如果將錢包加密後忘記密碼, 你會<b>失去其中所有的位元幣</b>! 你確定要將錢包加密嗎? - - + + Wallet encrypted 錢包已加密 - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - 請記得, 即使將錢包加密, 也不能完全防止因惡意軟體入侵, 而導致位元幣被偷. + + Bitcoin 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. + 位元幣現在要關閉以完成加密程序. 請記住, 加密錢包無法完全防止入侵電腦的惡意程式偷取你的位元幣. - - - - + + + Warning: The Caps Lock key is on. + 警告: 鍵盤輸入鎖定為大寫字母中. + + + + + + Wallet encryption failed 錢包加密失敗 - + Wallet encryption failed due to an internal error. Your wallet was not encrypted. 錢包加密因程式內部有誤而失敗. 你的錢包還是沒有加密. - - + + The supplied passphrases do not match. 提供的密碼不符. - + Wallet unlock failed 錢包解鎖失敗 - - + + The passphrase entered for the wallet decryption was incorrect. 用來解密錢包的密碼輸入錯誤. - + Wallet decryption failed 錢包解密失敗 - + Wallet passphrase was succesfully changed. 錢包密碼變更成功. @@ -251,247 +293,278 @@ Are you sure you wish to encrypt your wallet? BitcoinGUI - + Bitcoin Wallet 位元幣錢包 - + + Synchronizing with network... 網路同步中... - + Block chain synchronization in progress 正在進行區塊鎖鏈的同步中 - + &Overview 總覽 - + Show general overview of wallet 顯示錢包一般總覽 - + &Transactions 交易 - + Browse transaction history 瀏覽交易紀錄 - + &Address Book 位址簿 - + Edit the list of stored addresses and labels 編輯儲存位址與標記的列表 - + &Receive coins 收錢 - + Show the list of addresses for receiving payments 顯示收款位址的列表 - + &Send coins 付錢 - + Send coins to a bitcoin address 付錢至某個位元幣位址 - + + Sign &message + 訊息簽署 + + + + Prove you control an address + 證明你控制一個位址 + + + E&xit 結束 - + Quit application 結束應用程式 - + &About %1 關於%1 - + Show information about Bitcoin 顯示位元幣相關資訊 - + + About &Qt + 關於 &Qt + + + + Show information about Qt + 顯示有關於 Qt 的資訊 + + + &Options... 選項... - + Modify configuration options for bitcoin 修改位元幣的設定選項 - + Open &Bitcoin 開啟位元幣 - + Show the Bitcoin window 顯示位元幣主視窗 - + &Export... 匯出... - - Export the current view to a file - 將目前版面匯出至檔案 + + Export the data in the current tab to a file + 將目前分頁的資料匯出存成檔案 - + &Encrypt Wallet 錢包加密 - + Encrypt or decrypt wallet 將錢包加解密 - + + &Backup Wallet + 錢包備份 + + + + Backup wallet to another location + 將錢包備份到其它地方 + + + &Change Passphrase 變更密碼 - + Change the passphrase used for wallet encryption 變更錢包加密用的密碼 - + &File 檔案 - + &Settings 設定 - + &Help 求助 - + Tabs toolbar 分頁工具列 - + Actions toolbar 動作工具列 - + [testnet] [testnet] - + bitcoin-qt bitcoin-qt - + %n active connection(s) to Bitcoin network 與位元幣網路有 %n 個連線在使用中 - + Downloaded %1 of %2 blocks of transaction history. 已下載了 %1/%2 個交易紀錄的區塊. - + Downloaded %1 blocks of transaction history. 已下載了 %1 個交易紀錄的區塊. - + %n second(s) ago %n 秒鐘前 - + %n minute(s) ago %n 分鐘前 - + %n hour(s) ago %n 小時前 - + %n day(s) ago %n 天前 - + Up to date 最新狀態 - + Catching up... 進度追趕中... - + Last received block was generated %1. 最近收到的區塊產生於 %1. - + This transaction is over the size limit. You can still send it for a fee of %1, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? 這筆交易的資料大小超過限制了. 你還是可以付出 %1 的費用來傳送. 這筆費用會付給處理該筆交易的節點, 並幫助維持整個網路. 你願意支付這項費用嗎? - + Sending... 付出中... - + Sent transaction 付款交易 - + Incoming transaction 收款交易 - + Date: %1 Amount: %2 Type: %3 @@ -503,15 +576,35 @@ Address: %4 位址: %4 - + Wallet is <b>encrypted</b> and currently <b>unlocked</b> 錢包<b>已加密</b>並且正<b>解鎖中</b> - + Wallet is <b>encrypted</b> and currently <b>locked</b> 錢包<b>已加密</b>並且正<b>上鎖中</b> + + + Backup Wallet + 錢包備份 + + + + Wallet Data (*.dat) + 錢包資料檔 (*.dat) + + + + Backup Failed + 備份失敗 + + + + There was an error trying to save the wallet data to the new location. + 儲存錢包資料到新的地方時發生錯誤 + DisplayOptionsPage @@ -579,22 +672,22 @@ Address: %4 編輯付款位址 - + The entered address "%1" is already in the address book. 輸入的位址"%1"已存在於位址簿中. - + The entered address "%1" is not a valid bitcoin address. 輸入的位址"%1"並非有效的位元幣位址 - + Could not unlock wallet. 無法將錢包解鎖. - + New key generation failed. 新密鑰產生失敗. @@ -673,8 +766,8 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - 非必要的交易手續費, 有助於縮短你的交易處理時間. 以 kB 為計費單位, 而大部份交易的大小是 1kB. 建議設定為 0.01 元. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + 非必要的交易手續費, 以 kB 為計費單位, 且有助於縮短你的交易處理時間. 大部份交易的資料大小是 1 kB. 建議設定為 0.01 元. @@ -683,8 +776,98 @@ Address: %4 - Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1kB. Fee 0.01 recommended. - 非必要的交易手續費, 有助於縮短你的交易處理時間. 以 kB 為計費單位, 而大部份交易的大小是 1kB. 建議設定為 0.01 元. + Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. + 非必要的交易手續費, 以 kB 為計費單位, 且有助於縮短你的交易處理時間. 大部份交易的資料大小是 1 kB. 建議設定為 0.01 元. + + + + MessagePage + + + Message + 訊息 + + + + You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + 你可以用你的位址來簽署訊息, 以證明你對它的所有權. 但是請小心, 不要簽署語意含糊不清的內容, 因為釣魚式詐騙可能會用騙你簽署的手法來冒充是你. 只有在語句中的細節你都同意時才簽署. + + + + The address to send the payment to (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + 付款的目標位址 (比如說 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) + + + + Choose adress from address book + 從位址簿中選一個位址 + + + + Alt+A + Alt+A + + + + Paste address from clipboard + 從剪貼簿貼上位址 + + + + Alt+P + Alt+P + + + + Enter the message you want to sign here + 在這裡輸入你想簽署的訊息 + + + + Click "Sign Message" to get signature + 按"簽署訊息"來取得簽章 + + + + Sign a message to prove you own this address + 簽署一則訊息來證明你擁有這個位址 + + + + &Sign Message + 簽署訊息 + + + + Copy the currently selected address to the system clipboard + 複製目前選取的位址到系統剪貼簿 + + + + &Copy to Clipboard + 複製到剪貼簿 + + + + + + Error signing + 簽署發生錯誤 + + + + %1 is not a valid address. + %1 不是個有效的位址. + + + + Private key for %1 is not available. + 沒有 %1 的密鑰. + + + + Sign failed + 簽署失敗 @@ -752,7 +935,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">錢包</span></p></body></html> @@ -777,16 +960,69 @@ p, li { white-space: pre-wrap; } + QRCodeDialog + + + Dialog + 對話視窗 + + + + QR Code + QR 條碼 + + + + Request Payment + 付款單 + + + + Amount: + 金額: + + + + BTC + BTC + + + + Label: + 標記: + + + + Message: + 訊息: + + + + &Save As... + 儲存為... + + + + Save Image... + 儲存圖片... + + + + PNG Images (*.png) + PNG 圖檔 (*.png) + + + SendCoinsDialog - - - - - - - + + + + + + + Send Coins 付錢 @@ -802,81 +1038,86 @@ p, li { white-space: pre-wrap; } + Remove all transaction fields + 移除所有交易欄位 + + + Clear all 全部清掉 - + Balance: 餘額: - + 123.456 BTC 123.456 BTC - + Confirm the send action 確認付款動作 - + &Send 付出 - + <b>%1</b> to %2 (%3) <b>%1</b> 給 %2 (%3) - + Confirm send coins 確認付出金額 - + Are you sure you want to send %1? 確定要付出 %1 嗎? - + and 和 - + The recepient address is not valid, please recheck. 無效的收款位址, 請再檢查看看. - + The amount to pay must be larger than 0. 付款金額必須大於 0. - + Amount exceeds your balance 金額超過了你的餘額 - + Total exceeds your balance when the %1 transaction fee is included 加上交易手續費 %1 後的總金額超過了你的餘額 - + Duplicate address found, can only send to each address once in one send operation 發現了重複的位址; 在一次付款作業中, 只能付給每個位址一次 - + Error: Transaction creation failed 錯誤: 交易產生失敗 - + Error: 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. 錯誤: 交易被拒絕. 有時候會發生這種錯誤, 是因為你錢包中的一些錢已經被花掉了. 比如說你複製了錢包檔 wallet.dat, 然後用複製的錢包花掉了錢, 你現在所用的原來的錢包中卻沒有該筆交易紀錄. @@ -948,135 +1189,140 @@ p, li { white-space: pre-wrap; } TransactionDesc - + Open for %1 blocks 在 %1 個區塊內未定 - + Open until %1 在 %1 前未定 - + %1/offline? %1/離線中? - + %1/unconfirmed %1/未確認 - + %1 confirmations 經確認 %1 次 - + <b>Status:</b> <b>狀態:</b> - + , has not been successfully broadcast yet , 尚未成功公告出去 - + , broadcast through %1 node , 已公告至 %1 個節點 - + , broadcast through %1 nodes , 已公告至 %1 個節點 - + <b>Date:</b> <b>日期:</b> - + <b>Source:</b> Generated<br> <b>來源:</b> 生產所得<br> - - + + <b>From:</b> <b>來自:</b> - + unknown 未知 - - - + + + <b>To:</b> <b>目的:</b> - + (yours, label: (你的, 標記為: - + (yours) (你的) - - - - + + + + <b>Credit:</b> <b>入帳:</b> - + (%1 matures in %2 more blocks) (%1 將在 %2 個區塊產出後熟成) - + (not accepted) (不被接受) - - - + + + <b>Debit:</b> <b>出帳:</b> - + <b>Transaction fee:</b> <b>交易手續費:</b> - + <b>Net amount:</b> <b>淨額:</b> - + Message: 訊息: - + Comment: 附註: - + + Transaction ID: + 交易識別碼: + + + Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. 生產出來的錢要再等 120 個區塊產出之後, 才能夠花用. 當你產出區塊時, 它會被公布到網路上, 以被串連至區塊鎖鏈. 如果串連失敗了, 它的狀態就會變成"不被接受", 且不能被花用. 當你產出區塊的幾秒鐘內, 其他節點也產出了區塊的話, 有時候就會發生這種情形. @@ -1163,56 +1409,51 @@ p, li { white-space: pre-wrap; } - Received from IP - 收受於網路位址 + Received from + 收受自 - + Sent to 付出至 - - Sent to IP - 付出至網路位址 - - - + Payment to yourself 付給自己 - + Mined 開採所得 - + (n/a) (不適用) - + Transaction status. Hover over this field to show number of confirmations. 交易狀態. 移動游標至欄位上方來顯示確認次數. - + Date and time that the transaction was received. 收到交易的日期與時間. - + Type of transaction. 交易的種類. - + Destination address of transaction. 交易的目標位址. - + Amount removed from or added to balance. 減去或加入至餘額的金額 @@ -1291,16 +1532,21 @@ p, li { white-space: pre-wrap; } 最小金額 - + Copy address 複製位址 - + Copy label 複製標記 + + Copy amount + 複製金額 + + Edit label 編輯標記 @@ -1311,67 +1557,67 @@ p, li { white-space: pre-wrap; } 顯示明細... - + Export Transaction Data 匯出交易資料 - + Comma separated file (*.csv) 逗號分隔資料檔 (*.csv) - + Confirmed 已確認 - + Date 日期 - + Type 種類 - + Label 標記 - + Address 位址 - + Amount 金額 - + ID 識別碼 - + Error exporting 匯出錯誤 - + Could not write to file %1. 無法寫入至 %1 檔案. - + Range: 範圍: - + to 至 @@ -1379,7 +1625,7 @@ p, li { white-space: pre-wrap; } WalletModel - + Sending... 付出中... @@ -1398,936 +1644,363 @@ p, li { white-space: pre-wrap; } - Send command to -server or bitcoind - + Send command to -server or bitcoind 送指令至 -server 或 bitcoind - List commands - + List commands 列出指令 - Get help for a command - + Get help for a command 取得指令說明 - Options: - + Options: 選項: - Specify configuration file (default: bitcoin.conf) - + Specify configuration file (default: bitcoin.conf) 指定設定檔 (預設: bitcoin.conf) - Specify pid file (default: bitcoind.pid) - + Specify pid file (default: bitcoind.pid) 指定行程識別碼檔案 (預設: bitcoind.pid) - Generate coins - + Generate coins 生產位元幣 - Don't generate coins - + Don't generate coins 不生產位元幣 - Start minimized - + Start minimized 啓動時最小化 - Specify data directory - + Specify data directory 指定資料目錄 - Specify connection timeout (in milliseconds) - + Specify connection timeout (in milliseconds) 指定連線逾時時間 (毫秒) - Connect through socks4 proxy - + Connect through socks4 proxy 透過 socks4 代理伺服器連線 - Allow DNS lookups for addnode and connect - + Allow DNS lookups for addnode and connect 允許 addnode 和 connect 時做域名解析 - Add a node to connect to - + Listen for connections on <port> (default: 8333 or testnet: 18333) + 在通訊埠 <port> 聽候連線 (預è¨­: 8333, 或若為測試網路: 18333) + + + + Maintain at most <n> connections to peers (default: 125) + 維持與節點連線數的上限為 <n> 個 (預設: 125) + + + + Add a node to connect to 新增連線節點 - - Connect only to the specified node - + + Connect only to the specified node 只連線至指定節點 - - Don't accept connections from outside - + + Don't accept connections from outside 不接受外來連線 - - Don't attempt to use UPnP to map the listening port - + + Don't bootstrap list of peers using DNS + 初始化節點列表時不使用 DNS + + + + Threshold for disconnecting misbehaving peers (default: 100) + 與亂搞的節點斷線的臨界值 (預設: 100) + + + + Number of seconds to keep misbehaving peers from reconnecting (default: 86400) + 避免與亂搞的節點連線的秒數 (預設: 86400) + + + + Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000) + 每個連線的接收緩衝區大小上限為 <n>*1000 位元組 (預設: 10000) + + + + Maximum per-connection send buffer, <n>*1000 bytes (default: 10000) + 每個連線的傳送緩衝區大小上限為 <n>*1000 位元組 (預設: 10000) + + + + Don't attempt to use UPnP to map the listening port 不嘗試用 UPnP 來設定服務連接埠的對應 - - Attempt to use UPnP to map the listening port - + + Attempt to use UPnP to map the listening port 嘗試用 UPnP 來設定服務連接埠的對應 - - Fee per kB to add to transactions you send - - 交易付款時每 kB 的交易手續費 - + + Fee per kB to add to transactions you send + 交易付款時每 kB 的交易手續費 - - Accept command line and JSON-RPC commands - + + Accept command line and JSON-RPC commands 接受命令列與 JSON-RPC 指令 - - Run in the background as a daemon and accept commands - + + Run in the background as a daemon and accept commands 以背景程式執行並接受指令 - - Use the test network - + + Use the test network 使用測試網路 - - Username for JSON-RPC connections - + + Output extra debugging information + 輸出額外的除錯資訊 + + + + Prepend debug output with timestamp + 在除錯輸出內容前附加時間 + + + + Send trace/debug info to console instead of debug.log file + 輸出追蹤或除錯資訊至終端機, 而非 debug.log 檔案 + + + + Send trace/debug info to debugger + 輸出追蹤或除錯資訊給除錯器 + + + + Username for JSON-RPC connections JSON-RPC 連線使用者名稱 - - Password for JSON-RPC connections - + + Password for JSON-RPC connections JSON-RPC 連線密碼 - - Listen for JSON-RPC connections on <port> (default: 8332) - + + Listen for JSON-RPC connections on <port> (default: 8332) 在通訊埠 <port> 聽候 JSON-RPC 連線 (預設: 8332) - - Allow JSON-RPC connections from specified IP address - + + Allow JSON-RPC connections from specified IP address 只允許從指定網路位址來的 JSON-RPC 連線 - - Send commands to node running on <ip> (default: 127.0.0.1) - + + Send commands to node running on <ip> (default: 127.0.0.1) 送指令給在 <ip> 的節點 (預設: 127.0.0.1) - - Set key pool size to <n> (default: 100) - + + Set key pool size to <n> (default: 100) 設定密鑰池大小為 <n> (預設: 100) - - Rescan the block chain for missing wallet transactions - + + Rescan the block chain for missing wallet transactions 重新掃描區塊鎖鏈, 以尋找錢包所遺漏的交易. - + -SSL options: (see the Bitcoin Wiki for SSL setup instructions) - +SSL options: (see the Bitcoin Wiki for SSL setup instructions) SSL 選項: (SSL 設定程序請見 Bitcoin Wiki) - - Use OpenSSL (https) for JSON-RPC connections - + + Use OpenSSL (https) for JSON-RPC connections 使用 OpenSSL (https) 於JSON-RPC 連線 - - Server certificate file (default: server.cert) - + + Server certificate file (default: server.cert) 伺服器憑證檔 (預設: server.cert) - - Server private key (default: server.pem) - + + Server private key (default: server.pem) 伺服器密鑰檔 (預設: server.pem) - - Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - + + Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) 可以接受的加密法 (預設: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) - - This help message - + + This help message 此協助訊息 - + Cannot obtain a lock on data directory %s. Bitcoin is probably already running. 無法鎖定資料目錄 %s. 也許位元幣已經在執行了. - + Loading addresses... 載入位址中... - - Error loading addr.dat - - 載入 addr.dat 錯誤 - + + Error loading addr.dat + 載入 addr.dat 失敗 - - Loading block index... - 載入區塊索引中... + + Error loading blkindex.dat + 載入 blkindex.dat 失敗 - - Error loading blkindex.dat - - 載入 blkindex.dat 失敗 - + + Error loading wallet.dat: Wallet corrupted + 載入 wallet.dat 失敗: 錢包壞掉了 - - Loading wallet... - 載入錢包中... + + Error loading wallet.dat: Wallet requires newer version of Bitcoin + 載入 wallet.dat 失敗: 此錢包需要新版的 Bitcoin - - Error loading wallet.dat: Wallet corrupted - - 載入 wallet.dat 失敗: 錢包壞掉了 - + + Wallet needed to be rewritten: restart Bitcoin to complete + 錢包需要重寫: 請重啟位元幣來完成 - - Error loading wallet.dat: Wallet requires newer version of Bitcoin - - 載入 wallet.dat 錯誤: 此錢包需要新版的 Bitcoin - + + Error loading wallet.dat + 載入 wallet.dat 失敗 - - Error loading wallet.dat - - 載入 wallet.dat 錯誤 - + + Loading block index... + 載入區塊索引中... - + + Loading wallet... + 載入錢包中... + + + Rescanning... 重新掃描中... - + Done loading 載入完成 - + Invalid -proxy address 無效的 -proxy 位址 - + Invalid amount for -paytxfee=<amount> -paytxfee=<金額> 中的金額無效 - + Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction. 警告: -paytxfee 設定得很高. 這是當你交易付款時所要支付的手續費. - + Error: CreateThread(StartNode) failed 錯誤: CreateThread(StartNode) 失敗 - + Warning: Disk space is low 警告: 磁碟空間很少 - + Unable to bind to port %d on this computer. Bitcoin is probably already running. 無法與這台電腦上的通訊埠 %d 連結. 也許 Bitcoin 已經在執行了. - - This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee? - 這筆交易的資料大小超過限制了. 你還是可以付出 %s 的費用來傳送. 這項費用會付給處理該筆交易的節點, 並幫助維持整個網路. 你願意支付這項費用嗎? - - - - Enter the current passphrase to the wallet. - 輸入錢包目前的密碼. - - - - Passphrase - 密碼 - - - - Please supply the current wallet decryption passphrase. - 請提供錢包目前的解密密碼 - - - - The passphrase entered for the wallet decryption was incorrect. - 輸入的錢包解密密碼不對 - - - - Status - 狀態 - - - - Date - 日期 - - - - Description - 說明 - - - - Debit - 出帳 - - - - Credit - 入帳 - - - Open for %d blocks - 在 %d 個區塊內未定 - - - - Open until %s - 在 %s 前未定 - - - - %d/offline? - %d/斷線中? - - - - %d/unconfirmed - %d/未確認 - - - - %d confirmations - 經確認 %d 次 - - - - Generated - 已產出 - - - - Generated (%s matures in %d more blocks) - 已產出 (%s 將在 %d 個區塊產出後熟成) - - - - Generated - Warning: This block was not received by any other nodes and will probably not be accepted! - 已產出 - 警告: 沒有任何的其他節點收到此區塊, 也許不會被接受! - - - - Generated (not accepted) - 已產出 (不被接受) - - - - From: - 來自: - - - - Received with: - 收受於: - - - - Payment to yourself - 付給自己 - - - - To: - 目的: - - - - Generating - 生產中 - - - - (not connected) - (未連線) - - - - %d connections %d blocks %d transactions - %d 個連線 %d 個區塊 %d 次交易 - - - - Wallet already encrypted. - 錢包已經加密了. - - - - Enter the new passphrase to the wallet. -Please use a passphrase of 10 or more random characters, or eight or more words. - 輸入錢包的新密碼. -密碼請用 10 個以上的字元, 或是 8 個以上的字詞. - - - - Error: The supplied passphrase was too short. - 錯誤: 提供的密碼太短了. - - - - WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS! -Are you sure you wish to encrypt your wallet? - 警告: 如果將錢包加密後忘記密碼, 你會失去其中所有的位元幣! -你確定要將錢包加密嗎? - - - - Please re-enter your new wallet passphrase. - 請再輸入一次新密碼. - - - - Error: the supplied passphrases didn't match. - 錯誤: 提供的密碼不相符. - - - - Wallet encryption failed. - 錢包加密失敗. - - - - Wallet Encrypted. -Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - 錢包已加密. -請記得, 即使將錢包加密, 也不能完全防止因惡意軟體入侵, 而導致位元幣被偷. - - - - Wallet is unencrypted, please encrypt it first. - 錢包未加密, 請先加密. - - - - Enter the new passphrase for the wallet. - 輸入錢包的新密碼. - - - - Re-enter the new passphrase for the wallet. - 再輸入一次錢包的新密碼. - - - - Wallet Passphrase Changed. - 錢包密碼已變更. - - - - New Receiving Address - 新增收款位址 - - - - You should use a new address for each payment you receive. - -Label - 每次收款你都應該要用一個新的位址. - -標記 - - - - <b>Status:</b> - <b>狀態:</b> - - - - , has not been successfully broadcast yet - , 尚未成功公告出去 - - - - , broadcast through %d node - , 公告至 %d 個節點 - - - - , broadcast through %d nodes - , 公告至 %d 個節點 - - - - <b>Date:</b> - <b>日期:</b> - - - - <b>Source:</b> Generated<br> - <b>來源:</b> 生產所得<br> - - - - <b>From:</b> - <b>來自:</b> - - - - unknown - 不明 - - - - <b>To:</b> - <b>目的:</b> - - - - (yours, label: - (你的, 標記為: - - - - (yours) - (你的) - - - - <b>Credit:</b> - <b>入帳:</b> - - - - (%s matures in %d more blocks) - (%s 將在 %d 個區塊產出後熟成) - - - - (not accepted) - (不被接受) - - - - <b>Debit:</b> - <b>出帳:</b> - - - - <b>Transaction fee:</b> - <b>交易手續費:</b> - - - - <b>Net amount:</b> - <b>淨額:</b> - - - - Message: - 訊息: - - - - Comment: - 附註: - - - - Generated coins must wait 120 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, it will change to "not accepted" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - 生產出來的錢要再等 120 個區塊產出之後, 才能夠花用. 當你產出區塊時, 它會被公布到網路上, 以被串連至區塊鎖鏈. 如果串連失敗了, 它的狀態就會變成"不被接受", 且不能被花用. 當你產出區塊的幾秒鐘內, 其他節點也產出了區塊的話, 有時候就會發生這種情形. - - - - Cannot write autostart/bitcoin.desktop file - 無法寫入 autostart/bitcoin.desktop 檔案 - - - - Main - 主要 - - - - &Start Bitcoin on window system startup - 視窗系統啓動時同時開啓位元幣 - - - - &Minimize on close - 關閉時最小化 - - - - version %s - %s 版 - - - - Error in amount - 金額有誤 - - - - Send Coins - 付錢 - - - - Amount exceeds your balance - 金額超過了餘額 - - - - Total exceeds your balance when the - 包含手續費 - - - - transaction fee is included - 後總額超過了餘額 - - - - Payment sent - 已付款 - - - - Sending... - 付出中... - - - - Invalid address - 無效的位址 - - - - Sending %s to %s - 付出 %s 給 %s - - - - CANCELLED - 已取消 - - - - Cancelled - 已取消 - - - - Transfer cancelled - 交易已取消 - - - - Error: - 錯誤: - - - - Insufficient funds - 累積金額不足 - - - - Connecting... - 連線中... - - - - Unable to connect - 無法連線 - - - - Requesting public key... - 請求公鑰中... - - - - Received public key... - 接收公鑰中... - - - - Recipient is not accepting transactions sent by IP address - 收款人不接受來自以下網路位址的交易: - - - - Transfer was not accepted - 轉帳不被接受 - - - - Invalid response received - 收到了無效的回應 - - - - Creating transaction... - 交易建立中... - - - - This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds - 這筆交易因為金額或複雜度或最近累積收款的關係, 需要至少 %s 的手續費 - - - - Transaction creation failed - 交易建立失敗 - - - - Transaction aborted - 交易取消 - - - - Lost connection, transaction cancelled - 斷線了, 交易已取消 - - - - Sending payment... - 付款中... - - - - 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. - 交易被拒絕了. 有時候會發生這種事, 是因為你錢包中的一些錢已經被花掉了. 比如說你複製了錢包檔 wallet.dat, 然後用複製的錢包花掉了錢, 你現在所用的原來的錢包中卻沒有該筆交易紀錄. - - - - Waiting for confirmation... - 等待確認中... - - - - The payment was sent, but the recipient was unable to verify it. -The transaction is recorded and will credit to the recipient, -but the comment information will be blank. - 已付款, 但是無法驗證收款人. -這筆交易已經被紀錄了, 金額也會被記入至收款人的帳戶, -然而附註資訊將會是空白. - - - - Payment was sent, but an invalid response was received - 已付款, 但是收到無效的回應 - - - - Payment completed - 付款完成 - - - - Name - 名稱 - - - - Address - 位址 - - - - Label - 標記 - - - - Bitcoin Address - 位元幣位址 - - - - This is one of your own addresses for receiving payments and cannot be entered in the address book. - 這是你的一個收款位址, 因而無法輸入於位址簿中. - - - - Edit Address - 編輯位址 - - - - Edit Address Label - 編輯位址標記 - - - - Add Address - 新增位址 - - - - Bitcoin - 位元幣 - - - - Bitcoin - Generating - 位元幣 - 生產中 - - - - Bitcoin - (not connected) - 位元幣 - (未連線) - - - - &Open Bitcoin - 開啓位元幣 - - - - &Send Bitcoins - 付位元幣 - - - - O&ptions... - 選項... - - - - E&xit - 結束 - - - - Program has crashed and will terminate. - 程式已當掉且將被終止. - - - Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly. 警告: 請檢查電腦時間日期是否正確. 位元幣無法在時鐘不準的情況下正常運作. - + beta 公測版 - - main - - - Bitcoin Qt - 位元幣Qt版 - - \ No newline at end of file diff --git a/src/qt/messagepage.cpp b/src/qt/messagepage.cpp new file mode 100644 index 0000000..46a0cba --- /dev/null +++ b/src/qt/messagepage.cpp @@ -0,0 +1,107 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include "main.h" +#include "wallet.h" +#include "init.h" +#include "util.h" + +#include "messagepage.h" +#include "ui_messagepage.h" + +#include "addressbookpage.h" +#include "guiutil.h" +#include "walletmodel.h" + +MessagePage::MessagePage(QWidget *parent) : + QDialog(parent), + ui(new Ui::MessagePage) +{ + ui->setupUi(this); + + GUIUtil::setupAddressWidget(ui->signFrom, this); +} + +MessagePage::~MessagePage() +{ + delete ui; +} + +void MessagePage::setModel(WalletModel *model) +{ + this->model = model; +} + +void MessagePage::setAddress(QString addr) +{ + ui->signFrom->setText(addr); + ui->message->setFocus(); +} + +void MessagePage::on_pasteButton_clicked() +{ + setAddress(QApplication::clipboard()->text()); +} + +void MessagePage::on_addressBookButton_clicked() +{ + AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::ReceivingTab, this); + dlg.setModel(model->getAddressTableModel()); + if(dlg.exec()) + { + setAddress(dlg.getReturnValue()); + } +} + +void MessagePage::on_copyToClipboard_clicked() +{ + QApplication::clipboard()->setText(ui->signature->text()); +} + +void MessagePage::on_signMessage_clicked() +{ + QString address = ui->signFrom->text(); + + CBitcoinAddress addr(address.toStdString()); + if (!addr.IsValid()) + { + QMessageBox::critical(this, tr("Error signing"), tr("%1 is not a valid address.").arg(address), + QMessageBox::Abort, QMessageBox::Abort); + return; + } + + WalletModel::UnlockContext ctx(model->requestUnlock()); + if(!ctx.isValid()) + { + // Unlock wallet was cancelled + return; + } + + CKey key; + if (!pwalletMain->GetKey(addr, key)) + { + QMessageBox::critical(this, tr("Error signing"), tr("Private key for %1 is not available.").arg(address), + QMessageBox::Abort, QMessageBox::Abort); + return; + } + + CDataStream ss(SER_GETHASH); + ss << strMessageMagic; + ss << ui->message->document()->toPlainText().toStdString(); + + std::vector vchSig; + if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig)) + { + QMessageBox::critical(this, tr("Error signing"), tr("Sign failed"), + QMessageBox::Abort, QMessageBox::Abort); + } + + ui->signature->setText(QString::fromStdString(EncodeBase64(&vchSig[0], vchSig.size()))); + ui->signature->setFont(GUIUtil::bitcoinAddressFont()); +} diff --git a/src/qt/messagepage.h b/src/qt/messagepage.h new file mode 100644 index 0000000..55e6228 --- /dev/null +++ b/src/qt/messagepage.h @@ -0,0 +1,38 @@ +#ifndef MESSAGEPAGE_H +#define MESSAGEPAGE_H + +#include + +namespace Ui { + class MessagePage; +} +class WalletModel; + +QT_BEGIN_NAMESPACE +QT_END_NAMESPACE + +class MessagePage : public QDialog +{ + Q_OBJECT + +public: + explicit MessagePage(QWidget *parent = 0); + ~MessagePage(); + + void setModel(WalletModel *model); + + void setAddress(QString); + +private: + Ui::MessagePage *ui; + WalletModel *model; + +private slots: + void on_pasteButton_clicked(); + void on_addressBookButton_clicked(); + + void on_signMessage_clicked(); + void on_copyToClipboard_clicked(); +}; + +#endif // MESSAGEPAGE_H diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp index a2314ca..e668079 100644 --- a/src/qt/notificator.cpp +++ b/src/qt/notificator.cpp @@ -52,10 +52,13 @@ Notificator::Notificator(const QString &programName, QSystemTrayIcon *trayicon, OSStatus status = LSGetApplicationForInfo(kLSUnknownType, kLSUnknownCreator, CFSTR("growlTicket"), kLSRolesAll, 0, &cfurl); if (status != kLSApplicationNotFoundErr) { CFBundleRef bundle = CFBundleCreate(0, cfurl); - CFRelease(cfurl); if (CFStringCompare(CFBundleGetIdentifier(bundle), CFSTR("com.Growl.GrowlHelperApp"), kCFCompareCaseInsensitive | kCFCompareBackwards) == kCFCompareEqualTo) { - mode = Growl; + if (CFStringHasSuffix(CFURLGetString(cfurl), CFSTR("/Growl.app/"))) + mode = Growl13; + else + mode = Growl12; } + CFRelease(cfurl); CFRelease(bundle); } #endif @@ -226,7 +229,7 @@ void Notificator::notifySystray(Class cls, const QString &title, const QString & void Notificator::notifyGrowl(Class cls, const QString &title, const QString &text, const QIcon &icon) { const QString script( - "tell application \"GrowlHelperApp\"\n" + "tell application \"%5\"\n" " set the allNotificationsList to {\"Notification\"}\n" // -- Make a list of all the notification types (all) " set the enabledNotificationsList to {\"Notification\"}\n" // -- Make a list of the notifications (enabled) " register as application \"%1\" all notifications allNotificationsList default notifications enabledNotificationsList\n" // -- Register our script with Growl @@ -265,7 +268,8 @@ void Notificator::notifyGrowl(Class cls, const QString &title, const QString &te QString quotedTitle(title), quotedText(text); quotedTitle.replace("\\", "\\\\").replace("\"", "\\"); quotedText.replace("\\", "\\\\").replace("\"", "\\"); - qt_mac_execute_apple_script(script.arg(notificationApp, quotedTitle, quotedText, notificationIcon), 0); + QString growlApp(this->mode == Notificator::Growl13 ? "Growl" : "GrowlHelperApp"); + qt_mac_execute_apple_script(script.arg(notificationApp, quotedTitle, quotedText, notificationIcon, growlApp), 0); } #endif @@ -282,7 +286,8 @@ void Notificator::notify(Class cls, const QString &title, const QString &text, c notifySystray(cls, title, text, icon, millisTimeout); break; #ifdef Q_WS_MAC - case Growl: + case Growl12: + case Growl13: notifyGrowl(cls, title, text, icon); break; #endif diff --git a/src/qt/notificator.h b/src/qt/notificator.h index 2d83013..0271c26 100644 --- a/src/qt/notificator.h +++ b/src/qt/notificator.h @@ -49,7 +49,8 @@ private: None, /**< Ignore informational notifications, and show a modal pop-up dialog for Critical notifications. */ Freedesktop, /**< Use DBus org.freedesktop.Notifications */ QSystemTray, /**< Use QSystemTray::showMessage */ - Growl /**< Use the Growl notification system (Mac only) */ + Growl12, /**< Use the Growl 1.2 notification system (Mac only) */ + Growl13 /**< Use the Growl 1.3 notification system (Mac only) */ }; QString programName; Mode mode; diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index efc216d..ed2225c 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -1,20 +1,94 @@ #include "optionsmodel.h" #include "bitcoinunits.h" +#include #include "headers.h" +#include "init.h" -OptionsModel::OptionsModel(CWallet *wallet, QObject *parent) : - QAbstractListModel(parent), - wallet(wallet), - nDisplayUnit(BitcoinUnits::BTC), - bDisplayAddresses(false) +OptionsModel::OptionsModel(QObject *parent) : + QAbstractListModel(parent) { - // Read our specific settings from the wallet db - CWalletDB walletdb(wallet->strWalletFile); - walletdb.ReadSetting("nDisplayUnit", nDisplayUnit); - walletdb.ReadSetting("bDisplayAddresses", bDisplayAddresses); + Init(); } +void OptionsModel::Init() +{ + QSettings settings; + + // These are QT-only settings: + nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt(); + bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool(); + fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool(); + fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool(); + nTransactionFee = settings.value("nTransactionFee").toLongLong(); + + // These are shared with core bitcoin; we want + // command-line options to override the GUI settings: + if (settings.contains("fUseUPnP")) + SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool()); + if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool()) + SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString()); +} + +bool OptionsModel::Upgrade() +{ + QSettings settings; + + if (settings.contains("bImportFinished")) + return false; // Already upgraded + + settings.setValue("bImportFinished", true); + + // Move settings from old wallet.dat (if any): + CWalletDB walletdb("wallet.dat"); + + QList intOptions; + intOptions << "nDisplayUnit" << "nTransactionFee"; + foreach(QString key, intOptions) + { + int value = 0; + if (walletdb.ReadSetting(key.toStdString(), value)) + { + settings.setValue(key, value); + walletdb.EraseSetting(key.toStdString()); + } + } + QList boolOptions; + boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseUPnP"; + foreach(QString key, boolOptions) + { + bool value = false; + if (walletdb.ReadSetting(key.toStdString(), value)) + { + settings.setValue(key, value); + walletdb.EraseSetting(key.toStdString()); + } + } + try + { + CAddress addrProxyAddress; + if (walletdb.ReadSetting("addrProxy", addrProxyAddress)) + { + addrProxy = addrProxyAddress; + settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str()); + walletdb.EraseSetting("addrProxy"); + } + } + catch (std::ios_base::failure &e) + { + // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress + if (walletdb.ReadSetting("addrProxy", addrProxy)) + { + settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str()); + walletdb.EraseSetting("addrProxy"); + } + } + Init(); + + return true; +} + + int OptionsModel::rowCount(const QModelIndex & parent) const { return OptionIDRowCount; @@ -24,22 +98,23 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const { if(role == Qt::EditRole) { + QSettings settings; switch(index.row()) { case StartAtStartup: - return QVariant(); + return QVariant(GetStartOnSystemStartup()); case MinimizeToTray: return QVariant(fMinimizeToTray); case MapPortUPnP: - return QVariant(fUseUPnP); + return settings.value("fUseUPnP", GetBoolArg("-upnp", true)); case MinimizeOnClose: return QVariant(fMinimizeOnClose); case ConnectSOCKS4: - return QVariant(fUseProxy); + return settings.value("fUseProxy", false); case ProxyIP: return QVariant(QString::fromStdString(addrProxy.ToStringIP())); case ProxyPort: - return QVariant(QString::fromStdString(addrProxy.ToStringPort())); + return QVariant(addrProxy.GetPort()); case Fee: return QVariant(nTransactionFee); case DisplayUnit: @@ -58,39 +133,39 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in bool successful = true; /* set to false on parse error */ if(role == Qt::EditRole) { - CWalletDB walletdb(wallet->strWalletFile); + QSettings settings; switch(index.row()) { case StartAtStartup: - successful = false; /*TODO*/ + successful = SetStartOnSystemStartup(value.toBool()); break; case MinimizeToTray: fMinimizeToTray = value.toBool(); - walletdb.WriteSetting("fMinimizeToTray", fMinimizeToTray); + settings.setValue("fMinimizeToTray", fMinimizeToTray); break; case MapPortUPnP: - fUseUPnP = value.toBool(); - walletdb.WriteSetting("fUseUPnP", fUseUPnP); -#ifdef USE_UPNP - MapPort(fUseUPnP); -#endif + { + bool bUseUPnP = value.toBool(); + settings.setValue("fUseUPnP", bUseUPnP); + MapPort(bUseUPnP); + } break; case MinimizeOnClose: fMinimizeOnClose = value.toBool(); - walletdb.WriteSetting("fMinimizeOnClose", fMinimizeOnClose); + settings.setValue("fMinimizeOnClose", fMinimizeOnClose); break; case ConnectSOCKS4: fUseProxy = value.toBool(); - walletdb.WriteSetting("fUseProxy", fUseProxy); + settings.setValue("fUseProxy", fUseProxy); break; case ProxyIP: { // Use CAddress to parse and check IP - CAddress addr(value.toString().toStdString() + ":1"); - if (addr.ip != INADDR_NONE) + CNetAddr addr(value.toString().toStdString()); + if (addr.IsValid()) { - addrProxy.ip = addr.ip; - walletdb.WriteSetting("addrProxy", addrProxy); + addrProxy.SetIP(addr); + settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str()); } else { @@ -101,10 +176,10 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in case ProxyPort: { int nPort = atoi(value.toString().toAscii().data()); - if (nPort > 0 && nPort < USHRT_MAX) + if (nPort > 0 && nPort < std::numeric_limits::max()) { - addrProxy.port = htons(nPort); - walletdb.WriteSetting("addrProxy", addrProxy); + addrProxy.SetPort(nPort); + settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str()); } else { @@ -114,18 +189,18 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in break; case Fee: { nTransactionFee = value.toLongLong(); - walletdb.WriteSetting("nTransactionFee", nTransactionFee); + settings.setValue("nTransactionFee", nTransactionFee); } break; case DisplayUnit: { int unit = value.toInt(); nDisplayUnit = unit; - walletdb.WriteSetting("nDisplayUnit", nDisplayUnit); + settings.setValue("nDisplayUnit", nDisplayUnit); emit displayUnitChanged(unit); } case DisplayAddresses: { bDisplayAddresses = value.toBool(); - walletdb.WriteSetting("bDisplayAddresses", bDisplayAddresses); + settings.setValue("bDisplayAddresses", bDisplayAddresses); } default: break; diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 775362d..0be70f8 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -3,8 +3,6 @@ #include -class CWallet; - /** Interface from QT to configuration data structure for bitcoin client. To QT, the options are presented as a list with the different options laid out vertically. @@ -15,7 +13,7 @@ class OptionsModel : public QAbstractListModel { Q_OBJECT public: - explicit OptionsModel(CWallet *wallet, QObject *parent = 0); + explicit OptionsModel(QObject *parent = 0); enum OptionID { StartAtStartup, // bool @@ -31,6 +29,11 @@ public: OptionIDRowCount }; + void Init(); + + /* Migrate settings from wallet.dat after app initialization */ + bool Upgrade(); /* returns true if settings upgraded */ + int rowCount(const QModelIndex & parent = QModelIndex()) const; QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); @@ -42,10 +45,10 @@ public: int getDisplayUnit(); bool getDisplayAddresses(); private: - // Wallet stores persistent options - CWallet *wallet; int nDisplayUnit; bool bDisplayAddresses; + bool fMinimizeToTray; + bool fMinimizeOnClose; signals: void displayUnitChanged(int unit); diff --git a/src/qt/qrcodedialog.cpp b/src/qt/qrcodedialog.cpp new file mode 100644 index 0000000..8295983 --- /dev/null +++ b/src/qt/qrcodedialog.cpp @@ -0,0 +1,110 @@ +#include "qrcodedialog.h" +#include "ui_qrcodedialog.h" +#include "guiutil.h" + +#include +#include +#include + +#include + +#define EXPORT_IMAGE_SIZE 256 + +QRCodeDialog::QRCodeDialog(const QString &title, const QString &addr, const QString &label, bool enableReq, QWidget *parent) : + QDialog(parent), + ui(new Ui::QRCodeDialog), + address(addr) +{ + ui->setupUi(this); + setWindowTitle(title); + setAttribute(Qt::WA_DeleteOnClose); + + ui->chkReq->setVisible(enableReq); + ui->lnReqAmount->setVisible(enableReq); + ui->lblAm1->setVisible(enableReq); + ui->lblAm2->setVisible(enableReq); + + ui->lnLabel->setText(label); + + genCode(); +} + +QRCodeDialog::~QRCodeDialog() +{ + delete ui; +} + +void QRCodeDialog::genCode() +{ + QString uri = getURI(); + //qDebug() << "Encoding:" << uri.toUtf8().constData(); + QRcode *code = QRcode_encodeString(uri.toUtf8().constData(), 0, QR_ECLEVEL_L, QR_MODE_8, 1); + myImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32); + myImage.fill(0xffffff); + unsigned char *p = code->data; + for(int y = 0; y < code->width; y++) { + for(int x = 0; x < code->width; x++) { + myImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff)); + p++; + } + } + QRcode_free(code); + ui->lblQRCode->setPixmap(QPixmap::fromImage(myImage).scaled(300, 300)); +} + +QString QRCodeDialog::getURI() +{ + QString ret = QString("bitcoin:%1").arg(address); + + int paramCount = 0; + if(ui->chkReq->isChecked() && ui->lnReqAmount->text().isEmpty() == false) { + bool ok= false; + double amount = ui->lnReqAmount->text().toDouble(&ok); + if(ok) { + ret += QString("?amount=%1X8").arg(ui->lnReqAmount->text()); + paramCount++; + } + } + + if(ui->lnLabel->text().isEmpty() == false) { + QString lbl(QUrl::toPercentEncoding(ui->lnLabel->text())); + ret += QString("%1label=%2").arg(paramCount == 0 ? "?" : "&").arg(lbl); + paramCount++; + } + + if(ui->lnMessage->text().isEmpty() == false) { + QString msg(QUrl::toPercentEncoding(ui->lnMessage->text())); + ret += QString("%1message=%2").arg(paramCount == 0 ? "?" : "&").arg(msg); + paramCount++; + } + + return ret; +} + +void QRCodeDialog::on_lnReqAmount_textChanged(const QString &) +{ + genCode(); +} + +void QRCodeDialog::on_lnLabel_textChanged(const QString &) +{ + genCode(); +} + +void QRCodeDialog::on_lnMessage_textChanged(const QString &) +{ + genCode(); +} + +void QRCodeDialog::on_btnSaveAs_clicked() +{ + QString fn = GUIUtil::getSaveFileName(this, tr("Save Image..."), QString(), tr("PNG Images (*.png)")); + if(!fn.isEmpty()) { + myImage.scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE).save(fn); + } +} + +void QRCodeDialog::on_chkReq_toggled(bool) +{ + genCode(); +} diff --git a/src/qt/qrcodedialog.h b/src/qt/qrcodedialog.h new file mode 100644 index 0000000..7463a88 --- /dev/null +++ b/src/qt/qrcodedialog.h @@ -0,0 +1,37 @@ +#ifndef QRCODEDIALOG_H +#define QRCODEDIALOG_H + +#include +#include + +namespace Ui { + class QRCodeDialog; +} + +class QRCodeDialog : public QDialog +{ + Q_OBJECT + +public: + explicit QRCodeDialog(const QString &title, const QString &address, const QString &label, bool allowReq, QWidget *parent = 0); + ~QRCodeDialog(); + +private slots: + void on_lnReqAmount_textChanged(const QString &arg1); + void on_lnLabel_textChanged(const QString &arg1); + void on_lnMessage_textChanged(const QString &arg1); + void on_btnSaveAs_clicked(); + + void on_chkReq_toggled(bool checked); + +private: + Ui::QRCodeDialog *ui; + QImage myImage; + + QString getURI(); + QString address; + + void genCode(); +}; + +#endif // QRCODEDIALOG_H diff --git a/src/qt/qtipcserver.cpp b/src/qt/qtipcserver.cpp new file mode 100644 index 0000000..8b9270e --- /dev/null +++ b/src/qt/qtipcserver.cpp @@ -0,0 +1,88 @@ +// Copyright (c) 2009-2012 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include +#include + +#include "headers.h" + +using namespace boost::interprocess; +using namespace boost::posix_time; +using namespace boost; +using namespace std; + +void ipcShutdown() +{ + message_queue::remove("BitcoinURL"); +} + +void ipcThread(void* parg) +{ + message_queue* mq = (message_queue*)parg; + char strBuf[257]; + size_t nSize; + unsigned int nPriority; + loop + { + ptime d = boost::posix_time::microsec_clock::universal_time() + millisec(100); + if(mq->timed_receive(&strBuf, sizeof(strBuf), nSize, nPriority, d)) + { + ThreadSafeHandleURL(std::string(strBuf, nSize)); + Sleep(1000); + } + if (fShutdown) + { + ipcShutdown(); + break; + } + } + ipcShutdown(); +} + +void ipcInit() +{ +#ifdef MAC_OSX + // TODO: implement bitcoin: URI handling the Mac Way + return; +#endif +#ifdef WIN32 + // TODO: THOROUGHLY test boost::interprocess fix, + // and make sure there are no Windows argument-handling exploitable + // problems. + return; +#endif + + message_queue* mq; + char strBuf[257]; + size_t nSize; + unsigned int nPriority; + try { + mq = new message_queue(open_or_create, "BitcoinURL", 2, 256); + + // Make sure we don't lose any bitcoin: URIs + for (int i = 0; i < 2; i++) + { + ptime d = boost::posix_time::microsec_clock::universal_time() + millisec(1); + if(mq->timed_receive(&strBuf, sizeof(strBuf), nSize, nPriority, d)) + { + ThreadSafeHandleURL(std::string(strBuf, nSize)); + } + else + break; + } + + // Make sure only one bitcoin instance is listening + message_queue::remove("BitcoinURL"); + mq = new message_queue(open_or_create, "BitcoinURL", 2, 256); + } + catch (interprocess_exception &ex) { + return; + } + if (!CreateThread(ipcThread, mq)) + { + delete mq; + } +} diff --git a/src/qt/qtipcserver.h b/src/qt/qtipcserver.h new file mode 100644 index 0000000..1de0334 --- /dev/null +++ b/src/qt/qtipcserver.h @@ -0,0 +1,2 @@ +void ipcInit(); +void ipcShutdown(); diff --git a/src/qt/res/icons/filesave.png b/src/qt/res/icons/filesave.png new file mode 100644 index 0000000..ae13a15 Binary files /dev/null and b/src/qt/res/icons/filesave.png differ diff --git a/src/qt/res/images/qrcode.png b/src/qt/res/images/qrcode.png new file mode 100644 index 0000000..c89a49b Binary files /dev/null and b/src/qt/res/images/qrcode.png differ diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index e465b41..964313e 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -30,6 +30,8 @@ SendCoinsDialog::SendCoinsDialog(QWidget *parent) : connect(ui->addButton, SIGNAL(clicked()), this, SLOT(addEntry())); connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear())); + + fNewRecipientAllowed = true; } void SendCoinsDialog::setModel(WalletModel *model) @@ -92,6 +94,8 @@ void SendCoinsDialog::on_sendButton_clicked() formatted.append(tr("%1 to %2 (%3)").arg(BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, rcp.amount), Qt::escape(rcp.label), rcp.address)); } + fNewRecipientAllowed = false; + QMessageBox::StandardButton retval = QMessageBox::question(this, tr("Confirm send coins"), tr("Are you sure you want to send %1?").arg(formatted.join(tr(" and "))), QMessageBox::Yes|QMessageBox::Cancel, @@ -99,6 +103,7 @@ void SendCoinsDialog::on_sendButton_clicked() if(retval != QMessageBox::Yes) { + fNewRecipientAllowed = true; return; } @@ -106,6 +111,7 @@ void SendCoinsDialog::on_sendButton_clicked() if(!ctx.isValid()) { // Unlock wallet was cancelled + fNewRecipientAllowed = true; return; } @@ -152,6 +158,7 @@ void SendCoinsDialog::on_sendButton_clicked() accept(); break; } + fNewRecipientAllowed = true; } void SendCoinsDialog::clear() @@ -236,6 +243,9 @@ QWidget *SendCoinsDialog::setupTabChain(QWidget *prev) void SendCoinsDialog::pasteEntry(const SendCoinsRecipient &rv) { + if (!fNewRecipientAllowed) + return; + SendCoinsEntry *entry = 0; // Replace the first entry if it is still unused if(ui->entries->count() == 1) @@ -255,16 +265,6 @@ void SendCoinsDialog::pasteEntry(const SendCoinsRecipient &rv) } -void SendCoinsDialog::handleURL(const QUrl *url) -{ - SendCoinsRecipient rv; - if(!GUIUtil::parseBitcoinURL(url, &rv)) - { - return; - } - pasteEntry(rv); -} - void SendCoinsDialog::handleURL(const QString &url) { SendCoinsRecipient rv; diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h index 53d05b9..4dc3f08 100644 --- a/src/qt/sendcoinsdialog.h +++ b/src/qt/sendcoinsdialog.h @@ -30,7 +30,6 @@ public: QWidget *setupTabChain(QWidget *prev); void pasteEntry(const SendCoinsRecipient &rv); - void handleURL(const QUrl *url); void handleURL(const QString &url); public slots: @@ -44,6 +43,7 @@ public slots: private: Ui::SendCoinsDialog *ui; WalletModel *model; + bool fNewRecipientAllowed; private slots: void on_sendButton_clicked(); diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp new file mode 100644 index 0000000..0a08eaf --- /dev/null +++ b/src/qt/test/test_main.cpp @@ -0,0 +1,11 @@ +#include +#include + +#include "urltests.h" + +// This is all you need to run all the tests +int main(int argc, char *argv[]) +{ + URLTests test1; + QTest::qExec(&test1); +} diff --git a/src/qt/test/urltests.cpp b/src/qt/test/urltests.cpp new file mode 100644 index 0000000..1f11795 --- /dev/null +++ b/src/qt/test/urltests.cpp @@ -0,0 +1,71 @@ +#include "urltests.h" +#include "../guiutil.h" +#include "../walletmodel.h" + +#include + +/* +struct SendCoinsRecipient +{ + QString address; + QString label; + qint64 amount; +}; +*/ + +void URLTests::urlTests() +{ + SendCoinsRecipient rv; + QUrl url; + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-dontexist=")); + QVERIFY(!GUIUtil::parseBitcoinURL(url, &rv)); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?dontexist=")); + QVERIFY(GUIUtil::parseBitcoinURL(url, &rv)); + QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); + QVERIFY(rv.label == QString()); + QVERIFY(rv.amount == 0); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?label=Wikipedia Example Address")); + QVERIFY(GUIUtil::parseBitcoinURL(url, &rv)); + QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); + QVERIFY(rv.label == QString("Wikipedia Example Address")); + QVERIFY(rv.amount == 0); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=0.001")); + QVERIFY(GUIUtil::parseBitcoinURL(url, &rv)); + QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); + QVERIFY(rv.label == QString()); + QVERIFY(rv.amount == 100000); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1.001")); + QVERIFY(GUIUtil::parseBitcoinURL(url, &rv)); + QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); + QVERIFY(rv.label == QString()); + QVERIFY(rv.amount == 100100000); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=100&label=Wikipedia Example")); + QVERIFY(GUIUtil::parseBitcoinURL(url, &rv)); + QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); + QVERIFY(rv.amount == 10000000000); + QVERIFY(rv.label == QString("Wikipedia Example")); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?message=Wikipedia Example Address")); + QVERIFY(GUIUtil::parseBitcoinURL(url, &rv)); + QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); + QVERIFY(rv.label == QString()); + + QVERIFY(GUIUtil::parseBitcoinURL("bitcoin://175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?message=Wikipedia Example Address", &rv)); + QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); + QVERIFY(rv.label == QString()); + + // We currently dont implement the message paramenter (ok, yea, we break spec...) + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-message=Wikipedia Example Address")); + QVERIFY(!GUIUtil::parseBitcoinURL(url, &rv)); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1,000&label=Wikipedia Example")); + QVERIFY(!GUIUtil::parseBitcoinURL(url, &rv)); + + url.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1,000.0&label=Wikipedia Example")); + QVERIFY(!GUIUtil::parseBitcoinURL(url, &rv)); +} diff --git a/src/qt/test/urltests.h b/src/qt/test/urltests.h new file mode 100644 index 0000000..393c511 --- /dev/null +++ b/src/qt/test/urltests.h @@ -0,0 +1,15 @@ +#ifndef URLTESTS_H +#define URLTESTS_H + +#include +#include + +class URLTests : public QObject +{ + Q_OBJECT + +private slots: + void urlTests(); +}; + +#endif // URLTESTS_H diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 6ca3ac8..089fe75 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -7,25 +7,9 @@ #include "qtui.h" #include -#include // For Qt::escape using namespace std; -QString TransactionDesc::HtmlEscape(const QString& str, bool fMultiLine) -{ - QString escaped = Qt::escape(str); - if(fMultiLine) - { - escaped = escaped.replace("\n", "
\n"); - } - return escaped; -} - -QString TransactionDesc::HtmlEscape(const std::string& str, bool fMultiLine) -{ - return HtmlEscape(QString::fromStdString(str), fMultiLine); -} - QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx) { if (!wtx.IsFinal()) @@ -86,7 +70,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) { // Online transaction if (!wtx.mapValue["from"].empty()) - strHTML += tr("From: ") + HtmlEscape(wtx.mapValue["from"]) + "
"; + strHTML += tr("From: ") + GUIUtil::HtmlEscape(wtx.mapValue["from"]) + "
"; } else { @@ -99,15 +83,15 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) if (wallet->IsMine(txout)) { CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, wallet, address)) + if (ExtractAddress(txout.scriptPubKey, address) && wallet->HaveKey(address)) { if (wallet->mapAddressBook.count(address)) { strHTML += tr("From: ") + tr("unknown") + "
"; strHTML += tr("To: "); - strHTML += HtmlEscape(address.ToString()); + strHTML += GUIUtil::HtmlEscape(address.ToString()); if (!wallet->mapAddressBook[address].empty()) - strHTML += tr(" (yours, label: ") + HtmlEscape(wallet->mapAddressBook[address]) + ")"; + strHTML += tr(" (yours, label: ") + GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + ")"; else strHTML += tr(" (yours)"); strHTML += "
"; @@ -129,8 +113,8 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) strAddress = wtx.mapValue["to"]; strHTML += tr("To: "); if (wallet->mapAddressBook.count(strAddress) && !wallet->mapAddressBook[strAddress].empty()) - strHTML += HtmlEscape(wallet->mapAddressBook[strAddress]) + " "; - strHTML += HtmlEscape(strAddress) + "
"; + strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[strAddress]) + " "; + strHTML += GUIUtil::HtmlEscape(strAddress) + "
"; } // @@ -184,12 +168,12 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) { // Offline transaction CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, 0, address)) + if (ExtractAddress(txout.scriptPubKey, address)) { strHTML += tr("To: "); if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty()) - strHTML += HtmlEscape(wallet->mapAddressBook[address]) + " "; - strHTML += HtmlEscape(address.ToString()); + strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + " "; + strHTML += GUIUtil::HtmlEscape(address.ToString()); strHTML += "
"; } } @@ -230,9 +214,11 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) // Message // if (!wtx.mapValue["message"].empty()) - strHTML += QString("
") + tr("Message:") + "
" + HtmlEscape(wtx.mapValue["message"], true) + "
"; + strHTML += QString("
") + tr("Message:") + "
" + GUIUtil::HtmlEscape(wtx.mapValue["message"], true) + "
"; if (!wtx.mapValue["comment"].empty()) - strHTML += QString("
") + tr("Comment:") + "
" + HtmlEscape(wtx.mapValue["comment"], true) + "
"; + strHTML += QString("
") + tr("Comment:") + "
" + GUIUtil::HtmlEscape(wtx.mapValue["comment"], true) + "
"; + + strHTML += QString("") + tr("Transaction ID:") + " " + wtx.GetHash().ToString().c_str() + "
"; if (wtx.IsCoinBase()) strHTML += QString("
") + tr("Generated coins must wait 120 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, it will change to \"not accepted\" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.") + "
"; @@ -251,7 +237,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) strHTML += "Credit: " + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,wallet->GetCredit(txout)) + "
"; strHTML += "
Transaction:
"; - strHTML += HtmlEscape(wtx.ToString(), true); + strHTML += GUIUtil::HtmlEscape(wtx.ToString(), true); CTxDB txdb("r"); // To fetch source txouts @@ -271,10 +257,10 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) strHTML += "
  • "; const CTxOut &vout = prev.vout[prevout.n]; CBitcoinAddress address; - if (ExtractAddress(vout.scriptPubKey, 0, address)) + if (ExtractAddress(vout.scriptPubKey, address)) { if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty()) - strHTML += HtmlEscape(wallet->mapAddressBook[address]) + " "; + strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + " "; strHTML += QString::fromStdString(address.ToString()); } strHTML = strHTML + " Amount=" + BitcoinUnits::formatWithUnit(BitcoinUnits::BTC,vout.nValue); diff --git a/src/qt/transactiondesc.h b/src/qt/transactiondesc.h index 55b9eaf..2523f9a 100644 --- a/src/qt/transactiondesc.h +++ b/src/qt/transactiondesc.h @@ -18,8 +18,6 @@ public: private: TransactionDesc() {} - static QString HtmlEscape(const QString& str, bool fMultiLine=false); - static QString HtmlEscape(const std::string &str, bool fMultiLine=false); static QString FormatTxStatus(const CWalletTx& wtx); }; diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 4059207..57210dc 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -60,7 +60,7 @@ QList TransactionRecord::decomposeTransaction(const CWallet * // Generated sub.type = TransactionRecord::Generated; } - else if (ExtractAddress(txout.scriptPubKey, wallet, address)) + else if (ExtractAddress(txout.scriptPubKey, address) && wallet->HaveKey(address)) { // Received by Bitcoin Address sub.type = TransactionRecord::RecvWithAddress; @@ -116,7 +116,7 @@ QList TransactionRecord::decomposeTransaction(const CWallet * } CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, 0, address)) + if (ExtractAddress(txout.scriptPubKey, address)) { // Sent to Bitcoin Address sub.type = TransactionRecord::SendToAddress; @@ -172,7 +172,7 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx) // Sort order, unrecorded transactions sort to the top status.sortKey = strprintf("%010d-%01d-%010u-%03d", - (pindex ? pindex->nHeight : INT_MAX), + (pindex ? pindex->nHeight : std::numeric_limits::max()), (wtx.IsCoinBase() ? 1 : 0), wtx.nTimeReceived, idx); diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp index 1dd4c7b..eaed48b 100644 --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -100,7 +100,6 @@ TransactionView::TransactionView(QWidget *parent) : QVBoxLayout *vlayout = new QVBoxLayout(this); vlayout->setContentsMargins(0,0,0,0); vlayout->setSpacing(0); - //vlayout->addLayout(hlayout2); QTableView *view = new QTableView(this); vlayout->addLayout(hlayout); @@ -124,12 +123,14 @@ TransactionView::TransactionView(QWidget *parent) : // Actions QAction *copyAddressAction = new QAction(tr("Copy address"), this); QAction *copyLabelAction = new QAction(tr("Copy label"), this); + QAction *copyAmountAction = new QAction(tr("Copy amount"), this); QAction *editLabelAction = new QAction(tr("Edit label"), this); QAction *showDetailsAction = new QAction(tr("Show details..."), this); contextMenu = new QMenu(); contextMenu->addAction(copyAddressAction); contextMenu->addAction(copyLabelAction); + contextMenu->addAction(copyAmountAction); contextMenu->addAction(editLabelAction); contextMenu->addAction(showDetailsAction); @@ -140,14 +141,11 @@ TransactionView::TransactionView(QWidget *parent) : connect(amountWidget, SIGNAL(textChanged(QString)), this, SLOT(changedAmount(QString))); connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(doubleClicked(QModelIndex))); - - connect(view, - SIGNAL(customContextMenuRequested(QPoint)), - this, - SLOT(contextualMenu(QPoint))); + connect(view, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint))); connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(copyAddress())); connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(copyLabel())); + connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount())); connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel())); connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails())); } @@ -302,24 +300,17 @@ void TransactionView::contextualMenu(const QPoint &point) void TransactionView::copyAddress() { - if(!transactionView->selectionModel()) - return; - QModelIndexList selection = transactionView->selectionModel()->selectedRows(); - if(!selection.isEmpty()) - { - QApplication::clipboard()->setText(selection.at(0).data(TransactionTableModel::AddressRole).toString()); - } + GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::AddressRole); } void TransactionView::copyLabel() { - if(!transactionView->selectionModel()) - return; - QModelIndexList selection = transactionView->selectionModel()->selectedRows(); - if(!selection.isEmpty()) - { - QApplication::clipboard()->setText(selection.at(0).data(TransactionTableModel::LabelRole).toString()); - } + GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::LabelRole); +} + +void TransactionView::copyAmount() +{ + GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::FormattedAmountRole); } void TransactionView::editLabel() diff --git a/src/qt/transactionview.h b/src/qt/transactionview.h index 67d0b46..bc6e1e4 100644 --- a/src/qt/transactionview.h +++ b/src/qt/transactionview.h @@ -60,6 +60,11 @@ private: private slots: void contextualMenu(const QPoint &); void dateRangeChanged(); + void showDetails(); + void copyAddress(); + void editLabel(); + void copyLabel(); + void copyAmount(); signals: void doubleClicked(const QModelIndex&); @@ -70,10 +75,6 @@ public slots: void changedPrefix(const QString &prefix); void changedAmount(const QString &amount); void exportClicked(); - void showDetails(); - void copyAddress(); - void editLabel(); - void copyLabel(); }; diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index f028f10..8344a65 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -5,6 +5,7 @@ #include "transactiontablemodel.h" #include "headers.h" +#include "db.h" // for BackupWallet #include #include @@ -239,6 +240,11 @@ bool WalletModel::changePassphrase(const SecureString &oldPass, const SecureStri return retval; } +bool WalletModel::backupWallet(const QString &filename) +{ + return BackupWallet(*wallet, filename.toLocal8Bit().data()); +} + // WalletModel::UnlockContext implementation WalletModel::UnlockContext WalletModel::requestUnlock() { diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 89e8cdd..4123240 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -77,6 +77,8 @@ public: // Passphrase only needed when unlocking bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString()); bool changePassphrase(const SecureString &oldPass, const SecureString &newPass); + // Wallet backup + bool backupWallet(const QString &filename); // RAI object for unlocking wallet, returned by requestUnlock() class UnlockContext diff --git a/src/qtui.h b/src/qtui.h index 193f849..7987370 100644 --- a/src/qtui.h +++ b/src/qtui.h @@ -42,6 +42,7 @@ extern int MyMessageBox(const std::string& message, const std::string& caption=" #define wxMessageBox MyMessageBox extern int ThreadSafeMessageBox(const std::string& message, const std::string& caption, int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1); extern bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent); +extern void ThreadSafeHandleURL(const std::string& strURL); extern void CalledSetStatusBar(const std::string& strText, int nField); extern void UIThreadCall(boost::function0 fn); extern void MainFrameRepaint(); diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp new file mode 100644 index 0000000..d59536e --- /dev/null +++ b/src/rpcdump.cpp @@ -0,0 +1,104 @@ +// Copyright (c) 2009-2012 Bitcoin Developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. + +#include "headers.h" +#include "init.h" // for pwalletMain +#include "bitcoinrpc.h" + +// #include +// #include +// #include +#include +// #ifdef USE_SSL +// #include +// typedef boost::asio::ssl::stream SSLStream; +// #endif +// #include +#include "json/json_spirit_reader_template.h" +#include "json/json_spirit_writer_template.h" +#include "json/json_spirit_utils.h" + +#define printf OutputDebugStringF + +// using namespace boost::asio; +using namespace json_spirit; +using namespace std; + +extern Object JSONRPCError(int code, const string& message); + +class CTxDump +{ +public: + CBlockIndex *pindex; + int64 nValue; + bool fSpent; + CWalletTx* ptx; + int nOut; + CTxDump(CWalletTx* ptx = NULL, int nOut = -1) + { + pindex = NULL; + nValue = 0; + fSpent = false; + this->ptx = ptx; + this->nOut = nOut; + } +}; + +Value importprivkey(const Array& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "importprivkey [label]\n" + "Adds a private key (as returned by dumpprivkey) to your wallet."); + + string strSecret = params[0].get_str(); + string strLabel = ""; + if (params.size() > 1) + strLabel = params[1].get_str(); + CBitcoinSecret vchSecret; + bool fGood = vchSecret.SetString(strSecret); + + if (!fGood) throw JSONRPCError(-5,"Invalid private key"); + + CKey key; + bool fCompressed; + CSecret secret = vchSecret.GetSecret(fCompressed); + key.SetSecret(secret, fCompressed); + CBitcoinAddress vchAddress = CBitcoinAddress(key.GetPubKey()); + + CRITICAL_BLOCK(cs_main) + CRITICAL_BLOCK(pwalletMain->cs_wallet) + { + pwalletMain->MarkDirty(); + pwalletMain->SetAddressBookName(vchAddress, strLabel); + + if (!pwalletMain->AddKey(key)) + throw JSONRPCError(-4,"Error adding key to wallet"); + + pwalletMain->ScanForWalletTransactions(pindexGenesisBlock, true); + pwalletMain->ReacceptWalletTransactions(); + } + + MainFrameRepaint(); + + return Value::null; +} + +Value dumpprivkey(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "dumpprivkey \n" + "Reveals the private key corresponding to ."); + + string strAddress = params[0].get_str(); + CBitcoinAddress address; + if (!address.SetString(strAddress)) + throw JSONRPCError(-5, "Invalid bitcoin address"); + CSecret vchSecret; + bool fCompressed; + if (!pwalletMain->GetSecret(address, vchSecret, fCompressed)) + throw JSONRPCError(-4,"Private key for address " + strAddress + " is not known"); + return CBitcoinSecret(vchSecret, fCompressed).ToString(); +} diff --git a/src/script.cpp b/src/script.cpp index a7e4d3e..b6f1202 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #include "headers.h" @@ -70,6 +70,163 @@ static inline void popstack(vector& stack) } +const char* GetTxnOutputType(txnouttype t) +{ + switch (t) + { + case TX_NONSTANDARD: return "nonstandard"; + case TX_PUBKEY: return "pubkey"; + case TX_PUBKEYHASH: return "pubkeyhash"; + case TX_SCRIPTHASH: return "scripthash"; + case TX_MULTISIG: return "multisig"; + } + return NULL; +} + + +const char* GetOpName(opcodetype opcode) +{ + switch (opcode) + { + // push value + case OP_0 : return "0"; + case OP_PUSHDATA1 : return "OP_PUSHDATA1"; + case OP_PUSHDATA2 : return "OP_PUSHDATA2"; + case OP_PUSHDATA4 : return "OP_PUSHDATA4"; + case OP_1NEGATE : return "-1"; + case OP_RESERVED : return "OP_RESERVED"; + case OP_1 : return "1"; + case OP_2 : return "2"; + case OP_3 : return "3"; + case OP_4 : return "4"; + case OP_5 : return "5"; + case OP_6 : return "6"; + case OP_7 : return "7"; + case OP_8 : return "8"; + case OP_9 : return "9"; + case OP_10 : return "10"; + case OP_11 : return "11"; + case OP_12 : return "12"; + case OP_13 : return "13"; + case OP_14 : return "14"; + case OP_15 : return "15"; + case OP_16 : return "16"; + + // control + case OP_NOP : return "OP_NOP"; + case OP_VER : return "OP_VER"; + case OP_IF : return "OP_IF"; + case OP_NOTIF : return "OP_NOTIF"; + case OP_VERIF : return "OP_VERIF"; + case OP_VERNOTIF : return "OP_VERNOTIF"; + case OP_ELSE : return "OP_ELSE"; + case OP_ENDIF : return "OP_ENDIF"; + case OP_VERIFY : return "OP_VERIFY"; + case OP_RETURN : return "OP_RETURN"; + + // stack ops + case OP_TOALTSTACK : return "OP_TOALTSTACK"; + case OP_FROMALTSTACK : return "OP_FROMALTSTACK"; + case OP_2DROP : return "OP_2DROP"; + case OP_2DUP : return "OP_2DUP"; + case OP_3DUP : return "OP_3DUP"; + case OP_2OVER : return "OP_2OVER"; + case OP_2ROT : return "OP_2ROT"; + case OP_2SWAP : return "OP_2SWAP"; + case OP_IFDUP : return "OP_IFDUP"; + case OP_DEPTH : return "OP_DEPTH"; + case OP_DROP : return "OP_DROP"; + case OP_DUP : return "OP_DUP"; + case OP_NIP : return "OP_NIP"; + case OP_OVER : return "OP_OVER"; + case OP_PICK : return "OP_PICK"; + case OP_ROLL : return "OP_ROLL"; + case OP_ROT : return "OP_ROT"; + case OP_SWAP : return "OP_SWAP"; + case OP_TUCK : return "OP_TUCK"; + + // splice ops + case OP_CAT : return "OP_CAT"; + case OP_SUBSTR : return "OP_SUBSTR"; + case OP_LEFT : return "OP_LEFT"; + case OP_RIGHT : return "OP_RIGHT"; + case OP_SIZE : return "OP_SIZE"; + + // bit logic + case OP_INVERT : return "OP_INVERT"; + case OP_AND : return "OP_AND"; + case OP_OR : return "OP_OR"; + case OP_XOR : return "OP_XOR"; + case OP_EQUAL : return "OP_EQUAL"; + case OP_EQUALVERIFY : return "OP_EQUALVERIFY"; + case OP_RESERVED1 : return "OP_RESERVED1"; + case OP_RESERVED2 : return "OP_RESERVED2"; + + // numeric + case OP_1ADD : return "OP_1ADD"; + case OP_1SUB : return "OP_1SUB"; + case OP_2MUL : return "OP_2MUL"; + case OP_2DIV : return "OP_2DIV"; + case OP_NEGATE : return "OP_NEGATE"; + case OP_ABS : return "OP_ABS"; + case OP_NOT : return "OP_NOT"; + case OP_0NOTEQUAL : return "OP_0NOTEQUAL"; + case OP_ADD : return "OP_ADD"; + case OP_SUB : return "OP_SUB"; + case OP_MUL : return "OP_MUL"; + case OP_DIV : return "OP_DIV"; + case OP_MOD : return "OP_MOD"; + case OP_LSHIFT : return "OP_LSHIFT"; + case OP_RSHIFT : return "OP_RSHIFT"; + case OP_BOOLAND : return "OP_BOOLAND"; + case OP_BOOLOR : return "OP_BOOLOR"; + case OP_NUMEQUAL : return "OP_NUMEQUAL"; + case OP_NUMEQUALVERIFY : return "OP_NUMEQUALVERIFY"; + case OP_NUMNOTEQUAL : return "OP_NUMNOTEQUAL"; + case OP_LESSTHAN : return "OP_LESSTHAN"; + case OP_GREATERTHAN : return "OP_GREATERTHAN"; + case OP_LESSTHANOREQUAL : return "OP_LESSTHANOREQUAL"; + case OP_GREATERTHANOREQUAL : return "OP_GREATERTHANOREQUAL"; + case OP_MIN : return "OP_MIN"; + case OP_MAX : return "OP_MAX"; + case OP_WITHIN : return "OP_WITHIN"; + + // crypto + case OP_RIPEMD160 : return "OP_RIPEMD160"; + case OP_SHA1 : return "OP_SHA1"; + case OP_SHA256 : return "OP_SHA256"; + case OP_HASH160 : return "OP_HASH160"; + case OP_HASH256 : return "OP_HASH256"; + case OP_CODESEPARATOR : return "OP_CODESEPARATOR"; + case OP_CHECKSIG : return "OP_CHECKSIG"; + case OP_CHECKSIGVERIFY : return "OP_CHECKSIGVERIFY"; + case OP_CHECKMULTISIG : return "OP_CHECKMULTISIG"; + case OP_CHECKMULTISIGVERIFY : return "OP_CHECKMULTISIGVERIFY"; + + // expanson + case OP_NOP1 : return "OP_NOP1"; + case OP_NOP2 : return "OP_NOP2"; + case OP_NOP3 : return "OP_NOP3"; + case OP_NOP4 : return "OP_NOP4"; + case OP_NOP5 : return "OP_NOP5"; + case OP_NOP6 : return "OP_NOP6"; + case OP_NOP7 : return "OP_NOP7"; + case OP_NOP8 : return "OP_NOP8"; + case OP_NOP9 : return "OP_NOP9"; + case OP_NOP10 : return "OP_NOP10"; + + + + // template matching params + case OP_PUBKEYHASH : return "OP_PUBKEYHASH"; + case OP_PUBKEY : return "OP_PUBKEY"; + + case OP_INVALIDOPCODE : return "OP_INVALIDOPCODE"; + default: + return "OP_UNKNOWN"; + } +} + bool EvalScript(vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, int nHashType) { CAutoBN_CTX pctx; @@ -963,25 +1120,42 @@ bool CheckSig(vector vchSig, vector vchPubKey, CSc - -bool Solver(const CScript& scriptPubKey, vector >& vSolutionRet) +// +// Return public keys or hashes from scriptPubKey, for 'standard' transaction types. +// +bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector >& vSolutionsRet) { // Templates - static vector vTemplates; - if (vTemplates.empty()) + static map mTemplates; + if (mTemplates.empty()) { // Standard tx, sender provides pubkey, receiver adds signature - vTemplates.push_back(CScript() << OP_PUBKEY << OP_CHECKSIG); + mTemplates.insert(make_pair(TX_PUBKEY, CScript() << OP_PUBKEY << OP_CHECKSIG)); // Bitcoin address tx, sender provides hash of pubkey, receiver provides signature and pubkey - vTemplates.push_back(CScript() << OP_DUP << OP_HASH160 << OP_PUBKEYHASH << OP_EQUALVERIFY << OP_CHECKSIG); + mTemplates.insert(make_pair(TX_PUBKEYHASH, CScript() << OP_DUP << OP_HASH160 << OP_PUBKEYHASH << OP_EQUALVERIFY << OP_CHECKSIG)); + + // Sender provides N pubkeys, receivers provides M signatures + mTemplates.insert(make_pair(TX_MULTISIG, CScript() << OP_SMALLINTEGER << OP_PUBKEYS << OP_SMALLINTEGER << OP_CHECKMULTISIG)); + } + + // Shortcut for pay-to-script-hash, which are more constrained than the other types: + // it is always OP_HASH160 20 [20 byte hash] OP_EQUAL + if (scriptPubKey.IsPayToScriptHash()) + { + typeRet = TX_SCRIPTHASH; + vector hashBytes(scriptPubKey.begin()+2, scriptPubKey.begin()+22); + vSolutionsRet.push_back(hashBytes); + return true; } // Scan templates const CScript& script1 = scriptPubKey; - BOOST_FOREACH(const CScript& script2, vTemplates) + BOOST_FOREACH(const PAIRTYPE(txnouttype, CScript)& tplate, mTemplates) { - vSolutionRet.clear(); + const CScript& script2 = tplate.second; + vSolutionsRet.clear(); + opcodetype opcode1, opcode2; vector vch1, vch2; @@ -993,159 +1167,305 @@ bool Solver(const CScript& scriptPubKey, vector >& vSo if (pc1 == script1.end() && pc2 == script2.end()) { // Found a match - reverse(vSolutionRet.begin(), vSolutionRet.end()); + typeRet = tplate.first; + if (typeRet == TX_MULTISIG) + { + // Additional checks for TX_MULTISIG: + unsigned char m = vSolutionsRet.front()[0]; + unsigned char n = vSolutionsRet.back()[0]; + if (m < 1 || n < 1 || m > n || vSolutionsRet.size()-2 != n) + return false; + } return true; } if (!script1.GetOp(pc1, opcode1, vch1)) break; if (!script2.GetOp(pc2, opcode2, vch2)) break; + + // Template matching opcodes: + if (opcode2 == OP_PUBKEYS) + { + while (vch1.size() >= 33 && vch1.size() <= 120) + { + vSolutionsRet.push_back(vch1); + if (!script1.GetOp(pc1, opcode1, vch1)) + break; + } + if (!script2.GetOp(pc2, opcode2, vch2)) + break; + // Normal situation is to fall through + // to other if/else statments + } + if (opcode2 == OP_PUBKEY) { if (vch1.size() < 33 || vch1.size() > 120) break; - vSolutionRet.push_back(make_pair(opcode2, vch1)); + vSolutionsRet.push_back(vch1); } else if (opcode2 == OP_PUBKEYHASH) { if (vch1.size() != sizeof(uint160)) break; - vSolutionRet.push_back(make_pair(opcode2, vch1)); + vSolutionsRet.push_back(vch1); + } + else if (opcode2 == OP_SMALLINTEGER) + { // Single-byte small integer pushed onto vSolutions + if (opcode1 == OP_0 || + (opcode1 >= OP_1 && opcode1 <= OP_16)) + { + char n = (char)CScript::DecodeOP_N(opcode1); + vSolutionsRet.push_back(valtype(1, n)); + } + else + break; } else if (opcode1 != opcode2 || vch1 != vch2) { + // Others must match exactly break; } } } - vSolutionRet.clear(); + vSolutionsRet.clear(); + typeRet = TX_NONSTANDARD; return false; } -bool Solver(const CKeyStore& keystore, const CScript& scriptPubKey, uint256 hash, int nHashType, CScript& scriptSigRet) +bool Sign1(const CBitcoinAddress& address, const CKeyStore& keystore, uint256 hash, int nHashType, CScript& scriptSigRet) { - scriptSigRet.clear(); + CKey key; + if (!keystore.GetKey(address, key)) + return false; - vector > vSolution; - if (!Solver(scriptPubKey, vSolution)) + vector vchSig; + if (!key.Sign(hash, vchSig)) return false; + vchSig.push_back((unsigned char)nHashType); + scriptSigRet << vchSig; - // Compile solution - BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) + return true; +} + +bool SignN(const vector& multisigdata, const CKeyStore& keystore, uint256 hash, int nHashType, CScript& scriptSigRet) +{ + int nSigned = 0; + int nRequired = multisigdata.front()[0]; + for (vector::const_iterator it = multisigdata.begin()+1; it != multisigdata.begin()+multisigdata.size()-1; it++) { - if (item.first == OP_PUBKEY) - { - // Sign - const valtype& vchPubKey = item.second; - CKey key; - if (!keystore.GetKey(Hash160(vchPubKey), key)) - return false; - if (key.GetPubKey() != vchPubKey) - return false; - if (hash != 0) - { - vector vchSig; - if (!key.Sign(hash, vchSig)) - return false; - vchSig.push_back((unsigned char)nHashType); - scriptSigRet << vchSig; - } - } - else if (item.first == OP_PUBKEYHASH) + const valtype& pubkey = *it; + CBitcoinAddress address; + address.SetPubKey(pubkey); + if (Sign1(address, keystore, hash, nHashType, scriptSigRet)) { - // Sign and give pubkey - CKey key; - if (!keystore.GetKey(uint160(item.second), key)) - return false; - if (hash != 0) - { - vector vchSig; - if (!key.Sign(hash, vchSig)) - return false; - vchSig.push_back((unsigned char)nHashType); - scriptSigRet << vchSig << key.GetPubKey(); - } + ++nSigned; + if (nSigned == nRequired) break; } + } + return nSigned==nRequired; +} + +// +// Sign scriptPubKey with private keys stored in keystore, given transaction hash and hash type. +// Signatures are returned in scriptSigRet (or returns false if scriptPubKey can't be signed), +// unless whichTypeRet is TX_SCRIPTHASH, in which case scriptSigRet is the redemption script. +// Returns false if scriptPubKey could not be completely satisified. +// +bool Solver(const CKeyStore& keystore, const CScript& scriptPubKey, uint256 hash, int nHashType, + CScript& scriptSigRet, txnouttype& whichTypeRet) +{ + scriptSigRet.clear(); + + vector vSolutions; + if (!Solver(scriptPubKey, whichTypeRet, vSolutions)) + return false; + + CBitcoinAddress address; + switch (whichTypeRet) + { + case TX_NONSTANDARD: + return false; + case TX_PUBKEY: + address.SetPubKey(vSolutions[0]); + return Sign1(address, keystore, hash, nHashType, scriptSigRet); + case TX_PUBKEYHASH: + address.SetHash160(uint160(vSolutions[0])); + if (!Sign1(address, keystore, hash, nHashType, scriptSigRet)) + return false; else { - return false; + valtype vch; + keystore.GetPubKey(address, vch); + scriptSigRet << vch; } - } + return true; + case TX_SCRIPTHASH: + return keystore.GetCScript(uint160(vSolutions[0]), scriptSigRet); - return true; + case TX_MULTISIG: + scriptSigRet << OP_0; // workaround CHECKMULTISIG bug + return (SignN(vSolutions, keystore, hash, nHashType, scriptSigRet)); + } + return false; } +int ScriptSigArgsExpected(txnouttype t, const std::vector >& vSolutions) +{ + switch (t) + { + case TX_NONSTANDARD: + return -1; + case TX_PUBKEY: + return 1; + case TX_PUBKEYHASH: + return 2; + case TX_MULTISIG: + if (vSolutions.size() < 1 || vSolutions[0].size() < 1) + return -1; + return vSolutions[0][0] + 1; + case TX_SCRIPTHASH: + return 1; // doesn't include args needed by the script + } + return -1; +} bool IsStandard(const CScript& scriptPubKey) { - vector > vSolution; - return Solver(scriptPubKey, vSolution); + vector vSolutions; + txnouttype whichType; + if (!Solver(scriptPubKey, whichType, vSolutions)) + return false; + + if (whichType == TX_MULTISIG) + { + unsigned char m = vSolutions.front()[0]; + unsigned char n = vSolutions.back()[0]; + // Support up to x-of-3 multisig txns as standard + if (n < 1 || n > 3) + return false; + if (m < 1 || m > n) + return false; + } + + return whichType != TX_NONSTANDARD; } +int HaveKeys(const vector& pubkeys, const CKeyStore& keystore) +{ + int nResult = 0; + BOOST_FOREACH(const valtype& pubkey, pubkeys) + { + CBitcoinAddress address; + address.SetPubKey(pubkey); + if (keystore.HaveKey(address)) + ++nResult; + } + return nResult; +} + bool IsMine(const CKeyStore &keystore, const CScript& scriptPubKey) { - vector > vSolution; - if (!Solver(scriptPubKey, vSolution)) + vector vSolutions; + txnouttype whichType; + if (!Solver(scriptPubKey, whichType, vSolutions)) return false; - // Compile solution - BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) + CBitcoinAddress address; + switch (whichType) { - if (item.first == OP_PUBKEY) - { - const valtype& vchPubKey = item.second; - vector vchPubKeyFound; - if (!keystore.GetPubKey(Hash160(vchPubKey), vchPubKeyFound)) - return false; - if (vchPubKeyFound != vchPubKey) - return false; - } - else if (item.first == OP_PUBKEYHASH) - { - if (!keystore.HaveKey(uint160(item.second))) - return false; - } - else - { + case TX_NONSTANDARD: + return false; + case TX_PUBKEY: + address.SetPubKey(vSolutions[0]); + return keystore.HaveKey(address); + case TX_PUBKEYHASH: + address.SetHash160(uint160(vSolutions[0])); + return keystore.HaveKey(address); + case TX_SCRIPTHASH: + { + CScript subscript; + if (!keystore.GetCScript(uint160(vSolutions[0]), subscript)) return false; - } + return IsMine(keystore, subscript); } - - return true; + case TX_MULTISIG: + { + // Only consider transactions "mine" if we own ALL the + // keys involved. multi-signature transactions that are + // partially owned (somebody else has a key that can spend + // them) enable spend-out-from-under-you attacks, especially + // in shared-wallet situations. + vector keys(vSolutions.begin()+1, vSolutions.begin()+vSolutions.size()-1); + return HaveKeys(keys, keystore) == keys.size(); + } + } + return false; } -bool static ExtractAddressInner(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet) +bool ExtractAddress(const CScript& scriptPubKey, CBitcoinAddress& addressRet) { - vector > vSolution; - if (!Solver(scriptPubKey, vSolution)) + vector vSolutions; + txnouttype whichType; + if (!Solver(scriptPubKey, whichType, vSolutions)) return false; - BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) + if (whichType == TX_PUBKEY) { - if (item.first == OP_PUBKEY) - addressRet.SetPubKey(item.second); - else if (item.first == OP_PUBKEYHASH) - addressRet.SetHash160((uint160)item.second); - if (keystore == NULL || keystore->HaveKey(addressRet)) - return true; + addressRet.SetPubKey(vSolutions[0]); + return true; } - + else if (whichType == TX_PUBKEYHASH) + { + addressRet.SetHash160(uint160(vSolutions[0])); + return true; + } + else if (whichType == TX_SCRIPTHASH) + { + addressRet.SetScriptHash160(uint160(vSolutions[0])); + return true; + } + // Multisig txns have more than one address... return false; } - -bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet) +bool ExtractAddresses(const CScript& scriptPubKey, txnouttype& typeRet, vector& addressRet, int& nRequiredRet) { - if (keystore) - return ExtractAddressInner(scriptPubKey, keystore, addressRet); + addressRet.clear(); + typeRet = TX_NONSTANDARD; + vector vSolutions; + if (!Solver(scriptPubKey, typeRet, vSolutions)) + return false; + + if (typeRet == TX_MULTISIG) + { + nRequiredRet = vSolutions.front()[0]; + int n = vSolutions.back()[0]; + for (int i = 1; i < vSolutions.size()-1; i++) + { + CBitcoinAddress address; + address.SetPubKey(vSolutions[i]); + addressRet.push_back(address); + } + } else - return ExtractAddressInner(scriptPubKey, NULL, addressRet); - return false; -} + { + nRequiredRet = 1; + CBitcoinAddress address; + if (typeRet == TX_PUBKEYHASH) + address.SetHash160(uint160(vSolutions.front())); + else if (typeRet == TX_SCRIPTHASH) + address.SetScriptHash160(uint160(vSolutions.front())); + else if (typeRet == TX_PUBKEY) + address.SetPubKey(vSolutions.front()); + addressRet.push_back(address); + } + return true; +} bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, bool fValidatePayToScriptHash, int nHashType) @@ -1184,7 +1504,7 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const C } -bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType, CScript scriptPrereq) +bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType) { assert(nIn < txTo.vin.size()); CTxIn& txin = txTo.vin[nIn]; @@ -1193,17 +1513,32 @@ bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CTrans // Leave out the signature from the hash, since a signature can't sign itself. // The checksig op will also drop the signatures from its hash. - uint256 hash = SignatureHash(scriptPrereq + txout.scriptPubKey, txTo, nIn, nHashType); + uint256 hash = SignatureHash(txout.scriptPubKey, txTo, nIn, nHashType); - if (!Solver(keystore, txout.scriptPubKey, hash, nHashType, txin.scriptSig)) + txnouttype whichType; + if (!Solver(keystore, txout.scriptPubKey, hash, nHashType, txin.scriptSig, whichType)) return false; - txin.scriptSig = scriptPrereq + txin.scriptSig; + if (whichType == TX_SCRIPTHASH) + { + // Solver returns the subscript that need to be evaluated; + // the final scriptSig is the signatures from that + // and then the serialized subscript: + CScript subscript = txin.scriptSig; + + // Recompute txn hash using subscript in place of scriptPubKey: + uint256 hash2 = SignatureHash(subscript, txTo, nIn, nHashType); + txnouttype subType; + if (!Solver(keystore, subscript, hash2, nHashType, txin.scriptSig, subType)) + return false; + if (subType == TX_SCRIPTHASH) + return false; + txin.scriptSig << static_cast(subscript); // Append serialized subscript + } // Test solution - if (scriptPrereq.empty()) - if (!VerifyScript(txin.scriptSig, txout.scriptPubKey, txTo, nIn, true, 0)) - return false; + if (!VerifyScript(txin.scriptSig, txout.scriptPubKey, txTo, nIn, true, 0)) + return false; return true; } @@ -1282,3 +1617,30 @@ bool CScript::IsPayToScriptHash() const this->at(1) == 0x14 && this->at(22) == OP_EQUAL); } + +void CScript::SetBitcoinAddress(const CBitcoinAddress& address) +{ + this->clear(); + if (address.IsScript()) + *this << OP_HASH160 << address.GetHash160() << OP_EQUAL; + else + *this << OP_DUP << OP_HASH160 << address.GetHash160() << OP_EQUALVERIFY << OP_CHECKSIG; +} + +void CScript::SetMultisig(int nRequired, const std::vector& keys) +{ + this->clear(); + + *this << EncodeOP_N(nRequired); + BOOST_FOREACH(const CKey& key, keys) + *this << key.GetPubKey(); + *this << EncodeOP_N(keys.size()) << OP_CHECKMULTISIG; +} + +void CScript::SetPayToScriptHash(const CScript& subscript) +{ + assert(!subscript.empty()); + uint160 subscriptHash = Hash160(subscript); + this->clear(); + *this << OP_HASH160 << subscriptHash << OP_EQUAL; +} diff --git a/src/script.h b/src/script.h index bc9fc9a..524d08b 100644 --- a/src/script.h +++ b/src/script.h @@ -1,12 +1,11 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef H_BITCOIN_SCRIPT #define H_BITCOIN_SCRIPT #include "base58.h" -#include "keystore.h" #include #include @@ -14,7 +13,9 @@ #include class CTransaction; +class CKeyStore; +/** Signature hash types/flags */ enum { SIGHASH_ALL = 1, @@ -24,7 +25,19 @@ enum }; +enum txnouttype +{ + TX_NONSTANDARD, + // 'standard' transaction types: + TX_PUBKEY, + TX_PUBKEYHASH, + TX_SCRIPTHASH, + TX_MULTISIG, +}; +const char* GetTxnOutputType(txnouttype t); + +/** Script opcodes */ enum opcodetype { // push value @@ -162,162 +175,15 @@ enum opcodetype // template matching params + OP_SMALLINTEGER = 0xfa, + OP_PUBKEYS = 0xfb, OP_PUBKEYHASH = 0xfd, OP_PUBKEY = 0xfe, OP_INVALIDOPCODE = 0xff, }; - - - - - - - -inline const char* GetOpName(opcodetype opcode) -{ - switch (opcode) - { - // push value - case OP_0 : return "0"; - case OP_PUSHDATA1 : return "OP_PUSHDATA1"; - case OP_PUSHDATA2 : return "OP_PUSHDATA2"; - case OP_PUSHDATA4 : return "OP_PUSHDATA4"; - case OP_1NEGATE : return "-1"; - case OP_RESERVED : return "OP_RESERVED"; - case OP_1 : return "1"; - case OP_2 : return "2"; - case OP_3 : return "3"; - case OP_4 : return "4"; - case OP_5 : return "5"; - case OP_6 : return "6"; - case OP_7 : return "7"; - case OP_8 : return "8"; - case OP_9 : return "9"; - case OP_10 : return "10"; - case OP_11 : return "11"; - case OP_12 : return "12"; - case OP_13 : return "13"; - case OP_14 : return "14"; - case OP_15 : return "15"; - case OP_16 : return "16"; - - // control - case OP_NOP : return "OP_NOP"; - case OP_VER : return "OP_VER"; - case OP_IF : return "OP_IF"; - case OP_NOTIF : return "OP_NOTIF"; - case OP_VERIF : return "OP_VERIF"; - case OP_VERNOTIF : return "OP_VERNOTIF"; - case OP_ELSE : return "OP_ELSE"; - case OP_ENDIF : return "OP_ENDIF"; - case OP_VERIFY : return "OP_VERIFY"; - case OP_RETURN : return "OP_RETURN"; - - // stack ops - case OP_TOALTSTACK : return "OP_TOALTSTACK"; - case OP_FROMALTSTACK : return "OP_FROMALTSTACK"; - case OP_2DROP : return "OP_2DROP"; - case OP_2DUP : return "OP_2DUP"; - case OP_3DUP : return "OP_3DUP"; - case OP_2OVER : return "OP_2OVER"; - case OP_2ROT : return "OP_2ROT"; - case OP_2SWAP : return "OP_2SWAP"; - case OP_IFDUP : return "OP_IFDUP"; - case OP_DEPTH : return "OP_DEPTH"; - case OP_DROP : return "OP_DROP"; - case OP_DUP : return "OP_DUP"; - case OP_NIP : return "OP_NIP"; - case OP_OVER : return "OP_OVER"; - case OP_PICK : return "OP_PICK"; - case OP_ROLL : return "OP_ROLL"; - case OP_ROT : return "OP_ROT"; - case OP_SWAP : return "OP_SWAP"; - case OP_TUCK : return "OP_TUCK"; - - // splice ops - case OP_CAT : return "OP_CAT"; - case OP_SUBSTR : return "OP_SUBSTR"; - case OP_LEFT : return "OP_LEFT"; - case OP_RIGHT : return "OP_RIGHT"; - case OP_SIZE : return "OP_SIZE"; - - // bit logic - case OP_INVERT : return "OP_INVERT"; - case OP_AND : return "OP_AND"; - case OP_OR : return "OP_OR"; - case OP_XOR : return "OP_XOR"; - case OP_EQUAL : return "OP_EQUAL"; - case OP_EQUALVERIFY : return "OP_EQUALVERIFY"; - case OP_RESERVED1 : return "OP_RESERVED1"; - case OP_RESERVED2 : return "OP_RESERVED2"; - - // numeric - case OP_1ADD : return "OP_1ADD"; - case OP_1SUB : return "OP_1SUB"; - case OP_2MUL : return "OP_2MUL"; - case OP_2DIV : return "OP_2DIV"; - case OP_NEGATE : return "OP_NEGATE"; - case OP_ABS : return "OP_ABS"; - case OP_NOT : return "OP_NOT"; - case OP_0NOTEQUAL : return "OP_0NOTEQUAL"; - case OP_ADD : return "OP_ADD"; - case OP_SUB : return "OP_SUB"; - case OP_MUL : return "OP_MUL"; - case OP_DIV : return "OP_DIV"; - case OP_MOD : return "OP_MOD"; - case OP_LSHIFT : return "OP_LSHIFT"; - case OP_RSHIFT : return "OP_RSHIFT"; - case OP_BOOLAND : return "OP_BOOLAND"; - case OP_BOOLOR : return "OP_BOOLOR"; - case OP_NUMEQUAL : return "OP_NUMEQUAL"; - case OP_NUMEQUALVERIFY : return "OP_NUMEQUALVERIFY"; - case OP_NUMNOTEQUAL : return "OP_NUMNOTEQUAL"; - case OP_LESSTHAN : return "OP_LESSTHAN"; - case OP_GREATERTHAN : return "OP_GREATERTHAN"; - case OP_LESSTHANOREQUAL : return "OP_LESSTHANOREQUAL"; - case OP_GREATERTHANOREQUAL : return "OP_GREATERTHANOREQUAL"; - case OP_MIN : return "OP_MIN"; - case OP_MAX : return "OP_MAX"; - case OP_WITHIN : return "OP_WITHIN"; - - // crypto - case OP_RIPEMD160 : return "OP_RIPEMD160"; - case OP_SHA1 : return "OP_SHA1"; - case OP_SHA256 : return "OP_SHA256"; - case OP_HASH160 : return "OP_HASH160"; - case OP_HASH256 : return "OP_HASH256"; - case OP_CODESEPARATOR : return "OP_CODESEPARATOR"; - case OP_CHECKSIG : return "OP_CHECKSIG"; - case OP_CHECKSIGVERIFY : return "OP_CHECKSIGVERIFY"; - case OP_CHECKMULTISIG : return "OP_CHECKMULTISIG"; - case OP_CHECKMULTISIGVERIFY : return "OP_CHECKMULTISIGVERIFY"; - - // expanson - case OP_NOP1 : return "OP_NOP1"; - case OP_NOP2 : return "OP_NOP2"; - case OP_NOP3 : return "OP_NOP3"; - case OP_NOP4 : return "OP_NOP4"; - case OP_NOP5 : return "OP_NOP5"; - case OP_NOP6 : return "OP_NOP6"; - case OP_NOP7 : return "OP_NOP7"; - case OP_NOP8 : return "OP_NOP8"; - case OP_NOP9 : return "OP_NOP9"; - case OP_NOP10 : return "OP_NOP10"; - - - - // template matching params - case OP_PUBKEYHASH : return "OP_PUBKEYHASH"; - case OP_PUBKEY : return "OP_PUBKEY"; - - case OP_INVALIDOPCODE : return "OP_INVALIDOPCODE"; - default: - return "OP_UNKNOWN"; - } -}; - +const char* GetOpName(opcodetype opcode); @@ -348,7 +214,7 @@ inline std::string StackString(const std::vector >& v - +/** Serialized script, used inside transaction inputs and outputs */ class CScript : public std::vector { protected: @@ -582,19 +448,31 @@ public: assert(opcode >= OP_1 && opcode <= OP_16); return (int)opcode - (int)(OP_1 - 1); } + static opcodetype EncodeOP_N(int n) + { + assert(n >= 0 && n <= 16); + if (n == 0) + return OP_0; + return (opcodetype)(OP_1+n-1); + } - void FindAndDelete(const CScript& b) + int FindAndDelete(const CScript& b) { + int nFound = 0; if (b.empty()) - return; + return nFound; iterator pc = begin(); opcodetype opcode; do { while (end() - pc >= b.size() && memcmp(&pc[0], &b[0], b.size()) == 0) + { erase(pc, pc + b.size()); + ++nFound; + } } while (GetOp(pc, opcode)); + return nFound; } int Find(opcodetype op) const { @@ -611,7 +489,7 @@ public: // CHECKMULTISIGs serialized in scriptSigs are // counted more accurately, assuming they are of the form // ... OP_N CHECKMULTISIG ... - int GetSigOpCount(bool fAccurate=false) const; + int GetSigOpCount(bool fAccurate) const; // Accurately count sigOps, including sigOps in // pay-to-script-hash transactions: @@ -619,10 +497,9 @@ public: bool IsPayToScriptHash() const; + // Called by CTransaction::IsStandard bool IsPushOnly() const { - if (size() > 200) - return false; const_iterator pc = begin(); while (pc < end()) { @@ -636,31 +513,13 @@ public: } - CBitcoinAddress GetBitcoinAddress() const - { - opcodetype opcode; - std::vector vch; - CScript::const_iterator pc = begin(); - if (!GetOp(pc, opcode, vch) || opcode != OP_DUP) return 0; - if (!GetOp(pc, opcode, vch) || opcode != OP_HASH160) return 0; - if (!GetOp(pc, opcode, vch) || vch.size() != sizeof(uint160)) return 0; - uint160 hash160 = uint160(vch); - if (!GetOp(pc, opcode, vch) || opcode != OP_EQUALVERIFY) return 0; - if (!GetOp(pc, opcode, vch) || opcode != OP_CHECKSIG) return 0; - if (pc != end()) return 0; - return CBitcoinAddress(hash160); - } - - void SetBitcoinAddress(const CBitcoinAddress& address) - { - this->clear(); - *this << OP_DUP << OP_HASH160 << address.GetHash160() << OP_EQUALVERIFY << OP_CHECKSIG; - } - + void SetBitcoinAddress(const CBitcoinAddress& address); void SetBitcoinAddress(const std::vector& vchPubKey) { SetBitcoinAddress(CBitcoinAddress(vchPubKey)); } + void SetMultisig(int nRequired, const std::vector& keys); + void SetPayToScriptHash(const CScript& subscript); void PrintHex() const @@ -701,14 +560,14 @@ public: - - bool EvalScript(std::vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, int nHashType); - +bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, std::vector >& vSolutionsRet); +int ScriptSigArgsExpected(txnouttype t, const std::vector >& vSolutions); bool IsStandard(const CScript& scriptPubKey); bool IsMine(const CKeyStore& keystore, const CScript& scriptPubKey); -bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* pkeystore, CBitcoinAddress& addressRet); -bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL, CScript scriptPrereq=CScript()); +bool ExtractAddress(const CScript& scriptPubKey, CBitcoinAddress& addressRet); +bool ExtractAddresses(const CScript& scriptPubKey, txnouttype& typeRet, std::vector& addressRet, int& nRequiredRet); +bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL); bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, bool fValidatePayToScriptHash, int nHashType); #endif diff --git a/src/serialize.h b/src/serialize.h index 396e172..25777fe 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -19,18 +19,11 @@ #include #include -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 int64; -typedef unsigned __int64 uint64; -#else typedef long long int64; typedef unsigned long long uint64; -#endif -#if defined(_MSC_VER) && _MSC_VER < 1300 -#define for if (false) ; else for -#endif #ifdef WIN32 +#define _WIN32_WINNT 0x0501 #include // This is used to attempt to keep keying material out of swap // Note that VirtualLock does not provide this as a guarantee on Windows, @@ -60,9 +53,7 @@ class CDataStream; class CAutoFile; static const unsigned int MAX_SIZE = 0x02000000; -static const int VERSION = 50400; -static const char* pszSubVer = ""; -static const bool VERSION_IS_BETA = true; +static const int PROTOCOL_VERSION = 60000; // Used to bypass the rule against non-const reference to temporary // where it makes sense with wrappers such as CFlatData or CTxDB @@ -91,7 +82,7 @@ enum }; #define IMPLEMENT_SERIALIZE(statements) \ - unsigned int GetSerializeSize(int nType=0, int nVersion=VERSION) const \ + unsigned int GetSerializeSize(int nType=0, int nVersion=PROTOCOL_VERSION) const \ { \ CSerActionGetSerializeSize ser_action; \ const bool fGetSize = true; \ @@ -106,7 +97,7 @@ enum return nSerSize; \ } \ template \ - void Serialize(Stream& s, int nType=0, int nVersion=VERSION) const \ + void Serialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) const \ { \ CSerActionSerialize ser_action; \ const bool fGetSize = false; \ @@ -117,7 +108,7 @@ enum {statements} \ } \ template \ - void Unserialize(Stream& s, int nType=0, int nVersion=VERSION) \ + void Unserialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) \ { \ CSerActionUnserialize ser_action; \ const bool fGetSize = false; \ @@ -202,8 +193,8 @@ template inline void Unserialize(Stream& s, bool& a, int, int=0 inline unsigned int GetSizeOfCompactSize(uint64 nSize) { if (nSize < 253) return sizeof(unsigned char); - else if (nSize <= USHRT_MAX) return sizeof(unsigned char) + sizeof(unsigned short); - else if (nSize <= UINT_MAX) return sizeof(unsigned char) + sizeof(unsigned int); + else if (nSize <= std::numeric_limits::max()) return sizeof(unsigned char) + sizeof(unsigned short); + else if (nSize <= std::numeric_limits::max()) return sizeof(unsigned char) + sizeof(unsigned int); else return sizeof(unsigned char) + sizeof(uint64); } @@ -215,14 +206,14 @@ void WriteCompactSize(Stream& os, uint64 nSize) unsigned char chSize = nSize; WRITEDATA(os, chSize); } - else if (nSize <= USHRT_MAX) + else if (nSize <= std::numeric_limits::max()) { unsigned char chSize = 253; unsigned short xSize = nSize; WRITEDATA(os, chSize); WRITEDATA(os, xSize); } - else if (nSize <= UINT_MAX) + else if (nSize <= std::numeric_limits::max()) { unsigned char chSize = 254; unsigned int xSize = nSize; @@ -274,11 +265,11 @@ uint64 ReadCompactSize(Stream& is) -// -// Wrapper for serializing arrays and POD -// There's a clever template way to make arrays serialize normally, but MSVC6 doesn't support it -// #define FLATDATA(obj) REF(CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj))) + +/** Wrapper for serializing arrays and POD. + * There's a clever template way to make arrays serialize normally, but MSVC6 doesn't support it. + */ class CFlatData { protected: @@ -311,9 +302,7 @@ public: -// -// string stored as a fixed length field -// +/** string stored as a fixed length field */ template class CFixedFieldString { @@ -365,43 +354,43 @@ template void Unserialize(Stream& is, std::basic_st // vector template unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const boost::true_type&); template unsigned int GetSerializeSize_impl(const std::vector& v, int nType, int nVersion, const boost::false_type&); -template inline unsigned int GetSerializeSize(const std::vector& v, int nType, int nVersion=VERSION); +template inline unsigned int GetSerializeSize(const std::vector& v, int nType, int nVersion=PROTOCOL_VERSION); template void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const boost::true_type&); template void Serialize_impl(Stream& os, const std::vector& v, int nType, int nVersion, const boost::false_type&); -template inline void Serialize(Stream& os, const std::vector& v, int nType, int nVersion=VERSION); +template inline void Serialize(Stream& os, const std::vector& v, int nType, int nVersion=PROTOCOL_VERSION); template void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const boost::true_type&); template void Unserialize_impl(Stream& is, std::vector& v, int nType, int nVersion, const boost::false_type&); -template inline void Unserialize(Stream& is, std::vector& v, int nType, int nVersion=VERSION); +template inline void Unserialize(Stream& is, std::vector& v, int nType, int nVersion=PROTOCOL_VERSION); // others derived from vector -extern inline unsigned int GetSerializeSize(const CScript& v, int nType, int nVersion=VERSION); -template void Serialize(Stream& os, const CScript& v, int nType, int nVersion=VERSION); -template void Unserialize(Stream& is, CScript& v, int nType, int nVersion=VERSION); +extern inline unsigned int GetSerializeSize(const CScript& v, int nType, int nVersion=PROTOCOL_VERSION); +template void Serialize(Stream& os, const CScript& v, int nType, int nVersion=PROTOCOL_VERSION); +template void Unserialize(Stream& is, CScript& v, int nType, int nVersion=PROTOCOL_VERSION); // pair -template unsigned int GetSerializeSize(const std::pair& item, int nType, int nVersion=VERSION); -template void Serialize(Stream& os, const std::pair& item, int nType, int nVersion=VERSION); -template void Unserialize(Stream& is, std::pair& item, int nType, int nVersion=VERSION); +template unsigned int GetSerializeSize(const std::pair& item, int nType, int nVersion=PROTOCOL_VERSION); +template void Serialize(Stream& os, const std::pair& item, int nType, int nVersion=PROTOCOL_VERSION); +template void Unserialize(Stream& is, std::pair& item, int nType, int nVersion=PROTOCOL_VERSION); // 3 tuple -template unsigned int GetSerializeSize(const boost::tuple& item, int nType, int nVersion=VERSION); -template void Serialize(Stream& os, const boost::tuple& item, int nType, int nVersion=VERSION); -template void Unserialize(Stream& is, boost::tuple& item, int nType, int nVersion=VERSION); +template unsigned int GetSerializeSize(const boost::tuple& item, int nType, int nVersion=PROTOCOL_VERSION); +template void Serialize(Stream& os, const boost::tuple& item, int nType, int nVersion=PROTOCOL_VERSION); +template void Unserialize(Stream& is, boost::tuple& item, int nType, int nVersion=PROTOCOL_VERSION); // 4 tuple -template unsigned int GetSerializeSize(const boost::tuple& item, int nType, int nVersion=VERSION); -template void Serialize(Stream& os, const boost::tuple& item, int nType, int nVersion=VERSION); -template void Unserialize(Stream& is, boost::tuple& item, int nType, int nVersion=VERSION); +template unsigned int GetSerializeSize(const boost::tuple& item, int nType, int nVersion=PROTOCOL_VERSION); +template void Serialize(Stream& os, const boost::tuple& item, int nType, int nVersion=PROTOCOL_VERSION); +template void Unserialize(Stream& is, boost::tuple& item, int nType, int nVersion=PROTOCOL_VERSION); // map -template unsigned int GetSerializeSize(const std::map& m, int nType, int nVersion=VERSION); -template void Serialize(Stream& os, const std::map& m, int nType, int nVersion=VERSION); -template void Unserialize(Stream& is, std::map& m, int nType, int nVersion=VERSION); +template unsigned int GetSerializeSize(const std::map& m, int nType, int nVersion=PROTOCOL_VERSION); +template void Serialize(Stream& os, const std::map& m, int nType, int nVersion=PROTOCOL_VERSION); +template void Unserialize(Stream& is, std::map& m, int nType, int nVersion=PROTOCOL_VERSION); // set -template unsigned int GetSerializeSize(const std::set& m, int nType, int nVersion=VERSION); -template void Serialize(Stream& os, const std::set& m, int nType, int nVersion=VERSION); -template void Unserialize(Stream& is, std::set& m, int nType, int nVersion=VERSION); +template unsigned int GetSerializeSize(const std::set& m, int nType, int nVersion=PROTOCOL_VERSION); +template void Serialize(Stream& os, const std::set& m, int nType, int nVersion=PROTOCOL_VERSION); +template void Unserialize(Stream& is, std::set& m, int nType, int nVersion=PROTOCOL_VERSION); @@ -414,19 +403,19 @@ template void Unserializ // Thanks to Boost serialization for this idea. // template -inline unsigned int GetSerializeSize(const T& a, long nType, int nVersion=VERSION) +inline unsigned int GetSerializeSize(const T& a, long nType, int nVersion=PROTOCOL_VERSION) { return a.GetSerializeSize((int)nType, nVersion); } template -inline void Serialize(Stream& os, const T& a, long nType, int nVersion=VERSION) +inline void Serialize(Stream& os, const T& a, long nType, int nVersion=PROTOCOL_VERSION) { a.Serialize(os, (int)nType, nVersion); } template -inline void Unserialize(Stream& is, T& a, long nType, int nVersion=VERSION) +inline void Unserialize(Stream& is, T& a, long nType, int nVersion=PROTOCOL_VERSION) { a.Unserialize(is, (int)nType, nVersion); } @@ -865,11 +854,11 @@ struct zero_after_free_allocator : public std::allocator -// -// Double ended buffer combining vector and stream-like interfaces. -// >> and << read and write unformatted data using the above serialization templates. -// Fills with data in linear time; some stringstream implementations take N^2 time. -// +/** Double ended buffer combining vector and stream-like interfaces. + * + * >> and << read and write unformatted data using the above serialization templates. + * Fills with data in linear time; some stringstream implementations take N^2 time. + */ class CDataStream { protected: @@ -892,39 +881,39 @@ public: typedef vector_type::const_iterator const_iterator; typedef vector_type::reverse_iterator reverse_iterator; - explicit CDataStream(int nTypeIn=SER_NETWORK, int nVersionIn=VERSION) + explicit CDataStream(int nTypeIn=SER_NETWORK, int nVersionIn=PROTOCOL_VERSION) { Init(nTypeIn, nVersionIn); } - CDataStream(const_iterator pbegin, const_iterator pend, int nTypeIn=SER_NETWORK, int nVersionIn=VERSION) : vch(pbegin, pend) + CDataStream(const_iterator pbegin, const_iterator pend, int nTypeIn=SER_NETWORK, int nVersionIn=PROTOCOL_VERSION) : vch(pbegin, pend) { Init(nTypeIn, nVersionIn); } #if !defined(_MSC_VER) || _MSC_VER >= 1300 - CDataStream(const char* pbegin, const char* pend, int nTypeIn=SER_NETWORK, int nVersionIn=VERSION) : vch(pbegin, pend) + CDataStream(const char* pbegin, const char* pend, int nTypeIn=SER_NETWORK, int nVersionIn=PROTOCOL_VERSION) : vch(pbegin, pend) { Init(nTypeIn, nVersionIn); } #endif - CDataStream(const vector_type& vchIn, int nTypeIn=SER_NETWORK, int nVersionIn=VERSION) : vch(vchIn.begin(), vchIn.end()) + CDataStream(const vector_type& vchIn, int nTypeIn=SER_NETWORK, int nVersionIn=PROTOCOL_VERSION) : vch(vchIn.begin(), vchIn.end()) { Init(nTypeIn, nVersionIn); } - CDataStream(const std::vector& vchIn, int nTypeIn=SER_NETWORK, int nVersionIn=VERSION) : vch(vchIn.begin(), vchIn.end()) + CDataStream(const std::vector& vchIn, int nTypeIn=SER_NETWORK, int nVersionIn=PROTOCOL_VERSION) : vch(vchIn.begin(), vchIn.end()) { Init(nTypeIn, nVersionIn); } - CDataStream(const std::vector& vchIn, int nTypeIn=SER_NETWORK, int nVersionIn=VERSION) : vch((char*)&vchIn.begin()[0], (char*)&vchIn.end()[0]) + CDataStream(const std::vector& vchIn, int nTypeIn=SER_NETWORK, int nVersionIn=PROTOCOL_VERSION) : vch((char*)&vchIn.begin()[0], (char*)&vchIn.end()[0]) { Init(nTypeIn, nVersionIn); } - void Init(int nTypeIn=SER_NETWORK, int nVersionIn=VERSION) + void Init(int nTypeIn=SER_NETWORK, int nVersionIn=PROTOCOL_VERSION) { nReadPos = 0; nType = nTypeIn; @@ -1138,7 +1127,7 @@ public: } template - void Serialize(Stream& s, int nType=0, int nVersion=VERSION) const + void Serialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) const { // Special case: stream << stream concatenates like stream += stream if (!vch.empty()) @@ -1229,12 +1218,12 @@ int main(int argc, char *argv[]) -// -// Automatic closing wrapper for FILE* -// - Will automatically close the file when it goes out of scope if not null. -// - If you're returning the file pointer, return file.release(). -// - If you need to close the file early, use file.fclose() instead of fclose(file). -// +/** RAII wrapper for FILE*. + * + * Will automatically close the file when it goes out of scope if not null. + * If you're returning the file pointer, return file.release(). + * If you need to close the file early, use file.fclose() instead of fclose(file). + */ class CAutoFile { protected: @@ -1247,7 +1236,7 @@ public: typedef FILE element_type; - CAutoFile(FILE* filenew=NULL, int nTypeIn=SER_DISK, int nVersionIn=VERSION) + CAutoFile(FILE* filenew=NULL, int nTypeIn=SER_DISK, int nVersionIn=PROTOCOL_VERSION) { file = filenew; nType = nTypeIn; diff --git a/src/test/DoS_tests.cpp b/src/test/DoS_tests.cpp index 01e6691..0b89414 100644 --- a/src/test/DoS_tests.cpp +++ b/src/test/DoS_tests.cpp @@ -5,44 +5,58 @@ #include #include -#include "../main.h" -#include "../net.h" -#include "../util.h" +#include "main.h" +#include "wallet.h" +#include "net.h" +#include "util.h" -using namespace std; +#include + +// Tests this internal-to-main.cpp method: +extern void AddOrphanTx(const CDataStream& vMsg); +extern int LimitOrphanTxSize(int nMaxOrphans); +extern std::map mapOrphanTransactions; +extern std::multimap mapOrphanTransactionsByPrev; + +CService ip(uint32_t i) +{ + struct in_addr s; + s.s_addr = i; + return CService(CNetAddr(s), GetDefaultPort()); +} BOOST_AUTO_TEST_SUITE(DoS_tests) BOOST_AUTO_TEST_CASE(DoS_banning) { CNode::ClearBanned(); - CAddress addr1(0xa0b0c001); + CAddress addr1(ip(0xa0b0c001)); CNode dummyNode1(INVALID_SOCKET, addr1, true); dummyNode1.Misbehaving(100); // Should get banned - BOOST_CHECK(CNode::IsBanned(addr1.ip)); - BOOST_CHECK(!CNode::IsBanned(addr1.ip|0x0000ff00)); // Different ip, not banned + BOOST_CHECK(CNode::IsBanned(addr1)); + BOOST_CHECK(!CNode::IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different ip, not banned - CAddress addr2(0xa0b0c002); + CAddress addr2(ip(0xa0b0c002)); CNode dummyNode2(INVALID_SOCKET, addr2, true); dummyNode2.Misbehaving(50); - BOOST_CHECK(!CNode::IsBanned(addr2.ip)); // 2 not banned yet... - BOOST_CHECK(CNode::IsBanned(addr1.ip)); // ... but 1 still should be + BOOST_CHECK(!CNode::IsBanned(addr2)); // 2 not banned yet... + BOOST_CHECK(CNode::IsBanned(addr1)); // ... but 1 still should be dummyNode2.Misbehaving(50); - BOOST_CHECK(CNode::IsBanned(addr2.ip)); + BOOST_CHECK(CNode::IsBanned(addr2)); } BOOST_AUTO_TEST_CASE(DoS_banscore) { CNode::ClearBanned(); mapArgs["-banscore"] = "111"; // because 11 is my favorite number - CAddress addr1(0xa0b0c001); + CAddress addr1(ip(0xa0b0c001)); CNode dummyNode1(INVALID_SOCKET, addr1, true); dummyNode1.Misbehaving(100); - BOOST_CHECK(!CNode::IsBanned(addr1.ip)); + BOOST_CHECK(!CNode::IsBanned(addr1)); dummyNode1.Misbehaving(10); - BOOST_CHECK(!CNode::IsBanned(addr1.ip)); + BOOST_CHECK(!CNode::IsBanned(addr1)); dummyNode1.Misbehaving(1); - BOOST_CHECK(CNode::IsBanned(addr1.ip)); + BOOST_CHECK(CNode::IsBanned(addr1)); mapArgs["-banscore"] = "100"; } @@ -52,20 +66,20 @@ BOOST_AUTO_TEST_CASE(DoS_bantime) int64 nStartTime = GetTime(); SetMockTime(nStartTime); // Overrides future calls to GetTime() - CAddress addr(0xa0b0c001); + CAddress addr(ip(0xa0b0c001)); CNode dummyNode(INVALID_SOCKET, addr, true); dummyNode.Misbehaving(100); - BOOST_CHECK(CNode::IsBanned(addr.ip)); + BOOST_CHECK(CNode::IsBanned(addr)); SetMockTime(nStartTime+60*60); - BOOST_CHECK(CNode::IsBanned(addr.ip)); + BOOST_CHECK(CNode::IsBanned(addr)); SetMockTime(nStartTime+60*60*24+1); - BOOST_CHECK(!CNode::IsBanned(addr.ip)); -} + BOOST_CHECK(!CNode::IsBanned(addr)); +} -static bool CheckNBits(unsigned int nbits1, int64 time1, unsigned int nbits2, int64 time2) +static bool CheckNBits(unsigned int nbits1, int64 time1, unsigned int nbits2, int64 time2)\ { if (time1 > time2) return CheckNBits(nbits2, time2, nbits1, time1); @@ -115,4 +129,77 @@ BOOST_AUTO_TEST_CASE(DoS_checknbits) } +static uint256 RandomHash() +{ + std::vector randbytes(32); + RAND_bytes(&randbytes[0], 32); + uint256 randomhash(randbytes); + return randomhash; +} + +CTransaction RandomOrphan() +{ + std::map::iterator it; + it = mapOrphanTransactions.lower_bound(RandomHash()); + if (it == mapOrphanTransactions.end()) + it = mapOrphanTransactions.begin(); + const CDataStream* pvMsg = it->second; + CTransaction tx; + CDataStream(*pvMsg) >> tx; + return tx; +} + +BOOST_AUTO_TEST_CASE(DoS_mapOrphans) +{ + CKey key; + key.MakeNewKey(true); + CBasicKeyStore keystore; + keystore.AddKey(key); + + // 50 orphan transactions: + for (int i = 0; i < 50; i++) + { + CTransaction tx; + tx.vin.resize(1); + tx.vin[0].prevout.n = 0; + tx.vin[0].prevout.hash = RandomHash(); + tx.vin[0].scriptSig << OP_1; + tx.vout.resize(1); + tx.vout[0].nValue = 1*CENT; + tx.vout[0].scriptPubKey.SetBitcoinAddress(key.GetPubKey()); + + CDataStream ds; + ds << tx; + AddOrphanTx(ds); + } + + // ... and 50 that depend on other orphans: + for (int i = 0; i < 50; i++) + { + CTransaction txPrev = RandomOrphan(); + + CTransaction tx; + tx.vin.resize(1); + tx.vin[0].prevout.n = 0; + tx.vin[0].prevout.hash = txPrev.GetHash(); + tx.vout.resize(1); + tx.vout[0].nValue = 1*CENT; + tx.vout[0].scriptPubKey.SetBitcoinAddress(key.GetPubKey()); + SignSignature(keystore, txPrev, tx, 0); + + CDataStream ds; + ds << tx; + AddOrphanTx(ds); + } + + // Test LimitOrphanTxSize() function: + LimitOrphanTxSize(40); + BOOST_CHECK(mapOrphanTransactions.size() <= 40); + LimitOrphanTxSize(10); + BOOST_CHECK(mapOrphanTransactions.size() <= 10); + LimitOrphanTxSize(0); + BOOST_CHECK(mapOrphanTransactions.empty()); + BOOST_CHECK(mapOrphanTransactionsByPrev.empty()); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp index c7fa74e..d52ac74 100644 --- a/src/test/base58_tests.cpp +++ b/src/test/base58_tests.cpp @@ -1,6 +1,8 @@ #include -#include "../util.h" +#include "main.h" +#include "wallet.h" +#include "util.h" BOOST_AUTO_TEST_SUITE(base58_tests) diff --git a/src/test/base64_tests.cpp b/src/test/base64_tests.cpp index f30f7f8..fff30ef 100644 --- a/src/test/base64_tests.cpp +++ b/src/test/base64_tests.cpp @@ -1,18 +1,20 @@ #include -#include "../util.h" +#include "main.h" +#include "wallet.h" +#include "util.h" BOOST_AUTO_TEST_SUITE(base64_tests) BOOST_AUTO_TEST_CASE(base64_testvectors) { - static const string vstrIn[] = {"","f","fo","foo","foob","fooba","foobar"}; - static const string vstrOut[] = {"","Zg==","Zm8=","Zm9v","Zm9vYg==","Zm9vYmE=","Zm9vYmFy"}; + static const std::string vstrIn[] = {"","f","fo","foo","foob","fooba","foobar"}; + static const std::string vstrOut[] = {"","Zg==","Zm8=","Zm9v","Zm9vYg==","Zm9vYmE=","Zm9vYmFy"}; for (int i=0; i +#include +#include + +#include "util.h" + +BOOST_AUTO_TEST_SUITE(getarg_tests) + +static void +ResetArgs(const std::string& strArg) +{ + std::vector vecArg; + boost::split(vecArg, strArg, boost::is_space(), boost::token_compress_on); + + // Insert dummy executable name: + vecArg.insert(vecArg.begin(), "testbitcoin"); + + // Convert to char*: + std::vector vecChar; + BOOST_FOREACH(std::string& s, vecArg) + vecChar.push_back(s.c_str()); + + ParseParameters(vecChar.size(), &vecChar[0]); +} + +BOOST_AUTO_TEST_CASE(boolarg) +{ + ResetArgs("-foo"); + BOOST_CHECK(GetBoolArg("-foo")); + BOOST_CHECK(GetBoolArg("-foo", false)); + BOOST_CHECK(GetBoolArg("-foo", true)); + + BOOST_CHECK(!GetBoolArg("-fo")); + BOOST_CHECK(!GetBoolArg("-fo", false)); + BOOST_CHECK(GetBoolArg("-fo", true)); + + BOOST_CHECK(!GetBoolArg("-fooo")); + BOOST_CHECK(!GetBoolArg("-fooo", false)); + BOOST_CHECK(GetBoolArg("-fooo", true)); + + ResetArgs("-foo=0"); + BOOST_CHECK(!GetBoolArg("-foo")); + BOOST_CHECK(!GetBoolArg("-foo", false)); + BOOST_CHECK(!GetBoolArg("-foo", true)); + + ResetArgs("-foo=1"); + BOOST_CHECK(GetBoolArg("-foo")); + BOOST_CHECK(GetBoolArg("-foo", false)); + BOOST_CHECK(GetBoolArg("-foo", true)); + + // New 0.6 feature: auto-map -nosomething to !-something: + ResetArgs("-nofoo"); + BOOST_CHECK(!GetBoolArg("-foo")); + BOOST_CHECK(!GetBoolArg("-foo", false)); + BOOST_CHECK(!GetBoolArg("-foo", true)); + + ResetArgs("-nofoo=1"); + BOOST_CHECK(!GetBoolArg("-foo")); + BOOST_CHECK(!GetBoolArg("-foo", false)); + BOOST_CHECK(!GetBoolArg("-foo", true)); + + ResetArgs("-foo -nofoo"); // -foo should win + BOOST_CHECK(GetBoolArg("-foo")); + BOOST_CHECK(GetBoolArg("-foo", false)); + BOOST_CHECK(GetBoolArg("-foo", true)); + + ResetArgs("-foo=1 -nofoo=1"); // -foo should win + BOOST_CHECK(GetBoolArg("-foo")); + BOOST_CHECK(GetBoolArg("-foo", false)); + BOOST_CHECK(GetBoolArg("-foo", true)); + + ResetArgs("-foo=0 -nofoo=0"); // -foo should win + BOOST_CHECK(!GetBoolArg("-foo")); + BOOST_CHECK(!GetBoolArg("-foo", false)); + BOOST_CHECK(!GetBoolArg("-foo", true)); + + // New 0.6 feature: treat -- same as -: + ResetArgs("--foo=1"); + BOOST_CHECK(GetBoolArg("-foo")); + BOOST_CHECK(GetBoolArg("-foo", false)); + BOOST_CHECK(GetBoolArg("-foo", true)); + + ResetArgs("--nofoo=1"); + BOOST_CHECK(!GetBoolArg("-foo")); + BOOST_CHECK(!GetBoolArg("-foo", false)); + BOOST_CHECK(!GetBoolArg("-foo", true)); + +} + +BOOST_AUTO_TEST_CASE(stringarg) +{ + ResetArgs(""); + BOOST_CHECK_EQUAL(GetArg("-foo", ""), ""); + BOOST_CHECK_EQUAL(GetArg("-foo", "eleven"), "eleven"); + + ResetArgs("-foo -bar"); + BOOST_CHECK_EQUAL(GetArg("-foo", ""), ""); + BOOST_CHECK_EQUAL(GetArg("-foo", "eleven"), ""); + + ResetArgs("-foo="); + BOOST_CHECK_EQUAL(GetArg("-foo", ""), ""); + BOOST_CHECK_EQUAL(GetArg("-foo", "eleven"), ""); + + ResetArgs("-foo=11"); + BOOST_CHECK_EQUAL(GetArg("-foo", ""), "11"); + BOOST_CHECK_EQUAL(GetArg("-foo", "eleven"), "11"); + + ResetArgs("-foo=eleven"); + BOOST_CHECK_EQUAL(GetArg("-foo", ""), "eleven"); + BOOST_CHECK_EQUAL(GetArg("-foo", "eleven"), "eleven"); + +} + +BOOST_AUTO_TEST_CASE(intarg) +{ + ResetArgs(""); + BOOST_CHECK_EQUAL(GetArg("-foo", 11), 11); + BOOST_CHECK_EQUAL(GetArg("-foo", 0), 0); + + ResetArgs("-foo -bar"); + BOOST_CHECK_EQUAL(GetArg("-foo", 11), 0); + BOOST_CHECK_EQUAL(GetArg("-bar", 11), 0); + + ResetArgs("-foo=11 -bar=12"); + BOOST_CHECK_EQUAL(GetArg("-foo", 0), 11); + BOOST_CHECK_EQUAL(GetArg("-bar", 11), 12); + + ResetArgs("-foo=NaN -bar=NotANumber"); + BOOST_CHECK_EQUAL(GetArg("-foo", 1), 0); + BOOST_CHECK_EQUAL(GetArg("-bar", 11), 0); +} + +BOOST_AUTO_TEST_CASE(doubledash) +{ + ResetArgs("--foo"); + BOOST_CHECK_EQUAL(GetBoolArg("-foo"), true); + + ResetArgs("--foo=verbose --bar=1"); + BOOST_CHECK_EQUAL(GetArg("-foo", ""), "verbose"); + BOOST_CHECK_EQUAL(GetArg("-bar", 0), 1); +} + +BOOST_AUTO_TEST_CASE(boolargno) +{ + ResetArgs("-nofoo"); + BOOST_CHECK(!GetBoolArg("-foo")); + BOOST_CHECK(!GetBoolArg("-foo", true)); + BOOST_CHECK(!GetBoolArg("-foo", false)); + + ResetArgs("-nofoo=1"); + BOOST_CHECK(!GetBoolArg("-foo")); + BOOST_CHECK(!GetBoolArg("-foo", true)); + BOOST_CHECK(!GetBoolArg("-foo", false)); + + ResetArgs("-nofoo=0"); + BOOST_CHECK(GetBoolArg("-foo")); + BOOST_CHECK(GetBoolArg("-foo", true)); + BOOST_CHECK(GetBoolArg("-foo", false)); + + ResetArgs("-foo --nofoo"); + BOOST_CHECK(GetBoolArg("-foo")); + + ResetArgs("-nofoo -foo"); // foo always wins: + BOOST_CHECK(GetBoolArg("-foo")); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/key_tests.cpp b/src/test/key_tests.cpp new file mode 100644 index 0000000..bc8759b --- /dev/null +++ b/src/test/key_tests.cpp @@ -0,0 +1,138 @@ +#include + +#include +#include + +#include "key.h" +#include "base58.h" +#include "uint256.h" +#include "util.h" + +using namespace std; + +static const string strSecret1 ("5HxWvvfubhXpYYpS3tJkw6fq9jE9j18THftkZjHHfmFiWtmAbrj"); +static const string strSecret2 ("5KC4ejrDjv152FGwP386VD1i2NYc5KkfSMyv1nGy1VGDxGHqVY3"); +static const string strSecret1C("Kwr371tjA9u2rFSMZjTNun2PXXP3WPZu2afRHTcta6KxEUdm1vEw"); +static const string strSecret2C("L3Hq7a8FEQwJkW1M2GNKDW28546Vp5miewcCzSqUD9kCAXrJdS3g"); + +#ifdef KEY_TESTS_DUMPINFO +void dumpKeyInfo(uint256 privkey) +{ + CSecret secret; + secret.resize(32); + memcpy(&secret[0], &privkey, 32); + vector sec; + sec.resize(32); + memcpy(&sec[0], &secret[0], 32); + printf(" * secret (hex): %s\n", HexStr(sec).c_str()); + + for (int nCompressed=0; nCompressed<2; nCompressed++) + { + bool fCompressed = nCompressed == 1; + printf(" * %s:\n", fCompressed ? "compressed" : "uncompressed"); + CBitcoinSecret bsecret; + bsecret.SetSecret(secret, fCompressed); + printf(" * secret (base58): %s\n", bsecret.ToString().c_str()); + CKey key; + key.SetSecret(secret, fCompressed); + vector vchPubKey = key.GetPubKey(); + printf(" * pubkey (hex): %s\n", HexStr(vchPubKey).c_str()); + printf(" * address (base58): %s\n", CBitcoinAddress(vchPubKey).ToString().c_str()); + } +} +#endif + + +BOOST_AUTO_TEST_SUITE(key_tests) + +BOOST_AUTO_TEST_CASE(key_test1) +{ + CBitcoinSecret bsecret1, bsecret2, bsecret1C, bsecret2C; + bsecret1.SetString (strSecret1); + bsecret2.SetString (strSecret2); + bsecret1C.SetString(strSecret1C); + bsecret2C.SetString(strSecret2C); + + bool fCompressed; + CSecret secret1 = bsecret1.GetSecret (fCompressed); + BOOST_CHECK(fCompressed == false); + CSecret secret2 = bsecret2.GetSecret (fCompressed); + BOOST_CHECK(fCompressed == false); + CSecret secret1C = bsecret1C.GetSecret(fCompressed); + BOOST_CHECK(fCompressed == true); + CSecret secret2C = bsecret2C.GetSecret(fCompressed); + BOOST_CHECK(fCompressed == true); + + BOOST_CHECK(secret1 == secret1C); + BOOST_CHECK(secret2 == secret2C); + + CKey key1, key2, key1C, key2C; + key1.SetSecret(secret1, false); + key2.SetSecret(secret2, false); + key1C.SetSecret(secret1, true); + key2C.SetSecret(secret2, true); + + BOOST_CHECK(CBitcoinAddress(key1.GetPubKey ()).ToString() == "1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ"); + BOOST_CHECK(CBitcoinAddress(key2.GetPubKey ()).ToString() == "1F5y5E5FMc5YzdJtB9hLaUe43GDxEKXENJ"); + BOOST_CHECK(CBitcoinAddress(key1C.GetPubKey()).ToString() == "1NoJrossxPBKfCHuJXT4HadJrXRE9Fxiqs"); + BOOST_CHECK(CBitcoinAddress(key2C.GetPubKey()).ToString() == "1CRj2HyM1CXWzHAXLQtiGLyggNT9WQqsDs"); + + for (int n=0; n<16; n++) + { + string strMsg = strprintf("Very secret message %i: 11", n); + uint256 hashMsg = Hash(strMsg.begin(), strMsg.end()); + + // normal signatures + + vector sign1, sign2, sign1C, sign2C; + + BOOST_CHECK(key1.Sign (hashMsg, sign1)); + BOOST_CHECK(key2.Sign (hashMsg, sign2)); + BOOST_CHECK(key1C.Sign(hashMsg, sign1C)); + BOOST_CHECK(key2C.Sign(hashMsg, sign2C)); + + BOOST_CHECK( key1.Verify(hashMsg, sign1)); + BOOST_CHECK(!key1.Verify(hashMsg, sign2)); + BOOST_CHECK( key1.Verify(hashMsg, sign1C)); + BOOST_CHECK(!key1.Verify(hashMsg, sign2C)); + + BOOST_CHECK(!key2.Verify(hashMsg, sign1)); + BOOST_CHECK( key2.Verify(hashMsg, sign2)); + BOOST_CHECK(!key2.Verify(hashMsg, sign1C)); + BOOST_CHECK( key2.Verify(hashMsg, sign2C)); + + BOOST_CHECK( key1C.Verify(hashMsg, sign1)); + BOOST_CHECK(!key1C.Verify(hashMsg, sign2)); + BOOST_CHECK( key1C.Verify(hashMsg, sign1C)); + BOOST_CHECK(!key1C.Verify(hashMsg, sign2C)); + + BOOST_CHECK(!key2C.Verify(hashMsg, sign1)); + BOOST_CHECK( key2C.Verify(hashMsg, sign2)); + BOOST_CHECK(!key2C.Verify(hashMsg, sign1C)); + BOOST_CHECK( key2C.Verify(hashMsg, sign2C)); + + // compact signatures (with key recovery) + + vector csign1, csign2, csign1C, csign2C; + + BOOST_CHECK(key1.SignCompact (hashMsg, csign1)); + BOOST_CHECK(key2.SignCompact (hashMsg, csign2)); + BOOST_CHECK(key1C.SignCompact(hashMsg, csign1C)); + BOOST_CHECK(key2C.SignCompact(hashMsg, csign2C)); + + CKey rkey1, rkey2, rkey1C, rkey2C; + + BOOST_CHECK(rkey1.SetCompactSignature (hashMsg, csign1)); + BOOST_CHECK(rkey2.SetCompactSignature (hashMsg, csign2)); + BOOST_CHECK(rkey1C.SetCompactSignature(hashMsg, csign1C)); + BOOST_CHECK(rkey2C.SetCompactSignature(hashMsg, csign2C)); + + + BOOST_CHECK(rkey1.GetPubKey() == key1.GetPubKey()); + BOOST_CHECK(rkey2.GetPubKey() == key2.GetPubKey()); + BOOST_CHECK(rkey1C.GetPubKey() == key1C.GetPubKey()); + BOOST_CHECK(rkey2C.GetPubKey() == key2C.GetPubKey()); + } +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 8fc5347..d4abd6d 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -1,6 +1,6 @@ #include -#include "../uint256.h" +#include "uint256.h" extern void SHA256Transform(void* pstate, void* pinput, const void* pinit); diff --git a/src/test/mruset_tests.cpp b/src/test/mruset_tests.cpp new file mode 100644 index 0000000..ca5a1f1 --- /dev/null +++ b/src/test/mruset_tests.cpp @@ -0,0 +1,90 @@ +#include + +using namespace std; + +#include "mruset.h" +#include "util.h" + +#define NUM_TESTS 16 +#define MAX_SIZE 100 + +class mrutester +{ +private: + mruset mru; + std::set set; + +public: + mrutester() { mru.max_size(MAX_SIZE); } + int size() const { return set.size(); } + + void insert(int n) + { + mru.insert(n); + set.insert(n); + BOOST_CHECK(mru == set); + } +}; + +BOOST_AUTO_TEST_SUITE(mruset_tests) + +// Test that an mruset behaves like a set, as long as no more than MAX_SIZE elements are in it +BOOST_AUTO_TEST_CASE(mruset_like_set) +{ + + for (int nTest=0; nTest mru(MAX_SIZE); + for (int nAction=0; nAction<3*MAX_SIZE; nAction++) + { + int n = GetRandInt(2 * MAX_SIZE); + mru.insert(n); + BOOST_CHECK(mru.size() <= MAX_SIZE); + } + } +} + +// 16-bit permutation function +int static permute(int n) +{ + // hexadecimals of pi; verified to be linearly independent + static const int table[16] = {0x243F, 0x6A88, 0x85A3, 0x08D3, 0x1319, 0x8A2E, 0x0370, 0x7344, + 0xA409, 0x3822, 0x299F, 0x31D0, 0x082E, 0xFA98, 0xEC4E, 0x6C89}; + + int ret = 0; + for (int bit=0; bit<16; bit++) + if (n & (1< mru(MAX_SIZE); + for (int n=0; n<10*MAX_SIZE; n++) + { + mru.insert(permute(n)); + + set tester; + for (int m=max(0,n-MAX_SIZE+1); m<=n; m++) + tester.insert(permute(m)); + + BOOST_CHECK(mru == tester); + } +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp new file mode 100644 index 0000000..8ae9290 --- /dev/null +++ b/src/test/multisig_tests.cpp @@ -0,0 +1,296 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "keystore.h" +#include "main.h" +#include "script.h" +#include "wallet.h" + +using namespace std; +using namespace boost::assign; + +typedef vector valtype; + +extern uint256 SignatureHash(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); +extern bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, + bool fValidatePayToScriptHash, int nHashType); + +BOOST_AUTO_TEST_SUITE(multisig_tests) + +CScript +sign_multisig(CScript scriptPubKey, vector keys, CTransaction transaction, int whichIn) +{ + uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL); + + CScript result; + result << OP_0; // CHECKMULTISIG bug workaround + BOOST_FOREACH(CKey key, keys) + { + vector vchSig; + BOOST_CHECK(key.Sign(hash, vchSig)); + vchSig.push_back((unsigned char)SIGHASH_ALL); + result << vchSig; + } + return result; +} + +BOOST_AUTO_TEST_CASE(multisig_verify) +{ + CKey key[4]; + for (int i = 0; i < 4; i++) + key[i].MakeNewKey(true); + + CScript a_and_b; + a_and_b << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + + CScript a_or_b; + a_or_b << OP_1 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + + CScript escrow; + escrow << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << key[2].GetPubKey() << OP_3 << OP_CHECKMULTISIG; + + CTransaction txFrom; // Funding transaction + txFrom.vout.resize(3); + txFrom.vout[0].scriptPubKey = a_and_b; + txFrom.vout[1].scriptPubKey = a_or_b; + txFrom.vout[2].scriptPubKey = escrow; + + CTransaction txTo[3]; // Spending transaction + for (int i = 0; i < 3; i++) + { + txTo[i].vin.resize(1); + txTo[i].vout.resize(1); + txTo[i].vin[0].prevout.n = i; + txTo[i].vin[0].prevout.hash = txFrom.GetHash(); + txTo[i].vout[0].nValue = 1; + } + + vector keys; + CScript s; + + // Test a AND b: + keys.clear(); + keys += key[0],key[1]; // magic operator+= from boost.assign + s = sign_multisig(a_and_b, keys, txTo[0], 0); + BOOST_CHECK(VerifyScript(s, a_and_b, txTo[0], 0, true, 0)); + + for (int i = 0; i < 4; i++) + { + keys.clear(); + keys += key[i]; + s = sign_multisig(a_and_b, keys, txTo[0], 0); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, txTo[0], 0, true, 0), strprintf("a&b 1: %d", i)); + + keys.clear(); + keys += key[1],key[i]; + s = sign_multisig(a_and_b, keys, txTo[0], 0); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, txTo[0], 0, true, 0), strprintf("a&b 2: %d", i)); + } + + // Test a OR b: + for (int i = 0; i < 4; i++) + { + keys.clear(); + keys += key[i]; + s = sign_multisig(a_or_b, keys, txTo[1], 0); + if (i == 0 || i == 1) + BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, txTo[1], 0, true, 0), strprintf("a|b: %d", i)); + else + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, txTo[1], 0, true, 0), strprintf("a|b: %d", i)); + } + s.clear(); + s << OP_0 << OP_0; + BOOST_CHECK(!VerifyScript(s, a_or_b, txTo[1], 0, true, 0)); + s.clear(); + s << OP_0 << OP_1; + BOOST_CHECK(!VerifyScript(s, a_or_b, txTo[1], 0, true, 0)); + + + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + keys.clear(); + keys += key[i],key[j]; + s = sign_multisig(escrow, keys, txTo[2], 0); + if (i < j && i < 3 && j < 3) + BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, txTo[2], 0, true, 0), strprintf("escrow 1: %d %d", i, j)); + else + BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, txTo[2], 0, true, 0), strprintf("escrow 2: %d %d", i, j)); + } +} + +BOOST_AUTO_TEST_CASE(multisig_IsStandard) +{ + CKey key[4]; + for (int i = 0; i < 4; i++) + key[i].MakeNewKey(true); + + CScript a_and_b; + a_and_b << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + BOOST_CHECK(::IsStandard(a_and_b)); + + CScript a_or_b; + a_or_b << OP_1 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + BOOST_CHECK(::IsStandard(a_or_b)); + + CScript escrow; + escrow << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << key[2].GetPubKey() << OP_3 << OP_CHECKMULTISIG; + BOOST_CHECK(::IsStandard(escrow)); + + CScript one_of_four; + one_of_four << OP_1 << key[0].GetPubKey() << key[1].GetPubKey() << key[2].GetPubKey() << key[3].GetPubKey() << OP_4 << OP_CHECKMULTISIG; + BOOST_CHECK(!::IsStandard(one_of_four)); + + CScript malformed[6]; + malformed[0] << OP_3 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + malformed[1] << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << OP_3 << OP_CHECKMULTISIG; + malformed[2] << OP_0 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + malformed[3] << OP_1 << key[0].GetPubKey() << key[1].GetPubKey() << OP_0 << OP_CHECKMULTISIG; + malformed[4] << OP_1 << key[0].GetPubKey() << key[1].GetPubKey() << OP_CHECKMULTISIG; + malformed[5] << OP_1 << key[0].GetPubKey() << key[1].GetPubKey(); + + for (int i = 0; i < 6; i++) + BOOST_CHECK(!::IsStandard(malformed[i])); +} + +BOOST_AUTO_TEST_CASE(multisig_Solver1) +{ + // Tests Solver() that returns lists of keys that are + // required to satisfy a ScriptPubKey + // + // Also tests IsMine() and ExtractAddress() + // + // Note: ExtractAddress for the multisignature transactions + // always returns false for this release, even if you have + // one key that would satisfy an (a|b) or 2-of-3 keys needed + // to spend an escrow transaction. + // + CBasicKeyStore keystore, emptykeystore, partialkeystore; + CKey key[3]; + CBitcoinAddress keyaddr[3]; + for (int i = 0; i < 3; i++) + { + key[i].MakeNewKey(true); + keystore.AddKey(key[i]); + keyaddr[i].SetPubKey(key[i].GetPubKey()); + } + partialkeystore.AddKey(key[0]); + + { + vector solutions; + txnouttype whichType; + CScript s; + s << key[0].GetPubKey() << OP_CHECKSIG; + BOOST_CHECK(Solver(s, whichType, solutions)); + BOOST_CHECK(solutions.size() == 1); + CBitcoinAddress addr; + BOOST_CHECK(ExtractAddress(s, addr)); + BOOST_CHECK(addr == keyaddr[0]); + BOOST_CHECK(IsMine(keystore, s)); + BOOST_CHECK(!IsMine(emptykeystore, s)); + } + { + vector solutions; + txnouttype whichType; + CScript s; + s << OP_DUP << OP_HASH160 << Hash160(key[0].GetPubKey()) << OP_EQUALVERIFY << OP_CHECKSIG; + BOOST_CHECK(Solver(s, whichType, solutions)); + BOOST_CHECK(solutions.size() == 1); + CBitcoinAddress addr; + BOOST_CHECK(ExtractAddress(s, addr)); + BOOST_CHECK(addr == keyaddr[0]); + BOOST_CHECK(IsMine(keystore, s)); + BOOST_CHECK(!IsMine(emptykeystore, s)); + } + { + vector solutions; + txnouttype whichType; + CScript s; + s << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + BOOST_CHECK(Solver(s, whichType, solutions)); + BOOST_CHECK_EQUAL(solutions.size(), 4); + CBitcoinAddress addr; + BOOST_CHECK(!ExtractAddress(s, addr)); + BOOST_CHECK(IsMine(keystore, s)); + BOOST_CHECK(!IsMine(emptykeystore, s)); + BOOST_CHECK(!IsMine(partialkeystore, s)); + } + { + vector solutions; + txnouttype whichType; + CScript s; + s << OP_1 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + BOOST_CHECK(Solver(s, whichType, solutions)); + BOOST_CHECK_EQUAL(solutions.size(), 4); + vector addrs; + int nRequired; + BOOST_CHECK(ExtractAddresses(s, whichType, addrs, nRequired)); + BOOST_CHECK(addrs[0] == keyaddr[0]); + BOOST_CHECK(addrs[1] == keyaddr[1]); + BOOST_CHECK(nRequired = 1); + BOOST_CHECK(IsMine(keystore, s)); + BOOST_CHECK(!IsMine(emptykeystore, s)); + BOOST_CHECK(!IsMine(partialkeystore, s)); + } + { + vector solutions; + txnouttype whichType; + CScript s; + s << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << key[2].GetPubKey() << OP_3 << OP_CHECKMULTISIG; + BOOST_CHECK(Solver(s, whichType, solutions)); + BOOST_CHECK(solutions.size() == 5); + } +} + +BOOST_AUTO_TEST_CASE(multisig_Sign) +{ + // Test SignSignature() (and therefore the version of Solver() that signs transactions) + CBasicKeyStore keystore; + CKey key[4]; + for (int i = 0; i < 4; i++) + { + key[i].MakeNewKey(true); + keystore.AddKey(key[i]); + } + + CScript a_and_b; + a_and_b << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + + CScript a_or_b; + a_or_b << OP_1 << key[0].GetPubKey() << key[1].GetPubKey() << OP_2 << OP_CHECKMULTISIG; + + CScript escrow; + escrow << OP_2 << key[0].GetPubKey() << key[1].GetPubKey() << key[2].GetPubKey() << OP_3 << OP_CHECKMULTISIG; + + CTransaction txFrom; // Funding transaction + txFrom.vout.resize(3); + txFrom.vout[0].scriptPubKey = a_and_b; + txFrom.vout[1].scriptPubKey = a_or_b; + txFrom.vout[2].scriptPubKey = escrow; + + CTransaction txTo[3]; // Spending transaction + for (int i = 0; i < 3; i++) + { + txTo[i].vin.resize(1); + txTo[i].vout.resize(1); + txTo[i].vin[0].prevout.n = i; + txTo[i].vin[0].prevout.hash = txFrom.GetHash(); + txTo[i].vout[0].nValue = 1; + } + + for (int i = 0; i < 3; i++) + { + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i)); + } +} + + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp new file mode 100644 index 0000000..87462f7 --- /dev/null +++ b/src/test/rpc_tests.cpp @@ -0,0 +1,74 @@ +#include +#include + +#include "base58.h" +#include "util.h" +#include "json/json_spirit_reader_template.h" +#include "json/json_spirit_writer_template.h" +#include "json/json_spirit_utils.h" + +using namespace std; +using namespace json_spirit; + +typedef Value(*rpcfn_type)(const Array& params, bool fHelp); +extern map mapCallTable; + +BOOST_AUTO_TEST_SUITE(rpc_tests) + +static Array +createArgs(int nRequired, const char* address1=NULL, const char* address2=NULL) +{ + Array result; + result.push_back(nRequired); + Array addresses; + if (address1) addresses.push_back(address1); + if (address2) addresses.push_back(address1); + result.push_back(addresses); + return result; +} + +// This can be removed this when addmultisigaddress is enabled on main net: +struct TestNetFixture +{ + TestNetFixture() { fTestNet = true; } + ~TestNetFixture() { fTestNet = false; } +}; + +BOOST_FIXTURE_TEST_CASE(rpc_addmultisig, TestNetFixture) +{ + rpcfn_type addmultisig = mapCallTable["addmultisigaddress"]; + + // old, 65-byte-long: + const char* address1Hex = "0434e3e09f49ea168c5bbf53f877ff4206923858aab7c7e1df25bc263978107c95e35065a27ef6f1b27222db0ec97e0e895eaca603d3ee0d4c060ce3d8a00286c8"; + // new, compressed: + const char* address2Hex = "0388c2037017c62240b6b72ac1a2a5f94da790596ebd06177c8572752922165cb4"; + + Value v; + CBitcoinAddress address; + BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false)); + address.SetString(v.get_str()); + BOOST_CHECK(address.IsValid() && address.IsScript()); + + BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex, address2Hex), false)); + address.SetString(v.get_str()); + BOOST_CHECK(address.IsValid() && address.IsScript()); + + BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(2, address1Hex, address2Hex), false)); + address.SetString(v.get_str()); + BOOST_CHECK(address.IsValid() && address.IsScript()); + + BOOST_CHECK_THROW(addmultisig(createArgs(0), false), runtime_error); + BOOST_CHECK_THROW(addmultisig(createArgs(1), false), runtime_error); + BOOST_CHECK_THROW(addmultisig(createArgs(2, address1Hex), false), runtime_error); + + BOOST_CHECK_THROW(addmultisig(createArgs(1, ""), false), runtime_error); + BOOST_CHECK_THROW(addmultisig(createArgs(1, "NotAValidPubkey"), false), runtime_error); + + string short1(address1Hex, address1Hex+sizeof(address1Hex)-2); // last byte missing + BOOST_CHECK_THROW(addmultisig(createArgs(2, short1.c_str()), false), runtime_error); + + string short2(address1Hex+2, address1Hex+sizeof(address1Hex)); // first byte missing + BOOST_CHECK_THROW(addmultisig(createArgs(2, short2.c_str()), false), runtime_error); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp new file mode 100644 index 0000000..aa72c00 --- /dev/null +++ b/src/test/script_P2SH_tests.cpp @@ -0,0 +1,330 @@ +#include +#include +#include +#include +#include +#include + +#include "../main.h" +#include "../script.h" +#include "../wallet.h" + +using namespace std; + +// Test routines internal to script.cpp: +extern uint256 SignatureHash(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); +extern bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, + bool fValidatePayToScriptHash, int nHashType); + +// Helpers: +static std::vector +Serialize(const CScript& s) +{ + std::vector sSerialized(s); + return sSerialized; +} + +static bool +Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict) +{ + // Create dummy to/from transactions: + CTransaction txFrom; + txFrom.vout.resize(1); + txFrom.vout[0].scriptPubKey = scriptPubKey; + + CTransaction txTo; + txTo.vin.resize(1); + txTo.vout.resize(1); + txTo.vin[0].prevout.n = 0; + txTo.vin[0].prevout.hash = txFrom.GetHash(); + txTo.vin[0].scriptSig = scriptSig; + txTo.vout[0].nValue = 1; + + return VerifyScript(scriptSig, scriptPubKey, txTo, 0, fStrict, 0); +} + + +BOOST_AUTO_TEST_SUITE(script_P2SH_tests) + +BOOST_AUTO_TEST_CASE(sign) +{ + // Pay-to-script-hash looks like this: + // scriptSig: + // scriptPubKey: HASH160 EQUAL + + // Test SignSignature() (and therefore the version of Solver() that signs transactions) + CBasicKeyStore keystore; + CKey key[4]; + for (int i = 0; i < 4; i++) + { + key[i].MakeNewKey(true); + keystore.AddKey(key[i]); + } + + // 8 Scripts: checking all combinations of + // different keys, straight/P2SH, pubkey/pubkeyhash + CScript standardScripts[4]; + standardScripts[0] << key[0].GetPubKey() << OP_CHECKSIG; + standardScripts[1].SetBitcoinAddress(key[1].GetPubKey()); + standardScripts[2] << key[1].GetPubKey() << OP_CHECKSIG; + standardScripts[3].SetBitcoinAddress(key[2].GetPubKey()); + CScript evalScripts[4]; + for (int i = 0; i < 4; i++) + { + keystore.AddCScript(standardScripts[i]); + evalScripts[i].SetPayToScriptHash(standardScripts[i]); + } + + CTransaction txFrom; // Funding transaction: + txFrom.vout.resize(8); + for (int i = 0; i < 4; i++) + { + txFrom.vout[i].scriptPubKey = evalScripts[i]; + txFrom.vout[i+4].scriptPubKey = standardScripts[i]; + } + BOOST_CHECK(txFrom.IsStandard()); + + CTransaction txTo[8]; // Spending transactions + for (int i = 0; i < 8; i++) + { + txTo[i].vin.resize(1); + txTo[i].vout.resize(1); + txTo[i].vin[0].prevout.n = i; + txTo[i].vin[0].prevout.hash = txFrom.GetHash(); + txTo[i].vout[0].nValue = 1; + BOOST_CHECK_MESSAGE(IsMine(keystore, txFrom.vout[i].scriptPubKey), strprintf("IsMine %d", i)); + } + for (int i = 0; i < 8; i++) + { + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i)); + } + // All of the above should be OK, and the txTos have valid signatures + // Check to make sure signature verification fails if we use the wrong ScriptSig: + for (int i = 0; i < 8; i++) + for (int j = 0; j < 8; j++) + { + CScript sigSave = txTo[i].vin[0].scriptSig; + txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig; + bool sigOK = VerifySignature(txFrom, txTo[i], 0, true, 0); + if (i == j) + BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j)); + else + BOOST_CHECK_MESSAGE(!sigOK, strprintf("VerifySignature %d %d", i, j)); + txTo[i].vin[0].scriptSig = sigSave; + } +} + +BOOST_AUTO_TEST_CASE(norecurse) +{ + // Make sure only the outer pay-to-script-hash does the + // extra-validation thing: + CScript invalidAsScript; + invalidAsScript << OP_INVALIDOPCODE << OP_INVALIDOPCODE; + + CScript p2sh; + p2sh.SetPayToScriptHash(invalidAsScript); + + CScript scriptSig; + scriptSig << Serialize(invalidAsScript); + + // Should not verify, because it will try to execute OP_INVALIDOPCODE + BOOST_CHECK(!Verify(scriptSig, p2sh, true)); + + // Try to recurse, and verification should succeed because + // the inner HASH160 <> EQUAL should only check the hash: + CScript p2sh2; + p2sh2.SetPayToScriptHash(p2sh); + CScript scriptSig2; + scriptSig2 << Serialize(invalidAsScript) << Serialize(p2sh); + + BOOST_CHECK(Verify(scriptSig2, p2sh2, true)); +} + +BOOST_AUTO_TEST_CASE(set) +{ + // Test the CScript::Set* methods + CBasicKeyStore keystore; + CKey key[4]; + std::vector keys; + for (int i = 0; i < 4; i++) + { + key[i].MakeNewKey(true); + keystore.AddKey(key[i]); + keys.push_back(key[i]); + } + + CScript inner[4]; + inner[0].SetBitcoinAddress(key[0].GetPubKey()); + inner[1].SetMultisig(2, std::vector(keys.begin(), keys.begin()+2)); + inner[2].SetMultisig(1, std::vector(keys.begin(), keys.begin()+2)); + inner[3].SetMultisig(2, std::vector(keys.begin(), keys.begin()+3)); + + CScript outer[4]; + for (int i = 0; i < 4; i++) + { + outer[i].SetPayToScriptHash(inner[i]); + keystore.AddCScript(inner[i]); + } + + CTransaction txFrom; // Funding transaction: + txFrom.vout.resize(4); + for (int i = 0; i < 4; i++) + { + txFrom.vout[i].scriptPubKey = outer[i]; + } + BOOST_CHECK(txFrom.IsStandard()); + + CTransaction txTo[4]; // Spending transactions + for (int i = 0; i < 4; i++) + { + txTo[i].vin.resize(1); + txTo[i].vout.resize(1); + txTo[i].vin[0].prevout.n = i; + txTo[i].vin[0].prevout.hash = txFrom.GetHash(); + txTo[i].vout[0].nValue = 1; + txTo[i].vout[0].scriptPubKey = inner[i]; + BOOST_CHECK_MESSAGE(IsMine(keystore, txFrom.vout[i].scriptPubKey), strprintf("IsMine %d", i)); + } + for (int i = 0; i < 4; i++) + { + BOOST_CHECK_MESSAGE(SignSignature(keystore, txFrom, txTo[i], 0), strprintf("SignSignature %d", i)); + BOOST_CHECK_MESSAGE(txTo[i].IsStandard(), strprintf("txTo[%d].IsStandard", i)); + } +} + +BOOST_AUTO_TEST_CASE(is) +{ + // Test CScript::IsPayToScriptHash() + uint160 dummy; + CScript p2sh; + p2sh << OP_HASH160 << dummy << OP_EQUAL; + BOOST_CHECK(p2sh.IsPayToScriptHash()); + + // Not considered pay-to-script-hash if using one of the OP_PUSHDATA opcodes: + static const unsigned char direct[] = { OP_HASH160, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUAL }; + BOOST_CHECK(CScript(direct, direct+sizeof(direct)).IsPayToScriptHash()); + static const unsigned char pushdata1[] = { OP_HASH160, OP_PUSHDATA1, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUAL }; + BOOST_CHECK(!CScript(pushdata1, pushdata1+sizeof(pushdata1)).IsPayToScriptHash()); + static const unsigned char pushdata2[] = { OP_HASH160, OP_PUSHDATA2, 20,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUAL }; + BOOST_CHECK(!CScript(pushdata2, pushdata2+sizeof(pushdata2)).IsPayToScriptHash()); + static const unsigned char pushdata4[] = { OP_HASH160, OP_PUSHDATA4, 20,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUAL }; + BOOST_CHECK(!CScript(pushdata4, pushdata4+sizeof(pushdata4)).IsPayToScriptHash()); + + CScript not_p2sh; + BOOST_CHECK(!not_p2sh.IsPayToScriptHash()); + + not_p2sh.clear(); not_p2sh << OP_HASH160 << dummy << dummy << OP_EQUAL; + BOOST_CHECK(!not_p2sh.IsPayToScriptHash()); + + not_p2sh.clear(); not_p2sh << OP_NOP << dummy << OP_EQUAL; + BOOST_CHECK(!not_p2sh.IsPayToScriptHash()); + + not_p2sh.clear(); not_p2sh << OP_HASH160 << dummy << OP_CHECKSIG; + BOOST_CHECK(!not_p2sh.IsPayToScriptHash()); +} + +BOOST_AUTO_TEST_CASE(switchover) +{ + // Test switchover code + CScript notValid; + notValid << OP_11 << OP_12 << OP_EQUALVERIFY; + CScript scriptSig; + scriptSig << Serialize(notValid); + + CScript fund; + fund.SetPayToScriptHash(notValid); + + + // Validation should succeed under old rules (hash is correct): + BOOST_CHECK(Verify(scriptSig, fund, false)); + // Fail under new: + BOOST_CHECK(!Verify(scriptSig, fund, true)); +} + +BOOST_AUTO_TEST_CASE(AreInputsStandard) +{ + std::map > mapInputs; + CBasicKeyStore keystore; + CKey key[3]; + vector keys; + for (int i = 0; i < 3; i++) + { + key[i].MakeNewKey(true); + keystore.AddKey(key[i]); + keys.push_back(key[i]); + } + + CTransaction txFrom; + txFrom.vout.resize(6); + + // First three are standard: + CScript pay1; pay1.SetBitcoinAddress(key[0].GetPubKey()); + keystore.AddCScript(pay1); + CScript payScriptHash1; payScriptHash1.SetPayToScriptHash(pay1); + CScript pay1of3; pay1of3.SetMultisig(1, keys); + + txFrom.vout[0].scriptPubKey = payScriptHash1; + txFrom.vout[1].scriptPubKey = pay1; + txFrom.vout[2].scriptPubKey = pay1of3; + + // Last three non-standard: + CScript empty; + keystore.AddCScript(empty); + txFrom.vout[3].scriptPubKey = empty; + // Can't use SetPayToScriptHash, it checks for the empty Script. So: + txFrom.vout[4].scriptPubKey << OP_HASH160 << Hash160(empty) << OP_EQUAL; + CScript oneOfEleven; + oneOfEleven << OP_1; + for (int i = 0; i < 11; i++) + oneOfEleven << key[0].GetPubKey(); + oneOfEleven << OP_11 << OP_CHECKMULTISIG; + txFrom.vout[5].scriptPubKey.SetPayToScriptHash(oneOfEleven); + + mapInputs[txFrom.GetHash()] = make_pair(CTxIndex(), txFrom); + + CTransaction txTo; + txTo.vout.resize(1); + txTo.vout[0].scriptPubKey.SetBitcoinAddress(key[1].GetPubKey()); + + txTo.vin.resize(3); + txTo.vin[0].prevout.n = 0; + txTo.vin[0].prevout.hash = txFrom.GetHash(); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 0)); + txTo.vin[1].prevout.n = 1; + txTo.vin[1].prevout.hash = txFrom.GetHash(); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 1)); + txTo.vin[2].prevout.n = 2; + txTo.vin[2].prevout.hash = txFrom.GetHash(); + BOOST_CHECK(SignSignature(keystore, txFrom, txTo, 2)); + + BOOST_CHECK(txTo.AreInputsStandard(mapInputs)); + BOOST_CHECK_EQUAL(txTo.GetP2SHSigOpCount(mapInputs), 1); + + // Make sure adding crap to the scriptSigs makes them non-standard: + for (int i = 0; i < 3; i++) + { + CScript t = txTo.vin[i].scriptSig; + txTo.vin[i].scriptSig = (CScript() << 11) + t; + BOOST_CHECK(!txTo.AreInputsStandard(mapInputs)); + txTo.vin[i].scriptSig = t; + } + + CTransaction txToNonStd; + txToNonStd.vout.resize(1); + txToNonStd.vout[0].scriptPubKey.SetBitcoinAddress(key[1].GetPubKey()); + txToNonStd.vin.resize(2); + txToNonStd.vin[0].prevout.n = 4; + txToNonStd.vin[0].prevout.hash = txFrom.GetHash(); + txToNonStd.vin[0].scriptSig << Serialize(empty); + txToNonStd.vin[1].prevout.n = 5; + txToNonStd.vin[1].prevout.hash = txFrom.GetHash(); + txToNonStd.vin[1].scriptSig << OP_0 << Serialize(oneOfEleven); + + BOOST_CHECK(!txToNonStd.AreInputsStandard(mapInputs)); + BOOST_CHECK_EQUAL(txToNonStd.GetP2SHSigOpCount(mapInputs), 11); + + txToNonStd.vin[0].scriptSig.clear(); + BOOST_CHECK(!txToNonStd.AreInputsStandard(mapInputs)); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index 541f5f0..493ea69 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -2,8 +2,8 @@ #include #include -#include "../main.h" -#include "../wallet.h" +#include "main.h" +#include "wallet.h" using namespace std; extern uint256 SignatureHash(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); @@ -72,9 +72,9 @@ sign_multisig(CScript scriptPubKey, CKey key, CTransaction transaction) BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) { CKey key1, key2, key3; - key1.MakeNewKey(); - key2.MakeNewKey(); - key3.MakeNewKey(); + key1.MakeNewKey(true); + key2.MakeNewKey(false); + key3.MakeNewKey(true); CScript scriptPubKey12; scriptPubKey12 << OP_1 << key1.GetPubKey() << key2.GetPubKey() << OP_2 << OP_CHECKMULTISIG; @@ -105,10 +105,10 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) { CKey key1, key2, key3, key4; - key1.MakeNewKey(); - key2.MakeNewKey(); - key3.MakeNewKey(); - key4.MakeNewKey(); + key1.MakeNewKey(true); + key2.MakeNewKey(false); + key3.MakeNewKey(true); + key4.MakeNewKey(false); CScript scriptPubKey23; scriptPubKey23 << OP_2 << key1.GetPubKey() << key2.GetPubKey() << key3.GetPubKey() << OP_3 << OP_CHECKMULTISIG; diff --git a/src/test/sigopcount_tests.cpp b/src/test/sigopcount_tests.cpp new file mode 100644 index 0000000..d301313 --- /dev/null +++ b/src/test/sigopcount_tests.cpp @@ -0,0 +1,60 @@ +#include +#include +#include + +#include "script.h" +#include "key.h" + +using namespace std; + +// Helpers: +static std::vector +Serialize(const CScript& s) +{ + std::vector sSerialized(s); + return sSerialized; +} + +BOOST_AUTO_TEST_SUITE(sigopcount_tests) + +BOOST_AUTO_TEST_CASE(GetSigOpCount) +{ + // Test CScript::GetSigOpCount() + CScript s1; + BOOST_CHECK_EQUAL(s1.GetSigOpCount(false), 0); + BOOST_CHECK_EQUAL(s1.GetSigOpCount(true), 0); + + uint160 dummy; + s1 << OP_1 << dummy << dummy << OP_2 << OP_CHECKMULTISIG; + BOOST_CHECK_EQUAL(s1.GetSigOpCount(true), 2); + s1 << OP_IF << OP_CHECKSIG << OP_ENDIF; + BOOST_CHECK_EQUAL(s1.GetSigOpCount(true), 3); + BOOST_CHECK_EQUAL(s1.GetSigOpCount(false), 21); + + CScript p2sh; + p2sh.SetPayToScriptHash(s1); + CScript scriptSig; + scriptSig << OP_0 << Serialize(s1); + BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig), 3); + + std::vector keys; + for (int i = 0; i < 3; i++) + { + CKey k; + k.MakeNewKey(true); + keys.push_back(k); + } + CScript s2; + s2.SetMultisig(1, keys); + BOOST_CHECK_EQUAL(s2.GetSigOpCount(true), 3); + BOOST_CHECK_EQUAL(s2.GetSigOpCount(false), 20); + + p2sh.SetPayToScriptHash(s2); + BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(true), 0); + BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(false), 0); + CScript scriptSig2; + scriptSig2 << OP_1 << dummy << dummy << Serialize(s2); + BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig2), 3); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 39a7c88..7ff7545 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -1,22 +1,27 @@ #define BOOST_TEST_MODULE Bitcoin Test Suite #include -#include "../main.h" -#include "../wallet.h" - -#include "uint160_tests.cpp" -#include "uint256_tests.cpp" -#include "script_tests.cpp" -#include "transaction_tests.cpp" -#include "DoS_tests.cpp" -#include "base64_tests.cpp" -#include "util_tests.cpp" -#include "base58_tests.cpp" -#include "miner_tests.cpp" -#include "Checkpoints_tests.cpp" +#include "main.h" +#include "wallet.h" CWallet* pwalletMain; +extern bool fPrintToConsole; +struct TestingSetup { + TestingSetup() { + fPrintToConsole = true; // don't want to write to debug.log file + pwalletMain = new CWallet(); + RegisterWallet(pwalletMain); + } + ~TestingSetup() + { + delete pwalletMain; + pwalletMain = NULL; + } +}; + +BOOST_GLOBAL_FIXTURE(TestingSetup); + void Shutdown(void* parg) { exit(0); diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index e6eb0f0..99163e5 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -1,7 +1,7 @@ #include -#include "../main.h" -#include "../wallet.h" +#include "main.h" +#include "wallet.h" using namespace std; @@ -22,4 +22,99 @@ BOOST_AUTO_TEST_CASE(basic_transaction_tests) BOOST_CHECK_MESSAGE(!tx.CheckTransaction(), "Transaction with duplicate txins should be invalid."); } +// +// Helper: create two dummy transactions, each with +// two outputs. The first has 11 and 50 CENT outputs +// paid to a TX_PUBKEY, the second 21 and 22 CENT outputs +// paid to a TX_PUBKEYHASH. +// +static std::vector +SetupDummyInputs(CBasicKeyStore& keystoreRet, MapPrevTx& inputsRet) +{ + std::vector dummyTransactions; + dummyTransactions.resize(2); + + // Add some keys to the keystore: + CKey key[4]; + for (int i = 0; i < 4; i++) + { + key[i].MakeNewKey(i % 2); + keystoreRet.AddKey(key[i]); + } + + // Create some dummy input transactions + dummyTransactions[0].vout.resize(2); + dummyTransactions[0].vout[0].nValue = 11*CENT; + dummyTransactions[0].vout[0].scriptPubKey << key[0].GetPubKey() << OP_CHECKSIG; + dummyTransactions[0].vout[1].nValue = 50*CENT; + dummyTransactions[0].vout[1].scriptPubKey << key[1].GetPubKey() << OP_CHECKSIG; + inputsRet[dummyTransactions[0].GetHash()] = make_pair(CTxIndex(), dummyTransactions[0]); + + dummyTransactions[1].vout.resize(2); + dummyTransactions[1].vout[0].nValue = 21*CENT; + dummyTransactions[1].vout[0].scriptPubKey.SetBitcoinAddress(key[2].GetPubKey()); + dummyTransactions[1].vout[1].nValue = 22*CENT; + dummyTransactions[1].vout[1].scriptPubKey.SetBitcoinAddress(key[3].GetPubKey()); + inputsRet[dummyTransactions[1].GetHash()] = make_pair(CTxIndex(), dummyTransactions[1]); + + return dummyTransactions; +} + +BOOST_AUTO_TEST_CASE(test_Get) +{ + CBasicKeyStore keystore; + MapPrevTx dummyInputs; + std::vector dummyTransactions = SetupDummyInputs(keystore, dummyInputs); + + CTransaction t1; + t1.vin.resize(3); + t1.vin[0].prevout.hash = dummyTransactions[0].GetHash(); + t1.vin[0].prevout.n = 1; + t1.vin[0].scriptSig << std::vector(65, 0); + t1.vin[1].prevout.hash = dummyTransactions[1].GetHash(); + t1.vin[1].prevout.n = 0; + t1.vin[1].scriptSig << std::vector(65, 0) << std::vector(33, 4); + t1.vin[2].prevout.hash = dummyTransactions[1].GetHash(); + t1.vin[2].prevout.n = 1; + t1.vin[2].scriptSig << std::vector(65, 0) << std::vector(33, 4); + t1.vout.resize(2); + t1.vout[0].nValue = 90*CENT; + t1.vout[0].scriptPubKey << OP_1; + + BOOST_CHECK(t1.AreInputsStandard(dummyInputs)); + BOOST_CHECK_EQUAL(t1.GetValueIn(dummyInputs), (50+21+22)*CENT); + + // Adding extra junk to the scriptSig should make it non-standard: + t1.vin[0].scriptSig << OP_11; + BOOST_CHECK(!t1.AreInputsStandard(dummyInputs)); + + // ... as should not having enough: + t1.vin[0].scriptSig = CScript(); + BOOST_CHECK(!t1.AreInputsStandard(dummyInputs)); +} + +BOOST_AUTO_TEST_CASE(test_GetThrow) +{ + CBasicKeyStore keystore; + MapPrevTx dummyInputs; + std::vector dummyTransactions = SetupDummyInputs(keystore, dummyInputs); + + MapPrevTx missingInputs; + + CTransaction t1; + t1.vin.resize(3); + t1.vin[0].prevout.hash = dummyTransactions[0].GetHash(); + t1.vin[0].prevout.n = 0; + t1.vin[1].prevout.hash = dummyTransactions[1].GetHash();; + t1.vin[1].prevout.n = 0; + t1.vin[2].prevout.hash = dummyTransactions[1].GetHash();; + t1.vin[2].prevout.n = 1; + t1.vout.resize(2); + t1.vout[0].nValue = 90*CENT; + t1.vout[0].scriptPubKey << OP_1; + + BOOST_CHECK_THROW(t1.AreInputsStandard(missingInputs), runtime_error); + BOOST_CHECK_THROW(t1.GetValueIn(missingInputs), runtime_error); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/uint160_tests.cpp b/src/test/uint160_tests.cpp index 42c8275..35cb35b 100644 --- a/src/test/uint160_tests.cpp +++ b/src/test/uint160_tests.cpp @@ -1,6 +1,6 @@ #include -#include "../uint256.h" +#include "uint256.h" BOOST_AUTO_TEST_SUITE(uint160_tests) diff --git a/src/test/uint256_tests.cpp b/src/test/uint256_tests.cpp index c5d45e2..efdc8a6 100644 --- a/src/test/uint256_tests.cpp +++ b/src/test/uint256_tests.cpp @@ -1,6 +1,6 @@ #include -#include "../uint256.h" +#include "uint256.h" BOOST_AUTO_TEST_SUITE(uint256_tests) diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp index 8c8b99e..94c0c77 100644 --- a/src/test/util_tests.cpp +++ b/src/test/util_tests.cpp @@ -2,7 +2,9 @@ #include #include -#include "../util.h" +#include "main.h" +#include "wallet.h" +#include "util.h" using namespace std; @@ -230,4 +232,19 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney) BOOST_CHECK(!ParseMoney("92233720368.54775808", ret)); } +BOOST_AUTO_TEST_CASE(util_IsHex) +{ + BOOST_CHECK(IsHex("00")); + BOOST_CHECK(IsHex("00112233445566778899aabbccddeeffAABBCCDDEEFF")); + BOOST_CHECK(IsHex("ff")); + BOOST_CHECK(IsHex("FF")); + + BOOST_CHECK(!IsHex("")); + BOOST_CHECK(!IsHex("0")); + BOOST_CHECK(!IsHex("a")); + BOOST_CHECK(!IsHex("eleven")); + BOOST_CHECK(!IsHex("00xx00")); + BOOST_CHECK(!IsHex("0x0000")); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/uint256.h b/src/uint256.h index ae26334..cfc2eb1 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_UINT256_H @@ -11,24 +11,17 @@ #include #include -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 int64; -typedef unsigned __int64 uint64; -#else typedef long long int64; typedef unsigned long long uint64; -#endif -#if defined(_MSC_VER) && _MSC_VER < 1300 -#define for if (false) ; else for -#endif inline int Testuint256AdHoc(std::vector vArg); -// We have to keep a separate base class without constructors -// so the compiler will let us use it in a union +/** Base class without constructors for uint256 and uint160. + * This makes the compiler let u use it in a union. + */ template class base_uint { @@ -356,20 +349,24 @@ public: return sizeof(pn); } + uint64 Get64(int n=0) const + { + return pn[2*n] | (uint64)pn[2*n+1] << 32; + } - unsigned int GetSerializeSize(int nType=0, int nVersion=VERSION) const + unsigned int GetSerializeSize(int nType=0, int nVersion=PROTOCOL_VERSION) const { return sizeof(pn); } template - void Serialize(Stream& s, int nType=0, int nVersion=VERSION) const + void Serialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) const { s.write((char*)pn, sizeof(pn)); } template - void Unserialize(Stream& s, int nType=0, int nVersion=VERSION) + void Unserialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) { s.read((char*)pn, sizeof(pn)); } @@ -397,6 +394,7 @@ typedef base_uint<256> base_uint256; // uint160 // +/** 160-bit unsigned integer */ class uint160 : public base_uint160 { public: @@ -511,6 +509,7 @@ inline const uint160 operator-(const uint160& a, const uint160& b) { return // uint256 // +/** 256-bit unsigned integer */ class uint256 : public base_uint256 { public: @@ -624,7 +623,7 @@ inline const uint256 operator-(const uint256& a, const uint256& b) { return - +#ifdef TEST_UINT256 inline int Testuint256AdHoc(std::vector vArg) { @@ -757,3 +756,5 @@ inline int Testuint256AdHoc(std::vector vArg) } #endif + +#endif diff --git a/src/util.cpp b/src/util.cpp index f6c37a2..08752e6 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -4,6 +4,7 @@ // file license.txt or http://www.opensource.org/licenses/mit-license.php. #include "headers.h" #include "strlcpy.h" +#include #include #include #include @@ -30,7 +31,7 @@ string strMiscWarning; bool fTestNet = false; bool fNoListen = false; bool fLogTimestamps = false; - +CMedianFilter vTimeOffsets(200,0); @@ -132,7 +133,7 @@ uint64 GetRand(uint64 nMax) // The range of the random source must be a multiple of the modulus // to give every possible output value an equal possibility - uint64 nRange = (UINT64_MAX / nMax) * nMax; + uint64 nRange = (std::numeric_limits::max() / nMax) * nMax; uint64 nRand = 0; do RAND_bytes((unsigned char*)&nRand, sizeof(nRand)); @@ -399,26 +400,36 @@ bool ParseMoney(const char* pszIn, int64& nRet) } -vector ParseHex(const char* psz) +static char phexdigit[256] = +{ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1, + -1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1 + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, }; + +bool IsHex(const string& str) { - static char phexdigit[256] = - { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1, - -1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1 - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, }; + BOOST_FOREACH(unsigned char c, str) + { + if (phexdigit[c] < 0) + return false; + } + return (str.size() > 0) && (str.size()%2 == 0); +} +vector ParseHex(const char* psz) +{ // convert hex dump to vector vector vch; loop @@ -443,7 +454,22 @@ vector ParseHex(const string& str) return ParseHex(str.c_str()); } -void ParseParameters(int argc, char* argv[]) +static void InterpretNegativeSetting(string name, map& mapSettingsRet) +{ + // interpret -nofoo as -foo=0 (and -nofoo=0 as -foo=1) as long as -foo not set + if (name.find("-no") == 0) + { + std::string positive("-"); + positive.append(name.begin()+3, name.end()); + if (mapSettingsRet.count(positive) == 0) + { + bool value = !GetBoolArg(name); + mapSettingsRet[positive] = (value ? "1" : "0"); + } + } +} + +void ParseParameters(int argc, const char*const argv[]) { mapArgs.clear(); mapMultiArgs.clear(); @@ -464,9 +490,53 @@ void ParseParameters(int argc, char* argv[]) #endif if (psz[0] != '-') break; + mapArgs[psz] = pszValue; mapMultiArgs[psz].push_back(pszValue); } + + // New 0.6 features: + BOOST_FOREACH(const PAIRTYPE(string,string)& entry, mapArgs) + { + string name = entry.first; + + // interpret --foo as -foo (as long as both are not set) + if (name.find("--") == 0) + { + std::string singleDash(name.begin()+1, name.end()); + if (mapArgs.count(singleDash) == 0) + mapArgs[singleDash] = entry.second; + name = singleDash; + } + + // interpret -nofoo as -foo=0 (and -nofoo=0 as -foo=1) as long as -foo not set + InterpretNegativeSetting(name, mapArgs); + } +} + +std::string GetArg(const std::string& strArg, const std::string& strDefault) +{ + if (mapArgs.count(strArg)) + return mapArgs[strArg]; + return strDefault; +} + +int64 GetArg(const std::string& strArg, int64 nDefault) +{ + if (mapArgs.count(strArg)) + return atoi64(mapArgs[strArg]); + return nDefault; +} + +bool GetBoolArg(const std::string& strArg, bool fDefault) +{ + if (mapArgs.count(strArg)) + { + if (mapArgs[strArg].empty()) + return true; + return (atoi(mapArgs[strArg]) != 0); + } + return fDefault; } bool SoftSetArg(const std::string& strArg, const std::string& strValue) @@ -477,7 +547,7 @@ bool SoftSetArg(const std::string& strArg, const std::string& strValue) return true; } -bool SoftSetArg(const std::string& strArg, bool fValue) +bool SoftSetBoolArg(const std::string& strArg, bool fValue) { if (fValue) return SoftSetArg(strArg, std::string("1")); @@ -697,17 +767,6 @@ void PrintException(std::exception* pex, const char* pszThread) throw; } -void ThreadOneMessageBox(string strMessage) -{ - // Skip message boxes if one is already open - static bool fMessageBoxOpen; - if (fMessageBoxOpen) - return; - fMessageBoxOpen = true; - ThreadSafeMessageBox(strMessage, "Bitcoin", wxOK | wxICON_EXCLAMATION); - fMessageBoxOpen = false; -} - void PrintExceptionContinue(std::exception* pex, const char* pszThread) { char pszMessage[10000]; @@ -717,55 +776,23 @@ void PrintExceptionContinue(std::exception* pex, const char* pszThread) strMiscWarning = pszMessage; } - - - - - - - #ifdef WIN32 -typedef WINSHELLAPI BOOL (WINAPI *PSHGETSPECIALFOLDERPATHA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate); - string MyGetSpecialFolderPath(int nFolder, bool fCreate) { - char pszPath[MAX_PATH+100] = ""; - - // SHGetSpecialFolderPath isn't always available on old Windows versions - HMODULE hShell32 = LoadLibraryA("shell32.dll"); - if (hShell32) + char pszPath[MAX_PATH] = ""; + if(SHGetSpecialFolderPathA(NULL, pszPath, nFolder, fCreate)) { - PSHGETSPECIALFOLDERPATHA pSHGetSpecialFolderPath = - (PSHGETSPECIALFOLDERPATHA)GetProcAddress(hShell32, "SHGetSpecialFolderPathA"); - bool fSuccess = false; - if (pSHGetSpecialFolderPath) - fSuccess = - (*pSHGetSpecialFolderPath)(NULL, pszPath, nFolder, fCreate); - FreeModule(hShell32); - if (fSuccess) - return pszPath; + return pszPath; } - - // Backup option - std::string strPath; + else if (nFolder == CSIDL_STARTUP) { - const char *pszEnv; - if (nFolder == CSIDL_STARTUP) - { - pszEnv = getenv("USERPROFILE"); - if (pszEnv) - strPath = pszEnv; - strPath += "\\Start Menu\\Programs\\Startup"; - } - else if (nFolder == CSIDL_APPDATA) - { - pszEnv = getenv("APPDATA"); - if (pszEnv) - strPath = pszEnv; - } + return string(getenv("USERPROFILE")) + "\\Start Menu\\Programs\\Startup"; } - - return strPath; + else if (nFolder == CSIDL_APPDATA) + { + return getenv("APPDATA"); + } + return ""; } #endif @@ -847,15 +874,28 @@ string GetConfigFile() return pathConfig.string(); } -void ReadConfigFile(map& mapSettingsRet, +bool ReadConfigFile(map& mapSettingsRet, map >& mapMultiSettingsRet) { namespace fs = boost::filesystem; namespace pod = boost::program_options::detail; + if (mapSettingsRet.count("-datadir")) + { + if (fs::is_directory(fs::system_complete(mapSettingsRet["-datadir"]))) + { + fs::path pathDataDir = fs::system_complete(mapSettingsRet["-datadir"]); + strlcpy(pszSetDataDir, pathDataDir.string().c_str(), sizeof(pszSetDataDir)); + } + else + { + return false; + } + } + fs::ifstream streamConfig(GetConfigFile()); if (!streamConfig.good()) - return; + return true; // No bitcoin.conf file is OK set setOptions; setOptions.insert("*"); @@ -865,9 +905,14 @@ void ReadConfigFile(map& mapSettingsRet, // Don't overwrite existing settings so command line settings override bitcoin.conf string strKey = string("-") + it->string_key; if (mapSettingsRet.count(strKey) == 0) + { mapSettingsRet[strKey] = it->value[0]; + // interpret nofoo=1 as foo=0 (and nofoo=0 as foo=1) as long as foo not set) + InterpretNegativeSetting(strKey, mapSettingsRet); + } mapMultiSettingsRet[strKey].push_back(it->value[0]); } + return true; } string GetPidFile() @@ -956,25 +1001,22 @@ int64 GetAdjustedTime() return GetTime() + nTimeOffset; } -void AddTimeData(unsigned int ip, int64 nTime) +void AddTimeData(const CNetAddr& ip, int64 nTime) { int64 nOffsetSample = nTime - GetTime(); // Ignore duplicates - static set setKnown; + static set setKnown; if (!setKnown.insert(ip).second) return; // Add data - static vector vTimeOffsets; - if (vTimeOffsets.empty()) - vTimeOffsets.push_back(0); - vTimeOffsets.push_back(nOffsetSample); - printf("Added time data, samples %d, offset %+"PRI64d" (%+"PRI64d" minutes)\n", vTimeOffsets.size(), vTimeOffsets.back(), vTimeOffsets.back()/60); + vTimeOffsets.input(nOffsetSample); + printf("Added time data, samples %d, offset %+"PRI64d" (%+"PRI64d" minutes)\n", vTimeOffsets.size(), nOffsetSample, nOffsetSample/60); if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1) { - sort(vTimeOffsets.begin(), vTimeOffsets.end()); - int64 nMedian = vTimeOffsets[vTimeOffsets.size()/2]; + int64 nMedian = vTimeOffsets.median(); + std::vector vSorted = vTimeOffsets.sorted(); // Only let other nodes change our time by so much if (abs64(nMedian) < 70 * 60) { @@ -989,7 +1031,7 @@ void AddTimeData(unsigned int ip, int64 nTime) { // If nobody has a time different than ours but within 5 minutes of ours, give a warning bool fMatch = false; - BOOST_FOREACH(int64 nOffset, vTimeOffsets) + BOOST_FOREACH(int64 nOffset, vSorted) if (nOffset != 0 && abs64(nOffset) < 5 * 60) fMatch = true; @@ -1003,9 +1045,12 @@ void AddTimeData(unsigned int ip, int64 nTime) } } } - BOOST_FOREACH(int64 n, vTimeOffsets) - printf("%+"PRI64d" ", n); - printf("| nTimeOffset = %+"PRI64d" (%+"PRI64d" minutes)\n", nTimeOffset, nTimeOffset/60); + if (fDebug) { + BOOST_FOREACH(int64 n, vSorted) + printf("%+"PRI64d" ", n); + printf("| "); + } + printf("nTimeOffset = %+"PRI64d" (%+"PRI64d" minutes)\n", nTimeOffset, nTimeOffset/60); } } @@ -1016,7 +1061,6 @@ void AddTimeData(unsigned int ip, int64 nTime) - string FormatVersion(int nVersion) { if (nVersion%100 == 0) @@ -1027,7 +1071,7 @@ string FormatVersion(int nVersion) string FormatFullVersion() { - string s = FormatVersion(VERSION) + pszSubVer; + string s = FormatVersion(CLIENT_VERSION); if (VERSION_IS_BETA) { s += "-"; s += _("beta"); @@ -1035,6 +1079,17 @@ string FormatFullVersion() return s; } +// Format the subversion field according to BIP 14 spec (https://en.bitcoin.it/wiki/BIP_0014) +std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments) +{ + std::ostringstream ss; + ss << "/"; + ss << name << ":" << FormatVersion(nClientVersion); + if (!comments.empty()) + ss << "(" << boost::algorithm::join(comments, "; ") << ")"; + ss << "/"; + return ss.str(); +} @@ -1141,7 +1196,18 @@ static void pop_lock() void CCriticalSection::Enter(const char* pszName, const char* pszFile, int nLine) { push_lock(this, CLockLocation(pszName, pszFile, nLine)); +#ifdef DEBUG_LOCKCONTENTION + bool result = mutex.try_lock(); + if (!result) + { + printf("LOCKCONTENTION: %s\n", pszName); + printf("Locker: %s:%d\n", pszFile, nLine); + mutex.lock(); + printf("Locked\n"); + } +#else mutex.lock(); +#endif } void CCriticalSection::Leave() { @@ -1158,9 +1224,19 @@ bool CCriticalSection::TryEnter(const char* pszName, const char* pszFile, int nL #else -void CCriticalSection::Enter(const char*, const char*, int) +void CCriticalSection::Enter(const char* pszName, const char* pszFile, int nLine) { +#ifdef DEBUG_LOCKCONTENTION + bool result = mutex.try_lock(); + if (!result) + { + printf("LOCKCONTENTION: %s\n", pszName); + printf("Locker: %s:%d\n", pszFile, nLine); + mutex.lock(); + } +#else mutex.lock(); +#endif } void CCriticalSection::Leave() @@ -1175,3 +1251,4 @@ bool CCriticalSection::TryEnter(const char*, const char*, int) } #endif /* DEBUG_LOCKORDER */ + diff --git a/src/util.h b/src/util.h index 45b1442..4fa5a08 100644 --- a/src/util.h +++ b/src/util.h @@ -24,20 +24,10 @@ #include #include +#include "netbase.h" -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 int64; -typedef unsigned __int64 uint64; -#else typedef long long int64; typedef unsigned long long uint64; -#endif -#if defined(_MSC_VER) && _MSC_VER < 1300 -#define for if (false) ; else for -#endif -#ifndef _MSC_VER -#define __forceinline inline -#endif #define loop for (;;) #define BEGIN(a) ((char*)&(a)) @@ -53,7 +43,7 @@ typedef unsigned long long uint64; #define snprintf my_snprintf #ifndef PRI64d -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MSVCRT__) +#if defined(_MSC_VER) || defined(__MSVCRT__) #define PRI64d "I64d" #define PRI64u "I64u" #define PRI64x "I64x" @@ -84,35 +74,17 @@ T* alignup(T* p) #ifdef WIN32 #define MSG_NOSIGNAL 0 #define MSG_DONTWAIT 0 -#ifndef UINT64_MAX -#define UINT64_MAX _UI64_MAX -#define INT64_MAX _I64_MAX -#define INT64_MIN _I64_MIN -#endif + #ifndef S_IRUSR #define S_IRUSR 0400 #define S_IWUSR 0200 #endif #define unlink _unlink -typedef int socklen_t; #else -#define WSAGetLastError() errno -#define WSAEINVAL EINVAL -#define WSAEALREADY EALREADY -#define WSAEWOULDBLOCK EWOULDBLOCK -#define WSAEMSGSIZE EMSGSIZE -#define WSAEINTR EINTR -#define WSAEINPROGRESS EINPROGRESS -#define WSAEADDRINUSE EADDRINUSE -#define WSAENOTSOCK EBADF -#define INVALID_SOCKET (SOCKET)(~0) -#define SOCKET_ERROR -1 -typedef u_int SOCKET; #define _vsnprintf(a,b,c,d) vsnprintf(a,b,c,d) #define strlwr(psz) to_lower(psz) #define _strlwr(psz) to_lower(psz) #define MAX_PATH 1024 -#define Beep(n1,n2) (0) inline void Sleep(int64 n) { /*Boost has a year 2038 problem— if the request sleep time is past epoch+2^31 seconds the sleep returns instantly. @@ -121,19 +93,6 @@ inline void Sleep(int64 n) } #endif -inline int myclosesocket(SOCKET& hSocket) -{ - if (hSocket == INVALID_SOCKET) - return WSAENOTSOCK; -#ifdef WIN32 - int ret = closesocket(hSocket); -#else - int ret = close(hSocket); -#endif - hSocket = INVALID_SOCKET; - return ret; -} -#define closesocket(s) myclosesocket(s) #if !defined(QT_GUI) inline const char* _(const char* psz) { @@ -180,12 +139,12 @@ bool ParseMoney(const std::string& str, int64& nRet); bool ParseMoney(const char* pszIn, int64& nRet); std::vector ParseHex(const char* psz); std::vector ParseHex(const std::string& str); +bool IsHex(const std::string& str); std::vector DecodeBase64(const char* p, bool* pfInvalid = NULL); std::string DecodeBase64(const std::string& str); std::string EncodeBase64(const unsigned char* pch, size_t len); std::string EncodeBase64(const std::string& str); -void ParseParameters(int argc, char* argv[]); -const char* wxGetTranslation(const char* psz); +void ParseParameters(int argc, const char*const argv[]); bool WildcardMatch(const char* psz, const char* mask); bool WildcardMatch(const std::string& str, const std::string& mask); int GetFilesize(FILE* file); @@ -193,7 +152,7 @@ void GetDataDir(char* pszDirRet); std::string GetConfigFile(); std::string GetPidFile(); void CreatePidFile(std::string pidFile, pid_t pid); -void ReadConfigFile(std::map& mapSettingsRet, std::map >& mapMultiSettingsRet); +bool ReadConfigFile(std::map& mapSettingsRet, std::map >& mapMultiSettingsRet); #ifdef WIN32 std::string MyGetSpecialFolderPath(int nFolder, bool fCreate); #endif @@ -205,8 +164,9 @@ uint64 GetRand(uint64 nMax); int64 GetTime(); void SetMockTime(int64 nMockTimeIn); int64 GetAdjustedTime(); -void AddTimeData(unsigned int ip, int64 nTime); std::string FormatFullVersion(); +std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments); +void AddTimeData(const CNetAddr& ip, int64 nTime); @@ -219,8 +179,7 @@ std::string FormatFullVersion(); - -// Wrapper to automatically initialize mutex +/** Wrapper to automatically initialize mutex. */ class CCriticalSection { protected: @@ -233,7 +192,7 @@ public: bool TryEnter(const char* pszName, const char* pszFile, int nLine); }; -// Automatically leave critical section when leaving block, needed for exception safety +/** RAII object that acquires mutex. Needed for exception safety. */ class CCriticalBlock { protected: @@ -266,6 +225,7 @@ public: #define LEAVE_CRITICAL_SECTION(cs) \ (cs).Leave() +/** RAII object that tries to acquire mutex. Needed for exception safety. */ class CTryCriticalBlock { protected: @@ -304,10 +264,6 @@ public: // (secure_allocator<> is defined in serialize.h) typedef std::basic_string, secure_allocator > SecureString; -// This is exactly like std::string, but with a custom allocator. -// (secure_allocator<> is defined in serialize.h) -typedef std::basic_string, secure_allocator > SecureString; - @@ -380,25 +336,6 @@ inline std::string HexStr(const std::vector& vch, bool fSpaces=fa } template -std::string HexNumStr(const T itbegin, const T itend, bool f0x=true) -{ - if (itbegin == itend) - return ""; - const unsigned char* pbegin = (const unsigned char*)&itbegin[0]; - const unsigned char* pend = pbegin + (itend - itbegin) * sizeof(itbegin[0]); - std::string str = (f0x ? "0x" : ""); - str.reserve(str.size() + (pend-pbegin) * 2); - for (const unsigned char* p = pend-1; p >= pbegin; p--) - str += strprintf("%02x", *p); - return str; -} - -inline std::string HexNumStr(const std::vector& vch, bool f0x=true) -{ - return HexNumStr(vch.begin(), vch.end(), f0x); -} - -template void PrintHex(const T pbegin, const T pend, const char* pszFormat="%s", bool fSpaces=true) { printf(pszFormat, HexStr(pbegin, pend, fSpaces).c_str()); @@ -453,30 +390,32 @@ inline bool IsSwitchChar(char c) #endif } -inline std::string GetArg(const std::string& strArg, const std::string& strDefault) -{ - if (mapArgs.count(strArg)) - return mapArgs[strArg]; - return strDefault; -} +/** + * Return string argument or default value + * + * @param strArg Argument to get (e.g. "-foo") + * @param default (e.g. "1") + * @return command-line argument or default value + */ +std::string GetArg(const std::string& strArg, const std::string& strDefault); -inline int64 GetArg(const std::string& strArg, int64 nDefault) -{ - if (mapArgs.count(strArg)) - return atoi64(mapArgs[strArg]); - return nDefault; -} +/** + * Return integer argument or default value + * + * @param strArg Argument to get (e.g. "-foo") + * @param default (e.g. 1) + * @return command-line argument (0 if invalid number) or default value + */ +int64 GetArg(const std::string& strArg, int64 nDefault); -inline bool GetBoolArg(const std::string& strArg, bool fDefault=false) -{ - if (mapArgs.count(strArg)) - { - if (mapArgs[strArg].empty()) - return true; - return (atoi(mapArgs[strArg]) != 0); - } - return fDefault; -} +/** + * Return boolean argument or default value + * + * @param strArg Argument to get (e.g. "-foo") + * @param default (true or false) + * @return command-line argument or default value + */ +bool GetBoolArg(const std::string& strArg, bool fDefault=false); /** * Set an argument if it doesn't already have a value @@ -494,7 +433,7 @@ bool SoftSetArg(const std::string& strArg, const std::string& strValue); * @param fValue Value (e.g. false) * @return true if argument gets set, false if it already had a value */ -bool SoftSetArg(const std::string& strArg, bool fValue); +bool SoftSetBoolArg(const std::string& strArg, bool fValue); @@ -504,15 +443,6 @@ bool SoftSetArg(const std::string& strArg, bool fValue); -inline void heapchk() -{ -#ifdef WIN32 - /// for debugging - //if (_heapchk() != _HEAPOK) - // DebugBreak(); -#endif -} - // Randomize the stack to help protect against buffer overrun exploits #define IMPLEMENT_RANDOMIZE_STACK(ThreadFn) \ { \ @@ -526,21 +456,6 @@ inline void heapchk() } \ } -#define CATCH_PRINT_EXCEPTION(pszFn) \ - catch (std::exception& e) { \ - PrintException(&e, (pszFn)); \ - } catch (...) { \ - PrintException(NULL, (pszFn)); \ - } - - - - - - - - - template inline uint256 Hash(const T1 pbegin, const T1 pend) @@ -588,7 +503,7 @@ inline uint256 Hash(const T1 p1begin, const T1 p1end, } template -uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=VERSION) +uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION) { // Most of the time is spent allocating and deallocating CDataStream's // buffer. If this ever needs to be optimized further, make a CStaticStream @@ -609,8 +524,9 @@ inline uint160 Hash160(const std::vector& vch) } -// Median filter over a stream of values -// Returns the median of the last N numbers +/** Median filter over a stream of values. + * Returns the median of the last N numbers + */ template class CMedianFilter { private: @@ -652,6 +568,16 @@ public: return (vSorted[size/2-1] + vSorted[size/2]) / 2; } } + + int size() const + { + return vValues.size(); + } + + std::vector sorted () const + { + return vSorted; + } }; @@ -730,11 +656,6 @@ inline void SetThreadPriority(int nPriority) #endif } -inline bool TerminateThread(pthread_t hthread, unsigned int nExitCode) -{ - return (pthread_cancel(hthread) == 0); -} - inline void ExitThread(size_t nExitCode) { pthread_exit((void*)nExitCode); @@ -772,3 +693,4 @@ inline uint32_t ByteReverse(uint32_t value) } #endif + diff --git a/src/wallet.cpp b/src/wallet.cpp index 20c3eab..27ed722 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. @@ -15,6 +15,23 @@ using namespace std; // mapWallet // +std::vector CWallet::GenerateNewKey() +{ + bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY); // default to compressed public keys if we want 0.6.0 wallets + + RandAddSeedPerfmon(); + CKey key; + key.MakeNewKey(fCompressed); + + // Compressed public keys were introduced in version 0.6.0 + if (fCompressed) + SetMinVersion(FEATURE_COMPRPUBKEY); + + if (!AddKey(key)) + throw std::runtime_error("CWallet::GenerateNewKey() : AddKey failed"); + return key.GetPubKey(); +} + bool CWallet::AddKey(const CKey& key) { if (!CCryptoKeyStore::AddKey(key)) @@ -42,6 +59,15 @@ bool CWallet::AddCryptedKey(const vector &vchPubKey, const vector return false; } +bool CWallet::AddCScript(const CScript& redeemScript) +{ + if (!CCryptoKeyStore::AddCScript(redeemScript)) + return false; + if (!fFileBacked) + return true; + return CWalletDB(strWalletFile).WriteCScript(Hash160(redeemScript), redeemScript); +} + bool CWallet::Unlock(const SecureString& strWalletPassphrase) { if (!IsLocked()) @@ -122,6 +148,50 @@ public: ) }; +bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit) +{ + if (nWalletVersion >= nVersion) + return true; + + // when doing an explicit upgrade, if we pass the max version permitted, upgrade all the way + if (fExplicit && nVersion > nWalletMaxVersion) + nVersion = FEATURE_LATEST; + + nWalletVersion = nVersion; + + if (nVersion > nWalletMaxVersion) + nWalletMaxVersion = nVersion; + + if (fFileBacked) + { + CWalletDB* pwalletdb = pwalletdbIn ? pwalletdbIn : new CWalletDB(strWalletFile); + if (nWalletVersion >= 40000) + { + // Versions prior to 0.4.0 did not support the "minversion" record. + // Use a CCorruptAddress to make them crash instead. + CCorruptAddress corruptAddress; + pwalletdb->WriteSetting("addrIncoming", corruptAddress); + } + if (nWalletVersion > 40000) + pwalletdb->WriteMinVersion(nWalletVersion); + if (!pwalletdbIn) + delete pwalletdb; + } + + return true; +} + +bool CWallet::SetMaxVersion(int nVersion) +{ + // cannot downgrade below current version + if (nWalletVersion > nVersion) + return false; + + nWalletMaxVersion = nVersion; + + return true; +} + bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase) { if (IsCrypted()) @@ -175,10 +245,11 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase) exit(1); //We now probably have half of our keys encrypted in memory, and half not...die and let the user reload their unencrypted wallet. } + // Encryption was introduced in version 0.4.0 + SetMinVersion(FEATURE_WALLETCRYPT, pwalletdbEncryption, true); + if (fFileBacked) { - CCorruptAddress corruptAddress; - pwalletdbEncryption->WriteSetting("addrIncoming", corruptAddress); if (!pwalletdbEncryption->TxnCommit()) exit(1); //We now have keys encrypted in memory, but no on disk...die to avoid confusion and let the user reload their unencrypted wallet. @@ -224,6 +295,15 @@ void CWallet::WalletUpdateSpent(const CTransaction &tx) } } +void CWallet::MarkDirty() +{ + CRITICAL_BLOCK(cs_wallet) + { + BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet) + item.second.MarkDirty(); + } +} + bool CWallet::AddToWallet(const CWalletTx& wtxIn) { uint256 hash = wtxIn.GetHash(); @@ -232,7 +312,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn) // Inserts only if not already there, returns tx inserted or tx found pair::iterator, bool> ret = mapWallet.insert(make_pair(hash, wtxIn)); CWalletTx& wtx = (*ret.first).second; - wtx.pwallet = this; + wtx.BindWallet(this); bool fInsertedNew = ret.second; if (fInsertedNew) wtx.nTimeReceived = GetAdjustedTime(); @@ -299,7 +379,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn) // Add a transaction to the wallet, or update it. // pblock is optional, but should be provided if the transaction is known to be in a block. // If fUpdate is true, existing transactions will be updated. -bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate) +bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate, bool fFindBlock) { uint256 hash = tx.GetHash(); CRITICAL_BLOCK(cs_wallet) @@ -365,6 +445,24 @@ int64 CWallet::GetDebit(const CTxIn &txin) const return 0; } +bool CWallet::IsChange(const CTxOut& txout) const +{ + CBitcoinAddress address; + + // TODO: fix handling of 'change' outputs. The assumption is that any + // payment to a TX_PUBKEYHASH that is mine but isn't in the address book + // is change. That assumption is likely to break when we implement multisignature + // wallets that return change back into a multi-signature-protected address; + // a better way of identifying which outputs are 'the send' and which are + // 'the change' will need to be implemented (maybe extend CWalletTx to remember + // which output, if any, was change). + if (ExtractAddress(txout.scriptPubKey, address) && HaveKey(address)) + CRITICAL_BLOCK(cs_wallet) + if (!mapAddressBook.count(address)) + return true; + return false; +} + int64 CWalletTx::GetTxTime() const { return nTimeReceived; @@ -434,13 +532,12 @@ void CWalletTx::GetAmounts(int64& nGeneratedImmature, int64& nGeneratedMature, l nFee = nDebit - nValueOut; } - // Sent/received. Standard client will never generate a send-to-multiple-recipients, - // but non-standard clients might (so return a list of address/amount pairs) + // Sent/received. BOOST_FOREACH(const CTxOut& txout, vout) { CBitcoinAddress address; vector vchPubKey; - if (!ExtractAddress(txout.scriptPubKey, NULL, address)) + if (!ExtractAddress(txout.scriptPubKey, address)) { printf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n", this->GetHash().ToString().c_str()); @@ -586,6 +683,15 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate) return ret; } +int CWallet::ScanForWalletTransaction(const uint256& hashTx) +{ + CTransaction tx; + tx.ReadFromDisk(COutPoint(hashTx, 0)); + if (AddToWalletIfInvolvingMe(tx, NULL, true, true)) + return 1; + return 0; +} + void CWallet::ReacceptWalletTransactions() { CTxDB txdb("r"); @@ -764,7 +870,7 @@ bool CWallet::SelectCoinsMinConf(int64 nTargetValue, int nConfMine, int nConfThe // List of values less than target pair > coinLowestLarger; - coinLowestLarger.first = INT64_MAX; + coinLowestLarger.first = std::numeric_limits::max(); coinLowestLarger.second.first = NULL; vector > > vValue; int64 nTotalLower = 0; @@ -924,7 +1030,7 @@ bool CWallet::CreateTransaction(const vector >& vecSend, CW if (vecSend.empty() || nValue < 0) return false; - wtxNew.pwallet = this; + wtxNew.BindWallet(this); CRITICAL_BLOCK(cs_main) CRITICAL_BLOCK(cs_wallet) @@ -959,6 +1065,7 @@ bool CWallet::CreateTransaction(const vector >& vecSend, CW int64 nChange = nValueIn - nValue - nFeeRet; // if sub-cent change is required, the fee must be raised to at least MIN_TX_FEE // or until nChange becomes zero + // NOTE: this depends on the exact behaviour of GetMinFee if (nFeeRet < MIN_TX_FEE && nChange > 0 && nChange < CENT) { int64 nMoveToFee = min(nChange, MIN_TX_FEE - nFeeRet); @@ -979,12 +1086,11 @@ bool CWallet::CreateTransaction(const vector >& vecSend, CW vector vchPubKey = reservekey.GetReservedKey(); // assert(mapKeys.count(vchPubKey)); - // Fill a vout to ourself, using same address type as the payment + // Fill a vout to ourself + // TODO: pass in scriptChange instead of reservekey so + // change transaction isn't always pay-to-bitcoin-address CScript scriptChange; - if (vecSend[0].first.GetBitcoinAddress().IsValid()) - scriptChange.SetBitcoinAddress(vchPubKey); - else - scriptChange << vchPubKey << OP_CHECKSIG; + scriptChange.SetBitcoinAddress(vchPubKey); // Insert change txn at random position: vector::iterator position = wtxNew.vout.begin()+GetRandInt(wtxNew.vout.size()); @@ -1012,7 +1118,7 @@ bool CWallet::CreateTransaction(const vector >& vecSend, CW // Check that enough fee is included int64 nPayFee = nTransactionFee * (1 + (int64)nBytes / 1000); bool fAllowFree = CTransaction::AllowFree(dPriority); - int64 nMinFee = wtxNew.GetMinFee(1, fAllowFree); + int64 nMinFee = wtxNew.GetMinFee(1, fAllowFree, GMF_SEND); if (nFeeRet < max(nPayFee, nMinFee)) { nFeeRet = max(nPayFee, nMinFee); @@ -1062,7 +1168,7 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey) BOOST_FOREACH(const CTxIn& txin, wtxNew.vin) { CWalletTx &coin = mapWallet[txin.prevout.hash]; - coin.pwallet = this; + coin.BindWallet(this); coin.MarkSpent(txin.prevout.n); coin.WriteToDisk(); vWalletUpdated.push_back(coin.GetHash()); @@ -1165,19 +1271,6 @@ int CWallet::LoadWallet(bool& fFirstRunRet) return nLoadWalletRet; fFirstRunRet = vchDefaultKey.empty(); - if (!HaveKey(Hash160(vchDefaultKey))) - { - // Create new keyUser and set as default key - RandAddSeedPerfmon(); - - std::vector newDefaultKey; - if (!GetKeyFromPool(newDefaultKey, false)) - return DB_LOAD_FAIL; - SetDefaultKey(newDefaultKey); - if (!SetAddressBookName(CBitcoinAddress(vchDefaultKey), "")) - return DB_LOAD_FAIL; - } - CreateThread(ThreadFlushWalletDB, &strWalletFile); return DB_LOAD_OK; } @@ -1325,6 +1418,22 @@ void CWallet::ReserveKeyFromKeyPool(int64& nIndex, CKeyPool& keypool) } } +int64 CWallet::AddReserveKey(const CKeyPool& keypool) +{ + CRITICAL_BLOCK(cs_main) + CRITICAL_BLOCK(cs_wallet) + { + CWalletDB walletdb(strWalletFile); + + int64 nIndex = 1 + *(--setKeyPool.end()); + if (!walletdb.WritePool(nIndex, keypool)) + throw runtime_error("AddReserveKey() : writing added key failed"); + setKeyPool.insert(nIndex); + return nIndex; + } + return -1; +} + void CWallet::KeepKey(int64 nIndex) { // Remove from key pool @@ -1413,3 +1522,23 @@ void CReserveKey::ReturnKey() vchPubKey.clear(); } +void CWallet::GetAllReserveAddresses(set& setAddress) +{ + setAddress.clear(); + + CWalletDB walletdb(strWalletFile); + + CRITICAL_BLOCK(cs_main) + CRITICAL_BLOCK(cs_wallet) + BOOST_FOREACH(const int64& id, setKeyPool) + { + CKeyPool keypool; + if (!walletdb.ReadPool(id, keypool)) + throw runtime_error("GetAllReserveKeyHashes() : read failed"); + CBitcoinAddress address(keypool.vchPubKey); + assert(!keypool.vchPubKey.empty()); + if (!HaveKey(address)) + throw runtime_error("GetAllReserveKeyHashes() : unknown key in key pool"); + setAddress.insert(address); + } +} diff --git a/src/wallet.h b/src/wallet.h index 62dd6d5..e1065cf 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -7,15 +7,27 @@ #include "bignum.h" #include "key.h" +#include "keystore.h" #include "script.h" class CWalletTx; class CReserveKey; class CWalletDB; -// A CWallet is an extension of a keystore, which also maintains a set of -// transactions and balances, and provides the ability to create new -// transactions +/** (client) version numbers for particular wallet features */ +enum WalletFeature +{ + FEATURE_BASE = 10500, // the earliest version new wallets supports (only useful for getinfo's clientversion output) + + FEATURE_WALLETCRYPT = 40000, // wallet encryption + FEATURE_COMPRPUBKEY = 60000, // compressed public keys + + FEATURE_LATEST = 60000 +}; + +/** A CWallet is an extension of a keystore, which also maintains a set of transactions and balances, + * and provides the ability to create new transactions. + */ class CWallet : public CCryptoKeyStore { private: @@ -24,6 +36,12 @@ private: CWalletDB *pwalletdbEncryption; + // the current wallet version: clients below this version are not able to load the wallet + int nWalletVersion; + + // the maxmimum wallet format version: memory-only variable that specifies to what version this wallet may be upgraded + int nWalletMaxVersion; + public: mutable CCriticalSection cs_wallet; @@ -32,18 +50,23 @@ public: std::set setKeyPool; + typedef std::map MasterKeyMap; MasterKeyMap mapMasterKeys; unsigned int nMasterKeyMaxID; CWallet() { + nWalletVersion = FEATURE_BASE; + nWalletMaxVersion = FEATURE_BASE; fFileBacked = false; nMasterKeyMaxID = 0; pwalletdbEncryption = NULL; } CWallet(std::string strWalletFileIn) { + nWalletVersion = FEATURE_BASE; + nWalletMaxVersion = FEATURE_BASE; strWalletFile = strWalletFileIn; fFileBacked = true; nMasterKeyMaxID = 0; @@ -59,26 +82,37 @@ public: std::vector vchDefaultKey; + // check whether we are allowed to upgrade (or already support) to the named feature + bool CanSupportFeature(enum WalletFeature wf) { return nWalletMaxVersion >= wf; } + // keystore implementation + // Generate a new key + std::vector GenerateNewKey(); // Adds a key to the store, and saves it to disk. bool AddKey(const CKey& key); // Adds a key to the store, without saving it to disk (used by LoadWallet) bool LoadKey(const CKey& key) { return CCryptoKeyStore::AddKey(key); } + bool LoadMinVersion(int nVersion) { nWalletVersion = nVersion; nWalletMaxVersion = std::max(nWalletMaxVersion, nVersion); return true; } + // Adds an encrypted key to the store, and saves it to disk. bool AddCryptedKey(const std::vector &vchPubKey, const std::vector &vchCryptedSecret); // Adds an encrypted key to the store, without saving it to disk (used by LoadWallet) - bool LoadCryptedKey(const std::vector &vchPubKey, const std::vector &vchCryptedSecret) { return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret); } + bool LoadCryptedKey(const std::vector &vchPubKey, const std::vector &vchCryptedSecret) { SetMinVersion(FEATURE_WALLETCRYPT); return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret); } + bool AddCScript(const CScript& redeemScript); + bool LoadCScript(const CScript& redeemScript) { return CCryptoKeyStore::AddCScript(redeemScript); } bool Unlock(const SecureString& strWalletPassphrase); bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase); bool EncryptWallet(const SecureString& strWalletPassphrase); + void MarkDirty(); bool AddToWallet(const CWalletTx& wtxIn); - bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate = false); + bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate = false, bool fFindBlock = false); bool EraseFromWallet(uint256 hash); void WalletUpdateSpent(const CTransaction& prevout); int ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false); + int ScanForWalletTransaction(const uint256& hashTx); void ReacceptWalletTransactions(); void ResendWalletTransactions(); int64 GetBalance() const; @@ -91,11 +125,13 @@ public: bool NewKeyPool(); bool TopUpKeyPool(); + int64 AddReserveKey(const CKeyPool& keypool); void ReserveKeyFromKeyPool(int64& nIndex, CKeyPool& keypool); void KeepKey(int64 nIndex); void ReturnKey(int64 nIndex); bool GetKeyFromPool(std::vector &key, bool fAllowReuse=true); int64 GetOldestKeyPoolTime(); + void GetAllReserveAddresses(std::set& setAddress); bool IsMine(const CTxIn& txin) const; int64 GetDebit(const CTxIn& txin) const; @@ -109,15 +145,7 @@ public: throw std::runtime_error("CWallet::GetCredit() : value out of range"); return (IsMine(txout) ? txout.nValue : 0); } - bool IsChange(const CTxOut& txout) const - { - CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, this, address)) - CRITICAL_BLOCK(cs_wallet) - if (!mapAddressBook.count(address)) - return true; - return false; - } + bool IsChange(const CTxOut& txout) const; int64 GetChange(const CTxOut& txout) const { if (!MoneyRange(txout.nValue)) @@ -207,9 +235,18 @@ public: bool GetTransaction(const uint256 &hashTx, CWalletTx& wtx); bool SetDefaultKey(const std::vector &vchPubKey); -}; + // signify that a particular wallet feature is now used. this may change nWalletVersion and nWalletMaxVersion if those are lower + bool SetMinVersion(enum WalletFeature, CWalletDB* pwalletdbIn = NULL, bool fExplicit = false); + + // change which version we're allowed to upgrade to (note that this does not immediately imply upgrading to that format) + bool SetMaxVersion(int nVersion); + // get the current wallet format (the oldest client version guaranteed to understand this wallet) + int GetVersion() { return nWalletVersion; } +}; + +/** A key allocated from the key pool. */ class CReserveKey { protected: @@ -235,16 +272,15 @@ public: }; -// -// A transaction with a bunch of additional info that only the owner cares -// about. It includes any unrecorded transactions needed to link it back -// to the block chain. -// +/** A transaction with a bunch of additional info that only the owner cares about. + * It includes any unrecorded transactions needed to link it back to the block chain. + */ class CWalletTx : public CMerkleTx { -public: +private: const CWallet* pwallet; +public: std::vector vtxPrev; std::map mapValue; std::vector > vOrderForm; @@ -388,6 +424,12 @@ public: fChangeCached = false; } + void BindWallet(CWallet *pwalletIn) + { + pwallet = pwalletIn; + MarkDirty(); + } + void MarkSpent(unsigned int nOut) { if (nOut >= vout.size()) @@ -537,9 +579,7 @@ public: }; -// -// Private key that includes an expiration date in case it never gets used. -// +/** Private key that includes an expiration date in case it never gets used. */ class CWalletKey { public: @@ -572,10 +612,9 @@ public: -// -// Account information. -// Stored in wallet with key "acc"+string account name -// +/** Account information. + * Stored in wallet with key "acc"+string account name. + */ class CAccount { public: @@ -601,10 +640,9 @@ public: -// -// Internal transfers. -// Database key is acentry -// +/** Internal transfers. + * Database key is acentry. + */ class CAccountingEntry { public: