diff --git a/INSTALL.md b/INSTALL.md index 1cb06c5b..4eb896eb 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -57,8 +57,8 @@ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" Now, install the required dependencies ``` -sudo port install python27 py27-pyqt4 openssl -sudo port install git-core +svn +doc +bash_completion +gitweb +brew install python pyqt +brew install git ``` Download and run PyBitmessage: diff --git a/Makefile b/Makefile index e0ff247a..07e8b7bc 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,8 @@ PREFIX?=/usr/local all: debug: source: - tar -cvzf ../${APP}_${VERSION}.orig.tar.gz ../${APP}-${VERSION} --exclude-vcs + tar -cvf ../${APP}_${VERSION}.orig.tar ../${APP}-${VERSION} --exclude-vcs + gzip -f9n ../${APP}_${VERSION}.orig.tar install: mkdir -p ${DESTDIR}/usr mkdir -p ${DESTDIR}${PREFIX} diff --git a/arch.sh b/arch.sh index 0ccc45b3..795ec69d 100755 --- a/arch.sh +++ b/arch.sh @@ -1,10 +1,11 @@ #!/bin/bash +GIT_APP=PyBitmessage APP=pybitmessage PREV_VERSION=0.3.5 VERSION=0.3.5 RELEASE=1 -ARCH_TYPE=`uname -m` +ARCH_TYPE=any CURRDIR=`pwd` SOURCE=archpackage/${APP}-${VERSION}.tar.gz @@ -25,24 +26,12 @@ make clean rm -f archpackage/*.gz # having the root directory called name-version seems essential -mv ../${APP} ../${APP}-${VERSION} +mv ../${GIT_APP} ../${APP}-${VERSION} tar -cvzf ${SOURCE} ../${APP}-${VERSION} --exclude-vcs # rename the root directory without the version number -mv ../${APP}-${VERSION} ../${APP} +mv ../${APP}-${VERSION} ../${GIT_APP} # calculate the MD5 checksum CHECKSM=$(md5sum ${SOURCE}) sed -i "s/md5sums[^)]*)/md5sums=(${CHECKSM%% *})/g" archpackage/PKGBUILD - -cd archpackage - -# Create the package -tar -c -f ${APP}-${VERSION}.pkg.tar . -sync -xz ${APP}-${VERSION}.pkg.tar -sync - -# Move back to the original directory -cd ${CURRDIR} - diff --git a/archpackage/PKGBUILD b/archpackage/PKGBUILD index efbf33e2..fd13b92a 100644 --- a/archpackage/PKGBUILD +++ b/archpackage/PKGBUILD @@ -3,13 +3,13 @@ pkgname=pybitmessage pkgver=0.3.5 pkgrel=1 pkgdesc="Bitmessage is a P2P communications protocol used to send encrypted messages to another person or to many subscribers. It is decentralized and trustless, meaning that you need-not inherently trust any entities like root certificate authorities. It uses strong authentication which means that the sender of a message cannot be spoofed, and it aims to hide "non-content" data, like the sender and receiver of messages, from passive eavesdroppers like those running warrantless wiretapping programs." -arch=('i686' 'x86_64') +arch=('any') url="https://github.com/Bitmessage/PyBitmessage" license=('MIT') groups=() -depends=('python2' 'qt4' 'python2-pyqt4' 'sqlite' 'openssl' 'gst123') +depends=('python2' 'qt4' 'python2-pyqt4' 'sqlite' 'openssl' 'mpg123') makedepends=() -optdepends=('python2-gevent') +optdepends=('python2-gevent: Python network library that uses greenlet and libevent for easy and scalable concurrency') provides=() conflicts=() replaces=() @@ -19,7 +19,7 @@ install= changelog= source=($pkgname-$pkgver.tar.gz) noextract=() -md5sums=() +md5sums=(ebf89129571571198473559b4b2e552c) build() { cd "$srcdir/$pkgname-$pkgver" ./configure --prefix=/usr diff --git a/debian.sh b/debian.sh index a4d6882e..ea46acaf 100755 --- a/debian.sh +++ b/debian.sh @@ -1,10 +1,10 @@ #!/bin/bash APP=pybitmessage -PREV_VERSION=0.3.4 +PREV_VERSION=0.3.5 VERSION=0.3.5 RELEASE=1 -ARCH_TYPE=`uname -m` +ARCH_TYPE=all DIR=${APP}-${VERSION} if [ $ARCH_TYPE == "x86_64" ]; then diff --git a/debian/changelog b/debian/changelog index 711f6488..8cdaff2c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,7 +14,8 @@ pybitmessage (0.3.5-1) raring; urgency=low * Added Russian translation * Added search support in the UI * Added 'make uninstall' - * To improve OSX support, use PKCS5_PBKDF2_HMAC_SHA1 if PKCS5_PBKDF2_HMAC is unavailable + * To improve OSX support, use PKCS5_PBKDF2_HMAC_SHA1 + if PKCS5_PBKDF2_HMAC is unavailable * Added better warnings for OSX users who are using old versions of Python * Repaired debian packaging * Altered Makefile to avoid needing to chase changes diff --git a/debian/control b/debian/control index 5e016a1c..6fb419f4 100644 --- a/debian/control +++ b/debian/control @@ -1,4 +1,5 @@ Source: pybitmessage +Section: mail Priority: extra Maintainer: Bob Mottram (4096 bits) Build-Depends: debhelper (>= 9.0.0) @@ -7,8 +8,7 @@ Homepage: https://github.com/Bitmessage/PyBitmessage Vcs-Git: https://github.com/Bitmessage/PyBitmessage.git Package: pybitmessage -Section: mail -Architecture: any +Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, python (>= 2.7.0), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev, gst123 Suggests: libmessaging-menu-dev Description: Send encrypted messages diff --git a/generate.sh b/generate.sh index 3ab99536..4154fff7 100755 --- a/generate.sh +++ b/generate.sh @@ -26,7 +26,7 @@ packagemonkey -n "PyBitmessage" --version "0.3.5" --dir "." -l "mit" \ --dependspuppy "openssl, python-qt4, sqlite3, sqlite3-dev, " \ "python-openssl, python-sip, gst123" \ --dependsarch "python2, qt4, python2-pyqt4, sqlite, openssl, gst123" \ - --suggestsarch "python2-gevent" --pythonversion 2 \ + --suggestsarch "python2-gevent: Python network library that uses greenlet and libevent for easy and scalable concurrency" --pythonversion 2 \ --dependsebuild "dev-libs/openssl, dev-python/PyQt4[${PYTHON_USEDEP}]" \ --buildebuild "\${PYTHON_DEPS}" --pythonreq "sqlite" \ --repository "https://github.com/Bitmessage/PyBitmessage.git" diff --git a/osx.sh b/osx.sh old mode 100644 new mode 100755 index e5d2e371..2f59f446 --- a/osx.sh +++ b/osx.sh @@ -12,12 +12,12 @@ if [[ -z "$1" ]]; then exit fi -echo "Creating OS X packages for Bitmessage. This script will ask for sudo to create the dmg volume" +echo "Creating OS X packages for Bitmessage." cd src && python build_osx.py py2app if [[ $? = "0" ]]; then - sudo hdiutil create -fs HFS+ -volname "Bitmessage" -srcfolder dist/Bitmessage.app dist/bitmessage-v$1.dmg + hdiutil create -fs HFS+ -volname "Bitmessage" -srcfolder dist/Bitmessage.app dist/bitmessage-v$1.dmg else echo "Problem creating Bitmessage.app, stopping." exit diff --git a/puppypackage/pybitmessage-0.3.5.pet.specs b/puppypackage/pybitmessage-0.3.5.pet.specs index 939294e4..717cd281 100644 --- a/puppypackage/pybitmessage-0.3.5.pet.specs +++ b/puppypackage/pybitmessage-0.3.5.pet.specs @@ -1 +1 @@ -pybitmessage-0.3.5-1|PyBitmessage|0.3.5|1|Internet;mailnews;|7.2M||pybitmessage-0.3.5-1.pet|+openssl,+python-qt4,+sqlite3,+sqlite3-dev,+python-openssl,+python-sip,+gst123|Send encrypted messages|ubuntu|precise|5| +pybitmessage-0.3.5-1|PyBitmessage|0.3.5|1|Internet;mailnews;|3.8M||pybitmessage-0.3.5-1.pet|+openssl,+python-qt4,+sqlite3,+sqlite3-dev,+python-openssl,+python-sip,+gst123|Send encrypted messages|ubuntu|precise|5| diff --git a/rpmpackage/pybitmessage.spec b/rpmpackage/pybitmessage.spec index b15bd586..3af43532 100644 --- a/rpmpackage/pybitmessage.spec +++ b/rpmpackage/pybitmessage.spec @@ -6,6 +6,7 @@ License: MIT URL: https://github.com/Bitmessage/PyBitmessage Packager: Bob Mottram (4096 bits) Source0: http://yourdomainname.com/src/%{name}_%{version}.orig.tar.gz +BuildArch: noarch Group: Office/Email Requires: python, PyQt4, openssl-compat-bitcoin-libs, gst123 @@ -83,7 +84,8 @@ make install -B DESTDIR=%{buildroot} PREFIX=/usr - Added Russian translation - Added search support in the UI - Added 'make uninstall' -- To improve OSX support, use PKCS5_PBKDF2_HMAC_SHA1 if PKCS5_PBKDF2_HMAC is unavailable +- To improve OSX support, use PKCS5_PBKDF2_HMAC_SHA1 + if PKCS5_PBKDF2_HMAC is unavailable - Added better warnings for OSX users who are using old versions of Python - Repaired debian packaging - Altered Makefile to avoid needing to chase changes diff --git a/src/addresses.py b/src/addresses.py index a6a571f6..1db2105d 100644 --- a/src/addresses.py +++ b/src/addresses.py @@ -97,13 +97,18 @@ def calculateInventoryHash(data): return sha2.digest()[0:32] def encodeAddress(version,stream,ripe): - if version >= 2: + if version >= 2 and version < 4: if len(ripe) != 20: raise Exception("Programming error in encodeAddress: The length of a given ripe hash was not 20.") if ripe[:2] == '\x00\x00': ripe = ripe[2:] elif ripe[:1] == '\x00': ripe = ripe[1:] + elif version == 4: + if len(ripe) != 20: + raise Exception("Programming error in encodeAddress: The length of a given ripe hash was not 20.") + ripe = ripe.lstrip('\x00') + a = encodeVarint(version) + encodeVarint(stream) + ripe sha = hashlib.new('sha512') sha.update(a) @@ -164,7 +169,7 @@ def decodeAddress(address): #print 'addressVersionNumber', addressVersionNumber #print 'bytesUsedByVersionNumber', bytesUsedByVersionNumber - if addressVersionNumber > 3: + if addressVersionNumber > 4: print 'cannot decode address version numbers this high' status = 'versiontoohigh' return status,0,0,0 @@ -191,6 +196,15 @@ def decodeAddress(address): return 'ripetoolong',0,0,0 else: return 'otherproblem',0,0,0 + elif addressVersionNumber == 4: + if len(data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4]) > 20: + return 'ripetoolong',0,0,0 + elif len(data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4]) < 4: + return 'ripetooshort',0,0,0 + else: + x00string = '\x00' * (20 - len(data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4])) + return status,addressVersionNumber,streamNumber,x00string+data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4] + def addBMIfNotPresent(address): address = str(address).strip() diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index fd233bd5..e18a15d3 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -9,13 +9,6 @@ # The software version variable is now held in shared.py -# import ctypes -try: - from gevent import monkey - monkey.patch_all() -except ImportError as ex: - print "Not using the gevent module as it was not found. No need to worry." - import signal # Used to capture a Ctrl-C keypress so that Bitmessage can shutdown gracefully. # The next 3 are used for the API from SimpleXMLRPCServer import * @@ -38,10 +31,17 @@ from class_singleWorker import * from class_outgoingSynSender import * from class_singleListener import * from class_addressGenerator import * +from debug import logger # Helper Functions import helper_bootstrap +import sys +if sys.platform == 'darwin': + if float("{1}.{2}".format(*sys.version_info)) < 7.5: + logger.critical("You should use python 2.7.5 or greater. Your version: %s", "{0}.{1}.{2}".format(*sys.version_info)) + sys.exit(0) + def connectToStream(streamNumber): selfInitiatedConnections[streamNumber] = {} if sys.platform[0:3] == 'win': @@ -54,6 +54,13 @@ def connectToStream(streamNumber): a.start() +class APIError(Exception): + def __init__(self, error_number, error_message): + self.error_number = error_number + self.error_message = error_message + def __str__(self): + return "API Error %04i: %s" % (self.error_number, self.error_message) + # This is one of several classes that constitute the API # This class was written by Vaibhav Bhatia. Modified by Jonathan Warren (Atheros). # http://code.activestate.com/recipes/501148-xmlrpc-serverclient-which-does-cookie-handling-and/ @@ -127,20 +134,19 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): else: return False else: - print 'Authentication failed because header lacks Authentication field' + logger.warn('Authentication failed because header lacks Authentication field') time.sleep(2) return False return False - def _dispatch(self, method, params): - self.cookies = [] - - validuser = self.APIAuthenticateClient() - if not validuser: - time.sleep(2) - return "RPC Username or password incorrect or HTTP header lacks authentication at all." - # handle request + def _decode(self, text, decode_type): + try: + return text.decode(decode_type) + except TypeError as e: + raise APIError(22, "Decode error - " + str(e)) + + def _handle_request(self, method, params): if method == 'helloWorld': (a, b) = params return a + '-' + b @@ -166,7 +172,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'createRandomAddress': if len(params) == 0: - return 'API Error 0000: I need parameters!' + raise APIError(0, 'I need parameters!') elif len(params) == 1: label, = params eighteenByteRipe = False @@ -193,12 +199,12 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): payloadLengthExtraBytes = int( shared.networkDefaultPayloadLengthExtraBytes * smallMessageDifficulty) else: - return 'API Error 0000: Too many parameters!' - label = label.decode('base64') + raise APIError(0, 'Too many parameters!') + label = self._decode(label, "base64") try: unicode(label, 'utf-8') except: - return 'API Error 0017: Label is not valid UTF-8 data.' + raise APIError(17, 'Label is not valid UTF-8 data.') shared.apiAddressGeneratorReturnQueue.queue.clear() streamNumberForAddress = 1 shared.addressGeneratorQueue.put(( @@ -206,7 +212,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return shared.apiAddressGeneratorReturnQueue.get() elif method == 'createDeterministicAddresses': if len(params) == 0: - return 'API Error 0000: I need parameters!' + raise APIError(0, 'I need parameters!') elif len(params) == 1: passphrase, = params numberOfAddresses = 1 @@ -260,24 +266,24 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): payloadLengthExtraBytes = int( shared.networkDefaultPayloadLengthExtraBytes * smallMessageDifficulty) else: - return 'API Error 0000: Too many parameters!' + raise APIError(0, 'Too many parameters!') if len(passphrase) == 0: - return 'API Error 0001: The specified passphrase is blank.' - passphrase = passphrase.decode('base64') + raise APIError(1, 'The specified passphrase is blank.') + passphrase = self._decode(passphrase, "base64") if addressVersionNumber == 0: # 0 means "just use the proper addressVersionNumber" addressVersionNumber = 3 if addressVersionNumber != 3: - return 'API Error 0002: The address version number currently must be 3 (or 0 which means auto-select). ' + addressVersionNumber + ' isn\'t supported.' + raise APIError(2,'The address version number currently must be 3 (or 0 which means auto-select). ' + addressVersionNumber + ' isn\'t supported.') if streamNumber == 0: # 0 means "just use the most available stream" streamNumber = 1 if streamNumber != 1: - return 'API Error 0003: The stream number must be 1 (or 0 which means auto-select). Others aren\'t supported.' + raise APIError(3,'The stream number must be 1 (or 0 which means auto-select). Others aren\'t supported.') if numberOfAddresses == 0: - return 'API Error 0004: Why would you ask me to generate 0 addresses for you?' + raise APIError(4, 'Why would you ask me to generate 0 addresses for you?') if numberOfAddresses > 999: - return 'API Error 0005: You have (accidentally?) specified too many addresses to make. Maximum 999. This check only exists to prevent mischief; if you really want to create more addresses than this, contact the Bitmessage developers and we can modify the check or you can do it yourself by searching the source code for this message.' + raise APIError(5, 'You have (accidentally?) specified too many addresses to make. Maximum 999. This check only exists to prevent mischief; if you really want to create more addresses than this, contact the Bitmessage developers and we can modify the check or you can do it yourself by searching the source code for this message.') shared.apiAddressGeneratorReturnQueue.queue.clear() - print 'Requesting that the addressGenerator create', numberOfAddresses, 'addresses.' + logger.debug('Requesting that the addressGenerator create %s addresses.', numberOfAddresses) shared.addressGeneratorQueue.put( ('createDeterministicAddresses', addressVersionNumber, streamNumber, 'unused API address', numberOfAddresses, passphrase, eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes)) @@ -291,19 +297,19 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'getDeterministicAddress': if len(params) != 3: - return 'API Error 0000: I need exactly 3 parameters.' + raise APIError(0, 'I need exactly 3 parameters.') passphrase, addressVersionNumber, streamNumber = params numberOfAddresses = 1 eighteenByteRipe = False if len(passphrase) == 0: - return 'API Error 0001: The specified passphrase is blank.' - passphrase = passphrase.decode('base64') + raise APIError(1, 'The specified passphrase is blank.') + passphrase = self._decode(passphrase, "base64") if addressVersionNumber != 3: - return 'API Error 0002: The address version number currently must be 3. ' + addressVersionNumber + ' isn\'t supported.' + raise APIError(2, 'The address version number currently must be 3. ' + addressVersionNumber + ' isn\'t supported.') if streamNumber != 1: - return 'API Error 0003: The stream number must be 1. Others aren\'t supported.' + raise APIError(3, ' The stream number must be 1. Others aren\'t supported.') shared.apiAddressGeneratorReturnQueue.queue.clear() - print 'Requesting that the addressGenerator create', numberOfAddresses, 'addresses.' + logger.debug('Requesting that the addressGenerator create %s addresses.', numberOfAddresses) shared.addressGeneratorQueue.put( ('getDeterministicAddress', addressVersionNumber, streamNumber, 'unused API address', numberOfAddresses, passphrase, eighteenByteRipe)) @@ -343,8 +349,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'getInboxMessageById' or method == 'getInboxMessageByID': if len(params) == 0: - return 'API Error 0000: I need parameters!' - msgid = params[0].decode('hex') + raise APIError(0, 'I need parameters!') + msgid = self._decode(params[0], "hex") v = (msgid,) shared.sqlLock.acquire() shared.sqlSubmitQueue.put('''SELECT msgid, toaddress, fromaddress, subject, received, message, encodingtype, read FROM inbox WHERE msgid=?''') @@ -391,7 +397,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'getInboxMessagesByReceiver' or method == 'getInboxMessagesByAddress': #after some time getInboxMessagesByAddress should be removed if len(params) == 0: - return 'API Error 0000: I need parameters!' + raise APIError(0, 'I need parameters!') toAddress = params[0] v = (toAddress,) shared.sqlLock.acquire() @@ -411,8 +417,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'getSentMessageById' or method == 'getSentMessageByID': if len(params) == 0: - return 'API Error 0000: I need parameters!' - msgid = params[0].decode('hex') + raise APIError(0, 'I need parameters!') + msgid = self._decode(params[0], "hex") v = (msgid,) shared.sqlLock.acquire() shared.sqlSubmitQueue.put('''SELECT msgid, toaddress, fromaddress, subject, lastactiontime, message, encodingtype, status, ackdata FROM sent WHERE msgid=?''') @@ -429,7 +435,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'getSentMessagesByAddress' or method == 'getSentMessagesBySender': if len(params) == 0: - return 'API Error 0000: I need parameters!' + raise APIError(0, 'I need parameters!') fromAddress = params[0] v = (fromAddress,) shared.sqlLock.acquire() @@ -449,8 +455,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'getSentMessageByAckData': if len(params) == 0: - return 'API Error 0000: I need parameters!' - ackData = params[0].decode('hex') + raise APIError(0, 'I need parameters!') + ackData = self._decode(params[0], "hex") v = (ackData,) shared.sqlLock.acquire() shared.sqlSubmitQueue.put('''SELECT msgid, toaddress, fromaddress, subject, lastactiontime, message, encodingtype, status, ackdata FROM sent WHERE ackdata=?''') @@ -467,8 +473,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return data elif method == 'trashMessage': if len(params) == 0: - return 'API Error 0000: I need parameters!' - msgid = params[0].decode('hex') + raise APIError(0, 'I need parameters!') + msgid = self._decode(params[0], "hex") # Trash if in inbox table helper_inbox.trash(msgid) @@ -484,14 +490,14 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return 'Trashed message (assuming message existed).' elif method == 'trashInboxMessage': if len(params) == 0: - return 'API Error 0000: I need parameters!' - msgid = params[0].decode('hex') + raise APIError(0, 'I need parameters!') + msgid = self._decode(params[0], "hex") helper_inbox.trash(msgid) return 'Trashed inbox message (assuming message existed).' elif method == 'trashSentMessage': if len(params) == 0: - return 'API Error 0000: I need parameters!' - msgid = params[0].decode('hex') + raise APIError(0, 'I need parameters!') + msgid = self._decode(params[0], "hex") t = (msgid,) shared.sqlLock.acquire() shared.sqlSubmitQueue.put('''UPDATE sent SET folder='trash' WHERE msgid=?''') @@ -501,61 +507,72 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): shared.sqlLock.release() # shared.UISignalQueue.put(('removeSentRowByMsgid',msgid)) This function doesn't exist yet. return 'Trashed sent message (assuming message existed).' + elif method == 'trashSentMessageByAckData': + # This API method should only be used when msgid is not available + if len(params) == 0: + raise APIError(0, 'I need parameters!') + ackdata = self._decode(params[0], "hex") + t = (ackdata,) + shared.sqlLock.acquire() + shared.sqlSubmitQueue.put('''UPDATE sent SET folder='trash' WHERE ackdata=?''') + shared.sqlSubmitQueue.put(t) + shared.sqlReturnQueue.get() + shared.sqlSubmitQueue.put('commit') + shared.sqlLock.release() + return 'Trashed sent message (assuming message existed).' elif method == 'sendMessage': if len(params) == 0: - return 'API Error 0000: I need parameters!' + raise APIError(0, 'I need parameters!') elif len(params) == 4: toAddress, fromAddress, subject, message = params encodingType = 2 elif len(params) == 5: toAddress, fromAddress, subject, message, encodingType = params if encodingType != 2: - return 'API Error 0006: The encoding type must be 2 because that is the only one this program currently supports.' - subject = subject.decode('base64') - message = message.decode('base64') + raise APIError(6, 'The encoding type must be 2 because that is the only one this program currently supports.') + subject = self._decode(subject, "base64") + message = self._decode(message, "base64") status, addressVersionNumber, streamNumber, toRipe = decodeAddress( toAddress) if status != 'success': - with shared.printLock: - print 'API Error 0007: Could not decode address:', toAddress, ':', status + logger.warn('API Error 0007: Could not decode address %s. Status: %s.', toAddress, status) if status == 'checksumfailed': - return 'API Error 0008: Checksum failed for address: ' + toAddress + raise APIError(8, 'Checksum failed for address: ' + toAddress) if status == 'invalidcharacters': - return 'API Error 0009: Invalid characters in address: ' + toAddress + raise APIError(9, 'Invalid characters in address: ' + toAddress) if status == 'versiontoohigh': - return 'API Error 0010: Address version number too high (or zero) in address: ' + toAddress - return 'API Error 0007: Could not decode address: ' + toAddress + ' : ' + status + raise APIError(10, 'Address version number too high (or zero) in address: ' + toAddress) + raise APIError(7, 'Could not decode address: ' + toAddress + ' : ' + status) if addressVersionNumber < 2 or addressVersionNumber > 3: - return 'API Error 0011: The address version number currently must be 2 or 3. Others aren\'t supported. Check the toAddress.' + raise APIError(11, 'The address version number currently must be 2 or 3. Others aren\'t supported. Check the toAddress.') if streamNumber != 1: - return 'API Error 0012: The stream number must be 1. Others aren\'t supported. Check the toAddress.' + raise APIError(12, 'The stream number must be 1. Others aren\'t supported. Check the toAddress.') status, addressVersionNumber, streamNumber, fromRipe = decodeAddress( fromAddress) if status != 'success': - with shared.printLock: - print 'API Error 0007: Could not decode address:', fromAddress, ':', status + logger.warn('API Error 0007: Could not decode address %s. Status: %s.', fromAddress, status) if status == 'checksumfailed': - return 'API Error 0008: Checksum failed for address: ' + fromAddress + raise APIError(8, 'Checksum failed for address: ' + fromAddress) if status == 'invalidcharacters': - return 'API Error 0009: Invalid characters in address: ' + fromAddress + raise APIError(9, 'Invalid characters in address: ' + fromAddress) if status == 'versiontoohigh': - return 'API Error 0010: Address version number too high (or zero) in address: ' + fromAddress - return 'API Error 0007: Could not decode address: ' + fromAddress + ' : ' + status + raise APIError(10, 'Address version number too high (or zero) in address: ' + fromAddress) + raise APIError(7, 'Could not decode address: ' + fromAddress + ' : ' + status) if addressVersionNumber < 2 or addressVersionNumber > 3: - return 'API Error 0011: The address version number currently must be 2 or 3. Others aren\'t supported. Check the fromAddress.' + raise APIError(11, 'The address version number currently must be 2 or 3. Others aren\'t supported. Check the fromAddress.') if streamNumber != 1: - return 'API Error 0012: The stream number must be 1. Others aren\'t supported. Check the fromAddress.' + raise APIError(12, 'The stream number must be 1. Others aren\'t supported. Check the fromAddress.') toAddress = addBMIfNotPresent(toAddress) fromAddress = addBMIfNotPresent(fromAddress) try: fromAddressEnabled = shared.config.getboolean( fromAddress, 'enabled') except: - return 'API Error 0013: Could not find your fromAddress in the keys.dat file.' + raise APIError(13, 'Could not find your fromAddress in the keys.dat file.') if not fromAddressEnabled: - return 'API Error 0014: Your fromAddress is disabled. Cannot send.' + raise APIError(14, 'Your fromAddress is disabled. Cannot send.') ackdata = OpenSSL.rand(32) @@ -584,40 +601,39 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): elif method == 'sendBroadcast': if len(params) == 0: - return 'API Error 0000: I need parameters!' + raise APIError(0, 'I need parameters!') if len(params) == 3: fromAddress, subject, message = params encodingType = 2 elif len(params) == 4: fromAddress, subject, message, encodingType = params if encodingType != 2: - return 'API Error 0006: The encoding type must be 2 because that is the only one this program currently supports.' - subject = subject.decode('base64') - message = message.decode('base64') + raise APIError(6, 'The encoding type must be 2 because that is the only one this program currently supports.') + subject = self._decode(subject, "base64") + message = self._decode(message, "base64") status, addressVersionNumber, streamNumber, fromRipe = decodeAddress( fromAddress) if status != 'success': - with shared.printLock: - print 'API Error 0007: Could not decode address:', fromAddress, ':', status + logger.warn('API Error 0007: Could not decode address %s. Status: %s.', fromAddress, status) if status == 'checksumfailed': - return 'API Error 0008: Checksum failed for address: ' + fromAddress + raise APIError(8, 'Checksum failed for address: ' + fromAddress) if status == 'invalidcharacters': - return 'API Error 0009: Invalid characters in address: ' + fromAddress + raise APIError(9, 'Invalid characters in address: ' + fromAddress) if status == 'versiontoohigh': - return 'API Error 0010: Address version number too high (or zero) in address: ' + fromAddress - return 'API Error 0007: Could not decode address: ' + fromAddress + ' : ' + status + raise APIError(10, 'Address version number too high (or zero) in address: ' + fromAddress) + raise APIError(7, 'Could not decode address: ' + fromAddress + ' : ' + status) if addressVersionNumber < 2 or addressVersionNumber > 3: - return 'API Error 0011: the address version number currently must be 2 or 3. Others aren\'t supported. Check the fromAddress.' + raise APIError(11, 'the address version number currently must be 2 or 3. Others aren\'t supported. Check the fromAddress.') if streamNumber != 1: - return 'API Error 0012: the stream number must be 1. Others aren\'t supported. Check the fromAddress.' + raise APIError(12, 'the stream number must be 1. Others aren\'t supported. Check the fromAddress.') fromAddress = addBMIfNotPresent(fromAddress) try: fromAddressEnabled = shared.config.getboolean( fromAddress, 'enabled') except: - return 'API Error 0013: could not find your fromAddress in the keys.dat file.' + raise APIError(13, 'could not find your fromAddress in the keys.dat file.') ackdata = OpenSSL.rand(32) toAddress = '[Broadcast subscribers]' ripe = '' @@ -635,14 +651,15 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return ackdata.encode('hex') elif method == 'getStatus': if len(params) != 1: - return 'API Error 0000: I need one parameter!' + raise APIError(0, 'I need one parameter!') ackdata, = params if len(ackdata) != 64: - return 'API Error 0015: The length of ackData should be 32 bytes (encoded in hex thus 64 characters).' + raise APIError(15, 'The length of ackData should be 32 bytes (encoded in hex thus 64 characters).') + ackdata = self._decode(ackdata, "hex") shared.sqlLock.acquire() shared.sqlSubmitQueue.put( '''SELECT status FROM sent where ackdata=?''') - shared.sqlSubmitQueue.put((ackdata.decode('hex'),)) + shared.sqlSubmitQueue.put((ackdata,)) queryreturn = shared.sqlReturnQueue.get() shared.sqlLock.release() if queryreturn == []: @@ -652,37 +669,36 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): return status elif method == 'addSubscription': if len(params) == 0: - return 'API Error 0000: I need parameters!' + raise APIError(0, 'I need parameters!') if len(params) == 1: address, = params label == '' if len(params) == 2: address, label = params - label = label.decode('base64') + label = self._decode(label, "base64") try: unicode(label, 'utf-8') except: - return 'API Error 0017: Label is not valid UTF-8 data.' + raise APIError(17, 'Label is not valid UTF-8 data.') if len(params) > 2: - return 'API Error 0000: I need either 1 or 2 parameters!' + raise APIError(0, 'I need either 1 or 2 parameters!') address = addBMIfNotPresent(address) status, addressVersionNumber, streamNumber, toRipe = decodeAddress( address) if status != 'success': - with shared.printLock: - print 'API Error 0007: Could not decode address:', address, ':', status + logger.warn('API Error 0007: Could not decode address %s. Status: %s.', address, status) if status == 'checksumfailed': - return 'API Error 0008: Checksum failed for address: ' + address + raise APIError(8, 'Checksum failed for address: ' + address) if status == 'invalidcharacters': - return 'API Error 0009: Invalid characters in address: ' + address + raise APIError(9, 'Invalid characters in address: ' + address) if status == 'versiontoohigh': - return 'API Error 0010: Address version number too high (or zero) in address: ' + address - return 'API Error 0007: Could not decode address: ' + address + ' : ' + status + raise APIError(10, 'Address version number too high (or zero) in address: ' + address) + raise APIError(7, 'Could not decode address: ' + address + ' : ' + status) if addressVersionNumber < 2 or addressVersionNumber > 3: - return 'API Error 0011: The address version number currently must be 2 or 3. Others aren\'t supported.' + raise APIError(11, 'The address version number currently must be 2 or 3. Others aren\'t supported.') if streamNumber != 1: - return 'API Error 0012: The stream number must be 1. Others aren\'t supported.' + raise APIError(12, 'The stream number must be 1. Others aren\'t supported.') # First we must check to see if the address is already in the # subscriptions list. shared.sqlLock.acquire() @@ -693,7 +709,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): queryreturn = shared.sqlReturnQueue.get() shared.sqlLock.release() if queryreturn != []: - return 'API Error 0016: You are already subscribed to that address.' + raise APIError(16, 'You are already subscribed to that address.') t = (label, address, True) shared.sqlLock.acquire() shared.sqlSubmitQueue.put( @@ -709,7 +725,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): elif method == 'deleteSubscription': if len(params) != 1: - return 'API Error 0000: I need 1 parameter!' + raise APIError(0, 'I need 1 parameter!') address, = params address = addBMIfNotPresent(address) t = (address,) @@ -746,9 +762,9 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): # object and sends it out to the rest of the Bitmessage network as if it had generated the # message itself. Please do not yet add this to the api doc. if len(params) != 1: - return 'API Error 0000: I need 1 parameter!' + raise APIError(0, 'I need 1 parameter!') encryptedPayload, = params - encryptedPayload = encryptedPayload.decode('hex') + encryptedPayload = self._decode(encryptedPayload, "hex") toStreamNumber = decodeVarint(encryptedPayload[16:26])[0] inventoryHash = calculateInventoryHash(encryptedPayload) objectType = 'msg' @@ -765,9 +781,9 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): # rest of the Bitmessage network as if it had generated the pubkey object itself. Please # do not yet add this to the api doc. if len(params) != 1: - return 'API Error 0000: I need 1 parameter!' + raise APIError(0, 'I need 1 parameter!') payload, = params - payload = payload.decode('hex') + payload = self._decode(payload, "hex") pubkeyReadPosition = 8 # bypass the nonce if payload[pubkeyReadPosition:pubkeyReadPosition+4] == '\x00\x00\x00\x00': # if this pubkey uses 8 byte time pubkeyReadPosition += 8 @@ -790,11 +806,11 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): # doc. if len(params) != 1: - return 'API Error 0000: I need 1 parameter!' + raise APIError(0, 'I need 1 parameter!') requestedHash, = params if len(requestedHash) != 40: - return 'API Error 0019: The length of hash should be 20 bytes (encoded in hex thus 40 characters).' - requestedHash = requestedHash.decode('hex') + raise APIError(19, 'The length of hash should be 20 bytes (encoded in hex thus 40 characters).') + requestedHash = self._decode(requestedHash, "hex") # This is not a particularly commonly used API function. Before we # use it we'll need to fill out a field in our inventory database @@ -832,11 +848,11 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): # Method will eventually be used by a particular Android app to # retrieve pubkeys. Please do not yet add this to the api docs. if len(params) != 1: - return 'API Error 0000: I need 1 parameter!' + raise APIError(0, 'I need 1 parameter!') requestedHash, = params if len(requestedHash) != 40: - return 'API Error 0019: The length of hash should be 20 bytes (encoded in hex thus 40 characters).' - requestedHash = requestedHash.decode('hex') + raise APIError(19, 'The length of hash should be 20 bytes (encoded in hex thus 40 characters).') + requestedHash = self._decode(requestedHash, "hex") parameters = (requestedHash,) with shared.sqlLock: shared.sqlSubmitQueue.put('''SELECT transmitdata FROM pubkeys WHERE hash = ? ; ''') @@ -849,9 +865,31 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): data += ']}' return data elif method == 'clientStatus': - return '{ "networkConnections" : "%s" }' % str(len(shared.connectedHostsList)) + if len(shared.connectedHostsList) == 0: + networkStatus = 'notConnected' + elif len(shared.connectedHostsList) > 0 and not shared.clientHasReceivedIncomingConnections: + networkStatus = 'connectedButHaveNotReceivedIncomingConnections' + else: + networkStatus = 'connectedAndReceivingIncomingConnections' + return json.dumps({'networkConnections':len(shared.connectedHostsList),'numberOfMessagesProcessed':shared.numberOfMessagesProcessed, 'numberOfBroadcastsProcessed':shared.numberOfBroadcastsProcessed, 'numberOfPubkeysProcessed':shared.numberOfPubkeysProcessed, 'networkStatus':networkStatus}, indent=4, separators=(',', ': ')) else: - return 'API Error 0020: Invalid method: %s' % method + raise APIError(20, 'Invalid method: %s' % method) + + def _dispatch(self, method, params): + self.cookies = [] + + validuser = self.APIAuthenticateClient() + if not validuser: + time.sleep(2) + return "RPC Username or password incorrect or HTTP header lacks authentication at all." + + try: + return self._handle_request(method, params) + except APIError as e: + return str(e) + except Exception as e: + logger.exception(e) + return "API Error 0021: Unexpected API Failure - %s" % str(e) # This thread, of which there is only one, runs the API. @@ -878,7 +916,7 @@ if shared.useVeryEasyProofOfWorkForTesting: shared.networkDefaultPayloadLengthExtraBytes / 7000) class Main: - def start(self, deamon=False): + def start(self, daemon=False): # is the application already running? If yes then exit. thisapp = singleton.singleinstance() @@ -931,7 +969,7 @@ class Main: singleListenerThread.daemon = True # close the main program even if there are threads left singleListenerThread.start() - if deamon == False and shared.safeConfigGetBoolean('bitmessagesettings', 'daemon') == False: + if daemon == False and shared.safeConfigGetBoolean('bitmessagesettings', 'daemon') == False: try: from PyQt4 import QtCore, QtGui except Exception as err: @@ -944,7 +982,7 @@ class Main: else: shared.config.remove_option('bitmessagesettings', 'dontconnect') - if deamon: + if daemon: with shared.printLock: print 'Running as a daemon. The main program should exit this thread.' else: @@ -962,7 +1000,6 @@ class Main: def getApiAddress(self): if not shared.safeConfigGetBoolean('bitmessagesettings', 'apienabled'): return None - address = shared.config.get('bitmessagesettings', 'apiinterface') port = shared.config.getint('bitmessagesettings', 'apiport') return {'address':address,'port':port} diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 2d002385..3ad41c5e 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -417,11 +417,11 @@ class MyForm(QtGui.QMainWindow): QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( "updateNetworkStatusTab()"), self.updateNetworkStatusTab) QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "incrementNumberOfMessagesProcessed()"), self.incrementNumberOfMessagesProcessed) + "updateNumberOfMessagesProcessed()"), self.updateNumberOfMessagesProcessed) QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "incrementNumberOfPubkeysProcessed()"), self.incrementNumberOfPubkeysProcessed) + "updateNumberOfPubkeysProcessed()"), self.updateNumberOfPubkeysProcessed) QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "incrementNumberOfBroadcastsProcessed()"), self.incrementNumberOfBroadcastsProcessed) + "updateNumberOfBroadcastsProcessed()"), self.updateNumberOfBroadcastsProcessed) QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( "setStatusIcon(PyQt_PyObject)"), self.setStatusIcon) QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( @@ -1072,12 +1072,22 @@ class MyForm(QtGui.QMainWindow): if 'linux' in sys.platform: # Note: QSound was a nice idea but it didn't work if '.mp3' in soundFilename: + gst_available=False try: subprocess.call(["gst123", soundFilename], stdin=subprocess.PIPE, stdout=subprocess.PIPE) + gst_available=True except: print "WARNING: gst123 must be installed in order to play mp3 sounds" + if not gst_available: + try: + subprocess.call(["mpg123", soundFilename], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + gst_available=True + except: + print "WARNING: mpg123 must be installed in order to play mp3 sounds" else: try: subprocess.call(["aplay", soundFilename], @@ -1260,20 +1270,17 @@ class MyForm(QtGui.QMainWindow): self.actionShow.setChecked(not self.actionShow.isChecked()) self.appIndicatorShowOrHideWindow() - def incrementNumberOfMessagesProcessed(self): - self.numberOfMessagesProcessed += 1 + def updateNumberOfMessagesProcessed(self): self.ui.labelMessageCount.setText(_translate( - "MainWindow", "Processed %1 person-to-person messages.").arg(str(self.numberOfMessagesProcessed))) + "MainWindow", "Processed %1 person-to-person messages.").arg(str(shared.numberOfMessagesProcessed))) - def incrementNumberOfBroadcastsProcessed(self): - self.numberOfBroadcastsProcessed += 1 + def updateNumberOfBroadcastsProcessed(self): self.ui.labelBroadcastCount.setText(_translate( - "MainWindow", "Processed %1 broadcast messages.").arg(str(self.numberOfBroadcastsProcessed))) + "MainWindow", "Processed %1 broadcast messages.").arg(str(shared.numberOfBroadcastsProcessed))) - def incrementNumberOfPubkeysProcessed(self): - self.numberOfPubkeysProcessed += 1 + def updateNumberOfPubkeysProcessed(self): self.ui.labelPubkeyCount.setText(_translate( - "MainWindow", "Processed %1 public keys.").arg(str(self.numberOfPubkeysProcessed))) + "MainWindow", "Processed %1 public keys.").arg(str(shared.numberOfPubkeysProcessed))) def updateNetworkStatusTab(self): # print 'updating network status tab' @@ -2031,20 +2038,30 @@ class MyForm(QtGui.QMainWindow): self.settingsDialogInstance.ui.checkBoxStartInTray.isChecked())) shared.config.set('bitmessagesettings', 'willinglysendtomobile', str( self.settingsDialogInstance.ui.checkBoxWillinglySendToMobile.isChecked())) + + lang_ind = int(self.settingsDialogInstance.ui.languageComboBox.currentIndex()) + if not languages[lang_ind] == 'other': + shared.config.set('bitmessagesettings', 'userlocale', languages[lang_ind]) + if int(shared.config.get('bitmessagesettings', 'port')) != int(self.settingsDialogInstance.ui.lineEditTCPPort.text()): if not shared.safeConfigGetBoolean('bitmessagesettings', 'dontconnect'): QMessageBox.about(self, _translate("MainWindow", "Restart"), _translate( "MainWindow", "You must restart Bitmessage for the port number change to take effect.")) shared.config.set('bitmessagesettings', 'port', str( self.settingsDialogInstance.ui.lineEditTCPPort.text())) - if shared.config.get('bitmessagesettings', 'socksproxytype') == 'none' and str(self.settingsDialogInstance.ui.comboBoxProxyType.currentText())[0:5] == 'SOCKS': + #print 'self.settingsDialogInstance.ui.comboBoxProxyType.currentText()', self.settingsDialogInstance.ui.comboBoxProxyType.currentText() + #print 'self.settingsDialogInstance.ui.comboBoxProxyType.currentText())[0:5]', self.settingsDialogInstance.ui.comboBoxProxyType.currentText()[0:5] + if shared.config.get('bitmessagesettings', 'socksproxytype') == 'none' and self.settingsDialogInstance.ui.comboBoxProxyType.currentText()[0:5] == 'SOCKS': if shared.statusIconColor != 'red': QMessageBox.about(self, _translate("MainWindow", "Restart"), _translate( "MainWindow", "Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any).")) - if shared.config.get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS' and str(self.settingsDialogInstance.ui.comboBoxProxyType.currentText()) == 'none': + if shared.config.get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS' and self.settingsDialogInstance.ui.comboBoxProxyType.currentText()[0:5] != 'SOCKS': self.statusBar().showMessage('') - shared.config.set('bitmessagesettings', 'socksproxytype', str( - self.settingsDialogInstance.ui.comboBoxProxyType.currentText())) + if self.settingsDialogInstance.ui.comboBoxProxyType.currentText()[0:5] == 'SOCKS': + shared.config.set('bitmessagesettings', 'socksproxytype', str( + self.settingsDialogInstance.ui.comboBoxProxyType.currentText())) + else: + shared.config.set('bitmessagesettings', 'socksproxytype', 'none') shared.config.set('bitmessagesettings', 'socksauthentication', str( self.settingsDialogInstance.ui.checkBoxAuthentication.isChecked())) shared.config.set('bitmessagesettings', 'sockshostname', str( @@ -3041,6 +3058,16 @@ class settingsDialog(QtGui.QDialog): shared.config.getboolean('bitmessagesettings', 'startintray')) self.ui.checkBoxWillinglySendToMobile.setChecked( shared.safeConfigGetBoolean('bitmessagesettings', 'willinglysendtomobile')) + + global languages + languages = ['system','en','eo','fr','de','es','ru','en_pirate','other'] + user_countrycode = str(shared.config.get('bitmessagesettings', 'userlocale')) + if user_countrycode in languages: + curr_index = languages.index(user_countrycode) + else: + curr_index = languages.index('other') + self.ui.languageComboBox.setCurrentIndex(curr_index) + if shared.appdata == '': self.ui.checkBoxPortableMode.setChecked(True) if 'darwin' in sys.platform: @@ -3326,103 +3353,105 @@ class myTableWidgetItem(QTableWidgetItem): def __lt__(self, other): return int(self.data(33).toPyObject()) < int(other.data(33).toPyObject()) -from threading import Thread -class UISignaler(Thread,QThread): +class UISignaler(QThread): def __init__(self, parent=None): - Thread.__init__(self, parent) QThread.__init__(self, parent) def run(self): while True: - try: - command, data = shared.UISignalQueue.get() - if command == 'writeNewAddressToTable': - label, address, streamNumber = data - self.emit(SIGNAL( - "writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), label, address, str(streamNumber)) - elif command == 'updateStatusBar': - self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"), data) - elif command == 'updateSentItemStatusByHash': - hash, message = data - self.emit(SIGNAL( - "updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"), hash, message) - elif command == 'updateSentItemStatusByAckdata': - ackData, message = data - self.emit(SIGNAL( - "updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), ackData, message) - elif command == 'displayNewInboxMessage': - inventoryHash, toAddress, fromAddress, subject, body = data - self.emit(SIGNAL( - "displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), - inventoryHash, toAddress, fromAddress, subject, body) - elif command == 'displayNewSentMessage': - toAddress, fromLabel, fromAddress, subject, message, ackdata = data - self.emit(SIGNAL( - "displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), - toAddress, fromLabel, fromAddress, subject, message, ackdata) - elif command == 'updateNetworkStatusTab': - self.emit(SIGNAL("updateNetworkStatusTab()")) - elif command == 'incrementNumberOfMessagesProcessed': - self.emit(SIGNAL("incrementNumberOfMessagesProcessed()")) - elif command == 'incrementNumberOfPubkeysProcessed': - self.emit(SIGNAL("incrementNumberOfPubkeysProcessed()")) - elif command == 'incrementNumberOfBroadcastsProcessed': - self.emit(SIGNAL("incrementNumberOfBroadcastsProcessed()")) - elif command == 'setStatusIcon': - self.emit(SIGNAL("setStatusIcon(PyQt_PyObject)"), data) - elif command == 'rerenderInboxFromLabels': - self.emit(SIGNAL("rerenderInboxFromLabels()")) - elif command == 'rerenderSubscriptions': - self.emit(SIGNAL("rerenderSubscriptions()")) - elif command == 'removeInboxRowByMsgid': - self.emit(SIGNAL("removeInboxRowByMsgid(PyQt_PyObject)"), data) - else: - sys.stderr.write( - 'Command sent to UISignaler not recognized: %s\n' % command) - except Exception,ex: - # uncaught exception will block gevent - import traceback - traceback.print_exc() - traceback.print_stack() - print ex - pass - -try: - import gevent -except ImportError as ex: - gevent = None -else: - def mainloop(app): - while True: - app.processEvents() - gevent.sleep(0.01) - def testprint(): - #print 'this is running' - gevent.spawn_later(1, testprint) + command, data = shared.UISignalQueue.get() + if command == 'writeNewAddressToTable': + label, address, streamNumber = data + self.emit(SIGNAL( + "writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), label, address, str(streamNumber)) + elif command == 'updateStatusBar': + self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"), data) + elif command == 'updateSentItemStatusByHash': + hash, message = data + self.emit(SIGNAL( + "updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"), hash, message) + elif command == 'updateSentItemStatusByAckdata': + ackData, message = data + self.emit(SIGNAL( + "updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), ackData, message) + elif command == 'displayNewInboxMessage': + inventoryHash, toAddress, fromAddress, subject, body = data + self.emit(SIGNAL( + "displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), + inventoryHash, toAddress, fromAddress, subject, body) + elif command == 'displayNewSentMessage': + toAddress, fromLabel, fromAddress, subject, message, ackdata = data + self.emit(SIGNAL( + "displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), + toAddress, fromLabel, fromAddress, subject, message, ackdata) + elif command == 'updateNetworkStatusTab': + self.emit(SIGNAL("updateNetworkStatusTab()")) + elif command == 'updateNumberOfMessagesProcessed': + self.emit(SIGNAL("updateNumberOfMessagesProcessed()")) + elif command == 'updateNumberOfPubkeysProcessed': + self.emit(SIGNAL("updateNumberOfPubkeysProcessed()")) + elif command == 'updateNumberOfBroadcastsProcessed': + self.emit(SIGNAL("updateNumberOfBroadcastsProcessed()")) + elif command == 'setStatusIcon': + self.emit(SIGNAL("setStatusIcon(PyQt_PyObject)"), data) + elif command == 'rerenderInboxFromLabels': + self.emit(SIGNAL("rerenderInboxFromLabels()")) + elif command == 'rerenderSubscriptions': + self.emit(SIGNAL("rerenderSubscriptions()")) + elif command == 'removeInboxRowByMsgid': + self.emit(SIGNAL("removeInboxRowByMsgid(PyQt_PyObject)"), data) + else: + sys.stderr.write( + 'Command sent to UISignaler not recognized: %s\n' % command) def run(): app = QtGui.QApplication(sys.argv) translator = QtCore.QTranslator() - - lang_countrycode = str(locale.getdefaultlocale()[0]) - translation = "translations/bitmessage_" + lang_countrycode - if not os.path.isfile(translation + ".pro"): - # Don't have fully localized translation, try language only - lang = lang_countrycode[0:2] - translation = "translations/bitmessage_" + lang - - if not os.path.isfile(translation + ".pro"): - # Don't have language either, default to 'Merica USA! USA! - translation = "translations/bitmessage_en_US" - try: - translator.load(translation) - #translator.load("translations/bitmessage_fr_BE") # test French + locale_countrycode = str(locale.getdefaultlocale()[0]) except: # The above is not compatible with all versions of OSX. - translator.load("translations/bitmessage_en_US") # Default to english. + locale_countrycode = "en_US" # Default to english. + locale_lang = locale_countrycode[0:2] + user_countrycode = str(shared.config.get('bitmessagesettings', 'userlocale')) + user_lang = user_countrycode[0:2] + translation_path = "translations/bitmessage_" + + if shared.config.get('bitmessagesettings', 'userlocale') == 'system': + # try to detect the users locale otherwise fallback to English + try: + # try the users full locale, e.g. 'en_US': + # since we usually only provide languages, not localozations + # this will usually fail + translator.load(translation_path + locale_countrycode) + except: + try: + # try the users locale language, e.g. 'en': + # since we usually only provide languages, not localozations + # this will usually succeed + translator.load(translation_path + locale_lang) + except: + # as English is already the default language, we don't + # need to do anything. No need to translate. + pass + else: + try: + # check if the user input is a valid translation file: + # since user_countrycode will be usually set by the combobox + # it will usually just be a language code + translator.load(translation_path + user_countrycode) + except: + try: + # check if the user lang is a valid translation file: + # this is only needed if the user manually set his 'userlocale' + # in the keys.dat to a countrycode (e.g. 'de_CH') + translator.load(translation_path + user_lang) + except: + # as English is already the default language, we don't + # need to do anything. No need to translate. + pass QtGui.QApplication.installTranslator(translator) app.setStyleSheet("QStatusBar::item { border: 0px solid black }") @@ -3436,8 +3465,4 @@ def run(): myapp.notifierInit() if shared.safeConfigGetBoolean('bitmessagesettings', 'dontconnect'): myapp.showConnectDialog() # ask the user if we may connect - if gevent is None: - sys.exit(app.exec_()) - else: - gevent.joinall([gevent.spawn(testprint), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app), gevent.spawn(mainloop, app)]) - print 'done' + sys.exit(app.exec_()) diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index c051c076..74505f38 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'bitmessageui.ui' # -# Created: Mon Aug 12 00:08:20 2013 -# by: PyQt4 UI code generator 4.10.2 +# Created: Thu Aug 15 14:19:52 2013 +# by: PyQt4 UI code generator 4.10 # # WARNING! All changes made in this file will be lost! @@ -69,7 +69,11 @@ class Ui_MainWindow(object): self.inboxSearchOptionCB.addItem(_fromUtf8("")) self.horizontalLayoutSearch.addWidget(self.inboxSearchOptionCB) self.verticalLayout_2.addLayout(self.horizontalLayoutSearch) - self.tableWidgetInbox = QtGui.QTableWidget(self.inbox) + self.splitter = QtGui.QSplitter(self.inbox) + self.splitter.setOrientation(QtCore.Qt.Vertical) + self.splitter.setObjectName(_fromUtf8("splitter")) + self.tableWidgetInbox = QtGui.QTableWidget(self.splitter) + self.tableWidgetInbox.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.tableWidgetInbox.setAlternatingRowColors(True) self.tableWidgetInbox.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.tableWidgetInbox.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) @@ -93,11 +97,11 @@ class Ui_MainWindow(object): self.tableWidgetInbox.horizontalHeader().setStretchLastSection(True) self.tableWidgetInbox.verticalHeader().setVisible(False) self.tableWidgetInbox.verticalHeader().setDefaultSectionSize(26) - self.verticalLayout_2.addWidget(self.tableWidgetInbox) - self.textEditInboxMessage = QtGui.QTextEdit(self.inbox) + self.textEditInboxMessage = QtGui.QTextEdit(self.splitter) self.textEditInboxMessage.setBaseSize(QtCore.QSize(0, 500)) + self.textEditInboxMessage.setReadOnly(True) self.textEditInboxMessage.setObjectName(_fromUtf8("textEditInboxMessage")) - self.verticalLayout_2.addWidget(self.textEditInboxMessage) + self.verticalLayout_2.addWidget(self.splitter) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/inbox.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.tabWidget.addTab(self.inbox, icon1, _fromUtf8("")) @@ -193,7 +197,11 @@ class Ui_MainWindow(object): self.sentSearchOptionCB.addItem(_fromUtf8("")) self.horizontalLayout.addWidget(self.sentSearchOptionCB) self.verticalLayout.addLayout(self.horizontalLayout) - self.tableWidgetSent = QtGui.QTableWidget(self.sent) + self.splitter_2 = QtGui.QSplitter(self.sent) + self.splitter_2.setOrientation(QtCore.Qt.Vertical) + self.splitter_2.setObjectName(_fromUtf8("splitter_2")) + self.tableWidgetSent = QtGui.QTableWidget(self.splitter_2) + self.tableWidgetSent.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.tableWidgetSent.setDragDropMode(QtGui.QAbstractItemView.DragDrop) self.tableWidgetSent.setAlternatingRowColors(True) self.tableWidgetSent.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) @@ -217,10 +225,10 @@ class Ui_MainWindow(object): self.tableWidgetSent.horizontalHeader().setStretchLastSection(True) self.tableWidgetSent.verticalHeader().setVisible(False) self.tableWidgetSent.verticalHeader().setStretchLastSection(False) - self.verticalLayout.addWidget(self.tableWidgetSent) - self.textEditSentMessage = QtGui.QTextEdit(self.sent) + self.textEditSentMessage = QtGui.QTextEdit(self.splitter_2) + self.textEditSentMessage.setReadOnly(True) self.textEditSentMessage.setObjectName(_fromUtf8("textEditSentMessage")) - self.verticalLayout.addWidget(self.textEditSentMessage) + self.verticalLayout.addWidget(self.splitter_2) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/sent.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.tabWidget.addTab(self.sent, icon3, _fromUtf8("")) @@ -428,7 +436,7 @@ class Ui_MainWindow(object): self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 795, 18)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 795, 23)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuFile = QtGui.QMenu(self.menubar) self.menuFile.setObjectName(_fromUtf8("menuFile")) @@ -546,8 +554,8 @@ class Ui_MainWindow(object): self.textEditMessage.setHtml(_translate("MainWindow", "\n" "\n" -"


", None)) +"\n" +"


", None)) self.label.setText(_translate("MainWindow", "To:", None)) self.label_2.setText(_translate("MainWindow", "From:", None)) self.radioButtonBroadcast.setText(_translate("MainWindow", "Broadcast to everyone who is subscribed to your address", None)) diff --git a/src/bitmessageqt/bitmessageui.ui b/src/bitmessageqt/bitmessageui.ui index 683703d8..5b597d38 100644 --- a/src/bitmessageqt/bitmessageui.ui +++ b/src/bitmessageqt/bitmessageui.ui @@ -22,7 +22,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -112,76 +121,85 @@ - - - true + + + Qt::Vertical - - QAbstractItemView::ExtendedSelection - - - QAbstractItemView::SelectRows - - - true - - - false - - - true - - - 200 - - - false - - - 27 - - - false - - - true - - - false - - - 26 - - - - To + + + QAbstractItemView::NoEditTriggers - - - - From + + true - - - - Subject + + QAbstractItemView::ExtendedSelection - - - - Received + + QAbstractItemView::SelectRows - - - - - - - - 0 - 500 - - + + true + + + false + + + true + + + 200 + + + false + + + 27 + + + false + + + true + + + false + + + 26 + + + + To + + + + + From + + + + + Subject + + + + + Received + + + + + + + 0 + 500 + + + + true + + @@ -269,8 +287,8 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"><br /></p></body></html> @@ -409,71 +427,81 @@ p, li { white-space: pre-wrap; } - - - QAbstractItemView::DragDrop + + + Qt::Vertical - - true - - - QAbstractItemView::ExtendedSelection - - - QAbstractItemView::SelectRows - - - true - - - false - - - true - - - 130 - - - false - - - false - - - true - - - false - - - false - - - - To + + + QAbstractItemView::NoEditTriggers - - - - From + + QAbstractItemView::DragDrop - - - - Subject + + true - - - - Status + + QAbstractItemView::ExtendedSelection - + + QAbstractItemView::SelectRows + + + true + + + false + + + true + + + 130 + + + false + + + false + + + true + + + false + + + false + + + + To + + + + + From + + + + + Subject + + + + + Status + + + + + + true + + - - - @@ -1023,7 +1051,7 @@ p, li { white-space: pre-wrap; } 0 0 795 - 18 + 23 diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index 87e8ba7b..0d8f9e72 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'settings.ui' # -# Created: Wed Aug 14 18:31:34 2013 -# by: PyQt4 UI code generator 4.10 +# Created: Tue Aug 27 22:23:38 2013 +# by: PyQt4 UI code generator 4.10.2 # # WARNING! All changes made in this file will be lost! @@ -41,55 +41,68 @@ class Ui_settingsDialog(object): self.tabUserInterface.setObjectName(_fromUtf8("tabUserInterface")) self.gridLayout_5 = QtGui.QGridLayout(self.tabUserInterface) self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) - self.labelSettingsNote = QtGui.QLabel(self.tabUserInterface) - self.labelSettingsNote.setText(_fromUtf8("")) - self.labelSettingsNote.setWordWrap(True) - self.labelSettingsNote.setObjectName(_fromUtf8("labelSettingsNote")) - self.gridLayout_5.addWidget(self.labelSettingsNote, 7, 0, 1, 1) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_5.addItem(spacerItem, 8, 0, 1, 1) - self.checkBoxStartInTray = QtGui.QCheckBox(self.tabUserInterface) - self.checkBoxStartInTray.setObjectName(_fromUtf8("checkBoxStartInTray")) - self.gridLayout_5.addWidget(self.checkBoxStartInTray, 1, 0, 1, 1) - self.checkBoxShowTrayNotifications = QtGui.QCheckBox(self.tabUserInterface) - self.checkBoxShowTrayNotifications.setObjectName(_fromUtf8("checkBoxShowTrayNotifications")) - self.gridLayout_5.addWidget(self.checkBoxShowTrayNotifications, 3, 0, 1, 1) self.checkBoxMinimizeToTray = QtGui.QCheckBox(self.tabUserInterface) self.checkBoxMinimizeToTray.setChecked(True) self.checkBoxMinimizeToTray.setObjectName(_fromUtf8("checkBoxMinimizeToTray")) self.gridLayout_5.addWidget(self.checkBoxMinimizeToTray, 2, 0, 1, 1) - self.label_7 = QtGui.QLabel(self.tabUserInterface) - self.label_7.setWordWrap(True) - self.label_7.setObjectName(_fromUtf8("label_7")) - self.gridLayout_5.addWidget(self.label_7, 5, 0, 1, 1) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.gridLayout_5.addItem(spacerItem, 10, 0, 1, 1) self.checkBoxStartOnLogon = QtGui.QCheckBox(self.tabUserInterface) self.checkBoxStartOnLogon.setObjectName(_fromUtf8("checkBoxStartOnLogon")) self.gridLayout_5.addWidget(self.checkBoxStartOnLogon, 0, 0, 1, 1) + self.checkBoxShowTrayNotifications = QtGui.QCheckBox(self.tabUserInterface) + self.checkBoxShowTrayNotifications.setObjectName(_fromUtf8("checkBoxShowTrayNotifications")) + self.gridLayout_5.addWidget(self.checkBoxShowTrayNotifications, 3, 0, 1, 1) self.checkBoxPortableMode = QtGui.QCheckBox(self.tabUserInterface) self.checkBoxPortableMode.setObjectName(_fromUtf8("checkBoxPortableMode")) self.gridLayout_5.addWidget(self.checkBoxPortableMode, 4, 0, 1, 1) + self.checkBoxStartInTray = QtGui.QCheckBox(self.tabUserInterface) + self.checkBoxStartInTray.setObjectName(_fromUtf8("checkBoxStartInTray")) + self.gridLayout_5.addWidget(self.checkBoxStartInTray, 1, 0, 1, 1) + self.PortableModeDescription = QtGui.QLabel(self.tabUserInterface) + self.PortableModeDescription.setWordWrap(True) + self.PortableModeDescription.setObjectName(_fromUtf8("PortableModeDescription")) + self.gridLayout_5.addWidget(self.PortableModeDescription, 5, 0, 1, 2) self.checkBoxWillinglySendToMobile = QtGui.QCheckBox(self.tabUserInterface) self.checkBoxWillinglySendToMobile.setObjectName(_fromUtf8("checkBoxWillinglySendToMobile")) - self.gridLayout_5.addWidget(self.checkBoxWillinglySendToMobile, 6, 0, 1, 1) + self.gridLayout_5.addWidget(self.checkBoxWillinglySendToMobile, 6, 0, 1, 2) + self.groupBox = QtGui.QGroupBox(self.tabUserInterface) + self.groupBox.setObjectName(_fromUtf8("groupBox")) + self.horizontalLayout_2 = QtGui.QHBoxLayout(self.groupBox) + self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) + self.languageComboBox = QtGui.QComboBox(self.groupBox) + self.languageComboBox.setMinimumSize(QtCore.QSize(100, 0)) + self.languageComboBox.setObjectName(_fromUtf8("languageComboBox")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.languageComboBox.addItem(_fromUtf8("")) + self.horizontalLayout_2.addWidget(self.languageComboBox) + self.gridLayout_5.addWidget(self.groupBox, 10, 1, 1, 1) self.tabWidgetSettings.addTab(self.tabUserInterface, _fromUtf8("")) self.tabNetworkSettings = QtGui.QWidget() self.tabNetworkSettings.setObjectName(_fromUtf8("tabNetworkSettings")) self.gridLayout_4 = QtGui.QGridLayout(self.tabNetworkSettings) self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) - self.groupBox = QtGui.QGroupBox(self.tabNetworkSettings) - self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.gridLayout_3 = QtGui.QGridLayout(self.groupBox) + self.groupBox1 = QtGui.QGroupBox(self.tabNetworkSettings) + self.groupBox1.setObjectName(_fromUtf8("groupBox1")) + self.gridLayout_3 = QtGui.QGridLayout(self.groupBox1) self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) spacerItem1 = QtGui.QSpacerItem(125, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout_3.addItem(spacerItem1, 0, 0, 1, 1) - self.label = QtGui.QLabel(self.groupBox) + self.label = QtGui.QLabel(self.groupBox1) self.label.setObjectName(_fromUtf8("label")) self.gridLayout_3.addWidget(self.label, 0, 1, 1, 1) - self.lineEditTCPPort = QtGui.QLineEdit(self.groupBox) + self.lineEditTCPPort = QtGui.QLineEdit(self.groupBox1) self.lineEditTCPPort.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineEditTCPPort.setObjectName(_fromUtf8("lineEditTCPPort")) self.gridLayout_3.addWidget(self.lineEditTCPPort, 0, 2, 1, 1) - self.gridLayout_4.addWidget(self.groupBox, 0, 0, 1, 1) + self.gridLayout_4.addWidget(self.groupBox1, 0, 0, 1, 1) self.groupBox_2 = QtGui.QGroupBox(self.tabNetworkSettings) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_2) @@ -324,15 +337,25 @@ class Ui_settingsDialog(object): def retranslateUi(self, settingsDialog): settingsDialog.setWindowTitle(_translate("settingsDialog", "Settings", None)) - self.checkBoxStartInTray.setText(_translate("settingsDialog", "Start Bitmessage in the tray (don\'t show main window)", None)) - self.checkBoxShowTrayNotifications.setText(_translate("settingsDialog", "Show notification when message received", None)) self.checkBoxMinimizeToTray.setText(_translate("settingsDialog", "Minimize to tray", None)) - self.label_7.setText(_translate("settingsDialog", "In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive.", None)) self.checkBoxStartOnLogon.setText(_translate("settingsDialog", "Start Bitmessage on user login", None)) + self.checkBoxShowTrayNotifications.setText(_translate("settingsDialog", "Show notification when message received", None)) self.checkBoxPortableMode.setText(_translate("settingsDialog", "Run in Portable Mode", None)) + self.checkBoxStartInTray.setText(_translate("settingsDialog", "Start Bitmessage in the tray (don\'t show main window)", None)) + self.PortableModeDescription.setText(_translate("settingsDialog", "In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive.", None)) self.checkBoxWillinglySendToMobile.setText(_translate("settingsDialog", "Willingly include unencrypted destination address when sending to a mobile device", None)) + self.groupBox.setTitle(_translate("settingsDialog", "Interface Language", None)) + self.languageComboBox.setItemText(0, _translate("settingsDialog", "System Settings", "system")) + self.languageComboBox.setItemText(1, _translate("settingsDialog", "English", "en")) + self.languageComboBox.setItemText(2, _translate("settingsDialog", "Esperanto", "eo")) + self.languageComboBox.setItemText(3, _translate("settingsDialog", "Français", "fr")) + self.languageComboBox.setItemText(4, _translate("settingsDialog", "Deutsch", "de")) + self.languageComboBox.setItemText(5, _translate("settingsDialog", "Español", "es")) + self.languageComboBox.setItemText(6, _translate("settingsDialog", "Русский", "ru")) + self.languageComboBox.setItemText(7, _translate("settingsDialog", "Pirate English", "en_pirate")) + self.languageComboBox.setItemText(8, _translate("settingsDialog", "Other (set in keys.dat)", "other")) self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabUserInterface), _translate("settingsDialog", "User Interface", None)) - self.groupBox.setTitle(_translate("settingsDialog", "Listening port", None)) + self.groupBox1.setTitle(_translate("settingsDialog", "Listening port", None)) self.label.setText(_translate("settingsDialog", "Listen for connections on port:", None)) self.groupBox_2.setTitle(_translate("settingsDialog", "Proxy server / Tor", None)) self.label_2.setText(_translate("settingsDialog", "Type:", None)) diff --git a/src/bitmessageqt/settings.ui b/src/bitmessageqt/settings.ui index 0ca22088..02117149 100644 --- a/src/bitmessageqt/settings.ui +++ b/src/bitmessageqt/settings.ui @@ -37,17 +37,17 @@ User Interface - - + + - + Minimize to tray - + true - + Qt::Vertical @@ -60,10 +60,10 @@ - - + + - Start Bitmessage in the tray (don't show main window) + Start Bitmessage on user login @@ -74,18 +74,22 @@ - - + + - Minimize to tray - - - true + Run in Portable Mode - - + + + + Start Bitmessage in the tray (don't show main window) + + + + + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. @@ -94,27 +98,77 @@ - - - - Start Bitmessage on user login - - - - - - - Run in Portable Mode - - - - + Willingly include unencrypted destination address when sending to a mobile device + + + + Interface Language + + + + + + + 100 + 0 + + + + + System Settings + + + + + English + + + + + Esperanto + + + + + Français + + + + + Deutsch + + + + + Español + + + + + Русский + + + + + Pirate English + + + + + Other (set in keys.dat) + + + + + + + diff --git a/src/build_osx.py b/src/build_osx.py index 901d1ca6..fd1bbcf9 100644 --- a/src/build_osx.py +++ b/src/build_osx.py @@ -5,12 +5,15 @@ version = "0.3.4" mainscript = ["bitmessagemain.py"] setup( - name = name, + name = name, version = version, app = mainscript, setup_requires = ["py2app"], - options = dict(py2app=dict( - resources = ["images"], - iconfile = "images/bitmessage.icns" - )) + options = dict( + py2app = dict( + resources = ["images"], + includes = ['sip', 'PyQt4._qt'], + iconfile = "images/bitmessage.icns" + ) + ) ) diff --git a/src/class_bgWorker.py b/src/class_bgWorker.py deleted file mode 100644 index c01e26ef..00000000 --- a/src/class_bgWorker.py +++ /dev/null @@ -1,38 +0,0 @@ -#! /usr/bin/python -# -*- coding: utf-8 -*- -# cody by linker.lin@me.com - -__author__ = 'linkerlin' - - -import threading -import Queue -import time - -class bgWorker(threading.Thread): - def __init__(self): - threading.Thread.__init__(self) - self.q = Queue.Queue() - self.setDaemon(True) - - def post(self,job): - self.q.put(job) - - def run(self): - while 1: - job=None - try: - job = self.q.get(block=True) - if job: - job() - except Exception as ex: - print "Error,job exception:",ex.message,type(ex) - time.sleep(0.05) - else: - #print "job: ", job, " done" - pass - finally: - time.sleep(0.05) - -bgworker = bgWorker() -bgworker.start() diff --git a/src/class_outgoingSynSender.py b/src/class_outgoingSynSender.py index 8a929c7d..c526c9b4 100644 --- a/src/class_outgoingSynSender.py +++ b/src/class_outgoingSynSender.py @@ -25,7 +25,7 @@ class outgoingSynSender(threading.Thread): def run(self): while shared.safeConfigGetBoolean('bitmessagesettings', 'dontconnect'): time.sleep(2) - while True: + while shared.safeConfigGetBoolean('bitmessagesettings', 'sendoutgoingconnections'): while len(self.selfInitiatedConnections[self.streamNumber]) >= 8: # maximum number of outgoing connections = 8 time.sleep(10) if shared.shutdown: diff --git a/src/class_receiveDataThread.py b/src/class_receiveDataThread.py index 6adfe490..b5aa5893 100644 --- a/src/class_receiveDataThread.py +++ b/src/class_receiveDataThread.py @@ -256,6 +256,7 @@ class receiveDataThread(threading.Thread): def connectionFullyEstablished(self): self.connectionIsOrWasFullyEstablished = True if not self.initiatedConnection: + shared.clientHasReceivedIncomingConnections = True shared.UISignalQueue.put(('setStatusIcon', 'green')) self.sock.settimeout( 600) # We'll send out a pong every 5 minutes to make sure the connection stays alive if there has been no other traffic to send lately. @@ -392,8 +393,9 @@ class receiveDataThread(threading.Thread): objectType, self.streamNumber, data, embeddedTime) shared.inventoryLock.release() self.broadcastinv(self.inventoryHash) + shared.numberOfBroadcastsProcessed += 1 shared.UISignalQueue.put(( - 'incrementNumberOfBroadcastsProcessed', 'no data')) + 'updateNumberOfBroadcastsProcessed', 'no data')) self.processbroadcast( readPosition, data) # When this function returns, we will have either successfully processed this broadcast because we are interested in it, ignored it because we aren't interested in it, or found problem with the broadcast that warranted ignoring it. @@ -760,8 +762,9 @@ class receiveDataThread(threading.Thread): objectType, self.streamNumber, data, embeddedTime) shared.inventoryLock.release() self.broadcastinv(self.inventoryHash) + shared.numberOfMessagesProcessed += 1 shared.UISignalQueue.put(( - 'incrementNumberOfMessagesProcessed', 'no data')) + 'updateNumberOfMessagesProcessed', 'no data')) self.processmsg( readPosition, data) # When this function returns, we will have either successfully processed the message bound for us, ignored it because it isn't bound for us, or found problem with the message that warranted ignoring it. @@ -1178,8 +1181,9 @@ class receiveDataThread(threading.Thread): objectType, self.streamNumber, data, embeddedTime) shared.inventoryLock.release() self.broadcastinv(inventoryHash) + shared.numberOfPubkeysProcessed += 1 shared.UISignalQueue.put(( - 'incrementNumberOfPubkeysProcessed', 'no data')) + 'updateNumberOfPubkeysProcessed', 'no data')) self.processpubkey(data) @@ -1216,7 +1220,7 @@ class receiveDataThread(threading.Thread): if addressVersion == 0: print '(Within processpubkey) addressVersion of 0 doesn\'t make sense.' return - if addressVersion >= 4 or addressVersion == 1: + if addressVersion > 3 or addressVersion == 1: with shared.printLock: print 'This version of Bitmessage cannot handle version', addressVersion, 'addresses.' diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index b29b7f8d..a3d0a0c5 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -535,6 +535,8 @@ class singleWorker(threading.Thread): pubEncryptionKeyBase256 = pubkeyPayload[ readPosition:readPosition + 64] readPosition += 64 + + # Let us fetch the amount of work required by the recipient. if toAddressVersionNumber == 2: requiredAverageProofOfWorkNonceTrialsPerByte = shared.networkDefaultProofOfWorkNonceTrialsPerByte requiredPayloadLengthExtraBytes = shared.networkDefaultPayloadLengthExtraBytes @@ -569,6 +571,7 @@ class singleWorker(threading.Thread): requiredPayloadLengthExtraBytes) / shared.networkDefaultPayloadLengthExtraBytes)).arg(unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(time.time()))), 'utf-8'))))) continue + embeddedTime = pack('>Q', (int(time.time()) + random.randrange( -300, 300))) # the current time plus or minus five minutes. We will use this time both for our message and for the ackdata packed within our message. if fromAddressVersionNumber == 2: diff --git a/src/class_sqlThread.py b/src/class_sqlThread.py index 6ac0f168..47e41b42 100644 --- a/src/class_sqlThread.py +++ b/src/class_sqlThread.py @@ -60,11 +60,10 @@ class sqlThread(threading.Thread): self.cur.execute( '''INSERT INTO settings VALUES('lastvacuumtime',?)''', ( int(time.time()),)) self.conn.commit() - print 'Created messages database file' + logger.info('Created messages database file') except Exception as err: if str(err) == 'table inbox already exists': - with shared.printLock: - print 'Database file already exists.' + logger.debug('Database file already exists.') else: sys.stderr.write( @@ -146,13 +145,13 @@ class sqlThread(threading.Thread): self.cur.execute(item, parameters) if self.cur.fetchall() == []: # The settings table doesn't exist. We need to make it. - print 'In messages.dat database, creating new \'settings\' table.' + logger.debug('In messages.dat database, creating new \'settings\' table.') self.cur.execute( '''CREATE TABLE settings (key text, value blob, UNIQUE(key) ON CONFLICT REPLACE)''' ) self.cur.execute( '''INSERT INTO settings VALUES('version','1')''') self.cur.execute( '''INSERT INTO settings VALUES('lastvacuumtime',?)''', ( int(time.time()),)) - print 'In messages.dat database, removing an obsolete field from the pubkeys table.' + logger.debug('In messages.dat database, removing an obsolete field from the pubkeys table.') self.cur.execute( '''CREATE TEMPORARY TABLE pubkeys_backup(hash blob, transmitdata blob, time int, usedpersonally text, UNIQUE(hash) ON CONFLICT REPLACE);''') self.cur.execute( @@ -163,17 +162,17 @@ class sqlThread(threading.Thread): self.cur.execute( '''INSERT INTO pubkeys SELECT hash, transmitdata, time, usedpersonally FROM pubkeys_backup;''') self.cur.execute( '''DROP TABLE pubkeys_backup;''') - print 'Deleting all pubkeys from inventory. They will be redownloaded and then saved with the correct times.' + logger.debug('Deleting all pubkeys from inventory. They will be redownloaded and then saved with the correct times.') self.cur.execute( '''delete from inventory where objecttype = 'pubkey';''') - print 'replacing Bitmessage announcements mailing list with a new one.' + logger.debug('replacing Bitmessage announcements mailing list with a new one.') self.cur.execute( '''delete from subscriptions where address='BM-BbkPSZbzPwpVcYZpU4yHwf9ZPEapN5Zx' ''') self.cur.execute( '''INSERT INTO subscriptions VALUES('Bitmessage new releases/announcements','BM-GtovgYdgs7qXPkoYaRgrLFuFKz1SFpsw',1)''') - print 'Commiting.' + logger.debug('Commiting.') self.conn.commit() - print 'Vacuuming message.dat. You might notice that the file size gets much smaller.' + logger.debug('Vacuuming message.dat. You might notice that the file size gets much smaller.') self.cur.execute( ''' VACUUM ''') # After code refactoring, the possible status values for sent messages @@ -205,6 +204,14 @@ class sqlThread(threading.Thread): item = '''update settings set value=? WHERE key='version';''' parameters = (2,) self.cur.execute(item, parameters) + + if not shared.config.has_option('bitmessagesettings', 'userlocale'): + shared.config.set('bitmessagesettings', 'userlocale', 'system') + if not shared.config.has_option('bitmessagesettings', 'sendoutgoingconnections'): + shared.config.set('bitmessagesettings', 'sendoutgoingconnections', 'True') + + # Are you hoping to add a new option to the keys.dat file of existing + # Bitmessage users? Add it right above this line! try: testpayload = '\x00\x00' @@ -219,11 +226,11 @@ class sqlThread(threading.Thread): self.cur.execute('''DELETE FROM pubkeys WHERE hash='1234' ''') self.conn.commit() if transmitdata == '': - sys.stderr.write('Problem: The version of SQLite you have cannot store Null values. Please download and install the latest revision of your version of Python (for example, the latest Python 2.7 revision) and try again.\n') - sys.stderr.write('PyBitmessage will now exit very abruptly. You may now see threading errors related to this abrupt exit but the problem you need to solve is related to SQLite.\n\n') + logger.fatal('Problem: The version of SQLite you have cannot store Null values. Please download and install the latest revision of your version of Python (for example, the latest Python 2.7 revision) and try again.\n') + logger.fatal('PyBitmessage will now exit very abruptly. You may now see threading errors related to this abrupt exit but the problem you need to solve is related to SQLite.\n\n') os._exit(0) except Exception as err: - print err + logger.error(err) # Let us check to see the last time we vaccumed the messages.dat file. # If it has been more than a month let's do it now. @@ -234,7 +241,7 @@ class sqlThread(threading.Thread): for row in queryreturn: value, = row if int(value) < int(time.time()) - 2592000: - print 'It has been a long time since the messages.dat file has been vacuumed. Vacuuming now...' + logger.info('It has been a long time since the messages.dat file has been vacuumed. Vacuuming now...') self.cur.execute( ''' VACUUM ''') item = '''update settings set value=? WHERE key='lastvacuumtime';''' parameters = (int(time.time()),) @@ -246,13 +253,11 @@ class sqlThread(threading.Thread): self.conn.commit() elif item == 'exit': self.conn.close() - with shared.printLock: - print 'sqlThread exiting gracefully.' + logger.info('sqlThread exiting gracefully.') return elif item == 'movemessagstoprog': - with shared.printLock: - print 'the sqlThread is moving the messages.dat file to the local program directory.' + logger.debug('the sqlThread is moving the messages.dat file to the local program directory.') self.conn.commit() self.conn.close() @@ -262,8 +267,7 @@ class sqlThread(threading.Thread): self.conn.text_factory = str self.cur = self.conn.cursor() elif item == 'movemessagstoappdata': - with shared.printLock: - print 'the sqlThread is moving the messages.dat file to the Appdata folder.' + logger.debug('the sqlThread is moving the messages.dat file to the Appdata folder.') self.conn.commit() self.conn.close() @@ -284,10 +288,8 @@ class sqlThread(threading.Thread): try: self.cur.execute(item, parameters) except Exception as err: - with shared.printLock: - sys.stderr.write('\nMajor error occurred when trying to execute a SQL statement within the sqlThread. Please tell Atheros about this error message or post it in the forum! Error occurred while trying to execute statement: "' + str( - item) + '" Here are the parameters; you might want to censor this data with asterisks (***) as it can contain private information: ' + str(repr(parameters)) + '\nHere is the actual error message thrown by the sqlThread: ' + str(err) + '\n') - sys.stderr.write('This program shall now abruptly exit!\n') + logger.fatal('Major error occurred when trying to execute a SQL statement within the sqlThread. Please tell Atheros about this error message or post it in the forum! Error occurred while trying to execute statement: "%s" Here are the parameters; you might want to censor this data with asterisks (***) as it can contain private information: %s. Here is the actual error message thrown by the sqlThread: %s', str(item), str(repr(parameters)), str(err)) + logger.fatal('This program shall now abruptly exit!') os._exit(0) diff --git a/src/helper_startup.py b/src/helper_startup.py index 256dbcaa..05afcb9c 100644 --- a/src/helper_startup.py +++ b/src/helper_startup.py @@ -2,85 +2,107 @@ import shared import ConfigParser import sys import os +import locale from namecoin import ensureNamecoinOptions storeConfigFilesInSameDirectoryAsProgramByDefault = False # The user may de-select Portable Mode in the settings if they want the config files to stay in the application data folder. def loadConfig(): - # First try to load the config file (the keys.dat file) from the program - # directory - shared.config.read('keys.dat') - try: - shared.config.get('bitmessagesettings', 'settingsversion') - print 'Loading config files from same directory as program' - shared.appdata = '' - except: - # Could not load the keys.dat file in the program directory. Perhaps it - # is in the appdata directory. - shared.appdata = shared.lookupAppdataFolder() - shared.config = ConfigParser.SafeConfigParser() + if shared.appdata: shared.config.read(shared.appdata + 'keys.dat') + #shared.appdata must have been specified as a startup option. try: shared.config.get('bitmessagesettings', 'settingsversion') - print 'Loading existing config files from', shared.appdata + print 'Loading config files from directory specified on startup: ' + shared.appdata + needToCreateKeysFile = False except: - # This appears to be the first time running the program; there is - # no config file (or it cannot be accessed). Create config file. - shared.config.add_section('bitmessagesettings') - shared.config.set('bitmessagesettings', 'settingsversion', '6') - shared.config.set('bitmessagesettings', 'port', '8444') - shared.config.set( - 'bitmessagesettings', 'timeformat', '%%a, %%d %%b %%Y %%I:%%M %%p') - shared.config.set('bitmessagesettings', 'blackwhitelist', 'black') - shared.config.set('bitmessagesettings', 'startonlogon', 'false') - if 'linux' in sys.platform: - shared.config.set( - 'bitmessagesettings', 'minimizetotray', 'false') - # This isn't implimented yet and when True on - # Ubuntu causes Bitmessage to disappear while - # running when minimized. - else: - shared.config.set( - 'bitmessagesettings', 'minimizetotray', 'true') - shared.config.set( - 'bitmessagesettings', 'showtraynotifications', 'true') - shared.config.set('bitmessagesettings', 'startintray', 'false') - shared.config.set('bitmessagesettings', 'socksproxytype', 'none') - shared.config.set( - 'bitmessagesettings', 'sockshostname', 'localhost') - shared.config.set('bitmessagesettings', 'socksport', '9050') - shared.config.set( - 'bitmessagesettings', 'socksauthentication', 'false') - shared.config.set( - 'bitmessagesettings', 'sockslisten', 'false') - shared.config.set('bitmessagesettings', 'socksusername', '') - shared.config.set('bitmessagesettings', 'sockspassword', '') - shared.config.set('bitmessagesettings', 'keysencrypted', 'false') - shared.config.set( - 'bitmessagesettings', 'messagesencrypted', 'false') - shared.config.set('bitmessagesettings', 'defaultnoncetrialsperbyte', str( - shared.networkDefaultProofOfWorkNonceTrialsPerByte)) - shared.config.set('bitmessagesettings', 'defaultpayloadlengthextrabytes', str( - shared.networkDefaultPayloadLengthExtraBytes)) - shared.config.set('bitmessagesettings', 'minimizeonclose', 'false') - shared.config.set( - 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') - shared.config.set( - 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0') - shared.config.set('bitmessagesettings', 'dontconnect', 'true') - ensureNamecoinOptions() + needToCreateKeysFile = True - if storeConfigFilesInSameDirectoryAsProgramByDefault: - # Just use the same directory as the program and forget about - # the appdata folder - shared.appdata = '' - print 'Creating new config files in same directory as program.' - else: - print 'Creating new config files in', shared.appdata - if not os.path.exists(shared.appdata): - os.makedirs(shared.appdata) - if not sys.platform.startswith('win'): - os.umask(0o077) - with open(shared.appdata + 'keys.dat', 'wb') as configfile: - shared.config.write(configfile) + else: + shared.config.read('keys.dat') + try: + shared.config.get('bitmessagesettings', 'settingsversion') + print 'Loading config files from same directory as program.' + needToCreateKeysFile = False + shared.appdata = '' + except: + # Could not load the keys.dat file in the program directory. Perhaps it + # is in the appdata directory. + shared.appdata = shared.lookupAppdataFolder() + shared.config.read(shared.appdata + 'keys.dat') + try: + shared.config.get('bitmessagesettings', 'settingsversion') + print 'Loading existing config files from', shared.appdata + needToCreateKeysFile = False + except: + needToCreateKeysFile = True + + if needToCreateKeysFile: + # This appears to be the first time running the program; there is + # no config file (or it cannot be accessed). Create config file. + shared.config.add_section('bitmessagesettings') + shared.config.set('bitmessagesettings', 'settingsversion', '6') + shared.config.set('bitmessagesettings', 'port', '8444') + shared.config.set( + 'bitmessagesettings', 'timeformat', '%%a, %%d %%b %%Y %%I:%%M %%p') + shared.config.set('bitmessagesettings', 'blackwhitelist', 'black') + shared.config.set('bitmessagesettings', 'startonlogon', 'false') + if 'linux' in sys.platform: + shared.config.set( + 'bitmessagesettings', 'minimizetotray', 'false') + # This isn't implimented yet and when True on + # Ubuntu causes Bitmessage to disappear while + # running when minimized. + else: + shared.config.set( + 'bitmessagesettings', 'minimizetotray', 'true') + shared.config.set( + 'bitmessagesettings', 'showtraynotifications', 'true') + shared.config.set('bitmessagesettings', 'startintray', 'false') + shared.config.set('bitmessagesettings', 'socksproxytype', 'none') + shared.config.set( + 'bitmessagesettings', 'sockshostname', 'localhost') + shared.config.set('bitmessagesettings', 'socksport', '9050') + shared.config.set( + 'bitmessagesettings', 'socksauthentication', 'false') + shared.config.set( + 'bitmessagesettings', 'sockslisten', 'false') + shared.config.set('bitmessagesettings', 'socksusername', '') + shared.config.set('bitmessagesettings', 'sockspassword', '') + shared.config.set('bitmessagesettings', 'keysencrypted', 'false') + shared.config.set( + 'bitmessagesettings', 'messagesencrypted', 'false') + shared.config.set('bitmessagesettings', 'defaultnoncetrialsperbyte', str( + shared.networkDefaultProofOfWorkNonceTrialsPerByte)) + shared.config.set('bitmessagesettings', 'defaultpayloadlengthextrabytes', str( + shared.networkDefaultPayloadLengthExtraBytes)) + shared.config.set('bitmessagesettings', 'minimizeonclose', 'false') + shared.config.set( + 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '0') + shared.config.set( + 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '0') + shared.config.set('bitmessagesettings', 'dontconnect', 'true') + shared.config.set('bitmessagesettings', 'userlocale', 'system') + + # Are you hoping to add a new option to the keys.dat file? You're in + # the right place for adding it to users who install the software for + # the first time. But you must also add it to the keys.dat file of + # existing users. To do that, search the class_sqlThread.py file for the + # text: "right above this line!" + + ensureNamecoinOptions() + + if storeConfigFilesInSameDirectoryAsProgramByDefault: + # Just use the same directory as the program and forget about + # the appdata folder + shared.appdata = '' + print 'Creating new config files in same directory as program.' + else: + print 'Creating new config files in', shared.appdata + if not os.path.exists(shared.appdata): + os.makedirs(shared.appdata) + if not sys.platform.startswith('win'): + os.umask(0o077) + with open(shared.appdata + 'keys.dat', 'wb') as configfile: + shared.config.write(configfile) diff --git a/src/namecoin.py b/src/namecoin.py index 9fbf4518..f9565ccf 100644 --- a/src/namecoin.py +++ b/src/namecoin.py @@ -270,7 +270,7 @@ def ensureNamecoinOptions (): nmc.close () except Exception as exc: - print "Failure reading namecoin config file: %s" % str (exc) + print "Could not read the Namecoin config file probably because you don't have Namecoin installed. That's ok; we don't really need it. Detailed error message: %s" % str (exc) # If still nothing found, set empty at least. if (not hasUser): diff --git a/src/proofofwork.py b/src/proofofwork.py index 946d125a..17a13eb8 100644 --- a/src/proofofwork.py +++ b/src/proofofwork.py @@ -24,7 +24,7 @@ def _set_idle(): def _pool_worker(nonce, initialHash, target, pool_size): _set_idle() - trialValue = 99999999999999999999 + trialValue = float('inf') while trialValue > target: nonce += pool_size trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8]) @@ -32,7 +32,7 @@ def _pool_worker(nonce, initialHash, target, pool_size): def _doSafePoW(target, initialHash): nonce = 0 - trialValue = 99999999999999999999 + trialValue = float('inf') while trialValue > target: nonce += 1 trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8]) diff --git a/src/shared.py b/src/shared.py index 13d57445..a53f7db4 100644 --- a/src/shared.py +++ b/src/shared.py @@ -20,6 +20,7 @@ import sys import stat import threading import time +from os import path, environ # Project imports. from addresses import * @@ -64,6 +65,10 @@ successfullyDecryptMessageTimings = [ apiAddressGeneratorReturnQueue = Queue.Queue( ) # The address generator thread uses this queue to get information back to the API thread. ackdataForWhichImWatching = {} +clientHasReceivedIncomingConnections = False #used by API command clientStatus +numberOfMessagesProcessed = 0 +numberOfBroadcastsProcessed = 0 +numberOfPubkeysProcessed = 0 #If changed, these values will cause particularly unexpected behavior: You won't be able to either send or receive messages because the proof of work you do (or demand) won't match that done or demanded by others. Don't change them! networkDefaultProofOfWorkNonceTrialsPerByte = 320 #The amount of work that should be performed (and demanded) per byte of the payload. Double this number to double the work. @@ -126,7 +131,6 @@ def assembleVersionMessage(remoteHost, remotePort, myStreamNumber): def lookupAppdataFolder(): APPNAME = "PyBitmessage" - from os import path, environ if sys.platform == 'darwin': if "HOME" in environ: dataFolder = path.join(os.environ["HOME"], "Library/Application Support/", APPNAME) + '/' @@ -240,7 +244,7 @@ def reloadMyAddressHashes(): if isEnabled: hasEnabledKeys = True status,addressVersionNumber,streamNumber,hash = decodeAddress(addressInKeysFile) - if addressVersionNumber == 2 or addressVersionNumber == 3: + if addressVersionNumber == 2 or addressVersionNumber == 3 or addressVersionNumber == 4: # Returns a simple 32 bytes of information encoded in 64 Hex characters, # or null if there was an error. privEncryptionKey = decodeWalletImportFormat( @@ -251,7 +255,7 @@ def reloadMyAddressHashes(): myAddressesByHash[hash] = addressInKeysFile else: - logger.error('Error in reloadMyAddressHashes: Can\'t handle address versions other than 2 or 3.\n') + logger.error('Error in reloadMyAddressHashes: Can\'t handle address versions other than 2, 3, or 4.\n') if not keyfileSecure: fixSensitiveFilePermissions(appdata + 'keys.dat', hasEnabledKeys) diff --git a/src/translations/bitmessage_de.pro b/src/translations/bitmessage_de.pro index 7590dca3..1e8fe836 100644 --- a/src/translations/bitmessage_de.pro +++ b/src/translations/bitmessage_de.pro @@ -1,33 +1,33 @@ -SOURCES = ../addresses.py\ - ../bitmessagemain.py\ - ../class_addressGenerator.py\ - ../class_outgoingSynSender.py\ - ../class_receiveDataThread.py\ - ../class_sendDataThread.py\ - ../class_singleCleaner.py\ - ../class_singleListener.py\ - ../class_singleWorker.py\ - ../class_sqlThread.py\ - ../helper_bitcoin.py\ - ../helper_bootstrap.py\ - ../helper_generic.py\ - ../helper_inbox.py\ - ../helper_sent.py\ - ../helper_startup.py\ - ../shared.py - ../bitmessageqt/__init__.py\ - ../bitmessageqt/about.py\ - ../bitmessageqt/bitmessageui.py\ - ../bitmessageqt/connect.py\ - ../bitmessageqt/help.py\ - ../bitmessageqt/iconglossary.py\ - ../bitmessageqt/newaddressdialog.py\ - ../bitmessageqt/newchandialog.py\ - ../bitmessageqt/newsubscriptiondialog.py\ - ../bitmessageqt/regenerateaddresses.py\ - ../bitmessageqt/settings.py\ - ../bitmessageqt/specialaddressbehavior.py - - -TRANSLATIONS = bitmessage_de_DE.ts -CODECFORTR = UTF-8 +SOURCES = ../addresses.py\ + ../bitmessagemain.py\ + ../class_addressGenerator.py\ + ../class_outgoingSynSender.py\ + ../class_receiveDataThread.py\ + ../class_sendDataThread.py\ + ../class_singleCleaner.py\ + ../class_singleListener.py\ + ../class_singleWorker.py\ + ../class_sqlThread.py\ + ../helper_bitcoin.py\ + ../helper_bootstrap.py\ + ../helper_generic.py\ + ../helper_inbox.py\ + ../helper_sent.py\ + ../helper_startup.py\ + ../shared.py\ + ../bitmessageqt/__init__.py\ + ../bitmessageqt/about.py\ + ../bitmessageqt/bitmessageui.py\ + ../bitmessageqt/connect.py\ + ../bitmessageqt/help.py\ + ../bitmessageqt/iconglossary.py\ + ../bitmessageqt/newaddressdialog.py\ + ../bitmessageqt/newchandialog.py\ + ../bitmessageqt/newsubscriptiondialog.py\ + ../bitmessageqt/regenerateaddresses.py\ + ../bitmessageqt/settings.py\ + ../bitmessageqt/specialaddressbehavior.py + + +TRANSLATIONS = bitmessage_de.ts +CODECFORTR = UTF-8 diff --git a/src/translations/bitmessage_de.qm b/src/translations/bitmessage_de.qm index c4dec53e..a81aaaba 100644 Binary files a/src/translations/bitmessage_de.qm and b/src/translations/bitmessage_de.qm differ diff --git a/src/translations/bitmessage_de.ts b/src/translations/bitmessage_de.ts index a7188237..5f57e33a 100644 --- a/src/translations/bitmessage_de.ts +++ b/src/translations/bitmessage_de.ts @@ -1,200 +1,201 @@ - + MainWindow - + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? Eine Ihrer Adressen, %1, ist eine alte Version 1 Adresse. Version 1 Adressen werden nicht mehr unterstützt. Soll sie jetzt gelöscht werden? - + Reply + . Antworten - + Add sender to your Address Book - Absender zum Adressbuch hinzufügen + Absender zum Adressbuch hinzufügen. - + Move to Trash In den Papierkorb verschieben - + View HTML code as formatted text HTML als formatierten Text anzeigen - + Save message as... Nachricht speichern unter... - + New Neu - + Enable Aktivieren - + Disable Deaktivieren - + Copy address to clipboard Adresse in die Zwischenablage kopieren - + Special address behavior... Spezielles Verhalten der Adresse... - + Send message to this address Nachricht an diese Adresse senden - + Subscribe to this address Diese Adresse abonnieren - + Add New Address Neue Adresse hinzufügen - + Delete Löschen - + Copy destination address to clipboard Zieladresse in die Zwischenablage kopieren - + Force send Senden erzwingen - + Add new entry Neuen Eintrag erstellen - + Waiting on their encryption key. Will request it again soon. Warte auf den Verschlüsselungscode. Wird bald erneut angefordert. - + Encryption key request queued. Verschlüsselungscode Anforderung steht aus. - + Queued. In Warteschlange. - + Message sent. Waiting on acknowledgement. Sent at %1 Nachricht gesendet. Warten auf Bestätigung. Gesendet %1 - + Need to do work to send message. Work is queued. Es muss Arbeit verrichtet werden um die Nachricht zu versenden. Arbeit ist in Warteschlange. - + Acknowledgement of the message received %1 Bestätigung der Nachricht erhalten %1 - + Broadcast queued. Rundruf in Warteschlange. - + Broadcast on %1 Rundruf um %1 - + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 Problem: Die vom Empfänger geforderte Arbeit ist schwerer als Sie bereit sind zu berechnen. %1 - + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 Problem: Der Verschlüsselungscode des Empfängers ist nicht in Ordnung. Nachricht konnte nicht verschlüsselt werden. %1 - + Forced difficulty override. Send should start soon. Schwierigkeitslimit überschrieben. Senden sollte bald beginnen. - + Unknown status: %1 %2 Unbekannter Status: %1 %2 - + Since startup on %1 Seit Start der Anwendung am %1 - + Not Connected Nicht verbunden - + Show Bitmessage Bitmessage anzeigen - + Send Senden - + Subscribe Abonnieren - + Address Book Adressbuch - + Quit Schließen - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Sie können Ihre Schlüssel verwalten, indem Sie die keys.dat Datei bearbeiten, die im gleichen Ordner wie das Programm liegt. Es ist wichtig, dass Sie diese Datei sichern. - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. @@ -203,17 +204,17 @@ It is important that you back up this file. Es ist wichtig, dass Sie diese Datei sichern. - + Open keys.dat? Datei keys.dat öffnen? - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) Sie können Ihre Schlüssel verwalten, indem Sie die keys.dat Datei bearbeiten, die im gleichen Ordner wie das Programm liegt. Es ist wichtig, dass Sie diese Datei sichern. Möchten Sie die Datei jetzt öffnen? (Stellen Sie sicher, dass Bitmessage geschlossen ist, bevor Sie etwas ändern.) - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) @@ -223,192 +224,192 @@ Es ist wichtig, dass Sie diese Datei sichern. Möchten Sie die datei jetzt öffn (Stellen Sie sicher, dass Bitmessage geschlossen ist, bevor Sie etwas ändern.) - + Delete trash? Papierkorb leeren? - + Are you sure you want to delete all trashed messages? Sind Sie sicher, dass Sie alle Nachrichten im Papierkorb löschen möchten? - + bad passphrase Falscher Passwort-Satz - + You must type your passphrase. If you don't have one then this is not the form for you. Sie müssen Ihren Passwort-Satz eingeben. Wenn Sie keinen haben, ist dies das falsche Formular für Sie. - + Processed %1 person-to-person messages. %1 Person-zu-Person-Nachrichten bearbeitet. - + Processed %1 broadcast messages. %1 Rundruf-Nachrichten bearbeitet. - + Processed %1 public keys. %1 öffentliche Schlüssel bearbeitet. - + Total Connections: %1 Verbindungen insgesamt: %1 - + Connection lost Verbindung verloren - + Connected Verbunden - + Message trashed Nachricht in den Papierkorb verschoben - + Error: Bitmessage addresses start with BM- Please check %1 Fehler: Bitmessage Adressen starten mit BM- Bitte überprüfen Sie %1 - + Error: The address %1 is not typed or copied correctly. Please check it. Fehler: Die Adresse %1 wurde nicht korrekt getippt oder kopiert. Bitte überprüfen. - + Error: The address %1 contains invalid characters. Please check it. Fehler: Die Adresse %1 beinhaltet ungültig Zeichen. Bitte überprüfen. - + Error: The address version in %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. Fehler: Die Adressversion von %1 ist zu hoch. Entweder Sie müssen Ihre Bitmessage Software aktualisieren oder Ihr Bekannter ist sehr clever. - + Error: Some data encoded in the address %1 is too short. There might be something wrong with the software of your acquaintance. Fehler: Einige Daten die in der Adresse %1 codiert sind, sind zu kurz. Es könnte sein, dass etwas mit der Software Ihres Bekannten nicht stimmt. - + Error: Some data encoded in the address %1 is too long. There might be something wrong with the software of your acquaintance. Fehler: Einige Daten die in der Adresse %1 codiert sind, sind zu lang. Es könnte sein, dass etwas mit der Software Ihres Bekannten nicht stimmt. - + Error: Something is wrong with the address %1. Fehler: Mit der Adresse %1 stimmt etwas nicht. - + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. Fehler: Sie müssen eine Absenderadresse auswählen. Sollten Sie keine haben, wechseln Sie zum Reiter "Ihre Identitäten". - + Sending to your address Sende zu Ihrer Adresse - + Error: One of the addresses to which you are sending a message, %1, is yours. Unfortunately the Bitmessage client cannot process its own messages. Please try running a second client on a different computer or within a VM. Fehler: Eine der Adressen an die Sie eine Nachricht schreiben (%1) ist Ihre. Leider kann die Bitmessage Software ihre eigenen Nachrichten nicht verarbeiten. Bitte verwenden Sie einen zweite Installation auf einem anderen Computer oder in einer VM. - + Address version number Adressversion - + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. Bezüglich der Adresse %1, Bitmessage kann Adressen mit der Version %2 nicht verarbeiten. Möglicherweise müssen Sie Bitmessage auf die aktuelle Version aktualisieren. - + Stream number Datenstrom Nummer - + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. Bezüglich der Adresse %1, Bitmessage kann den Datenstrom mit der Version %2 nicht verarbeiten. Möglicherweise müssen Sie Bitmessage auf die aktuelle Version aktualisieren. - + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. Warnung: Sie sind aktuell nicht verbunden. Bitmessage wird die nötige Arbeit zum versenden verrichten, aber erst senden, wenn Sie verbunden sind. - + Your 'To' field is empty. Ihr "Empfänger"-Feld ist leer. - + Work is queued. Arbeit in Warteschlange. - + Right click one or more entries in your address book and select 'Send message to this address'. Klicken Sie mit rechts auf eine oder mehrere Einträge aus Ihrem Adressbuch und wählen Sie "Nachricht an diese Adresse senden". - + Work is queued. %1 Arbeit in Warteschlange. %1 - + New Message Neue Nachricht - + From Von - + Address is valid. Adresse ist gültig. - + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. Fehler: Sie können eine Adresse nicht doppelt im Adressbuch speichern. Wenn Sie möchten, benennen Sie den existierenden Eintrag um. - + The address you entered was invalid. Ignoring it. Die von Ihnen eingegebene Adresse ist ungültig, sie wird ignoriert. - + Error: You cannot add the same address to your subsciptions twice. Perhaps rename the existing one if you want. Fehler: Sie können eine Adresse nicht doppelt abonnieren. Wenn Sie möchten, benennen Sie den existierenden Eintrag um. - + Restart Neustart - + You must restart Bitmessage for the port number change to take effect. Sie müssen Bitmessage neu starten, um den geänderten Port zu verwenden. @@ -418,173 +419,173 @@ Es ist wichtig, dass Sie diese Datei sichern. Möchten Sie die datei jetzt öffn Bitmessage wird den Proxy-Server ab jetzt verwenden, möglicherweise möchten Sie Bitmessage neu starten um bestehende Verbindungen zu schließen. - + Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want. Fehler: Sie können eine Adresse nicht doppelt zur Liste hinzufügen. Wenn Sie möchten, benennen Sie den existierenden Eintrag um. - + Passphrase mismatch Kennwortsatz nicht identisch - + The passphrase you entered twice doesn't match. Try again. Die von Ihnen eingegebenen Kennwortsätze sind nicht identisch. Bitte neu versuchen. - + Choose a passphrase Wählen Sie einen Kennwortsatz - + You really do need a passphrase. Sie benötigen wirklich einen Kennwortsatz. - + All done. Closing user interface... Alles fertig. Benutzer interface wird geschlossen... - + Address is gone Adresse ist verloren - + Bitmessage cannot find your address %1. Perhaps you removed it? Bitmassage kann Ihre Adresse %1 nicht finden. Haben Sie sie gelöscht? - + Address disabled Adresse deaktiviert - + Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it. Fehler: Die Adresse von der Sie versuchen zu senden ist deaktiviert. Sie müssen sie unter dem Reiter "Ihre Identitäten" aktivieren bevor Sie fortfahren. - + Entry added to the Address Book. Edit the label to your liking. Eintrag dem Adressbuch hinzugefügt. Editieren Sie den Eintrag nach Belieben. - + Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back. Objekt in den Papierkorb verschoben. Es gibt kein Benutzerinterface für den Papierkorb, aber die Daten sind noch auf Ihrer Festplatte wenn Sie sie wirklich benötigen. - + Save As... Speichern unter... - + Write error. Fehler beim speichern. - + No addresses selected. Keine Adresse ausgewählt. - + Options have been disabled because they either aren't applicable or because they haven't yet been implemented for your operating system. Optionen wurden deaktiviert, da sie für Ihr Betriebssystem nicht relevant, oder noch nicht implementiert sind. - + The address should start with ''BM-'' Die Adresse sollte mit "BM-" beginnen - + The address is not typed or copied correctly (the checksum failed). Die Adresse wurde nicht korrekt getippt oder kopiert (Prüfsumme falsch). - + The version number of this address is higher than this software can support. Please upgrade Bitmessage. Die Versionsnummer dieser Adresse ist höher als diese Software unterstützt. Bitte installieren Sie die neuste Bitmessage Version. - + The address contains invalid characters. Diese Adresse beinhaltet ungültige Zeichen. - + Some data encoded in the address is too short. Die in der Adresse codierten Daten sind zu kurz. - + Some data encoded in the address is too long. Die in der Adresse codierten Daten sind zu lang. - + You are using TCP port %1. (This can be changed in the settings). Sie benutzen TCP-Port %1 (Dieser kann in den Einstellungen verändert werden). - + Bitmessage Bitmessage - + To An - + From Von - + Subject Betreff - + Received Erhalten - + Inbox Posteingang - + Load from Address book Aus Adressbuch wählen - + Message: Nachricht: - + Subject: Betreff: - + Send to one or more specific people Nachricht an eine oder mehrere spezifische Personen - + <!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; } @@ -597,277 +598,277 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + To: An: - + From: Von: - + Broadcast to everyone who is subscribed to your address Rundruf an jeden, der Ihre Adresse abonniert hat - + Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them. Beachten Sie, dass Rudrufe nur mit Ihrer Adresse verschlüsselt werden. Jeder, der Ihre Adresse kennt, kann diese Nachrichten lesen. - + Status Status - + Sent Gesendet - + Label (not shown to anyone) Bezeichnung (wird niemandem gezeigt) - + Address Adresse - + Stream Datenstrom - + Your Identities Ihre Identitäten - + Here you can subscribe to 'broadcast messages' that are sent by other users. Messages will appear in your Inbox. Addresses here override those on the Blacklist tab. Hier können Sie "Rundruf Nachrichten" abonnieren, die von anderen Benutzern versendet werden. Die Nachrichten tauchen in Ihrem Posteingang auf. (Die Adressen hier überschreiben die auf der Blacklist). - + Add new Subscription Neues Abonnement anlegen - + Label Bezeichnung - + Subscriptions Abonnements - + The Address book is useful for adding names or labels to other people's Bitmessage addresses so that you can recognize them more easily in your inbox. You can add entries here using the 'Add' button, or from your inbox by right-clicking on a message. Das Adressbuch ist nützlich um die Bitmessage-Adressen anderer Personen Namen oder Beschreibungen zuzuordnen, so dass Sie sie einfacher im Posteingang erkennen können. Sie können Adressen über "Hinzufügen" eintragen, oder über einen Rechtsklick auf eine Nachricht im Posteingang. - + Name or Label Name oder Bezeichnung - + Use a Blacklist (Allow all incoming messages except those on the Blacklist) Liste als Blacklist verwenden (Erlaubt alle eingehenden Nachrichten, außer von Adressen auf der Blacklist) - + Use a Whitelist (Block all incoming messages except those on the Whitelist) Liste als Whitelist verwenden (Erlaubt keine eingehenden Nachrichten, außer von Adressen auf der Whitelist) - + Blacklist Blacklist - + Stream # Datenstrom # - + Connections Verbindungen - + Total connections: 0 Verbindungen insgesamt: 0 - + Since startup at asdf: Seit start um asdf: - + Processed 0 person-to-person message. 0 Person-zu-Person-Nachrichten verarbeitet. - + Processed 0 public key. 0 öffentliche Schlüssel verarbeitet. - + Processed 0 broadcast. 0 Rundrufe verarbeitet. - + Network Status Netzwerk status - + File Datei - + Settings Einstellungen - + Help Hilfe - + Import keys Schlüssel importieren - + Manage keys Schlüssel verwalten - + About Über - + Regenerate deterministic addresses Deterministische Adressen neu generieren - + Delete all trashed messages Alle Nachrichten im Papierkorb löschen - + Message sent. Sent at %1 Nachricht gesendet. gesendet am %1 - + Chan name needed Chan name benötigt - + You didn't enter a chan name. Sie haben keinen Chan-Namen eingegeben. - + Address already present Adresse bereits vorhanden - + Could not add chan because it appears to already be one of your identities. Chan konnte nicht erstellt werden, da es sich bereits um eine Ihrer Identitäten handelt. - + Success Erfolgreich - + Successfully created chan. To let others join your chan, give them the chan name and this Bitmessage address: %1. This address also appears in 'Your Identities'. Chan erfolgreich erstellt. Um andere diesem Chan beitreten zu lassen, geben Sie ihnen den Chan-Namen und die Bitmessage-Adresse: %1. Diese Adresse befindet sich auch unter "Ihre Identitäten". - + Address too new Adresse zu neu - + Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage. Obwohl diese Bitmessage-Adresse gültig ist, ist ihre Versionsnummer zu hoch um verarbeitet zu werden. Vermutlich müssen Sie eine neuere Version von Bitmessage installieren. - + Address invalid Adresse ungültig - + That Bitmessage address is not valid. Diese Bitmessage-Adresse ist nicht gültig. - + Address does not match chan name Adresse stimmt nicht mit dem Chan-Namen überein - + Although the Bitmessage address you entered was valid, it doesn't match the chan name. Obwohl die Bitmessage-Adresse die Sie eingegeben haben gültig ist, stimmt diese nicht mit dem Chan-Namen überein. - + Successfully joined chan. Chan erfolgreich beigetreten. - + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). Bitmessage wird ab sofort den Proxy-Server verwenden, aber eventuell möchten Sie Bitmessage neu starten um bereits bestehende Verbindungen zu schließen. - + This is a chan address. You cannot use it as a pseudo-mailing list. Dies ist eine Chan-Adresse. Sie können sie nicht als Pseudo-Mailingliste verwenden. - + Search Suchen - + All Alle - + Message Nachricht - + Join / Create chan Chan beitreten / erstellen @@ -897,32 +898,32 @@ p, li { white-space: pre-wrap; } Anfrag für den Verschlüsselungscode gesendet. Warte auf Antwort. Angefragt am %1 - + Mark Unread Als ungelesen markieren - + Fetched address from namecoin identity. Adresse aus Namecoin Identität geholt. - + Testing... teste... - + Fetch Namecoin ID Hole Namecoin ID - + Ctrl+Q - Strg+Q + Strg+Q - + F1 F1 @@ -930,99 +931,99 @@ p, li { white-space: pre-wrap; } NewAddressDialog - + Create new Address Neue Adresse erstellen - + Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged. You may generate addresses by using either random numbers or by using a passphrase. If you use a passphrase, the address is called a "deterministic" address. The 'Random Number' option is selected by default but deterministic addresses have several pros and cons: Sie können so viele Adressen generieren wie Sie möchten. Es ist sogar empfohlen neue Adressen zu verwenden und alte fallen zu lassen. Sie können Adressen durch Zufallszahlen erstellen lassen, oder unter Verwendung eines Kennwortsatzes. Wenn Sie einen Kennwortsatz verwenden, nennt man dies eine "deterministische" Adresse. Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen einige Vor- und Nachteile: - + <html><head/><body><p><span style=" font-weight:600;">Pros:<br/></span>You can recreate your addresses on any computer from memory. <br/>You need-not worry about backing up your keys.dat file as long as you can remember your passphrase. <br/><span style=" font-weight:600;">Cons:<br/></span>You must remember (or write down) your passphrase if you expect to be able to recreate your keys if they are lost. <br/>You must remember the address version number and the stream number along with your passphrase. <br/>If you choose a weak passphrase and someone on the Internet can brute-force it, they can read your messages and send messages as you.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Vorteile:<br/></span>Sie können ihre Adresse an jedem Computer aus dem Gedächtnis regenerieren. <br/>Sie brauchen sich keine Sorgen um das Sichern ihrer Schlüssel machen solange Sie sich den Kennwortsatz merken. <br/><span style=" font-weight:600;">Nachteile:<br/></span>Sie müssen sich den Kennowrtsatz merken (oder aufschreiben) wenn Sie in der Lage sein wollen ihre Schlüssel wiederherzustellen. <br/>Sie müssen sich die Adressversion und die Datenstrom Nummer zusammen mit dem Kennwortsatz merken. <br/>Wenn Sie einen schwachen Kennwortsatz wählen und jemand kann ihn erraten oder durch ausprobieren herausbekommen, kann dieser Ihre Nachrichten lesen, oder in ihrem Namen Nachrichten senden..</p></body></html> - + Use a random number generator to make an address Lassen Sie eine Adresse mittels Zufallsgenerator erstellen - + Use a passphrase to make addresses Benutzen Sie einen Kennwortsatz um eine Adresse erstellen zu lassen - + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter Verwenden Sie einige Minuten extra Rechenleistung um die Adresse(n) ein bis zwei Zeichen kürzer zu machen - + Make deterministic addresses Deterministische Adresse erzeugen - + Address version number: 3 Adress-Versionsnummer: 3 - + In addition to your passphrase, you must remember these numbers: Zusätzlich zu Ihrem Kennwortsatz müssen Sie sich diese Zahlen merken: - + Passphrase Kennwortsatz - + Number of addresses to make based on your passphrase: Anzahl Adressen die basierend auf diesem Kennwortsatz erzeugt werden sollen: - + Stream number: 1 Datenstrom Nummer: 1 - + Retype passphrase Kennwortsatz erneut eingeben - + Randomly generate address Zufällig generierte Adresse - + Label (not shown to anyone except you) Bezeichnung (Wird niemandem außer Ihnen gezeigt) - + Use the most available stream Verwendung des am besten verfügbaren Datenstroms - + (best if this is the first of many addresses you will create) (zum generieren der erste Adresse empfohlen) - + Use the same stream as an existing address Verwendung des gleichen Datenstroms wie eine bestehende Adresse - + (saves you some bandwidth and processing power) (Dies erspart Ihnen etwas an Bandbreite und Rechenleistung) @@ -1030,17 +1031,17 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei NewSubscriptionDialog - + Add new entry Neuen Eintrag erstellen - + Label Name oder Bezeichnung - + Address Adresse @@ -1048,27 +1049,27 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei SpecialAddressBehaviorDialog - + Special Address Behavior Spezielles Adressverhalten - + Behave as a normal address Wie eine normale Adresse verhalten - + Behave as a pseudo-mailing-list address Wie eine Pseudo-Mailinglistenadresse verhalten - + Mail received to a pseudo-mailing-list address will be automatically broadcast to subscribers (and thus will be public). Nachrichten an eine Pseudo-Mailinglistenadresse werden automatisch zu allen Abbonenten weitergeleitet (Der Inhalt ist dann öffentlich). - + Name of the pseudo-mailing-list: Name der Pseudo-Mailingliste: @@ -1076,32 +1077,32 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei aboutDialog - + About Über - + PyBitmessage PyBitmessage - + version ? Version ? - + Copyright © 2013 Jonathan Warren Copyright © 2013 Jonathan Warren - + <html><head/><body><p>Distributed under the MIT/X11 software license; see <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html> <html><head/><body><p>Veröffentlicht unter der MIT/X11 Software-Lizenz; see <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html> - + This is Beta software. Diese ist Beta-Software. @@ -1109,22 +1110,22 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei connectDialog - + Bitmessage Internetverbindung - + Bitmessage won't connect to anyone until you let it. Bitmessage wird sich nicht verbinden, wenn Sie es nicht möchten. - + Connect now Jetzt verbinden - + Let me configure special network settings first Zunächst spezielle Nertzwerkeinstellungen vornehmen @@ -1132,17 +1133,17 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei helpDialog - + Help Hilfe - + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> - + As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: Bei Bitmessage handelt es sich um ein kollaboratives Projekt, Hilfe finden Sie online in Bitmessage-Wiki: @@ -1150,27 +1151,27 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei iconGlossaryDialog - + Icon Glossary Icon Glossar - + You have no connections with other peers. Sie haben keine Verbindung mit anderen Netzwerkteilnehmern. - + You have made at least one connection to a peer using an outgoing connection but you have not yet received any incoming connections. Your firewall or home router probably isn't configured to forward incoming TCP connections to your computer. Bitmessage will work just fine but it would help the Bitmessage network if you allowed for incoming connections and will help you be a better-connected node. Sie haben mindestes eine Verbindung mit einem Netzwerkteilnehmer über eine ausgehende Verbindung, aber Sie haben noch keine eingehende Verbindung. Ihre Firewall oder Router ist vermutlich nicht richtig konfiguriert um eingehende TCP-Verbindungen an Ihren Computer weiterzuleiten. Bittmessage wird gut funktionieren, jedoch helfen Sie dem Netzwerk, wenn Sie eingehende Verbindungen erlauben. Es hilft auch Ihnen schneller und mehr Verbindungen ins Netzwerk aufzubauen. - + You are using TCP port ?. (This can be changed in the settings). Sie benutzen TCP-Port ?. (Dies kann in den Einstellungen verändert werden). - + You do have connections with other peers and your firewall is correctly configured. Sie haben Verbindungen mit anderen Netzwerkteilnehmern und Ihre Firewall ist richtig konfiguriert. @@ -1178,42 +1179,42 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei newChanDialog - + Dialog Chan beitreten / erstellen - + Create a new chan Neuen Chan erstellen - + Join a chan Einem Chan beitreten - + Create a chan Chan erstellen - + Chan name: Chan-Name: - + <html><head/><body><p>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></body></html> <html><head/><body><p>Ein Chan existiert, wenn eine Gruppe von Leuten sich den gleichen Entschlüsselungscode teilen. Die Schlüssel und Bitmessage-Adressen werden basierend auf einem lesbaren Wort oder Satz generiert (Dem Chan-Namen). Um eine Nachricht an den Chan zu senden, senden Sie eine normale Person-zu-Person-Nachricht an die Chan-Adresse.</p><p>Chans sind experimentell and völlig unmoderierbar.</p><br></body></html> - + Chan bitmessage address: Chan-Bitmessage-Adresse: - + <html><head/><body><p>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html> <html><head/><body><p>Geben Sie einen Namen für Ihren Chan ein. Wenn Sie einen ausreichend komplexen Chan-Namen wählen (Wie einen starkes und einzigartigen Kennwortsatz) und keiner Ihrer Freunde ihn öffentlich weitergibt, wird der Chan sicher und privat bleiben. Wenn eine andere Person einen Chan mit dem gleichen Namen erzeugt, werden diese zu einem Chan.</p><br></body></html> @@ -1221,57 +1222,57 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei regenerateAddressesDialog - + Regenerate Existing Addresses Bestehende Adresse regenerieren - + Regenerate existing addresses Bestehende Adresse regenerieren - + Passphrase Kennwortsatz - + Number of addresses to make based on your passphrase: Anzahl der Adressen die basierend auf diesem Kennwortsatz erzeugt werden sollen: - + Address version Number: Adress-Versionsnummer: - + 3 3 - + Stream number: Stream Nummer: - + 1 1 - + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter Verwenden Sie einige Minuten extra Rechenleistung um die Adresse(n) ein bis zwei Zeichen kürzer zu machen - + You must check (or not check) this box just like you did (or didn't) when you made your addresses the first time. Sie müssen diese Option auswählen (oder nicht auswählen) wie Sie es gemacht haben, als Sie Ihre Adresse das erste mal erstellt haben. - + If you have previously made deterministic addresses but lost them due to an accident (like hard drive failure), you can regenerate them here. If you used the random number generator to make your addresses then this form will be of no use to you. Wenn Sie bereits deterministische Adressen erstellt haben, aber diese durch einen Unfall wie eine defekte Festplatte verloren haben, können Sie sie hier regenerieren. Wenn Sie den Zufallsgenerator verwendet haben um Ihre Adressen erstmals zu erstellen, kann dieses Formular Ihnen nicht helfen. @@ -1279,209 +1280,214 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei settingsDialog - + Settings Einstellungen - + Start Bitmessage on user login Bitmessage nach dem Hochfahren automatisch starten - + Start Bitmessage in the tray (don't show main window) Bitmessage minimiert starten (Zeigt das Hauptfenster nicht an) - + Minimize to tray In den Systemtray minimieren - + Show notification when message received Benachrichtigung anzeigen, wenn eine Nachricht eintrifft - + Run in Portable Mode In portablem Modus arbeiten - + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. Im portablen Modus werden Nachrichten und Konfigurationen im gleichen Ordner abgelegt, wie sich das Programm selbst befindet anstelle im normalen Anwendungsdaten-Ordner. Das macht es möglich Bitmessage auf einem USB-Stick zu betreiben. - + User Interface Benutzerinterface - + Listening port TCP-Port - + Listen for connections on port: Wartet auf Verbindungen auf Port: - + Proxy server / Tor Proxy-Server / Tor - + Type: Typ: - + none keiner - + SOCKS4a SOCKS4a - + SOCKS5 SOCKS5 - + Server hostname: Servername: - + Port: Port: - + Authentication Authentifizierung - + Username: Benutzername: - + Pass: Kennwort: - + Network Settings Netzwerkeinstellungen - + When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. Wenn jemand Ihnen eine Nachricht schickt, muss der absendende Computer erst einige Arbeit verrichten. Die Schwierigkeit dieser Arbeit ist standardmäßig 1. Sie können diesen Wert für alle neuen Adressen, die Sie generieren hier ändern. Es gibt eine Ausnahme: Wenn Sie einen Freund oder Bekannten in Ihr Adressbuch übernehmen, wird Bitmessage ihn mit der nächsten Nachricht automatisch informieren, dass er nur noch die minimale Arbeit verrichten muss: Schwierigkeit 1. - + Total difficulty: Gesamtschwierigkeit: - + Small message difficulty: Schwierigkeit für kurze Nachrichten: - + The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages. Die "Schwierigkeit für kurze Nachrichten" trifft nur auf das senden kurzen Nachrichten zu. Verdoppelung des Wertes macht es fast doppelt so schwer kurze Nachrichten zu senden, aber hat keinen Effekt bei langen Nachrichten. - + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. Die "Gesammtschwierigkeit" beeinflusst die absolute menge Arbeit die ein Sender verrichten muss. Verdoppelung dieses Wertes verdoppelt die Menge der Arbeit. - + Demanded difficulty Geforderte Schwierigkeit - + Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable. hier setzen Sie die maximale Arbeit die Sie bereit sind zu verrichten um eine Nachricht an eine andere Person zu verwenden. Ein Wert von 0 bedeutet, dass Sie jede Arbeit akzeptieren. - + Maximum acceptable total difficulty: Maximale akzeptierte Gesammtschwierigkeit: - + Maximum acceptable small message difficulty: Maximale akzeptierte Schwierigkeit für kurze Nachrichten: - + Max acceptable difficulty Maximale akzeptierte Schwierigkeit - + Listen for incoming connections when using proxy Auf eingehende Verdindungen warten, auch wenn eine Proxy-Server verwendet wird - + Willingly include unencrypted destination address when sending to a mobile device Willentlich die unverschlüsselte Adresse des Empfängers übertragen, wenn an ein mobiles Gerät gesendet wird - + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> <html><head/><body><p>Bitmessage kann ein anderes Bitcoin basiertes Programm namens Namecoin nutzen um Adressen leserlicher zu machen. Zum Beispiel: Anstelle Ihrem Bekannten Ihre lange Bitmessage-Adresse vorzulesen, können Sie ihm einfach sagen, er soll eine Nachricht an <span style=" font-style:italic;">test </span>senden.</p><p> (Ihre Bitmessage-Adresse in Namecoin zu speichern ist noch sehr umständlich)</p><p>Bitmessage kann direkt namecoind verwenden, oder eine nmcontrol Instanz.</p></body></html> - + Host: Server: - + Password: Kennwort: - + Test Verbindung testen - + Connect to: Verbinde mit: - + Namecoind Namecoind - + NMControl NMControl - + Namecoin integration Namecoin Integration + + + Override automatic language localization (use countycode or language code, e.g. 'en_US' or 'en'): + + diff --git a/src/translations/bitmessage_en_pirate.pro b/src/translations/bitmessage_en_pirate.pro new file mode 100644 index 00000000..5b7f27e4 --- /dev/null +++ b/src/translations/bitmessage_en_pirate.pro @@ -0,0 +1,33 @@ +SOURCES = ../addresses.py\ + ../bitmessagemain.py\ + ../class_addressGenerator.py\ + ../class_outgoingSynSender.py\ + ../class_receiveDataThread.py\ + ../class_sendDataThread.py\ + ../class_singleCleaner.py\ + ../class_singleListener.py\ + ../class_singleWorker.py\ + ../class_sqlThread.py\ + ../helper_bitcoin.py\ + ../helper_bootstrap.py\ + ../helper_generic.py\ + ../helper_inbox.py\ + ../helper_sent.py\ + ../helper_startup.py\ + ../shared.py\ + ../bitmessageqt/__init__.py\ + ../bitmessageqt/about.py\ + ../bitmessageqt/bitmessageui.py\ + ../bitmessageqt/connect.py\ + ../bitmessageqt/help.py\ + ../bitmessageqt/iconglossary.py\ + ../bitmessageqt/newaddressdialog.py\ + ../bitmessageqt/newchandialog.py\ + ../bitmessageqt/newsubscriptiondialog.py\ + ../bitmessageqt/regenerateaddresses.py\ + ../bitmessageqt/settings.py\ + ../bitmessageqt/specialaddressbehavior.py + + +TRANSLATIONS = bitmessage_en_pirate.ts +CODECFORTR = UTF-8 diff --git a/src/translations/bitmessage_en_pirate.qm b/src/translations/bitmessage_en_pirate.qm new file mode 100644 index 00000000..24feb4b9 Binary files /dev/null and b/src/translations/bitmessage_en_pirate.qm differ diff --git a/src/translations/bitmessage_en_pirate.ts b/src/translations/bitmessage_en_pirate.ts new file mode 100644 index 00000000..496b7d64 --- /dev/null +++ b/src/translations/bitmessage_en_pirate.ts @@ -0,0 +1,1463 @@ + + + + + MainWindow + + + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? + + + + + Reply + . + + + + + Add sender to your Address Book + + + + + Move to Trash + + + + + View HTML code as formatted text + + + + + Save message as... + + + + + Mark Unread + + + + + New + + + + + Enable + + + + + Disable + + + + + Copy address to clipboard + + + + + Special address behavior... + + + + + Send message to this address + + + + + Subscribe to this address + + + + + Add New Address + + + + + Delete + + + + + Copy destination address to clipboard + + + + + Force send + + + + + Add new entry + Add yee new entry + + + + Since startup on %1 + + + + + Waiting on their encryption key. Will request it again soon. + + + + + Encryption key request queued. + + + + + Queued. + + + + + Message sent. Waiting on acknowledgement. Sent at %1 + + + + + Message sent. Sent at %1 + + + + + Need to do work to send message. Work is queued. + + + + + Acknowledgement of the message received %1 + + + + + Broadcast queued. + + + + + Broadcast on %1 + + + + + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 + + + + + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 + + + + + Forced difficulty override. Send should start soon. + + + + + Unknown status: %1 %2 + + + + + Not Connected + + + + + Show Bitmessage + + + + + Send + + + + + Subscribe + + + + + Address Book + + + + + Quit + + + + + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. + + + + + You may manage your keys by editing the keys.dat file stored in + %1 +It is important that you back up this file. + + + + + Open keys.dat? + + + + + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) + + + + + You may manage your keys by editing the keys.dat file stored in + %1 +It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) + + + + + Delete trash? + + + + + Are you sure you want to delete all trashed messages? + + + + + bad passphrase + + + + + You must type your passphrase. If you don't have one then this is not the form for you. + + + + + Chan name needed + + + + + You didn't enter a chan name. + + + + + Address already present + + + + + Could not add chan because it appears to already be one of your identities. + + + + + Success + + + + + Successfully created chan. To let others join your chan, give them the chan name and this Bitmessage address: %1. This address also appears in 'Your Identities'. + + + + + Address too new + + + + + Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage. + + + + + Address invalid + + + + + That Bitmessage address is not valid. + + + + + Address does not match chan name + + + + + Although the Bitmessage address you entered was valid, it doesn't match the chan name. + + + + + Successfully joined chan. + + + + + Processed %1 person-to-person messages. + + + + + Processed %1 broadcast messages. + + + + + Processed %1 public keys. + + + + + Total Connections: %1 + + + + + Connection lost + + + + + Connected + + + + + Message trashed + + + + + Error: Bitmessage addresses start with BM- Please check %1 + + + + + Error: The address %1 is not typed or copied correctly. Please check it. + + + + + Error: The address %1 contains invalid characters. Please check it. + + + + + Error: The address version in %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. + + + + + Error: Some data encoded in the address %1 is too short. There might be something wrong with the software of your acquaintance. + + + + + Error: Some data encoded in the address %1 is too long. There might be something wrong with the software of your acquaintance. + + + + + Error: Something is wrong with the address %1. + + + + + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. + + + + + Sending to your address + + + + + Error: One of the addresses to which you are sending a message, %1, is yours. Unfortunately the Bitmessage client cannot process its own messages. Please try running a second client on a different computer or within a VM. + + + + + Address version number + + + + + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. + + + + + Stream number + + + + + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. + + + + + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. + + + + + Your 'To' field is empty. + + + + + Work is queued. + + + + + Right click one or more entries in your address book and select 'Send message to this address'. + + + + + Fetched address from namecoin identity. + + + + + Work is queued. %1 + + + + + New Message + + + + + From + + + + + Address is valid. + + + + + The address you entered was invalid. Ignoring it. + + + + + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. + + + + + Error: You cannot add the same address to your subsciptions twice. Perhaps rename the existing one if you want. + + + + + Restart + + + + + You must restart Bitmessage for the port number change to take effect. + + + + + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). + + + + + Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want. + + + + + Passphrase mismatch + + + + + The passphrase you entered twice doesn't match. Try again. + + + + + Choose a passphrase + + + + + You really do need a passphrase. + + + + + All done. Closing user interface... + + + + + Address is gone + + + + + Bitmessage cannot find your address %1. Perhaps you removed it? + + + + + Address disabled + + + + + Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it. + + + + + Entry added to the Address Book. Edit the label to your liking. + + + + + Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back. + + + + + Save As... + + + + + Write error. + + + + + No addresses selected. + + + + + Options have been disabled because they either aren't applicable or because they haven't yet been implemented for your operating system. + + + + + Testing... + + + + + This is a chan address. You cannot use it as a pseudo-mailing list. + + + + + The address should start with ''BM-'' + + + + + The address is not typed or copied correctly (the checksum failed). + + + + + The version number of this address is higher than this software can support. Please upgrade Bitmessage. + + + + + The address contains invalid characters. + + + + + Some data encoded in the address is too short. + + + + + Some data encoded in the address is too long. + + + + + You are using TCP port %1. (This can be changed in the settings). + + + + + Bitmessage + + + + + Search + + + + + All + + + + + To + + + + + From + + + + + Subject + + + + + Message + + + + + Received + + + + + Inbox + + + + + Load from Address book + + + + + Fetch Namecoin ID + + + + + Message: + + + + + Subject: + + + + + Send to one or more specific people + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + To: + + + + + From: + + + + + Broadcast to everyone who is subscribed to your address + + + + + Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them. + + + + + Status + + + + + Sent + + + + + Label (not shown to anyone) + + + + + Address + Address + + + + Stream + + + + + Your Identities + + + + + Here you can subscribe to 'broadcast messages' that are sent by other users. Messages will appear in your Inbox. Addresses here override those on the Blacklist tab. + + + + + Add new Subscription + + + + + Label + Label + + + + Subscriptions + + + + + The Address book is useful for adding names or labels to other people's Bitmessage addresses so that you can recognize them more easily in your inbox. You can add entries here using the 'Add' button, or from your inbox by right-clicking on a message. + + + + + Name or Label + + + + + Use a Blacklist (Allow all incoming messages except those on the Blacklist) + + + + + Use a Whitelist (Block all incoming messages except those on the Whitelist) + + + + + Blacklist + + + + + Stream # + + + + + Connections + + + + + Total connections: 0 + + + + + Since startup at asdf: + + + + + Processed 0 person-to-person message. + + + + + Processed 0 public key. + + + + + Processed 0 broadcast. + + + + + Network Status + + + + + File + + + + + Settings + Settings + + + + Help + Help + + + + Import keys + + + + + Manage keys + + + + + Ctrl+Q + Ctrrl+Q + + + + F1 + + + + + About + + + + + Regenerate deterministic addresses + + + + + Delete all trashed messages + + + + + Join / Create chan + + + + + NewAddressDialog + + + Create new Address + Neue Adresse erstellen + + + + Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged. You may generate addresses by using either random numbers or by using a passphrase. If you use a passphrase, the address is called a "deterministic" address. +The 'Random Number' option is selected by default but deterministic addresses have several pros and cons: + Here yee may gen'rate arrrs many arrddresses as yee like. Indeed, crrreatin' and abandonin' arrddresses be encouraged. Yee may generrrate arrddresses by usin' either random numbers or by usin' a passphrase. If you be usin' a passphrase, t' arrddress be called a "deterministic" arrddress. +T' 'Random Number' option be selected by default but deterministic arrddresses have several pros and cons: + + + + <html><head/><body><p><span style=" font-weight:600;">Pros:<br/></span>You can recreate your addresses on any computer from memory. <br/>You need-not worry about backing up your keys.dat file as long as you can remember your passphrase. <br/><span style=" font-weight:600;">Cons:<br/></span>You must remember (or write down) your passphrase if you expect to be able to recreate your keys if they are lost. <br/>You must remember the address version number and the stream number along with your passphrase. <br/>If you choose a weak passphrase and someone on the Internet can brute-force it, they can read your messages and send messages as you.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Pros:<br/></span>Yee may recreate your arrddresses on any computer from memory. <br/>Yee shant worry about backing up yee keys.dat file as long as yee shall remember t' passphrase. <br/><span style=" font-weight:600;">Cons:<br/></span>Yee must remember (or scribe down) t' passphrase if yee expect t' be able to recreate your keys if they be lost. <br/>Yee must remember t' arrddress version number and t' stream number along with yee passphrase. <br/>If yee choose a weak passphrase and someone on t' great see of internet can brute-force it like a real pirate, they can read yee messages and send messages as you.</p></body></html> + + + + Use a random number generator to make an address + Use yee random number generator to make an arrddress + + + + Use a passpharase to make addresses + Use yee passpharase to make arrddresses + + + + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter + Spend several minutes of extra computing time to make t' arrddress(es) 1 or 2 charrracters sharter. + + + + Make deterministic addresses + Make deterministic arrddresses + + + + Address version number: 3 + Arrddress version number: 3 + + + + In addition to your passphrase, you must remember these numbers: + In addition to yee passphrase, yee must rememberrr these numbers: + + + + Passphrase + Passphrase + + + + Number of addresses to make based on your passphrase: + Number of addresses t' make based on yee passphrase: + + + + Stream number: 1 + Stream number: 1 + + + + Retype passphrase + RRRetype passphrase matey: + + + + Randomly generate address + RRRandomly generate address + + + + Label (not shown to anyone except you) + Label (not shown t' any sailors 'cept you) + + + + Use the most available stream + Use t' most available stream + + + + (best if this is the first of many addresses you will create) + (best if this be t' first of many arrddresses you be creatin') + + + + Use the same stream as an existing address + Use t' same stream as an existing arrddress + + + + (saves you some bandwidth and processing power) + (saves yee some bandwidth and processing powerrr) + + + + Use a passphrase to make addresses + + + + + NewSubscriptionDialog + + + Add new entry + Add yee new entry + + + + Label + Label + + + + Address + Address + + + + SpecialAddressBehaviorDialog + + + Special Address Behavior + Special Arrddress Behavior + + + + Behave as a normal address + Behave yee as normal arrddress + + + + Behave as a pseudo-mailing-list address + Behave yee as pseudo-mailing-list arrddress + + + + Mail received to a pseudo-mailing-list address will be automatically broadcast to subscribers (and thus will be public). + Mail rrreceived to yee pseudo-mailing-list arrddress be automatically broadcast to subscribers (all sailors in public be able to see yee message). + + + + Name of the pseudo-mailing-list: + Name yee pseudo-mailing-list: + + + + aboutDialog + + + PyBitmessage + PyBitmessage + + + + version ? + Version ? + + + + About + + + + + Copyright © 2013 Jonathan Warren + + + + + <html><head/><body><p>Distributed under the MIT/X11 software license; see <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html> + + + + + This is Beta software. + + + + + connectDialog + + + Bitmessage + + + + + Bitmessage won't connect to anyone until you let it. + + + + + Connect now + + + + + Let me configure special network settings first + + + + + helpDialog + + + Help + Help + + + + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> + + + + As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: + Bitmessage be project of many, a pirates help can be found online in the Bitmessage Wiki: + + + + iconGlossaryDialog + + + Icon Glossary + Symbol-Glossar + + + + You have no connections with other peers. + Sie haben keine Verbindung zu anderen Teilnehmern. + + + + You have made at least one connection to a peer using an outgoing connection but you have not yet received any incoming connections. Your firewall or home router probably isn't configured to foward incoming TCP connections to your computer. Bitmessage will work just fine but it would help the Bitmessage network if you allowed for incoming connections and will help you be a better-connected node. + Yee have made least one connection to a peer pirate usin' outgoing connection but yee not yet received any incoming connections. Yee firewall, witches nest, or home router probably shant configured to foward incoming TCP connections to yee computer. Bitmessage be workin' just fine but it help fellow pirates if yee allowed for incoming connections and will help yee be a better-connected node matey. + + + + You are using TCP port ?. (This can be changed in the settings). + You be usin' TCP port ?. (This be changed in settings). + + + + You do have connections with other peers and your firewall is correctly configured. + Yee have connections with other peers and pirates,yee firewall is correctly configured. + + + + You have made at least one connection to a peer using an outgoing connection but you have not yet received any incoming connections. Your firewall or home router probably isn't configured to forward incoming TCP connections to your computer. Bitmessage will work just fine but it would help the Bitmessage network if you allowed for incoming connections and will help you be a better-connected node. + + + + + newChanDialog + + + Dialog + + + + + Create a new chan + + + + + Join a chan + + + + + Create a chan + + + + + <html><head/><body><p>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html> + + + + + Chan name: + + + + + <html><head/><body><p>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></body></html> + + + + + Chan bitmessage address: + + + + + regenerateAddressesDialog + + + Regenerate Existing Addresses + Regenerate Existin' Arrddresses + + + + Regenerate existing addresses + Regenerate existin' addresses + + + + Passphrase + Passphrase + + + + Number of addresses to make based on your passphrase: + Number of arrddresses to make based on yee passphrase: + + + + Address version Number: + Arrddress version Number: + + + + 3 + 3 + + + + Stream number: + Stream numberrr: + + + + 1 + 1 + + + + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter + Spend several minutes extra computin' time to make yee address(es) 1 arr 2 characters sharter + + + + You must check (or not check) this box just like you did (or didn't) when you made your addresses the first time. + Yee must check (arr not check) this box just like yee did (or didn't) when yee made your arrddresses the first time. + + + + If you have previously made deterministic addresses but lost them due to an accident (like hard drive failure), you can regenerate them here. If you used the random number generator to make your addresses then this form will be of no use to you. + If yee have previously made deterministic arrddresses but yee lost them due to an accident (like losin' yee pirate ship), yee can regenerate them here. If yee used t' random number generator to make yee addresses then this form be of no use to you. + + + + settingsDialog + + + Settings + Settings + + + + Start Bitmessage on user login + Start yee Bitmessage on userrr login + + + + Start Bitmessage in the tray (don't show main window) + Start yee Bitmessage in t' tray (don't show main window) + + + + Minimize to tray + Minimize to yee tray + + + + Show notification when message received + Show yee a notification when message received + + + + Run in Portable Mode + Run in yee Portable Mode + + + + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. + In Portable Mode, messages and config files are stored in t' same directory as yee program rather than t' normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive or wooden leg. + + + + User Interface + User Interface + + + + Listening port + Listenin' port + + + + Listen for connections on port: + Listen for connections on yee port: + + + + Proxy server / Tor + Proxy server / Tor + + + + Type: + Type: + + + + none + none + + + + SOCKS4a + SOCKS4a + + + + SOCKS5 + SOCKS5 + + + + Server hostname: + Server hostname: + + + + Port: + Port: + + + + Authentication + Authentication + + + + Username: + Username: + + + + Pass: + Pass: + + + + Network Settings + Network Settings + + + + When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. + When a pirate sends yee a message, their computer must first complete a load of work. T' difficulty of t' work, by default, is 1. Yee may raise this default for new arrddresses yee create by changin' the values here. Any new arrddresses you be createin' will require senders to meet t' higher difficulty. There be one exception: if yee add a friend or pirate to yee arrddress book, Bitmessage be automatically notifyin' them when yee next send a message that they needin' be only complete t' minimum amount of work: difficulty 1. + + + + Total difficulty: + Total difficulty: + + + + Small message difficulty: + Small message difficulty: + + + + The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages. + T' 'Small message difficulty' mostly only affects t' difficulty of sending small messages. Doubling this value be makin' it almost twice as difficult to send a small message but doesn't really affect large messages. + + + + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. + T' 'Total difficulty' affects the absolute amount of work yee sender must complete. Doubling this value be doublin' t' amount of work. + + + + Demanded difficulty + Demanded difficulty + + + + Willingly include unencrypted destination address when sending to a mobile device + + + + + Override automatic language localization (use countycode or language code, e.g. 'en_US' or 'en'): + + + + + Listen for incoming connections when using proxy + + + + + Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable. + + + + + Maximum acceptable total difficulty: + + + + + Maximum acceptable small message difficulty: + + + + + Max acceptable difficulty + + + + + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> + + + + + Host: + + + + + Password: + + + + + Test + + + + + Connect to: + + + + + Namecoind + + + + + NMControl + + + + + Namecoin integration + + + + diff --git a/src/translations/bitmessage_eo.pro b/src/translations/bitmessage_eo.pro new file mode 100644 index 00000000..7a53b739 --- /dev/null +++ b/src/translations/bitmessage_eo.pro @@ -0,0 +1,33 @@ +SOURCES = ../addresses.py\ + ../bitmessagemain.py\ + ../class_addressGenerator.py\ + ../class_outgoingSynSender.py\ + ../class_receiveDataThread.py\ + ../class_sendDataThread.py\ + ../class_singleCleaner.py\ + ../class_singleListener.py\ + ../class_singleWorker.py\ + ../class_sqlThread.py\ + ../helper_bitcoin.py\ + ../helper_bootstrap.py\ + ../helper_generic.py\ + ../helper_inbox.py\ + ../helper_sent.py\ + ../helper_startup.py\ + ../shared.py\ + ../bitmessageqt/__init__.py\ + ../bitmessageqt/about.py\ + ../bitmessageqt/bitmessageui.py\ + ../bitmessageqt/connect.py\ + ../bitmessageqt/help.py\ + ../bitmessageqt/iconglossary.py\ + ../bitmessageqt/newaddressdialog.py\ + ../bitmessageqt/newchandialog.py\ + ../bitmessageqt/newsubscriptiondialog.py\ + ../bitmessageqt/regenerateaddresses.py\ + ../bitmessageqt/settings.py\ + ../bitmessageqt/specialaddressbehavior.py + + +TRANSLATIONS = bitmessage_eo.ts +CODECFORTR = UTF-8 diff --git a/src/translations/bitmessage_eo.qm b/src/translations/bitmessage_eo.qm new file mode 100644 index 00000000..cfa0a6dc Binary files /dev/null and b/src/translations/bitmessage_eo.qm differ diff --git a/src/translations/bitmessage_eo.ts b/src/translations/bitmessage_eo.ts new file mode 100644 index 00000000..461ff559 --- /dev/null +++ b/src/translations/bitmessage_eo.ts @@ -0,0 +1,1525 @@ + + + + + MainWindow + + + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? + Iu de viaj adresoj, %1, estas malnova versio 1 adreso. Ĉu ni povas forviŝi ĝin? + + + + Reply + Aŭ ĉu oni uzas u-formon ĉi tie? "Respondu"?! Ŝajnas al mi ke ne.. + Respondi + + + + Add sender to your Address Book + Aldoni sendinton al via adresaro + + + + Move to Trash + Movi al rubujo + + + + View HTML code as formatted text + Montri HTML-n kiel aranĝita teksto + + + + Save message as... + Konservi mesaĝon kiel... + + + + New + Nova + + + + Enable + ankaŭ eblus aktivigi + Ŝalti + + + + Disable + ankaŭ eblus malaktivigi + Malŝalti + + + + Copy address to clipboard + ankaŭ eblus "tondujo" aŭ "poŝo" + Kopii adreson al tondejo + + + + Special address behavior... + Speciala sinteno de adreso... + + + + Send message to this address + Sendi mesaĝon al tiu adreso + + + + Subscribe to this address + Aboni tiun adreson + + + + Add New Address + Aldoni novan adreson + + + + Delete + aŭ forigi + Forviŝi + + + + Copy destination address to clipboard + Kopii cel-adreson al tondejo + + + + Force send + Devigi sendadon + + + + Add new entry + aŭ eron + Aldoni novan elementon + + + + Waiting on their encryption key. Will request it again soon. + mi ne certas kiel traduki "their" ĉi tie. Sonas strange al mi. + Atendante al ilia ĉifroŝlosilo. Baldaŭ petos ĝin denove. + + + + Encryption key request queued. + Peto por ĉifroŝlosilo envicigita. + + + + Queued. + En atendovico. + + + + Message sent. Waiting on acknowledgement. Sent at %1 + Mesaĝo sendita. Atendante konfirmon. Sendita je %1 + + + + Need to do work to send message. Work is queued. + Devas labori por sendi mesaĝon. Laboro en atendovico. + + + + Acknowledgement of the message received %1 + Ricevis konfirmon de la mesaĝo je %1 + + + + Broadcast queued. + Elsendo en atendovico. + + + + Broadcast on %1 + Elsendo je %1 + + + + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 + Problemo: la demandita laboro de la ricevonto estas pli malfacila ol vi pretas fari. %1 + + + + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 + Problemo: la ĉifroŝlosilo de la ricevonto estas rompita. Ne povis ĉifri la mesaĝon. %1 + + + + Forced difficulty override. Send should start soon. + Ĉi tie mi ne certas kiel traduki "Forced difficulty override" + Devigita superado de limito de malfacilaĵo. Sendado devus baldaŭ komenci. + + + + Unknown status: %1 %2 + Nekonata stato: %1 %2 + + + + Since startup on %1 + Ekde lanĉo de la programo je %1 + + + + Not Connected + Ne konektita + + + + Show Bitmessage + Montri Bitmesaĝon + + + + Send + Sendi + + + + Subscribe + Aboni + + + + Address Book + Adresaro + + + + Quit + Eliri + + + + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. + Vi povas administri viajn ŝlosilojn redaktante la dosieron keys.dat en la sama dosierujo kiel tiu programo. Estas grava ke vi faru savkopion de tiu dosiero. + + + + You may manage your keys by editing the keys.dat file stored in + %1 +It is important that you back up this file. + Vi povas administri viajn ŝlosilojn redaktante la dosieron keys.dat en la dosierujo +%1. +Estas grava ke vi faru savkopion de tiu dosiero. + + + + Open keys.dat? + Ĉu "ĉu" estas bezonata ĉi tie? Aŭ ĉu sufiĉas diri "Malfermi keys.dat?" + Ĉu malfermi keys.dat? + + + + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) + Vi povas administri viajn ŝlosilojn redaktante la dosieron keys.dat en la sama dosierujo kiel tiu programo. Estas grava ke vi faru savkopion de tiu dosiero. Ĉu vi volas malfermi la dosieron nun? (Bonvolu certigi ke Bitmesaĝo estas fermita antaŭ fari ŝanĝojn.) + + + + You may manage your keys by editing the keys.dat file stored in + %1 +It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) + Vi povas administri viajn ŝlosilojn redaktante la dosieron keys.dat en la dosierujo +%1. +Estas grava ke vi faru savkopion de tiu dosiero. Ĉu vi volas malfermi la dosieron nun? (Bonvolu certigi ke Bitmesaĝo estas fermita antaŭ fari ŝanĝojn.) + + + + Delete trash? + Malplenigi rubujon? + + + + Are you sure you want to delete all trashed messages? + Ĉu "el" aŭ "en" pli taŭgas? + Ĉu vi certas ke vi volas forviŝi ĉiujn mesaĝojn el la rubojo? + + + + bad passphrase + malprava pasvorto + + + + You must type your passphrase. If you don't have one then this is not the form for you. + Vi devas tajpi vian pasvorton. Se vi ne havas pasvorton tiu ne estas la prava formularo por vi. + + + + Processed %1 person-to-person messages. + (Mi trovis "inter-para" kiel traduko de P2P en vikipedio: https://eo.wikipedia.org/wiki/P2p "samtavola" sonis strange al mi. Inter "p"ara ja povus uziĝi kiel "para-al-para" kvazaŭ kiel la angla P2P. Poste mi vidis ke tio ne celas peer2peer sed person2person.) + Pritraktis %1 inter-personajn mesaĝojn. + + + + Processed %1 broadcast messages. + Pritraktis %1 elsendojn. + + + + Processed %1 public keys. + Pritraktis %1 publikajn ŝlosilojn. + + + + Total Connections: %1 + Ĉu "totala" pravas ĉi tie? + Totalaj Konektoj: %1 + + + + Connection lost + Perdis konekton + + + + Connected + Konektita + + + + Message trashed + Movis mesaĝon al rubujo + + + + Error: Bitmessage addresses start with BM- Please check %1 + Eraro: en Bitmesaĝa adresoj komencas kun BM- Bonvolu kontroli %1 + + + + Error: The address %1 is not typed or copied correctly. Please check it. + Eraro: La adreso %1 ne estis prave tajpita aŭ kopiita. Bonvolu kontroli ĝin. + + + + Error: The address %1 contains invalid characters. Please check it. + Eraro: La adreso %1 enhavas malpermesitajn simbolojn. Bonvolu kontroli ĝin. + + + + Error: The address version in %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. + Mi demandis en DevTalk kiel traduki " is being clever." Ŝajne la aliaj tradukoj simple forlasis ĝin. + Eraro: La adres-versio %1 estas tro alta. Eble vi devas promocii vian Bitmesaĝo programon aŭ via konato uzas alian programon. + + + + Error: Some data encoded in the address %1 is too short. There might be something wrong with the software of your acquaintance. + Eraro: Kelkaj datumoj kodita en la adreso %1 estas tro mallongaj. Povus esti ke io en la programo de via konato malfunkcias. + + + + Error: Some data encoded in the address %1 is too long. There might be something wrong with the software of your acquaintance. + Eraro: Kelkaj datumoj kodita en la adreso %1 estas tro longaj. Povus esti ke io en la programo de via konato malfunkcias. + + + + Error: Something is wrong with the address %1. + Eraro: Io malĝustas kun la adreso %1. + + + + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. + Eraro: Vi devas elekti sendontan adreson. Se vi ne havas iun, iru al langeto "Viaj identigoj". + + + + Sending to your address + Sendante al via adreso + + + + Error: One of the addresses to which you are sending a message, %1, is yours. Unfortunately the Bitmessage client cannot process its own messages. Please try running a second client on a different computer or within a VM. + Ĉu "kliento" pravas? Ĉu "virtuala maŝino? + Eraro: Unu el la adresoj al kiuj vi sendas mesaĝon (%1) apartenas al vi. Bedaŭrinde, la kliento de Bitmesaĝo ne povas pritrakti siajn proprajn mesaĝojn. Bonvolu uzi duan klienton ĉe alia komputilo aŭ en virtuala maŝino (VM). + + + + Address version number + Numero de adresversio + + + + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. + + + + + Stream number + Fluo numero + + + + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. + + + + + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. + + + + + Your 'To' field is empty. + Via "Ricevonto"-kampo malplenas. + + + + Work is queued. + Laboro en atendovico. + + + + Right click one or more entries in your address book and select 'Send message to this address'. + + + + + Work is queued. %1 + Laboro en atendovico. %1 + + + + New Message + Nova mesaĝo + + + + From + De + + + + Address is valid. + Adreso estas ĝusta. + + + + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. + Eraro: Vi ne povas duoble aldoni la saman adreson al via adresaro. Provu renomi la jaman se vi volas. + + + + The address you entered was invalid. Ignoring it. + La adreso kiun vi enmetis estas malĝusta. Ignoras ĝin. + + + + Error: You cannot add the same address to your subsciptions twice. Perhaps rename the existing one if you want. + Eraro: Vi ne povas duoble aboni la saman adreson. Provu renomi la jaman se vi volas. + + + + Restart + Restartigi + + + + You must restart Bitmessage for the port number change to take effect. + Vi devas restartigi Bitmesaĝon por ke la ŝanĝo de la numero de pordo (Port Number) efektivigu. + + + + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections. + Bitmessage wird den Proxy-Server ab jetzt verwenden, möglicherweise möchten Sie Bitmessage neu starten um bestehende Verbindungen zu schließen. + + + + Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want. + + + + + Passphrase mismatch + Notu ke pasfrazo kutime estas pli longa ol pasvorto. + Pasfrazoj malsamas + + + + The passphrase you entered twice doesn't match. Try again. + La pasfrazo kiun vi duoble enmetis malsamas. Provu denove. + + + + Choose a passphrase + Elektu pasfrazon + + + + You really do need a passphrase. + Vi ja vere bezonas pasfrazon. + + + + All done. Closing user interface... + Ĉiu preta. Fermante fasadon... + + + + Address is gone + Oni devas certigi KIE tiu frazo estas por havi la kuntekston. + Adreso foriris + + + + Bitmessage cannot find your address %1. Perhaps you removed it? + Bitmesaĝo ne povas trovi vian adreson %1. Ĉu eble vi forviŝis ĝin? + + + + Address disabled + Adreso malŝaltita + + + + Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it. + Eraro: La adreso kun kiu vi provas sendi estas malŝaltita. Vi devos ĝin ŝalti en la langeto 'Viaj identigoj' antaŭ uzi ĝin. + + + + Entry added to the Address Book. Edit the label to your liking. + Ĉu pli bone "Bv. redakti"? + Aldonis elementon al adresaro. Redaktu la etikedo laŭvole. + + + + Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back. + Movis elementojn al rubujo. Ne estas fasado por rigardi vian rubujon, sed ankoraŭ estas sur disko se vi esperas ĝin retrovi. + + + + Save As... + Konservi kiel... + + + + Write error. + http://komputeko.net/index_en.php?vorto=write+error + Skriberaro. + + + + No addresses selected. + Neniu adreso elektita. + + + + Options have been disabled because they either aren't applicable or because they haven't yet been implemented for your operating system. + + + + + The address should start with ''BM-'' + Aŭ "devus komenci" laŭ kunteksto? + La adreso komencu kun "BM-" + + + + The address is not typed or copied correctly (the checksum failed). + La adreso ne estis prave tajpita aŭ kopiita (kontrolsumo malsukcesis). + + + + The version number of this address is higher than this software can support. Please upgrade Bitmessage. + + + + + The address contains invalid characters. + La adreso enhavas malpermesitajn simbolojn. + + + + Some data encoded in the address is too short. + Kelkaj datumoj kodita en la adreso estas tro mallongaj. + + + + Some data encoded in the address is too long. + Kelkaj datumoj kodita en la adreso estas tro longaj. + + + + You are using TCP port %1. (This can be changed in the settings). + Vi estas uzanta TCP pordo %1 (Tio estas ŝanĝebla en la agordoj). + + + + Bitmessage + Dependas de la kunteksto ĉu oni volas traduki tion. + Bitmesaĝo + + + + To + Al + + + + From + De + + + + Subject + Temo + + + + Received + Kunteksto? + Ricevita + + + + Inbox + aŭ "ricevkesto" http://komputeko.net/index_en.php?vorto=Inbox + Ricevujo + + + + Load from Address book + Ŝarĝi el adresaro + + + + Message: + Mesaĝo: + + + + Subject: + Temo: + + + + Send to one or more specific people + Sendi al unu aŭ pli specifaj personoj + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></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:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + To: + Al: + + + + From: + De: + + + + Broadcast to everyone who is subscribed to your address + Ĉu "ĉiu kiu" eĉ eblas? + Elsendi al ĉiu kiu subskribis al via adreso + + + + Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them. + Sciu ke elsendoj estas sole ĉifrita kun via adreso. Iu ajn povas legi ĝin se tiu scias vian adreson. + + + + Status + http://komputeko.net/index_en.php?vorto=status + Stato + + + + Sent + Sendita + + + + Label (not shown to anyone) + Etikdeo (ne montrita al iu ajn) + + + + Address + Adreso + + + + Stream + Fluo + + + + Your Identities + Mi ne certis kion uzi: ĉu identeco (rim: internacia senco) aŭ ĉu identigo. Mi decidis por identigo pro la rilato al senco "rekoni" ("identigi krimulon") + Via identigoj + + + + Here you can subscribe to 'broadcast messages' that are sent by other users. Messages will appear in your Inbox. Addresses here override those on the Blacklist tab. + Ĉi tie vi povas aboni "elsendajn mesaĝojn" elsendita de aliaj uzantoj. Adresoj ĉi tie transpasas tiujn sur la langeto "Nigara listo". + + + + Add new Subscription + kial "Subscription" kun granda S? + Aldoni novan Abonon + + + + Label + Etikedo + + + + Subscriptions + Abonoj + + + + The Address book is useful for adding names or labels to other people's Bitmessage addresses so that you can recognize them more easily in your inbox. You can add entries here using the 'Add' button, or from your inbox by right-clicking on a message. + La Adresaro estas utila por aldoni nomojn aŭ etikedojn al la Bitmesaĝa adresoj de aliaj persono por ke vi povu rekoni ilin pli facile en via ricevujo. Vi povas aldoni elementojn ĉi tie uzante la butonon 'Aldoni', aŭ en la ricevujo per dekstra klako al mesaĝo. + + + + Name or Label + e aŭ E? + Nomo aŭ Etikedo + + + + Use a Blacklist (Allow all incoming messages except those on the Blacklist) + http://komputeko.net/index_en.php?vorto=blacklist + Uzi Nigran Liston (permesi ĉiujn alvenintajn mesaĝojn escepte tiuj en la Nigra Listo) + + + + Use a Whitelist (Block all incoming messages except those on the Whitelist) + mi skribis majuskle ĉar mi pensas ke Blacklist and Whitelist estas specifa por tiu kunteksto + Uzi Blankan Liston (bloki ĉiujn alvenintajn mesaĝojn escepte tiuj en la Blanka Listo) + + + + Blacklist + Nigra Listo + + + + Stream # + Fluo # + + + + Connections + Konetkoj + + + + Total connections: 0 + Totalaj konektoj: 0 + + + + Since startup at asdf: + Stranga fonto! + Ekde lanĉo de la programo je asdf: + + + + Processed 0 person-to-person message. + Pritraktis 0 inter-personajn mesaĝojn. + + + + Processed 0 public key. + Pritraktis 0 publikajn ŝlosilojn. + + + + Processed 0 broadcast. + Pritraktis 0 elsendojn. + + + + Network Status + Reta Stato + + + + File + Dosiero + + + + Settings + Agordoj + + + + Help + Helpo + + + + Import keys + Importi ŝlosilojn + + + + Manage keys + Administri ŝlosilojn + + + + About + Pri + + + + Regenerate deterministic addresses + http://www.reta-vortaro.de/revo/art/gener.html https://eo.wikipedia.org/wiki/Determinismo + Regeneri determinisman adreson + + + + Delete all trashed messages + Forviŝi ĉiujn mesaĝojn el rubujo + + + + Message sent. Sent at %1 + Mesaĝo sendita. Sendita je %1 + + + + Chan name needed + http://komputeko.net/index_en.php?vorto=channel + Bezonas nomon de kanalo + + + + You didn't enter a chan name. + Vi ne enmetis nonon de kanalo. + + + + Address already present + eble laŭ kunteksto "en la listo"? + Adreso jam ĉi tie + + + + Could not add chan because it appears to already be one of your identities. + Ne povis aldoni kanalon ĉar ŝajne jam estas unu el viaj indentigoj. + + + + Success + Sukceso + + + + Successfully created chan. To let others join your chan, give them the chan name and this Bitmessage address: %1. This address also appears in 'Your Identities'. + Sukcese kreis kanalon. Por ebligi al aliaj aniĝi vian kanalon, sciigu al ili la nomon de la kanalo kaj ties Bitmesaĝa adreso: %1. Tiu adreso ankaŭ aperas en 'Viaj identigoj'. + + + + Address too new + Kion tio signifu? kunteksto? + Adreso tro nova + + + + Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage. + Kvankam tiu Bitmesaĝa adreso povus esti ĝusta, ĝia versionumero estas tro nova por pritrakti ĝin. Eble vi devas promocii vian Bitmesaĝon. + + + + Address invalid + Adreso estas malĝusta + + + + That Bitmessage address is not valid. + Tiu Bitmesaĝa adreso ne estas ĝusta. + + + + Address does not match chan name + Adreso ne kongruas kun kanalonomo + + + + Although the Bitmessage address you entered was valid, it doesn't match the chan name. + Kvankam la Bitmesaĝa adreso kiun vi enigis estas ĝusta, ĝi ne kongruas kun la kanalonomo. + + + + Successfully joined chan. + Sukcese aniĝis al kanalo. + + + + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). + Bitmesaĝo uzos vian prokurilon (proxy) ekde nun sed eble vi volas permane restartigi Bitmesaĝon nun por ke ĝi fermu eblajn jamajn konektojn. + + + + This is a chan address. You cannot use it as a pseudo-mailing list. + Tio estas kanaladreso. Vi ne povas ĝin uzi kiel pseŭdo-dissendolisto. + + + + Search + Serĉi + + + + All + Ĉio + + + + Message + Mesaĝo + + + + Join / Create chan + Aniĝi / Krei kanalon + + + + Encryption key was requested earlier. + Verschlüsselungscode wurde bereits angefragt. + + + + Sending a request for the recipient's encryption key. + Sende eine Anfrage für den Verschlüsselungscode des Empfängers. + + + + Doing work necessary to request encryption key. + Verrichte die benötigte Arbeit um den Verschlüsselungscode anzufragen. + + + + Broacasting the public key request. This program will auto-retry if they are offline. + Anfrage für den Verschlüsselungscode versendet (wird automatisch periodisch neu verschickt). + + + + Sending public key request. Waiting for reply. Requested at %1 + Anfrag für den Verschlüsselungscode gesendet. Warte auf Antwort. Angefragt am %1 + + + + Mark Unread + Marki nelegita + + + + Fetched address from namecoin identity. + Venigis adreson de Namecoin identigo. + + + + Testing... + Testante... + + + + Fetch Namecoin ID + Venigu Namecoin ID + + + + Ctrl+Q + http://komputeko.net/index_en.php?vorto=ctrl + Stir+Q + + + + F1 + F1 + + + + NewAddressDialog + + + Create new Address + Krei novan Adreson + + + + Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged. You may generate addresses by using either random numbers or by using a passphrase. If you use a passphrase, the address is called a "deterministic" address. +The 'Random Number' option is selected by default but deterministic addresses have several pros and cons: + + + + + <html><head/><body><p><span style=" font-weight:600;">Pros:<br/></span>You can recreate your addresses on any computer from memory. <br/>You need-not worry about backing up your keys.dat file as long as you can remember your passphrase. <br/><span style=" font-weight:600;">Cons:<br/></span>You must remember (or write down) your passphrase if you expect to be able to recreate your keys if they are lost. <br/>You must remember the address version number and the stream number along with your passphrase. <br/>If you choose a weak passphrase and someone on the Internet can brute-force it, they can read your messages and send messages as you.</p></body></html> + + + + + Use a random number generator to make an address + + + + + Use a passphrase to make addresses + + + + + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter + + + + + Make deterministic addresses + + + + + Address version number: 3 + + + + + In addition to your passphrase, you must remember these numbers: + + + + + Passphrase + Pasfrazo + + + + Number of addresses to make based on your passphrase: + Kvanto de farotaj adresoj bazante sur via pasfrazo: + + + + Stream number: 1 + + + + + Retype passphrase + + + + + Randomly generate address + + + + + Label (not shown to anyone except you) + + + + + Use the most available stream + + + + + (best if this is the first of many addresses you will create) + + + + + Use the same stream as an existing address + + + + + (saves you some bandwidth and processing power) + + + + + NewSubscriptionDialog + + + Add new entry + Aldoni novan elementon + + + + Label + Etikedo + + + + Address + Adreso + + + + SpecialAddressBehaviorDialog + + + Special Address Behavior + + + + + Behave as a normal address + + + + + Behave as a pseudo-mailing-list address + + + + + Mail received to a pseudo-mailing-list address will be automatically broadcast to subscribers (and thus will be public). + + + + + Name of the pseudo-mailing-list: + + + + + aboutDialog + + + About + Pri + + + + PyBitmessage + PyBitmessage + + + + version ? + Veriso ? + + + + Copyright © 2013 Jonathan Warren + Kopirajto © 2013 Jonathan Warren + + + + <html><head/><body><p>Distributed under the MIT/X11 software license; see <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html> + <html><head/><body><p>Distribuita sub la permesilo "MIT/X11 software license"; vidu <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html> + + + + This is Beta software. + Tio estas beta-eldono. + + + + connectDialog + + + Bitmessage + Bitmesaĝo + + + + Bitmessage won't connect to anyone until you let it. + Bitmesaĝo ne konektos antaŭ vi permesas al ĝi. + + + + Connect now + Kenekti nun + + + + Let me configure special network settings first + Lasu min unue fari specialajn retajn agordojn + + + + helpDialog + + + Help + Helpo + + + + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> + Mi aldonis "(angle)" ĉar le enhavo de la helpopaĝo ja ne estas tradukita + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help (angle)</a> + + + + As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: + Ĉar Bitmesaĝo estas kunlabora projekto, vi povas trovi helpon enrete ĉe la vikio de Bitmesaĝo: + + + + iconGlossaryDialog + + + Icon Glossary + Piktograma Glosaro + + + + You have no connections with other peers. + Vi havas neniun konekton al aliaj samtavolano. + + + + You have made at least one connection to a peer using an outgoing connection but you have not yet received any incoming connections. Your firewall or home router probably isn't configured to forward incoming TCP connections to your computer. Bitmessage will work just fine but it would help the Bitmessage network if you allowed for incoming connections and will help you be a better-connected node. + Vi konektis almenaŭ al unu smtavolano uzante eliranta konekto, sed vi ankoraŭ ne ricevis enirantajn konetkojn. Via fajroŝirmilo (firewall) aŭ hejma enkursigilo (router) verŝajne estas agordita ne plusendi enirantajn TCP konektojn al via komputilo. Bitmesaĝo funkcios sufiĉe bone sed helpus al la Bitmesaĝa reto se vi permesus enirantajn konektojn kaj tiel estus pli bone konektita nodo. + + + + You are using TCP port ?. (This can be changed in the settings). + Vi estas uzanta TCP pordo ?. (Tio estas ŝanĝebla en la agordoj). + + + + You do have connections with other peers and your firewall is correctly configured. + Vi havas konektojn al aliaj samtavolanoj kaj via fajroŝirmilo estas ĝuste agordita. + + + + newChanDialog + + + Dialog + Dialogo + + + + Create a new chan + Krei novan kanalon + + + + Join a chan + Aniĝi al kanalo + + + + Create a chan + Krei kanalon + + + + Chan name: + Nomo de kanalo: + + + + <html><head/><body><p>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></body></html> + <html><head/><body><p>Kanalo ekzistas kiam grupo de personoj havas komunajn malĉifrajn ŝlosilojn. La ŝlosiloj kaj Bitmesaĝa adreso uzita de kanalo estas generita el homlegebla vorto aŭ frazo (la nomo de la kanalo). Por sendi mesaĝon al ĉiu en la kanalo, sendu normalan person-al-persona mesaĝon al la adreso de la kanalo.</p><p>Kanaloj estas eksperimentaj kaj tute malkontroleblaj.</p></body></html> + + + + Chan bitmessage address: + Bitmesaĝa adreso de kanalo: + + + + <html><head/><body><p>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html> + <html><head/><body><p>Enmetu nomon por via kanalo. Se vi elektas sufiĉe ampleksan kanalnomon (kiel fortan kaj unikan pasfrazon) kaj neniu el viaj amikoj komunikas ĝin publike la kanalo estos sekura kaj privata. Se vi kaj iu ajn kreas kanalon kun la sama nomo tiam en la momento estas tre verŝajne ke estos la sama kanalo.</p></body></html> + + + + regenerateAddressesDialog + + + Regenerate Existing Addresses + Regeneri ekzistantajn adresojn + + + + Regenerate existing addresses + Regeneri ekzistantajn Adresojn + + + + Passphrase + Pasfrazo + + + + Number of addresses to make based on your passphrase: + Kvanto de farotaj adresoj bazante sur via pasfrazo: + + + + Address version Number: + Adresa versio numero: + + + + 3 + 3 + + + + Stream number: + Fluo numero: + + + + 1 + 1 + + + + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter + Elspezi kelkajn minutojn per aldona tempo de komputila kalkulado por fari adreso(j)n 1 aŭ 2 simbolojn pli mallonge + + + + You must check (or not check) this box just like you did (or didn't) when you made your addresses the first time. + Vi devas marki (aŭ ne marki) tiun markobutono samkiel vi faris kiam vi generis vian adreson la unuan fojon. + + + + If you have previously made deterministic addresses but lost them due to an accident (like hard drive failure), you can regenerate them here. If you used the random number generator to make your addresses then this form will be of no use to you. + Se vi antaŭe kreis determinismajn adresojn sed perdis ĝin akcidente (ekz. en diska paneo), vi povas regeneri ilin ĉi tie. Se vi uzis la generilo de hazardaj numeroj por krei vian adreson tiu formularo ne taŭgos por vi. + + + + settingsDialog + + + Settings + Agordoj + + + + Start Bitmessage on user login + Startigi Bitmesaĝon dum ensaluto de uzanto + + + + Start Bitmessage in the tray (don't show main window) + Startigi Bitmesaĝon en la taskopleto (tray) ne montrante tiun fenestron + + + + Minimize to tray + Plejetigi al taskopleto + + + + Show notification when message received + Montri sciigon kiam mesaĝo alvenas + + + + Run in Portable Mode + Ekzekucii en Portebla Reĝimo + + + + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. + En Portebla Reĝimo, mesaĝoj kaj agordoj estas enmemorigitaj en la sama dosierujo kiel la programo mem anstataŭ en la dosierujo por datumoj de aplikaĵoj. Tio igas ĝin komforta ekzekucii Bitmesaĝon el USB poŝmemorilo. + + + + User Interface + Fasado + + + + Listening port + Aŭskultanta pordo (port) + + + + Listen for connections on port: + Aŭskultu pri konektoj ĉe pordo: + + + + Proxy server / Tor + Prokurila (proxy) servilo / Tor + + + + Type: + Tipo: + + + + none + Neniu + + + + SOCKS4a + SOCKS4a + + + + SOCKS5 + SOCKS5 + + + + Server hostname: + Servilo gastiga nomo (hostname): + + + + Port: + Pordo (port): + + + + Authentication + Aŭtentigo + + + + Username: + Uzantnomo: + + + + Pass: + Pas: + + + + Network Settings + Retaj agordoj + + + + When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. + + + + + Total difficulty: + + + + + Small message difficulty: + + + + + The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages. + + + + + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. + + + + + Demanded difficulty + + + + + Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable. + + + + + Maximum acceptable total difficulty: + + + + + Maximum acceptable small message difficulty: + + + + + Max acceptable difficulty + + + + + Listen for incoming connections when using proxy + + + + + Willingly include unencrypted destination address when sending to a mobile device + + + + + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> + + + + + Host: + Gastiga servilo: + + + + Password: + Pasvorto: + + + + Test + Testo + + + + Connect to: + Kenekti al: + + + + Namecoind + Namecoind + + + + NMControl + NMControl + + + + Namecoin integration + Integrigo de Namecoin + + + + Override automatic language localization (use countycode or language code, e.g. 'en_US' or 'en'): + Transpasi la automatan reconon de locala lingvo (uzu landokodon aŭ lingvokodon, ekz. 'en_US' aŭ 'en'): + + + diff --git a/src/translations/bitmessage_fr.pro b/src/translations/bitmessage_fr.pro index d86fdc4d..f2215048 100644 --- a/src/translations/bitmessage_fr.pro +++ b/src/translations/bitmessage_fr.pro @@ -2,7 +2,7 @@ SOURCES = ../addresses.py\ ../bitmessagemain.py\ ../class_addressGenerator.py\ ../class_outgoingSynSender.py\ - ../class_receiveDataThread.py\ + ../class_receiveDataThread.py\ ../class_sendDataThread.py\ ../class_singleCleaner.py\ ../class_singleListener.py\ @@ -14,10 +14,11 @@ SOURCES = ../addresses.py\ ../helper_inbox.py\ ../helper_sent.py\ ../helper_startup.py\ - ../shared.py + ../shared.py\ ../bitmessageqt/__init__.py\ ../bitmessageqt/about.py\ ../bitmessageqt/bitmessageui.py\ + ../bitmessageqt/connect.py\ ../bitmessageqt/help.py\ ../bitmessageqt/iconglossary.py\ ../bitmessageqt/newaddressdialog.py\ @@ -26,8 +27,7 @@ SOURCES = ../addresses.py\ ../bitmessageqt/regenerateaddresses.py\ ../bitmessageqt/settings.py\ ../bitmessageqt/specialaddressbehavior.py + - -TRANSLATIONS = bitmessage_fr_BE.ts - -CODECFORTR = UTF-8 +TRANSLATIONS = bitmessage_fr.ts +CODECFORTR = UTF-8 diff --git a/src/translations/bitmessage_fr.qm b/src/translations/bitmessage_fr.qm index 1eb1b25f..12247227 100644 Binary files a/src/translations/bitmessage_fr.qm and b/src/translations/bitmessage_fr.qm differ diff --git a/src/translations/bitmessage_fr.ts b/src/translations/bitmessage_fr.ts index 28b5e270..d68a5990 100644 --- a/src/translations/bitmessage_fr.ts +++ b/src/translations/bitmessage_fr.ts @@ -1,59 +1,60 @@ - + + MainWindow - + Bitmessage Bitmessage - + To Vers - + From De - + Subject Sujet - + Received Reçu - + Inbox Boîte de réception - + Load from Address book Charger depuis carnet d'adresses - + Message: Message : - + Subject: Sujet : - + Send to one or more specific people Envoyer à une ou plusieurs personne(s) - + <!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; } @@ -66,307 +67,307 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + To: Vers : - + From: De : - + Broadcast to everyone who is subscribed to your address Diffuser à chaque abonné de cette adresse - + Send Envoyer - + Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them. Gardez en tête que les diffusions sont seulement chiffrées avec votre adresse. Quiconque disposant de votre adresse peut les lire. - + Status Statut - + Sent Envoyé - + New Nouveau - + Label (not shown to anyone) Label (seulement visible par vous) - + Address Adresse - + Stream Flux - + Your Identities Vos identités - + Here you can subscribe to 'broadcast messages' that are sent by other users. Messages will appear in your Inbox. Addresses here override those on the Blacklist tab. Vous pouvez ici souscrire aux 'messages de diffusion' envoyés par d'autres utilisateurs. Les messages apparaîtront dans votre boîte de récption. Les adresses placées ici outrepassent la liste noire. - + Add new Subscription Ajouter un nouvel abonnement - + Label Label - + Subscriptions Abonnements - + The Address book is useful for adding names or labels to other people's Bitmessage addresses so that you can recognize them more easily in your inbox. You can add entries here using the 'Add' button, or from your inbox by right-clicking on a message. Le carnet d'adresses est utile pour mettre un nom sur une adresse Bitmessage et ainsi faciliter la gestion de votre boîte de réception. Vous pouvez ajouter des entrées ici en utilisant le bouton 'Ajouter', ou depuis votre boîte de réception en faisant un clic-droit sur un message. - + Add new entry Ajouter une nouvelle entrée - + Name or Label Nom ou Label - + Address Book Carnet d'adresses - + Use a Blacklist (Allow all incoming messages except those on the Blacklist) Utiliser une liste noire (autoriser tous les messages entrants exceptés ceux sur la liste noire) - + Use a Whitelist (Block all incoming messages except those on the Whitelist) Utiliser une liste blanche (refuser tous les messages entrants exceptés ceux sur la liste blanche) - + Blacklist Liste noire Stream Number - Numéro de flux + Numéro de flux Number of Connections - Nombre de connexions + Nombre de connexions - + Total connections: 0 Nombre de connexions total : 0 - + Since startup at asdf: Depuis le lancement à asdf : - + Processed 0 person-to-person message. 0 message de pair à pair traité. - + Processed 0 public key. 0 clé publique traitée. - + Processed 0 broadcast. 0 message de diffusion traité. - + Network Status État du réseau - + File Fichier - + Settings Paramètres - + Help Aide - + Import keys Importer les clés - + Manage keys Gérer les clés - + Quit Quitter - + About À propos - + Regenerate deterministic addresses Regénérer les clés déterministes - + Delete all trashed messages Supprimer tous les messages dans la corbeille - + Total Connections: %1 Nombre total de connexions : %1 - + Not Connected Déconnecté - + Connected Connecté - + Show Bitmessage Afficher Bitmessage - + Subscribe S'abonner - + Processed %1 person-to-person messages. %1 messages de pair à pair traités. - + Processed %1 broadcast messages. %1 messages de diffusion traités. - + Processed %1 public keys. %1 clés publiques traitées. - + Since startup on %1 Depuis lancement le %1 - + Waiting on their encryption key. Will request it again soon. En attente de la clé de chiffrement. Une nouvelle requête sera bientôt lancée. - + Encryption key request queued. Demande de clé de chiffrement en attente. - + Queued. En attente. - + Need to do work to send message. Work is queued. Travail nécessaire pour envoyer le message. Travail en attente. - + Acknowledgement of the message received %1 Accusé de réception reçu le %1 - + Broadcast queued. Message de diffusion en attente. - + Broadcast on %1 Message de diffusion à %1 - + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 Problème : Le travail demandé par le destinataire est plus difficile que ce que vous avez paramétré. %1 - + Forced difficulty override. Send should start soon. Neutralisation forcée de la difficulté. L'envoi devrait bientôt commencer. - + Message sent. Waiting on acknowledgement. Sent at %1 Message envoyé. En attente de l'accusé de réception. Envoyé le %1 - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Vous pouvez éditer vos clés en éditant le fichier keys.dat stocké dans le même répertoire que ce programme. Il est important de faire des sauvegardes de ce fichier. - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. @@ -375,12 +376,12 @@ It is important that you back up this file. Il est important de faire des sauvegardes de ce fichier. - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) Vous pouvez éditer vos clés en éditant le fichier keys.dat stocké dans le même répertoire que ce programme. Il est important de faire des sauvegardes de ce fichier. Souhaitez-vous l'ouvrir maintenant ? (Assurez-vous de fermer Bitmessage avant d'effectuer des changements.) - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) @@ -389,384 +390,385 @@ It is important that you back up this file. Would you like to open the file now? Il est important de faire des sauvegardes de ce fichier. Souhaitez-vous l'ouvrir maintenant ? (Assurez-vous de fermer Bitmessage avant d'effectuer des changements.) - + Add sender to your Address Book Ajouter l'expéditeur au carnet d'adresses - + Move to Trash Envoyer à la Corbeille - + View HTML code as formatted text Voir le code HTML comme du texte formaté - + Enable Activer - + Disable Désactiver - + Copy address to clipboard Copier l'adresse dans le presse-papier - + Special address behavior... Comportement spécial de l'adresse... - + Send message to this address Envoyer un message à cette adresse - + Add New Address Ajouter nouvelle adresse - + Delete Supprimer - + Copy destination address to clipboard Copier l'adresse de destination dans le presse-papier - + Force send Forcer l'envoi - + Are you sure you want to delete all trashed messages? Êtes-vous sûr de vouloir supprimer tous les messages dans la corbeille ? - + You must type your passphrase. If you don't have one then this is not the form for you. Vous devez taper votre phrase secrète. Si vous n'en avez pas, ce formulaire n'est pas pour vous. - + Delete trash? Supprimer la corbeille ? - + Open keys.dat? Ouvrir keys.dat ? - + bad passphrase Mauvaise phrase secrète - + Restart Redémarrer - + You must restart Bitmessage for the port number change to take effect. Vous devez redémarrer Bitmessage pour que le changement de port prenne effet. Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections. - Bitmessage utilisera votre proxy à partir de maintenant mais il vous faudra redémarrer Bitmessage pour fermer les connexions existantes. + Bitmessage utilisera votre proxy à partir de maintenant mais il vous faudra redémarrer Bitmessage pour fermer les connexions existantes. - + Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want. Erreur : Vous ne pouvez pas ajouter une adresse déjà présente dans votre liste. Essayez de renommer l'adresse existante. - + The address you entered was invalid. Ignoring it. L'adresse que vous avez entrée est invalide. Adresse ignorée. - + Passphrase mismatch Phrases secrètes différentes - + The passphrase you entered twice doesn't match. Try again. Les phrases secrètes entrées sont différentes. Réessayez. - + Choose a passphrase Choisissez une phrase secrète - + You really do need a passphrase. Vous devez vraiment utiliser une phrase secrète. - + All done. Closing user interface... Terminé. Fermeture de l'interface... - + Address is gone L'adresse a disparu - + Bitmessage cannot find your address %1. Perhaps you removed it? Bitmessage ne peut pas trouver votre adresse %1. Peut-être l'avez-vous supprimée ? - + Address disabled Adresse désactivée - + Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it. Erreur : L'adresse avec laquelle vous essayez de communiquer est désactivée. Vous devez d'abord l'activer dans l'onglet 'Vos identités' avant de l'utiliser. - + Entry added to the Address Book. Edit the label to your liking. Entrée ajoutée au carnet d'adresses. Éditez le label selon votre souhait. - + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. Erreur : Vous ne pouvez pas ajouter une adresse déjà présente dans votre carnet d'adresses. Essayez de renommer l'adresse existante. - + Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back. Messages déplacés dans la corbeille. Il n'y a pas d'interface utilisateur pour voir votre corbeille, mais ils sont toujours présents sur le disque si vous souhaitez les récupérer. - + No addresses selected. Aucune adresse sélectionnée. Options have been disabled because they either aren't applicable or because they haven't yet been implimented for your operating system. - Certaines options ont été désactivées car elles n'étaient pas applicables ou car elles n'ont pas encore été implémentées pour votre système d'exploitation. + Certaines options ont été désactivées car elles n'étaient pas applicables ou car elles n'ont pas encore été implémentées pour votre système d'exploitation. - + The address should start with ''BM-'' L'adresse devrait commencer avec "BM-" - + The address is not typed or copied correctly (the checksum failed). L'adresse n'est pas correcte (la somme de contrôle a échoué). - + The version number of this address is higher than this software can support. Please upgrade Bitmessage. Le numéro de version de cette adresse est supérieur à celui que le programme peut supporter. Veuiller mettre Bitmessage à jour. - + The address contains invalid characters. L'adresse contient des caractères invalides. - + Some data encoded in the address is too short. Certaines données encodées dans l'adresse sont trop courtes. - + Some data encoded in the address is too long. Certaines données encodées dans l'adresse sont trop longues. - + Address is valid. L'adresse est valide. - + You are using TCP port %1. (This can be changed in the settings). Vous utilisez le port TCP %1. (Ceci peut être changé dans les paramètres). - + Error: Bitmessage addresses start with BM- Please check %1 Erreur : Les adresses Bitmessage commencent avec BM- Merci de vérifier %1 - + Error: The address %1 contains invalid characters. Please check it. Erreur : L'adresse %1 contient des caractères invalides. Veuillez la vérifier. - + Error: The address %1 is not typed or copied correctly. Please check it. Erreur : L'adresse %1 n'est pas correctement recopiée. Veuillez la vérifier. - + Error: The address version in %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. Erreur : La version de l'adresse %1 est trop grande. Pensez à mettre à jour Bitmessage. - + Error: Some data encoded in the address %1 is too short. There might be something wrong with the software of your acquaintance. Erreur : Certaines données encodées dans l'adresse %1 sont trop courtes. Il peut y avoir un problème avec le logiciel ou votre connaissance. - + Error: Some data encoded in the address %1 is too long. There might be something wrong with the software of your acquaintance. Erreur : Certaines données encodées dans l'adresse %1 sont trop longues. Il peut y avoir un problème avec le logiciel ou votre connaissance. - + Error: Something is wrong with the address %1. Erreur : Problème avec l'adresse %1. - + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. Erreur : Vous devez spécifier une adresse d'expéditeur. Si vous n'en avez pas, rendez-vous dans l'onglet 'Vos identités'. - + Sending to your address Envoi vers votre adresse - + Error: One of the addresses to which you are sending a message, %1, is yours. Unfortunately the Bitmessage client cannot process its own messages. Please try running a second client on a different computer or within a VM. Erreur : Une des adresses vers lesquelles vous envoyez un message, %1, est vôtre. Malheureusement, Bitmessage ne peut pas traiter ses propres messages. Essayez de lancer un second client sur une machine différente. - + Address version number Numéro de version de l'adresse - + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. Concernant l'adresse %1, Bitmessage ne peut pas comprendre les numéros de version de %2. Essayez de mettre à jour Bitmessage vers la dernière version. - + Stream number Numéro de flux - + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. Concernant l'adresse %1, Bitmessage ne peut pas supporter les nombres de flux de %2. Essayez de mettre à jour Bitmessage vers la dernière version. - + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. Avertissement : Vous êtes actuellement déconnecté. Bitmessage fera le travail nécessaire pour envoyer le message mais il ne sera pas envoyé tant que vous ne vous connecterez pas. - + Your 'To' field is empty. Votre champ 'Vers' est vide. - + Right click one or more entries in your address book and select 'Send message to this address'. Cliquez droit sur une ou plusieurs entrées dans votre carnet d'adresses et sélectionnez 'Envoyer un message à ces adresses'. - + Error: You cannot add the same address to your subsciptions twice. Perhaps rename the existing one if you want. Erreur : Vous ne pouvez pas ajouter une même adresse à vos abonnements deux fois. Essayez de renommer l'adresse existante. - + Message trashed Message envoyé à la corbeille - + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? Une de vos adresses, %1, est une vieille adresse de la version 1. Les adresses de la version 1 ne sont plus supportées. Nous pourrions la supprimer maintenant ? - + Unknown status: %1 %2 Statut inconnu : %1 %2 - + Connection lost Connexion perdue SOCKS5 Authentication problem: %1 - Problème d'authentification SOCKS5 : %1 + Problème d'authentification SOCKS5 : %1 - + Reply + . Répondre Generating one new address - Génération d'une nouvelle adresse + Génération d'une nouvelle adresse Done generating address. Doing work necessary to broadcast it... - Génération de l'adresse terminée. Travail pour la diffuser en cours... + Génération de l'adresse terminée. Travail pour la diffuser en cours... Done generating address - Génération de l'adresse terminée + Génération de l'adresse terminée Message sent. Waiting on acknowledgement. Sent on %1 - Message envoyé. En attente de l'accusé de réception. Envoyé le %1 + Message envoyé. En attente de l'accusé de réception. Envoyé le %1 Error! Could not find sender address (your address) in the keys.dat file. - Erreur ! L'adresse de l'expéditeur (vous) n'a pas pu être trouvée dans le fichier keys.dat. + Erreur ! L'adresse de l'expéditeur (vous) n'a pas pu être trouvée dans le fichier keys.dat. Doing work necessary to send broadcast... - Travail pour envoyer la diffusion en cours... + Travail pour envoyer la diffusion en cours... Broadcast sent on %1 - Message de diffusion envoyé le %1 + Message de diffusion envoyé le %1 Looking up the receiver's public key - Recherche de la clé publique du destinataire + Recherche de la clé publique du destinataire @@ -777,64 +779,209 @@ Il est important de faire des sauvegardes de ce fichier. Souhaitez-vous l'o Doing work necessary to send message. Receiver's required difficulty: %1 and %2 - Travail nécessaire pour envoyer le message. + Travail nécessaire pour envoyer le message. Difficulté requise par le destinataire : %1 et %2 Problem: The work demanded by the recipient (%1 and %2) is more difficult than you are willing to do. - Problème : Le travail demandé par le destinataire (%1 et %2) est plus difficile que ce que vous souhaitez faire. + Problème : Le travail demandé par le destinataire (%1 et %2) est plus difficile que ce que vous souhaitez faire. - + Work is queued. Travail en attente. - + Work is queued. %1 Travail en attente. %1 - - - Acknowledgement of the message received. %1 - - Doing work necessary to send message. There is no required difficulty for version 2 addresses like this. - Travail nécessaire pour envoyer le message en cours. + Travail nécessaire pour envoyer le message en cours. Il n'y a pas de difficulté requise pour ces adresses de version 2. - + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 - - Encryption key was requested earlier. + + Save message as... - - Sending a request for the recipient's encryption key. + + Mark Unread - - Doing work necessary to request encryption key. + + Subscribe to this address - - Broacasting the public key request. This program will auto-retry if they are offline. + + Message sent. Sent at %1 - - Sending public key request. Waiting for reply. Requested at %1 + + Chan name needed + + + + + You didn't enter a chan name. + + + + + Address already present + + + + + Could not add chan because it appears to already be one of your identities. + + + + + Success + + + + + Successfully created chan. To let others join your chan, give them the chan name and this Bitmessage address: %1. This address also appears in 'Your Identities'. + + + + + Address too new + + + + + Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage. + + + + + Address invalid + + + + + That Bitmessage address is not valid. + + + + + Address does not match chan name + + + + + Although the Bitmessage address you entered was valid, it doesn't match the chan name. + + + + + Successfully joined chan. + + + + + Fetched address from namecoin identity. + + + + + New Message + + + + + From + + + + + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). + + + + + Save As... + + + + + Write error. + + + + + Options have been disabled because they either aren't applicable or because they haven't yet been implemented for your operating system. + + + + + Testing... + + + + + This is a chan address. You cannot use it as a pseudo-mailing list. + + + + + Search + + + + + All + + + + + Message + + + + + Fetch Namecoin ID + + + + + Stream # + + + + + Connections + + + + + Ctrl+Q + Ctrl+Q + + + + F1 + + + + + Join / Create chan @@ -849,99 +996,99 @@ Il n'y a pas de difficulté requise pour ces adresses de version 2. NewAddressDialog - + Create new Address Créer une nouvelle adresse - + Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged. You may generate addresses by using either random numbers or by using a passphrase. If you use a passphrase, the address is called a "deterministic" address. The 'Random Number' option is selected by default but deterministic addresses have several pros and cons: Vous pouvez générer autant d'adresses que vous le souhaitez. En effet, nous vous encourageons à créer et à délaisser vos adresses. Vous pouvez générer des adresses en utilisant des nombres aléatoires ou en utilisant une phrase secrète. Si vous utilisez une phrase secrète, l'adresse sera une adresse "déterministe". L'option 'Nombre Aléatoire' est sélectionnée par défaut mais les adresses déterministes ont certains avantages et inconvénients : - + <html><head/><body><p><span style=" font-weight:600;">Pros:<br/></span>You can recreate your addresses on any computer from memory. <br/>You need-not worry about backing up your keys.dat file as long as you can remember your passphrase. <br/><span style=" font-weight:600;">Cons:<br/></span>You must remember (or write down) your passphrase if you expect to be able to recreate your keys if they are lost. <br/>You must remember the address version number and the stream number along with your passphrase. <br/>If you choose a weak passphrase and someone on the Internet can brute-force it, they can read your messages and send messages as you.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Avantages :<br/></span>Vous pouvez recréer vos adresses sur n'importe quel ordinateur. <br/>Vous n'avez pas à vous inquiéter à propos de la sauvegarde de votre fichier keys.dat tant que vous vous rappelez de votre phrase secrète. <br/><span style=" font-weight:600;">Inconvénients :<br/></span>Vous devez vous rappeler (ou noter) votre phrase secrète si vous souhaitez être capable de récréer vos clés si vous les perdez. <br/>Vous devez vous rappeler du numéro de version de l'adresse et du numéro de flux en plus de votre phrase secrète. <br/>Si vous choisissez une phrase secrète faible et que quelqu'un sur Internet parvient à la brute-forcer, il pourra lire vos messages et vous en envoyer.</p></body></html> - + Use a random number generator to make an address Utiliser un générateur de nombres aléatoires pour créer une adresse - + Use a passphrase to make addresses Utiliser une phrase secrète pour créer une adresse - + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter Créer une adresse plus courte d'un ou deux caractères (nécessite plusieurs minutes de temps de calcul supplémentaires) - + Make deterministic addresses Créer une adresse déterministe - + Address version number: 3 Numéro de version de l'adresse : 3 - + In addition to your passphrase, you must remember these numbers: En plus de votre phrase secrète, vous devez vous rappeler ces numéros : - + Passphrase Phrase secrète - + Number of addresses to make based on your passphrase: Nombre d'adresses à créer sur base de votre phrase secrète : - + Stream number: 1 Nombre de flux : 1 - + Retype passphrase Retapez la phrase secrète - + Randomly generate address Générer une adresse de manière aléatoire - + Label (not shown to anyone except you) Label (seulement visible par vous) - + Use the most available stream Utiliser le flux le plus disponible - + (best if this is the first of many addresses you will create) (préférable si vous générez votre première adresse) - + Use the same stream as an existing address Utiliser le même flux qu'une adresse existante - + (saves you some bandwidth and processing power) (économise de la bande passante et de la puissance de calcul) @@ -949,17 +1096,17 @@ L'option 'Nombre Aléatoire' est sélectionnée par défaut mais NewSubscriptionDialog - + Add new entry Ajouter une nouvelle entrée - + Label Label - + Address Adresse @@ -967,27 +1114,27 @@ L'option 'Nombre Aléatoire' est sélectionnée par défaut mais SpecialAddressBehaviorDialog - + Special Address Behavior Comportement spécial de l'adresse - + Behave as a normal address Se comporter comme une adresse normale - + Behave as a pseudo-mailing-list address Se comporter comme une adresse d'une pseudo liste de diffusion - + Mail received to a pseudo-mailing-list address will be automatically broadcast to subscribers (and thus will be public). Un mail reçu sur une adresse d'une pseudo liste de diffusion sera automatiquement diffusé aux abonnés (et sera donc public). - + Name of the pseudo-mailing-list: Nom de la pseudo liste de diffusion : @@ -995,50 +1142,73 @@ L'option 'Nombre Aléatoire' est sélectionnée par défaut mais aboutDialog - + PyBitmessage PyBitmessage - + version ? version ? - + About À propos - - + + Copyright © 2013 Jonathan Warren Copyright © 2013 Jonathan Warren - + <html><head/><body><p>Distributed under the MIT/X11 software license; see <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html> <html><head/><body><p>Distribué sous la licence logicielle MIT/X11; voir <a href="http://www.opensource.org/licenses/mit-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.opensource.org/licenses/mit-license.php</span></a></p></body></html> - + This is Beta software. Version bêta. + + connectDialog + + + Bitmessage + Bitmessage + + + + Bitmessage won't connect to anyone until you let it. + + + + + Connect now + + + + + Let me configure special network settings first + + + helpDialog - + Help Aide - + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">Wiki d'aide de PyBitmessage</a> - + As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: Bitmessage étant un projet collaboratif, une aide peut être trouvée en ligne sur le Wiki de Bitmessage : @@ -1046,85 +1216,128 @@ L'option 'Nombre Aléatoire' est sélectionnée par défaut mais iconGlossaryDialog - + Icon Glossary Glossaire des icônes - + You have no connections with other peers. Vous n'avez aucune connexion avec d'autres pairs. - + You have made at least one connection to a peer using an outgoing connection but you have not yet received any incoming connections. Your firewall or home router probably isn't configured to forward incoming TCP connections to your computer. Bitmessage will work just fine but it would help the Bitmessage network if you allowed for incoming connections and will help you be a better-connected node. Vous avez au moins une connexion sortante avec un pair mais vous n'avez encore reçu aucune connexion entrante. Votre pare-feu ou routeur n'est probablement pas configuré pour transmettre les connexions TCP vers votre ordinateur. Bitmessage fonctionnera correctement, mais le réseau Bitmessage se portera mieux si vous autorisez les connexions entrantes. Cela vous permettra d'être un nœud mieux connecté. - + You are using TCP port ?. (This can be changed in the settings). Vous utilisez le port TCP ?. (Peut être changé dans les paramètres). - + You do have connections with other peers and your firewall is correctly configured. Vous avez des connexions avec d'autres pairs et votre pare-feu est configuré correctement. + + newChanDialog + + + Dialog + + + + + Create a new chan + + + + + Join a chan + + + + + Create a chan + + + + + <html><head/><body><p>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html> + + + + + Chan name: + + + + + <html><head/><body><p>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></body></html> + + + + + Chan bitmessage address: + + + regenerateAddressesDialog - + Regenerate Existing Addresses Regénérer des adresses existantes - + Regenerate existing addresses Regénérer des adresses existantes - + Passphrase Phrase secrète - + Number of addresses to make based on your passphrase: Nombre d'adresses basées sur votre phrase secrète à créer : - + Address version Number: Numéro de version de l'adresse : - + 3 3 - + Stream number: Numéro du flux : - + 1 1 - + Spend several minutes of extra computing time to make the address(es) 1 or 2 characters shorter Créer une adresse plus courte d'un ou deux caractères (nécessite plusieurs minutes de temps de calcul supplémentaires) - + You must check (or not check) this box just like you did (or didn't) when you made your addresses the first time. Vous devez cocher (ou décocher) cette case comme vous l'aviez fait (ou non) lors de la création de vos adresses la première fois. - + If you have previously made deterministic addresses but lost them due to an accident (like hard drive failure), you can regenerate them here. If you used the random number generator to make your addresses then this form will be of no use to you. Si vous aviez généré des adresses déterministes mais les avez perdues à cause d'un accident, vous pouvez les regénérer ici. Si vous aviez utilisé le générateur de nombres aléatoires pour créer vos adresses, ce formulaire ne vous sera d'aucune utilité. @@ -1132,159 +1345,214 @@ L'option 'Nombre Aléatoire' est sélectionnée par défaut mais settingsDialog - + Settings Paramètres - + Start Bitmessage on user login Démarrer Bitmessage à la connexion de l'utilisateur - + Start Bitmessage in the tray (don't show main window) Démarrer Bitmessage dans la barre des tâches (ne pas montrer la fenêtre principale) - + Minimize to tray Minimiser dans la barre des tâches - + Show notification when message received Montrer une notification lorsqu'un message est reçu - + Run in Portable Mode Lancer en Mode Portable - + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. En Mode Portable, les messages et les fichiers de configuration sont stockés dans le même dossier que le programme plutôt que le dossier de l'application. Cela rend l'utilisation de Bitmessage plus facile depuis une clé USB. - + User Interface Interface utilisateur - + Listening port Port d'écoute - + Listen for connections on port: Écouter les connexions sur le port : - + Proxy server / Tor Serveur proxy / Tor - + Type: Type : - + none aucun - + SOCKS4a SOCKS4a - + SOCKS5 SOCKS5 - + Server hostname: Nom du serveur : - + Port: Port : - + Authentication Authentification - + Username: Utilisateur : - + Pass: Mot de passe : - + Network Settings Paramètres réseau - + When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. Lorsque quelqu'un vous envoie un message, son ordinateur doit d'abord effectuer un travail. La difficulté de ce travail, par défaut, est de 1. Vous pouvez augmenter cette valeur pour les adresses que vous créez en changeant la valeur ici. Chaque nouvelle adresse que vous créez requerra à l'envoyeur de faire face à une difficulté supérieure. Il existe une exception : si vous ajoutez un ami ou une connaissance à votre carnet d'adresses, Bitmessage les notifiera automatiquement lors du prochain message que vous leur envoyez qu'ils ne doivent compléter que la charge de travail minimale : difficulté 1. - + Total difficulty: Difficulté totale : - + Small message difficulty: Difficulté d'un message court : - + The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages. La 'difficulté d'un message court' affecte principalement la difficulté d'envoyer des messages courts. Doubler cette valeur rend la difficulté à envoyer un court message presque double, tandis qu'un message plus long ne sera pas réellement affecté. - + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. La 'difficulté totale' affecte le montant total de travail que l'envoyeur devra compléter. Doubler cette valeur double la charge de travail. - + Demanded difficulty Difficulté demandée - + Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable. Vous pouvez préciser quelle charge de travail vous êtes prêt à effectuer afin d'envoyer un message à une personne. Placer cette valeur à 0 signifie que n'importe quelle valeur est acceptée. - + Maximum acceptable total difficulty: Difficulté maximale acceptée : - + Maximum acceptable small message difficulty: Difficulté maximale pour les messages courts acceptée : - + Max acceptable difficulty Difficulté acceptée max + + + Willingly include unencrypted destination address when sending to a mobile device + + + + + Override automatic language localization (use countycode or language code, e.g. 'en_US' or 'en'): + + + + + Listen for incoming connections when using proxy + + + + + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> + + + + + Host: + + + + + Password: + + + + + Test + + + + + Connect to: + + + + + Namecoind + + + + + NMControl + + + + + Namecoin integration + + diff --git a/src/translations/bitmessage_ru.pro b/src/translations/bitmessage_ru.pro index 71cac3ae..0370961b 100644 --- a/src/translations/bitmessage_ru.pro +++ b/src/translations/bitmessage_ru.pro @@ -1,30 +1,33 @@ -SOURCES += ../addresses.py -SOURCES += ../bitmessagemain.py -SOURCES += ../class_addressGenerator.py -SOURCES += ../class_outgoingSynSender.py -SOURCES += ../class_receiveDataThread.py -SOURCES += ../class_sendDataThread.py -SOURCES += ../class_singleCleaner.py -SOURCES += ../class_singleListener.py -SOURCES += ../class_singleWorker.py -SOURCES += ../class_sqlThread.py -SOURCES += ../helper_bitcoin.py -SOURCES += ../helper_bootstrap.py -SOURCES += ../helper_generic.py -SOURCES += ../helper_inbox.py -SOURCES += ../helper_sent.py -SOURCES += ../helper_startup.py -SOURCES += ../shared.py -SOURCES += ../bitmessageqt/__init__.py -SOURCES += ../bitmessageqt/about.py -SOURCES += ../bitmessageqt/bitmessageui.py -SOURCES += ../bitmessageqt/help.py -SOURCES += ../bitmessageqt/iconglossary.py -SOURCES += ../bitmessageqt/newaddressdialog.py -SOURCES += ../bitmessageqt/newchandialog.py -SOURCES += ../bitmessageqt/newsubscriptiondialog.py -SOURCES += ../bitmessageqt/regenerateaddresses.py -SOURCES += ../bitmessageqt/settings.py -SOURCES += ../bitmessageqt/specialaddressbehavior.py +SOURCES = ../addresses.py\ + ../bitmessagemain.py\ + ../class_addressGenerator.py\ + ../class_outgoingSynSender.py\ + ../class_receiveDataThread.py\ + ../class_sendDataThread.py\ + ../class_singleCleaner.py\ + ../class_singleListener.py\ + ../class_singleWorker.py\ + ../class_sqlThread.py\ + ../helper_bitcoin.py\ + ../helper_bootstrap.py\ + ../helper_generic.py\ + ../helper_inbox.py\ + ../helper_sent.py\ + ../helper_startup.py\ + ../shared.py\ + ../bitmessageqt/__init__.py\ + ../bitmessageqt/about.py\ + ../bitmessageqt/bitmessageui.py\ + ../bitmessageqt/connect.py\ + ../bitmessageqt/help.py\ + ../bitmessageqt/iconglossary.py\ + ../bitmessageqt/newaddressdialog.py\ + ../bitmessageqt/newchandialog.py\ + ../bitmessageqt/newsubscriptiondialog.py\ + ../bitmessageqt/regenerateaddresses.py\ + ../bitmessageqt/settings.py\ + ../bitmessageqt/specialaddressbehavior.py -TRANSLATIONS = bitmessage_ru_RU.ts + +TRANSLATIONS = bitmessage_ru.ts +CODECFORTR = UTF-8 diff --git a/src/translations/bitmessage_ru.qm b/src/translations/bitmessage_ru.qm index efe99c7e..f0bd6342 100644 Binary files a/src/translations/bitmessage_ru.qm and b/src/translations/bitmessage_ru.qm differ diff --git a/src/translations/bitmessage_ru.ts b/src/translations/bitmessage_ru.ts index 6895dd68..3be907d0 100644 --- a/src/translations/bitmessage_ru.ts +++ b/src/translations/bitmessage_ru.ts @@ -1,200 +1,200 @@ - + MainWindow - + One of your addresses, %1, is an old version 1 address. Version 1 addresses are no longer supported. May we delete it now? Один из Ваших адресов, %1, является устаревшим адресом версии 1. Адреса версии 1 больше не поддерживаются. Хотите ли Вы удалить его сейчас? - + Reply Ответить - + Add sender to your Address Book Добавить отправителя в адресную книгу - + Move to Trash Поместить в корзину - + View HTML code as formatted text Просмотреть HTML код как отформатированный текст - + Save message as... Сохранить сообщение как ... - + New Новый адрес - + Enable Включить - + Disable Выключить - + Copy address to clipboard Скопировать адрес в буфер обмена - + Special address behavior... Особое поведение адресов... - + Send message to this address Отправить сообщение на этот адрес - + Subscribe to this address Подписаться на рассылку с этого адреса - + Add New Address Добавить новый адрес - + Delete Удалить - + Copy destination address to clipboard Скопировать адрес отправки в буфер обмена - + Force send Форсировать отправку - + Add new entry Добавить новую запись - + Waiting on their encryption key. Will request it again soon. Ожидаем ключ шифрования от Вашего собеседника. Запрос будет повторен через некоторое время. - + Encryption key request queued. Запрос ключа шифрования поставлен в очередь. - + Queued. В очереди. - + Message sent. Waiting on acknowledgement. Sent at %1 Сообщение отправлено. Ожидаем подтверждения. Отправлено в %1 - + Need to do work to send message. Work is queued. Нужно провести требуемые вычисления, чтобы отправить сообщение. Вычисления ожидают очереди. - + Acknowledgement of the message received %1 - Сообщение доставлено %1 + Сообщение доставлено в %1 - + Broadcast queued. Рассылка ожидает очереди. - + Broadcast on %1 Рассылка на %1 - + Problem: The work demanded by the recipient is more difficult than you are willing to do. %1 Проблема: Ваш получатель требует более сложных вычислений, чем максимум, указанный в Ваших настройках. %1 - + Problem: The recipient's encryption key is no good. Could not encrypt message. %1 Проблема: ключ получателя неправильный. Невозможно зашифровать сообщение. %1 - + Forced difficulty override. Send should start soon. Форсирована смена сложности. Отправляем через некоторое время. - + Unknown status: %1 %2 Неизвестный статус: %1 %2 - + Since startup on %1 - С начала работы %1 + С начала работы в %1 - + Not Connected Не соединено - + Show Bitmessage Показать Bitmessage - + Send - Отправка + Отправить - + Subscribe Подписки - + Address Book Адресная книга - + Quit Выйти - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Вы можете управлять Вашими ключами, отредактировав файл keys.dat, находящийся в той же папке, что и эта программа. Создайте резервную копию этого файла перед тем как будете его редактировать. - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. @@ -203,19 +203,19 @@ It is important that you back up this file. Создайте резервную копию этого файла перед тем как будете его редактировать. - + Open keys.dat? Открыть файл keys.dat? - + You may manage your keys by editing the keys.dat file stored in the same directory as this program. It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) Вы можете управлять Вашими ключами, отредактировав файл keys.dat, находящийся в той же папке, что и эта программа. Создайте резервную копию этого файла перед тем как будете его редактировать. Хотели бы Вы открыть этот файл сейчас? (пожалуйста, закройте Bitmessage до того как Вы внесете в этот файл какие-либо изменения.) - + You may manage your keys by editing the keys.dat file stored in %1 It is important that you back up this file. Would you like to open the file now? (Be sure to close Bitmessage before making any changes.) @@ -225,192 +225,192 @@ It is important that you back up this file. Would you like to open the file now? (пожалуйста, закройте Bitmessage до того как Вы внесете в этот файл какие-либо изменения.) - + Delete trash? Очистить корзину? - + Are you sure you want to delete all trashed messages? Вы уверены, что хотите очистить корзину? - + bad passphrase Неподходящая секретная фраза - + You must type your passphrase. If you don't have one then this is not the form for you. Вы должны ввести секретную фразу. Если Вы не хотите это делать, то Вы выбрали неправильную опцию. - + Processed %1 person-to-person messages. Обработано %1 сообщений. - + Processed %1 broadcast messages. Обработано %1 рассылок. - + Processed %1 public keys. Обработано %1 открытых ключей. - + Total Connections: %1 Всего соединений: %1 - + Connection lost Соединение потеряно - + Connected Соединено - + Message trashed Сообщение удалено - + Error: Bitmessage addresses start with BM- Please check %1 Ошибка: Bitmessage адреса начинаются с BM- Пожалуйста, проверьте %1 - + Error: The address %1 is not typed or copied correctly. Please check it. Ошибка: адрес %1 внесен или скопирован неправильно. Пожалуйста, перепроверьте. - + Error: The address %1 contains invalid characters. Please check it. Ошибка: адрес %1 содержит запрещенные символы. Пожалуйста, перепроверьте. - + Error: The address version in %1 is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever. Ошибка: версия адреса в %1 слишком новая. Либо Вам нужно обновить Bitmessage, либо Ваш собеседник дал неправильный адрес. - + Error: Some data encoded in the address %1 is too short. There might be something wrong with the software of your acquaintance. Ошибка: некоторые данные, закодированные в адресе %1, слишком короткие. Возможно, что-то не так с программой Вашего собеседника. - + Error: Some data encoded in the address %1 is too long. There might be something wrong with the software of your acquaintance. Ошибка: некоторые данные, закодированные в адресе %1, слишком длинные. Возможно, что-то не так с программой Вашего собеседника. - + Error: Something is wrong with the address %1. Ошибка: что-то не так с адресом %1. - + Error: You must specify a From address. If you don't have one, go to the 'Your Identities' tab. Вы должны указать адрес в поле "От кого". Вы можете найти Ваш адрес во вкладе "Ваши Адреса". - + Sending to your address Отправка на Ваш собственный адрес - + Error: One of the addresses to which you are sending a message, %1, is yours. Unfortunately the Bitmessage client cannot process its own messages. Please try running a second client on a different computer or within a VM. Ошибка: Один из адресов, на который Вы отправляете сообщение, %1, принадлежит Вам. К сожалению, Bitmessage не может отправлять сообщения самому себе. Попробуйте запустить второго клиента на другом компьютере или на виртуальной машине. - + Address version number Версия адреса - + Concerning the address %1, Bitmessage cannot understand address version numbers of %2. Perhaps upgrade Bitmessage to the latest version. По поводу адреса %1: Bitmessage не поддерживаем адреса версии %2. Возможно, Вам нужно обновить клиент Bitmessage. - + Stream number Номер потока - + Concerning the address %1, Bitmessage cannot handle stream numbers of %2. Perhaps upgrade Bitmessage to the latest version. По поводу адреса %1: Bitmessage не поддерживаем стрим номер %2. Возможно, Вам нужно обновить клиент Bitmessage. - + Warning: You are currently not connected. Bitmessage will do the work necessary to send the message but it won't send until you connect. Внимание: Вы не подключены к сети. Bitmessage проделает необходимые вычисления, чтобы отправить сообщение, но не отправит его до тех пор, пока Вы не подсоединитесь к сети. - + Your 'To' field is empty. Вы не заполнили поле 'Кому'. - + Work is queued. Вычисления поставлены в очередь. - + Right click one or more entries in your address book and select 'Send message to this address'. Нажмите правую кнопку мышки на каком-либо адресе и выберите "Отправить сообщение на этот адрес". - + Work is queued. %1 Вычисления поставлены в очередь. %1 - + New Message Новое сообщение - + From От - + Address is valid. Адрес введен правильно. - + Error: You cannot add the same address to your address book twice. Try renaming the existing one if you want. Ошибка: Вы не можете добавлять один и тот же адрес в Адресную Книгу несколько раз. Просто переименуйте существующий адрес. - + The address you entered was invalid. Ignoring it. Вы ввели неправильный адрес. Это адрес проигнорирован. - + Error: You cannot add the same address to your subsciptions twice. Perhaps rename the existing one if you want. Ошибка: Вы не можете добавлять один и тот же адрес в подписку несколько раз. Просто переименуйте существующую подписку. - + Restart Перезапустить - + You must restart Bitmessage for the port number change to take effect. Вы должны перезапустить Bitmessage, чтобы смена номера порта имела эффект. @@ -420,458 +420,501 @@ It is important that you back up this file. Would you like to open the file now? Bitmessage будет использовать Ваш прокси в дальнейшем, тем не менее, мы рекомендуем перезапустить Bitmessage в ручную, чтобы закрыть уже существующие соединения. - + Error: You cannot add the same address to your list twice. Perhaps rename the existing one if you want. Ошибка: Вы не можете добавлять один и тот же адрес в список несколько раз. Просто переименуйте существующий адрес. - + Passphrase mismatch Секретная фраза не подходит - + The passphrase you entered twice doesn't match. Try again. Вы ввели две разные секретные фразы. Пожалуйста, повторите заново. - + Choose a passphrase Придумайте секретную фразу - + You really do need a passphrase. Вы действительно должны ввести секретную фразу. - + All done. Closing user interface... Программа завершена. Закрываем пользовательский интерфейс... - + Address is gone Адрес утерян - + Bitmessage cannot find your address %1. Perhaps you removed it? Bitmessage не может найти Ваш адрес %1. Возможно Вы удалили его? - + Address disabled Адрес выключен - + Error: The address from which you are trying to send is disabled. You'll have to enable it on the 'Your Identities' tab before using it. Ошибка: адрес, с которого Вы пытаетесь отправить, выключен. Вам нужно будет включить этот адрес во вкладке "Ваши адреса". - + Entry added to the Address Book. Edit the label to your liking. Запись добавлена в Адресную Книгу. Вы можете ее отредактировать. - + Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back. Удалено в корзину. Чтобы попасть в корзину, Вам нужно будет найти файл корзины на диске. - + Save As... Сохранить как ... - + Write error. Ошибка записи. - + No addresses selected. Вы не выбрали адрес. - + Options have been disabled because they either aren't applicable or because they haven't yet been implemented for your operating system. Опции были отключены, потому что ли они либо не подходят, либо еще не выполнены под Вашу операционную систему. - + The address should start with ''BM-'' Адрес должен начинаться с "BM-" - + The address is not typed or copied correctly (the checksum failed). Адрес введен или скопирован неверно (контрольная сумма не сходится). - + The version number of this address is higher than this software can support. Please upgrade Bitmessage. Версия этого адреса более поздняя, чем Ваша программа. Пожалуйста, обновите программу Bitmessage. - + The address contains invalid characters. Адрес содержит запрещенные символы. - + Some data encoded in the address is too short. Данные, закодированные в адресе, слишком короткие. - + Some data encoded in the address is too long. Данные, закодированные в адресе, слишком длинные. - + You are using TCP port %1. (This can be changed in the settings). Вы используете TCP порт %1 (Его можно поменять в настройках). - + Bitmessage Bitmessage - + To Кому - + From От кого - + Subject Тема - + Received Получено - + Inbox Входящие - + Load from Address book Взять из адресной книги - + Message: Сообщение: - + Subject: Тема: - + Send to one or more specific people Отправить одному или нескольким указанным получателям - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + To: Кому: - + From: От: - + Broadcast to everyone who is subscribed to your address Рассылка всем, кто подписался на Ваш адрес - + Be aware that broadcasts are only encrypted with your address. Anyone who knows your address can read them. Пожалуйста, учитывайте, что рассылки шифруются лишь Вашим адресом. Любой человек, который знает Ваш адрес, сможет прочитать Вашу рассылку. - + Status Статус - + Sent Отправленные - + Label (not shown to anyone) - Название (не показывается никому) + Имя (не показывается никому) - + Address Адрес - + Stream Поток - + Your Identities Ваши Адреса - + Here you can subscribe to 'broadcast messages' that are sent by other users. Messages will appear in your Inbox. Addresses here override those on the Blacklist tab. Здесь Вы можете подписаться на рассылки от других пользователей. Все рассылки будут появляться у Вас во Входящих. Вы будете следить за всеми адресами, указанными здесь, даже если они в черном списке. - + Add new Subscription Добавить новую подписку - + Label - Название + Имя - + Subscriptions Подписки - + The Address book is useful for adding names or labels to other people's Bitmessage addresses so that you can recognize them more easily in your inbox. You can add entries here using the 'Add' button, or from your inbox by right-clicking on a message. Адресная книга удобна для присвоения осмысленных имен Bitmessage адресам Ваших друзей. Вы можете добавлять новые записи с помощью кнопки "Добавить новую запись", или же правым кликом мышки на сообщении. - + Name or Label - Название + Имя - + Use a Blacklist (Allow all incoming messages except those on the Blacklist) Использовать черный список (Разрешить все входящие сообщения, кроме указанных в черном списке) - + Use a Whitelist (Block all incoming messages except those on the Whitelist) Использовать белый список (блокировать все входящие сообщения, кроме указанных в белом списке) - + Blacklist Черный список - + Stream # № потока - + Connections Соединений - + Total connections: 0 Всего соединений: 0 - + Since startup at asdf: С начала работы программы в asdf: - + Processed 0 person-to-person message. Обработано 0 сообщений. - + Processed 0 public key. Обработано 0 открытых ключей. - + Processed 0 broadcast. Обработано 0 рассылок. - + Network Status Статус сети - + File Файл - + Settings Настройки - + Help Помощь - + Import keys Импортировать ключи - + Manage keys Управлять ключами - + About О программе - + Regenerate deterministic addresses Сгенерировать заново все адреса - + Delete all trashed messages Стереть все сообщения из корзины - + Message sent. Sent at %1 Сообщение отправлено в %1 - + Chan name needed Требуется имя chan-а - + You didn't enter a chan name. Вы не ввели имя chan-a. - + Address already present Адрес уже существует - + Could not add chan because it appears to already be one of your identities. Не могу добавить chan, потому что это один из Ваших уже существующих адресов. - + Success Отлично - + Successfully created chan. To let others join your chan, give them the chan name and this Bitmessage address: %1. This address also appears in 'Your Identities'. Chan был успешно создан. Чтобы добавить других в сhan, сообщите им имя chan-а и этот Bitmessage адрес: %1. Этот адрес также отображается во вкладке "Ваши Адреса". - + Address too new Адрес слишком новый - + Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage. Этот Bitmessage адрес похож на правильный, но его версия этого адреса слишком новая. Возможно, Вам необходимо обновить программу Bitmessage. - + Address invalid Неправильный адрес - + That Bitmessage address is not valid. Этот Bitmessage адрес введен неправильно. - + Address does not match chan name Адрес не сходится с именем chan-а - + Although the Bitmessage address you entered was valid, it doesn't match the chan name. Вы ввели верный адрес Bitmessage, но он не сходится с именем chan-а. - + Successfully joined chan. Успешно присоединились к chan-у. - + Bitmessage will use your proxy from now on but you may want to manually restart Bitmessage now to close existing connections (if any). Bitmessage будет использовать Ваш прокси, начиная прямо сейчас. Тем не менее Вам имеет смысл перезапустить Bitmessage, чтобы закрыть уже существующие соединения. - + This is a chan address. You cannot use it as a pseudo-mailing list. Это адрес chan-а. Вы не можете его использовать как адрес рассылки. - + Search Поиск - + All - Всем + По всем полям - + Message Текст сообщения - + Join / Create chan Подсоединиться или создать chan + + + Mark Unread + Отметить как непрочитанное + + + + Fetched address from namecoin identity. + Получить адрес через Namecoin. + + + + Testing... + Проверяем... + + + + Fetch Namecoin ID + Получить Namecoin ID + + + + Ctrl+Q + Ctrl+Q + + + + F1 + F1 + + + + <!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:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"><br /></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:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"><br /></p></body></html> + NewAddressDialog @@ -949,7 +992,7 @@ The 'Random Number' option is selected by default but deterministic ad Label (not shown to anyone except you) - Название (не показывается никому кроме Вас) + Имя (не показывается никому кроме Вас) @@ -1025,7 +1068,7 @@ The 'Random Number' option is selected by default but deterministic ad Label - Название + Имя @@ -1094,6 +1137,29 @@ The 'Random Number' option is selected by default but deterministic ad Это бета версия программы. + + connectDialog + + + Bitmessage + Bitmessage + + + + Bitmessage won't connect to anyone until you let it. + Bitmessage не будет соединяться ни с кем, пока Вы не разрешите. + + + + Connect now + Соединиться прямо сейчас + + + + Let me configure special network settings first + Я хочу сперва настроить сетевые настройки + + helpDialog @@ -1143,45 +1209,50 @@ The 'Random Number' option is selected by default but deterministic ad newChanDialog - + Dialog Новый chan - + Create a new chan Создать новый chan - + Join a chan Присоединиться к chan - + Create a chan Создать chan Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. - Введите имя Вашего chan-a. Если Вы выберете достаточно сложное имя для chan-а (например, сложную и необычную секретную фразу) и никто из Ваших друзей не опубликует эту фразу, то Вам chan будет надежно зашифрован. + Введите имя Вашего chan-a. Если Вы выберете достаточно сложное имя для chan-а (например, сложную и необычную секретную фразу) и никто из Ваших друзей не опубликует эту фразу, то Вам chan будет надежно зашифрован. - + Chan name: Имя chan: - + <html><head/><body><p>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></body></html> <html><head/><body><p>Chan - это способ общения, когда набор ключей шифрования известен сразу целой группе людей. Ключи и Bitmessage-адрес, используемый chan-ом, генерируется из слова или фразы (имя chan-а). Чтобы отправить сообщение всем, находящимся в chan-е, отправьте обычное приватное сообщения на адрес chan-a.</p><p>Chan-ы - это экспериментальная фича.</p></body></html> - + Chan bitmessage address: Bitmessage адрес chan: + + + <html><head/><body><p>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html> + <html><head/><body><p>Введите имя Вашего chan-a. Если Вы выберете достаточно сложное имя для chan-а (например, сложную и необычную секретную фразу) и никто из Ваших друзей не опубликует эту фразу, то Вам chan будет надежно зашифрован. Если Вы и кто-то другой независимо создадите chan с полностью идентичным именем, то скорее всего Вы получите в итоге один и тот же chan.</p></body></html> + regenerateAddressesDialog @@ -1244,164 +1315,268 @@ The 'Random Number' option is selected by default but deterministic ad settingsDialog - + Settings Настройки - + Start Bitmessage on user login Запускать Bitmessage при входе в систему - + Start Bitmessage in the tray (don't show main window) Запускать Bitmessage в свернутом виде (не показывать главное окно) - + Minimize to tray Сворачивать в трей - + Show notification when message received Показывать уведомления при получении новых сообщений - + Run in Portable Mode Запустить в переносном режиме - + In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive. В переносном режиме, все сообщения и конфигурационные файлы сохраняются в той же самой папке что и сама программа. Это делает более удобным использование Bitmessage с USB-флэшки. - + User Interface Пользовательские - + Listening port Порт прослушивания - + Listen for connections on port: Прослушивать соединения на порту: - + Proxy server / Tor Прокси сервер / Tor - + Type: Тип: - + none отсутствует - + SOCKS4a SOCKS4a - + SOCKS5 SOCKS5 - + Server hostname: Адрес сервера: - + Port: Порт: - + Authentication Авторизация - + Username: Имя пользователя: - + Pass: Прль: - + Network Settings Сетевые настройки - + When someone sends you a message, their computer must first complete some work. The difficulty of this work, by default, is 1. You may raise this default for new addresses you create by changing the values here. Any new addresses you create will require senders to meet the higher difficulty. There is one exception: if you add a friend or acquaintance to your address book, Bitmessage will automatically notify them when you next send a message that they need only complete the minimum amount of work: difficulty 1. Когда кто-либо отправляет Вам сообщение, его компьютер должен сперва решить определенную вычислительную задачу. Сложность этой задачи по умолчанию равна 1. Вы можете повысить эту сложность для новых адресов, которые Вы создадите, здесь. Таким образом, любые новые адреса, которые Вы создадите, могут требовать от отправителей сложность большую чем 1. Однако, есть одно исключение: если Вы специально добавите Вашего собеседника в адресную книгу, то Bitmessage автоматически уведомит его о том, что для него минимальная сложность будет составлять всегда всего лишь 1. - + Total difficulty: Общая сложность: - + Small message difficulty: Сложность для маленьких сообщений: - + The 'Small message difficulty' mostly only affects the difficulty of sending small messages. Doubling this value makes it almost twice as difficult to send a small message but doesn't really affect large messages. "Сложность для маленьких сообщений" влияет исключительно на небольшие сообщения. Увеличив это число в два раза, вы сделаете отправку маленьких сообщений в два раза сложнее, в то время как сложность отправки больших сообщений не изменится. - + The 'Total difficulty' affects the absolute amount of work the sender must complete. Doubling this value doubles the amount of work. "Общая сложность" влияет на абсолютное количество вычислений, которые отправитель должен провести, чтобы отправить сообщение. Увеличив это число в два раза, вы увеличите в два раза объем требуемых вычислений. - + Demanded difficulty Требуемая сложность - + Here you may set the maximum amount of work you are willing to do to send a message to another person. Setting these values to 0 means that any value is acceptable. Здесь Вы можете установить максимальную вычислительную работу, которую Вы согласны проделать, чтобы отправить сообщение другому пользователю. Ноль означает, чтобы любое значение допустимо. - + Maximum acceptable total difficulty: Макс допустимая общая сложность: - + Maximum acceptable small message difficulty: Макс допустимая сложность для маленький сообщений: - + Max acceptable difficulty Макс допустимая сложность - + Listen for incoming connections when using proxy Прослушивать входящие соединения если используется прокси + + + Willingly include unencrypted destination address when sending to a mobile device + Специально прикреплять незашифрованный адрес получателя, когда посылаем на мобильное устройство + + + + <html><head/><body><p>Bitmessage can utilize a different Bitcoin-based program called Namecoin to make addresses human-friendly. For example, instead of having to tell your friend your long Bitmessage address, you can simply tell him to send a message to <span style=" font-style:italic;">test. </span></p><p>(Getting your own Bitmessage address into Namecoin is still rather difficult).</p><p>Bitmessage can use either namecoind directly or a running nmcontrol instance.</p></body></html> + <html><head/><body><p>Bitmessage умеет пользоваться программой Namecoin для того, чтобы сделать адреса более дружественными для пользователей. Например, вместо того, чтобы диктовать Вашему другу длинный и нудный адрес Bitmessage, Вы можете попросить его отправить сообщение на адрес вида <span style=" font-style:italic;">test. </span></p><p>(Перенести Ваш Bitmessage адрес в Namecoin по-прежнему пока довольно сложно).</p><p>Bitmessage может использовать либо прямо namecoind, либо уже запущенную программу nmcontrol.</p></body></html> + + + + Host: + Адрес: + + + + Password: + Пароль: + + + + Test + Проверить + + + + Connect to: + Подсоединиться к: + + + + Namecoind + Namecoind + + + + NMControl + NMControl + + + + Namecoin integration + Интеграция с Namecoin + + + + Interface Language + Язык интерфейса + + + + System Settings + system + Язык по умолчанию + + + + English + en + English + + + + Esperanto + eo + Esperanto + + + + Français + fr + Francais + + + + Deutsch + de + Deutsch + + + + Español + es + Espanol + + + + Русский + ru + Русский + + + + Pirate English + en_pirate + Pirate English + + + + Other (set in keys.dat) + other + Другие (настроено в keys.dat) +