From 035bb843bf32d2bcdbb737d91296fbb0475e1c62 Mon Sep 17 00:00:00 2001 From: David Sterry Date: Wed, 21 Dec 2016 09:57:55 -0800 Subject: [PATCH 01/13] i18n base for rein/cli.py --- rein/cli.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/rein/cli.py b/rein/cli.py index 929e11e..2b823c4 100644 --- a/rein/cli.py +++ b/rein/cli.py @@ -25,6 +25,7 @@ from lib.util import unique from lib.io import safe_get from lib.script import build_2_of_3, build_mandatory_multisig, check_redeem_scripts +from lib.localization import init_localization # Import config import lib.config as config @@ -42,12 +43,13 @@ from lib.mediator import Mediator rein = config.Config() +init_localization() @click.group() @click.option('--debug/--no-debug', default=False) @click.pass_context def cli(ctx, debug): - """ + _(""" Rein is a decentralized professional services market and Python-rein is a client that provides a user interface. Use this program from your local browser or command line to create an account, post a job, bid, etc. @@ -71,7 +73,7 @@ def cli(ctx, debug): $ rein resolve - mediator posts decision For more info and the setup guide visit: http://reinproject.org - """ + """) if debug: click.echo("Debuggin'") pass @@ -80,22 +82,22 @@ def cli(ctx, debug): @cli.command() @click.option('--multi/--no-multi', default=False, help="add even if an identity exists") def setup(multi): - """ + _(""" Setup or import an identity. You will choose a name or handle for your account, include public contact information, and a delegate Bitcoin address/private key that the program will use to sign documents on your behalf. An enrollment document will be created and you will need to sign it with your master Bitcoin private key. - """ + """) log = rein.get_log() if multi: rein.set_multiuser() log.info('entering setup') if multi or rein.has_no_account(): - click.echo("\n" + hilight("Welcome to Rein.", True, True) + "\n\n" - "Do you want to import a backup or create a new account?\n\n" - "1 - Create new account\n2 - Import backup\n") + click.echo("\n" + hilight(_("Welcome to Rein."), True, True) + "\n\n" + + _("Do you want to import a backup or create a new account?\n\n") + + _("1 - Create new account\n2 - Import backup\n")) choice = click.prompt(hilight("Choice", True, True), type=int, default=1) if choice == 1: create_account(rein) From b7dbf1ff0d6c2c0efc79d47d6d3d2e34620eb2fc Mon Sep 17 00:00:00 2001 From: David Sterry Date: Wed, 21 Dec 2016 11:26:37 -0800 Subject: [PATCH 02/13] full python coverage, still some static strings in html --- README.md | 6 + messages.po | 245 +++++++++++++++++++++++++++++++++++++++ rein/lib/forms.py | 62 +++++----- rein/lib/io.py | 2 +- rein/lib/localization.py | 22 ++++ rein/lib/market.py | 2 +- rein/lib/order.py | 34 +++--- rein/lib/toolbox.py | 2 +- rein/lib/validate.py | 4 +- 9 files changed, 327 insertions(+), 52 deletions(-) create mode 100644 messages.po create mode 100644 rein/lib/localization.py diff --git a/README.md b/README.md index 37aed0a..ed2df2a 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,12 @@ For the mediator payment, a mandatory multisig address is created. To spend the Like with the primary payment, a user is prompted for a signed mediator payment if they are a job creator accepting a delivery or they are the mediator resolving a dispute. +## Developer Notes + +To generate or update pot files for translation, run the following from the root of the repo: + + xgettext.pl rein/cli.py rein/lib/*.py + ## Testing To help test, download and run [a server](https://github.com/ReinProject/causeway) locally. Run `rein testnet true`, then `rein setup`. You can use the address/key pairs on [this sheet](https://docs.google.com/spreadsheets/d/1IRDvu-24LCDOTM1B3lwW9cfQM-zSCK1eds5Sb4QhpWY/edit#gid=691104568) for convenience to setup Alice, Bob, and Charlie with the right keys/identities. diff --git a/messages.po b/messages.po new file mode 100644 index 0000000..0d06b43 --- /dev/null +++ b/messages.po @@ -0,0 +1,245 @@ +# Rein Decentralized Freelance Market. +# Copyright (C) 2016 +# This file is distributed under the same license as the python-rein package. +# David Stery , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.2\n" +"POT-Creation-Date: 2016-12-21 11:00+PST\n" +"PO-Revision-Date: 2016-12-21 11:00+PST\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: rein/cli.py:52 +msgid "" +"\n" +" Rein is a decentralized professional services market and Python-rein is a client\n" +"that provides a user interface. Use this program from your local browser or command \n" +"line to create an account, post a job, bid, etc.\n" +"\n" +"\b\n" +" Quick start:\n" +" $ rein start - create an identity, run the Web UI\n" +" $ rein buy - request microhosting\n" +" $ rein sync - push your identity to microhosting servers\n" +" $ rein status - get user status, or dump of job's documents\n" +"\n" +"\b\n" +" Workers\n" +" $ rein bid - view and bid on jobs\n" +" $ rein deliver - complete job by providing deliverables\n" +"\n" +"\b\n" +" Disputes\n" +" $ rein workerdispute - worker files dispute\n" +" $ rein creatordispute - job creator files dispute\n" +" $ rein resolve - mediator posts decision\n" +"\n" +" For more info and the setup guide visit: http://reinproject.org\n" +" " +msgstr "" + +#: rein/cli.py:85 +msgid "" +"\n" +" Setup or import an identity.\n" +"\n" +" You will choose a name or handle for your account, include public contact information, \n" +" and a delegate Bitcoin address/private key that the program will use to sign documents\n" +" on your behalf. An enrollment document will be created and you will need to sign it\n" +" with your master Bitcoin private key.\n" +" " +msgstr "" + +#: rein/cli.py:98 +msgid "" +"1 - Create new account\n" +"2 - Import backup\n" +msgstr "" + +#: rein/lib/forms.py:51 +msgid "Bid amount" +msgstr "" + +#: rein/lib/forms.py:52 +msgid "Choose Job to bid on" +msgstr "" + +#: rein/lib/forms.py:55 +msgid "Choose bid" +msgstr "" + +#: rein/lib/forms.py:63 +msgid "Choose job" +msgstr "" + +#: rein/lib/forms.py:59 +msgid "Choose job associated with deliverables" +msgstr "" + +#: rein/lib/forms.py:47 +msgid "Choose mediator" +msgstr "" + +#: rein/lib/forms.py:33 +msgid "Delegate Bitcoin address" +msgstr "" + +#: rein/lib/forms.py:34 +msgid "Delegate Bitcoin private Key" +msgstr "" + +#: rein/lib/forms.py:58 rein/lib/forms.py:68 +msgid "Deliverables" +msgstr "" + +#: rein/lib/forms.py:44 rein/lib/forms.py:50 +msgid "Description" +msgstr "" + +#: rein/lib/forms.py:62 +msgid "Dispute detail" +msgstr "" + +#: rein/lib/forms.py:74 +msgid "Disputes" +msgstr "" + +#: rein/cli.py:97 +msgid "" +"Do you want to import a backup or create a new account?\n" +"\n" +msgstr "" + +#: rein/lib/forms.py:31 +msgid "Email / Bitmessage" +msgstr "" + +#: rein/lib/io.py:16 +msgid "Error connecting to server." +msgstr "" + +#: rein/lib/forms.py:46 +msgid "Expiration (days)" +msgstr "" + +#: rein/lib/market.py:54 +msgid "File containing signed document" +msgstr "" + +#: rein/lib/order.py:18 +msgid "" +"Funds for each job in Rein are stored in two multisig addresses. One address\n" +"is for the primary payment that will go to the worker on completion. The\n" +"second address pays the mediator to be available to resolve a dispute\n" +"if necessary. The second address should be funded according to the percentage\n" +"specified by the mediator and is in addition to the primary payment. The\n" +"listing below shows available mediators and the fee they charge. You should\n" +"consider the fee as well as any reputational data you are able to find when\n" +"choosing a mediator. Your choice may affect the number and quality of bids" +msgstr "" + +#: rein/lib/forms.py:22 +msgid "Invalid address" +msgstr "" + +#: rein/lib/forms.py:27 +msgid "Invalid signature" +msgstr "" + +#: rein/lib/forms.py:43 +msgid "Job name" +msgstr "" + +#: rein/lib/forms.py:32 +msgid "Master Bitcoin address" +msgstr "" + +#: rein/lib/forms.py:36 +msgid "Mediator Fee" +msgstr "" + +#: rein/lib/forms.py:30 +msgid "Name / Handle" +msgstr "" + +#: rein/lib/validate.py:168 +msgid "None found" +msgstr "" + +#: rein/lib/forms.py:18 +msgid "Not a valid private key." +msgstr "" + +#: rein/lib/toolbox.py:9 +msgid "Please enter " +msgstr "" + +#: rein/lib/forms.py:35 +msgid "Register as a mediator?" +msgstr "" + +#: rein/lib/forms.py:73 +msgid "Resolution" +msgstr "" + +#: rein/lib/forms.py:40 +msgid "Signed enrollment" +msgstr "" + +#: rein/lib/forms.py:67 rein/lib/forms.py:72 +msgid "Signed mediator payment" +msgstr "" + +#: rein/lib/forms.py:66 rein/lib/forms.py:71 +msgid "Signed primary payment" +msgstr "" + +#: rein/lib/forms.py:45 +msgid "Tags" +msgstr "" + +#: rein/lib/validate.py:14 +msgid "Verifying block times..." +msgstr "" + +#: rein/cli.py:98 +msgid "Welcome to Rein." +msgstr "" + +#: rein/lib/order.py:31 +msgid "bid submitted" +msgstr "" + +#: rein/lib/order.py:67 +msgid "complete, dispute resolved" +msgstr "" + +#: rein/lib/order.py:61 +msgid "complete, work accepted" +msgstr "" + +#: rein/lib/order.py:43 +msgid "deliverables submitted" +msgstr "" + +#: rein/lib/order.py:49 +msgid "disputed by job creator" +msgstr "" + +#: rein/lib/order.py:55 +msgid "disputed by worker" +msgstr "" + +#: rein/lib/order.py:37 +msgid "job awarded" +msgstr "" + +#: rein/lib/order.py:17 +msgid "posted" +msgstr "" diff --git a/rein/lib/forms.py b/rein/lib/forms.py index c7ca98b..925f851 100644 --- a/rein/lib/forms.py +++ b/rein/lib/forms.py @@ -15,60 +15,60 @@ def validate_privkey(form, field): if not privkey_to_address(field.data): - raise ValidationError("Not a valid private key.") + raise ValidationError(_("Not a valid private key.")) def validate_address(form, field): if not check_bitcoin_address(field.data): - raise ValidationError("Invalid address") + raise ValidationError(_("Invalid address")) def validate_en(form, field): message = field.data.replace("\r\n","\n") if not validate_enrollment(message): - raise ValidationError("Invalid signature") + raise ValidationError(_("Invalid signature")) class SetupForm(Form): - name = TextField('Name / Handle', validators = [Required()]) - contact = TextField('Email / Bitmessage', validators = [Required()]) - maddr = TextField('Master Bitcoin address', validators = [Required(), validate_address]) - daddr = TextField('Delegate Bitcoin address', validators = [Required(), validate_address]) - dkey = PasswordField('Delegate Bitcoin private Key', validators = [Required(), validate_privkey]) - will_mediate = RadioField('Register as a mediator?', choices = [('1','Yes'), ('0', 'No')]) - mediator_fee = TextField('Mediator Fee') # TODO make required only if Yes above + name = TextField(_('Name / Handle'), validators = [Required()]) + contact = TextField(_('Email / Bitmessage'), validators = [Required()]) + maddr = TextField(_('Master Bitcoin address'), validators = [Required(), validate_address]) + daddr = TextField(_('Delegate Bitcoin address'), validators = [Required(), validate_address]) + dkey = PasswordField(_('Delegate Bitcoin private Key'), validators = [Required(), validate_privkey]) + will_mediate = RadioField(_('Register as a mediator?'), choices = [('1','Yes'), ('0', 'No')]) + mediator_fee = TextField(_('Mediator Fee')) # TODO make required only if Yes above class SignForm(Form): identity_id = HiddenField("identity_id") - signed = TextAreaField('Signed enrollment', validators = [Required(), validate_en]) + signed = TextAreaField(_('Signed enrollment'), validators = [Required(), validate_en]) class JobPostForm(Form): - job_name = TextField('Job name', validators = [Required()]) - description = TextAreaField('Description', validators = [Required()]) - tags = TextField('Tags', validators = [Required()]) - expire_days = TextField('Expiration (days)', validators = [Required()]) - mediator_maddr = RadioField('Choose mediator') + job_name = TextField(_('Job name'), validators = [Required()]) + description = TextAreaField(_('Description'), validators = [Required()]) + tags = TextField(_('Tags'), validators = [Required()]) + expire_days = TextField(_('Expiration (days)'), validators = [Required()]) + mediator_maddr = RadioField(_('Choose mediator')) class BidForm(Form): - description = TextAreaField('Description', validators = [Required()]) - bid_amount = TextAreaField('Bid amount', validators = [Required()]) - job_id = RadioField('Choose Job to bid on') + description = TextAreaField(_('Description'), validators = [Required()]) + bid_amount = TextAreaField(_('Bid amount'), validators = [Required()]) + job_id = RadioField(_('Choose Job to bid on')) class JobOfferForm(Form): - bid_id = RadioField('Choose bid') + bid_id = RadioField(_('Choose bid')) class DeliverForm(Form): - deliverable = TextAreaField('Deliverables', validators = [Required()]) - job_id = RadioField('Choose job associated with deliverables') + deliverable = TextAreaField(_('Deliverables'), validators = [Required()]) + job_id = RadioField(_('Choose job associated with deliverables')) class DisputeForm(Form): - dispute_detail = TextAreaField('Dispute detail', validators = [Required()]) - order_id = RadioField('Choose job') + dispute_detail = TextAreaField(_('Dispute detail'), validators = [Required()]) + order_id = RadioField(_('Choose job')) class AcceptForm(Form): - signed_primary_payment = TextAreaField('Signed primary payment', validators = [Required()]) - signed_mediator_payment = TextAreaField('Signed mediator payment', validators = [Required()]) - deliverable_id = RadioField('Deliverables') + signed_primary_payment = TextAreaField(_('Signed primary payment'), validators = [Required()]) + signed_mediator_payment = TextAreaField(_('Signed mediator payment'), validators = [Required()]) + deliverable_id = RadioField(_('Deliverables')) class ResolveForm(Form): - signed_primary_payment = TextAreaField('Signed primary payment', validators = [Required()]) - signed_mediator_payment = TextAreaField('Signed mediator payment', validators = [Required()]) - resolution = TextAreaField('Resolution', validators = [Required()]) - dispute_id = RadioField('Disputes') + signed_primary_payment = TextAreaField(_('Signed primary payment'), validators = [Required()]) + signed_mediator_payment = TextAreaField(_('Signed mediator payment'), validators = [Required()]) + resolution = TextAreaField(_('Resolution'), validators = [Required()]) + dispute_id = RadioField(_('Disputes')) diff --git a/rein/lib/io.py b/rein/lib/io.py index d0e9fbd..4e96045 100644 --- a/rein/lib/io.py +++ b/rein/lib/io.py @@ -13,7 +13,7 @@ def safe_get(log, url): try: answer = requests.get(url=url, proxies=rein.proxies) except requests.ConnectionError: - click.echo('Error connecting to server.') + click.echo(_('Error connecting to server.')) log.error('server connect error ' + url) return None diff --git a/rein/lib/localization.py b/rein/lib/localization.py new file mode 100644 index 0000000..f6a7bce --- /dev/null +++ b/rein/lib/localization.py @@ -0,0 +1,22 @@ +import gettext +import locale +import logging + +def init_localization(): + '''prepare l10n''' + locale.setlocale(locale.LC_ALL, '') # use user's preferred locale + # take first two characters of country code + loc = locale.getlocale() + filename = "res/messages_%s.mo" % locale.getlocale()[0][0:2] + + try: + logging.debug( "Opening message file %s for locale %s", filename, loc[0] ) + trans = gettext.GNUTranslations(open( filename, "rb" ) ) + except IOError: + logging.debug( "Locale not found. Using default messages" ) + trans = gettext.NullTranslations() + + trans.install() + +if __name__ == '__main__': + init_localization() diff --git a/rein/lib/market.py b/rein/lib/market.py index f68de85..70ce26d 100644 --- a/rein/lib/market.py +++ b/rein/lib/market.py @@ -51,7 +51,7 @@ def sign_and_store_document(rein, doc_type, document, signature_address=None, si click.echo("\n%s\n" % document) done = False while not done: - filename = click.prompt("File containing signed document", type=str, default=doc_type + '.sig.txt') + filename = click.prompt(_("File containing signed document"), type=str, default=doc_type + '.sig.txt') if os.path.isfile(filename): done = True f = open(filename, 'r') diff --git a/rein/lib/order.py b/rein/lib/order.py index 33a8ef8..db49abc 100644 --- a/rein/lib/order.py +++ b/rein/lib/order.py @@ -1,68 +1,70 @@ from sqlalchemy import Column, Integer, String, Boolean, and_ from sqlalchemy.ext.declarative import declarative_base +from localization import init_localization try: from document import Document except: pass Base = declarative_base() +init_localization() STATE = { 'job_posting': { 'pre': [], 'next': ['bid'], 'endpoint': '/post', - 'past_tense': 'posted', - 'description': "Funds for each job in Rein are stored in two multisig addresses. One address\n" \ - "is for the primary payment that will go to the worker on completion. The\n" \ - "second address pays the mediator to be available to resolve a dispute\n" \ - "if necessary. The second address should be funded according to the percentage\n" \ - "specified by the mediator and is in addition to the primary payment. The\n" \ - "listing below shows available mediators and the fee they charge. You should\n" \ - "consider the fee as well as any reputational data you are able to find when\n" \ - "choosing a mediator. Your choice may affect the number and quality of bids\n" + 'past_tense': _('posted'), + 'description': _("""Funds for each job in Rein are stored in two multisig addresses. One address +is for the primary payment that will go to the worker on completion. The +second address pays the mediator to be available to resolve a dispute +if necessary. The second address should be funded according to the percentage +specified by the mediator and is in addition to the primary payment. The +listing below shows available mediators and the fee they charge. You should +consider the fee as well as any reputational data you are able to find when +choosing a mediator. Your choice may affect the number and quality of bids"""), }, 'bid': { 'pre': ['job_posting'], 'next': ['offer'], 'endpoint': None, - 'past_tense': 'bid submitted' + 'past_tense': _('bid submitted'), }, 'offer': { 'pre': ['bid'], 'next': ['delivery', 'creatordispute', 'workerdispute'], 'endpoint': '/offer', - 'past_tense': 'job awarded', + 'past_tense': _('job awarded'), }, 'delivery': { 'pre': ['offer'], 'next': ['accept', 'creatordispute', 'workerdispute'], 'endpoint': '/deliver', - 'past_tense': 'deliverables submitted' + 'past_tense': _('deliverables submitted'), }, 'creatordispute': { 'pre': ['offer', 'delivery'], 'next': ['resolve', 'workerdispute'], 'endpoint': '/dispute', - 'past_tense':'disputed by job creator' + 'past_tense': _('disputed by job creator'), }, 'workerdispute': { 'pre': ['offer', 'delivery', 'accept'], 'next': ['resolve', 'creatordispute'], 'endpoint': '/dispute', - 'past_tense': 'disputed by worker' + 'past_tense': _('disputed by worker'), }, 'accept': { 'pre': ['delivery'], 'next': ['workerdispute', 'complete'], 'endpoint': '/accept', - 'past_tense': 'complete, work accepted', + 'past_tense': _('complete, work accepted'), }, 'resolve': { 'pre': ['creatordispute', 'workerdispute'], 'next': ['complete'], 'endpoint': '/resolve', - 'past_tense': 'complete, dispute resolved' + 'past_tense': _('complete, dispute resolved'), }, } diff --git a/rein/lib/toolbox.py b/rein/lib/toolbox.py index 8787e0e..017cfc3 100644 --- a/rein/lib/toolbox.py +++ b/rein/lib/toolbox.py @@ -6,4 +6,4 @@ def yes_or_no(question): if len(reply) > 0 and reply[0] == 'n': return False else: - return yes_or_no("Please enter ") + return yes_or_no(_("Please enter ")) diff --git a/rein/lib/validate.py b/rein/lib/validate.py index 8d998ab..ed81b18 100644 --- a/rein/lib/validate.py +++ b/rein/lib/validate.py @@ -11,7 +11,7 @@ def filter_out_expired(rein, user, urls, jobs): live = [] times = {} - click.echo('Verifying block times...') + click.echo(_('Verifying block times...')) with click.progressbar(jobs) as bar: for j in bar: if 'Block hash' not in j: @@ -165,7 +165,7 @@ def remote_query(rein, user, urls, log, query_type, distinct): sel_url = "{0}query?owner={1}&query={2}&testnet={3}" data = safe_get(log, sel_url.format(url, user.maddr, query_type, rein.testnet)) if data is None or query_type not in data or len(data[query_type]) == 0: - click.echo('None found') + click.echo(_('None found')) continue res += filter_and_parse_valid_sigs(rein, data[query_type]) return unique(res, distinct) From b370cba94a4ea351a7745a0e7938e56e789b612e Mon Sep 17 00:00:00 2001 From: David Sterry Date: Tue, 14 Feb 2017 00:36:56 -0800 Subject: [PATCH 03/13] add latest po files --- rein/locale/ReinProjectCode.docx | Bin 0 -> 40833 bytes rein/locale/messages-ES.po | 296 +++++++++++++++++++++++++++++++ rein/locale/messages-LV.po | 245 +++++++++++++++++++++++++ rein/locale/messages-RU.po | 245 +++++++++++++++++++++++++ rein/locale/messages-fil.po | 290 ++++++++++++++++++++++++++++++ 5 files changed, 1076 insertions(+) create mode 100644 rein/locale/ReinProjectCode.docx create mode 100644 rein/locale/messages-ES.po create mode 100644 rein/locale/messages-LV.po create mode 100644 rein/locale/messages-RU.po create mode 100755 rein/locale/messages-fil.po diff --git a/rein/locale/ReinProjectCode.docx b/rein/locale/ReinProjectCode.docx new file mode 100644 index 0000000000000000000000000000000000000000..a31d7e3fb86c625356d80aaff7a1b97cdf95f4b6 GIT binary patch literal 40833 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, 2017. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.2\n" +"POT-Creation-Date: 2016-12-21 11:00+PST\n" +"PO-Revision-Date: 2016-12-21 11:00+PST\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: rein/cli.py:52 +msgid "" +"\n" +" Rein is a decentralized professional services market and Python-rein is a client\n" +"that provides a user interface. Use this program from your local browser or command \n" +"line to create an account, post a job, bid, etc.\n" +"\n" +"\b\n" +" Quick start:\n" +" $ rein start - create an identity, run the Web UI\n" +" $ rein buy - request microhosting\n" +" $ rein sync - push your identity to microhosting servers\n" +" $ rein status - get user status, or dump of job's documents\n" +"\n" +"\b\n" +" Workers\n" +" $ rein bid - view and bid on jobs\n" +" $ rein deliver - complete job by providing deliverables\n" +"\n" +"\b\n" +" Disputes\n" +" $ rein workerdispute - worker files dispute\n" +" $ rein creatordispute - job creator files dispute\n" +" $ rein resolve - mediator posts decision\n" +"\n" +" For more info and the setup guide visit: http://reinproject.org\n" +" " +msgstr "" +"\n" +" Rein es un mercado profesional, descentralizado, de servicios y Python-rein es el cliente\n" +"que provee la interfaz de usuario. Usa este programa desde tu navegador o línea de comandos \n" +"para crear una cuenta, publicar un trabajo, ofertarse para un trabajo, etc.\n" +"\n" +"\b\n" +" Iniciándose:\n" +" $ rein start - crea una identidad, ejecuta la interfaz de usuario web\n" +" $ rein buy - pide microhosting\n" +" $ rein sync - sincroniza tu identidad con los servidores\n" +" $ rein status - comprobar estado de identidad, transacción, etc\n" +"\n" +"\b\n" +" Trabajadores\n" +" $ rein bid - mirar y ofertarse para un trabajo\n" +" $ rein deliver - completar trabajo suministrando entregas\n" +"\n" +"\b\n" +" Disputas\n" +" $ rein workerdispute - mediante este comando el trabajador puede comenzar un conflicto,\n" +" debe especificar la razón de la misma, i.e. el epmpleador no \n" +" fue razonable, etc, enlazar pruebas \n" +" $ rein creatordispute - mediante este comando el empleador puede comenzar un conflicto, \n" +" debe especificar la razón de la misma, i.e. el trabajador no realizó \n" +" la entrega o hizo un mal trabajo, etc\n" +" $ rein resolve - este comando es el usado por el mediador para revisar la información \n" +" dada por el empleador y el trabajador con el fin de decidir cómo \n" +" resolver el conflicto.\n" +"\n" +" Para más información y guía de configuración visitar: http://reinproject.org\n" +" " + +#: rein/cli.py:85 +msgid "" +"\n" +" Setup or import an identity.\n" +"\n" +" You will choose a name or handle for your account, include public contact information, \n" +" and a delegate Bitcoin address/private key that the program will use to sign documents\n" +" on your behalf. An enrollment document will be created and you will need to sign it\n" +" with your master Bitcoin private key.\n" +" " +msgstr "" +"\n" +" Configurar o importar una identidad.\n" +"\n" +" Escoger un nombre de usuario para la cuenta, incluyendo información pública de contacto, \n" +" y una dirección/llave privada delegada de Bitcoinand que el programa utilizará para firmar documentos\n" +" a tu favor. Se creará un documento llamado matrícula el cual deberás firmar con \n" +" la llave privada de la dirección Bitcoin principal .\n" +" " + +#: rein/cli.py:98 +msgid "" +"1 - Create new account\n" +"2 - Import backup\n" +msgstr "" +"1 - Crear nueva cuenta\n" +"2 - Restaurar respaldo\n" + +#: rein/lib/forms.py:51 +msgid "Bid amount" +msgstr "Ofrecer cantidad" + +#: rein/lib/forms.py:52 +msgid "Choose Job to bid on" +msgstr "Escoger trabajo para ofrecerse" + +#: rein/lib/forms.py:55 +msgid "Choose bid" +msgstr "Escoger oferta" + +#: rein/lib/forms.py:63 +msgid "Choose job" +msgstr "Escoger trabajo" + +#: rein/lib/forms.py:59 +msgid "Choose job associated with deliverables" +msgstr "Escoger trabajo asociado a entregas" + +#: rein/lib/forms.py:47 +msgid "Choose mediator" +msgstr "Escoger mediador" + +#: rein/lib/forms.py:33 +msgid "Delegate Bitcoin address" +msgstr "Dirección Bitcoin delegada" + +#: rein/lib/forms.py:34 +msgid "Delegate Bitcoin private Key" +msgstr "Llave privada de dirección delegada" + +#: rein/lib/forms.py:58 rein/lib/forms.py:68 +msgid "Deliverables" +msgstr "Entregas" + +#: rein/lib/forms.py:44 rein/lib/forms.py:50 +msgid "Description" +msgstr "Descripción" + +#: rein/lib/forms.py:62 +msgid "Dispute detail" +msgstr "Detalles de conflicto" + +#: rein/lib/forms.py:74 +msgid "Disputes" +msgstr "Conflictos" + +#: rein/cli.py:97 +msgid "" +"Do you want to import a backup or create a new account?\n" +"\n" +msgstr "" +"Deseas restaurar copia de respaldo o crear una nueva cuenta?\n" +"\n" + +#: rein/lib/forms.py:31 +msgid "Email / Bitmessage" +msgstr "Email" + +#: rein/lib/io.py:16 +msgid "Error connecting to server." +msgstr "Error conectándose al servidor" + +#: rein/lib/forms.py:46 +msgid "Expiration (days)" +msgstr "Expira (días)" + +#: rein/lib/market.py:54 +msgid "File containing signed document" +msgstr "Archivo que contiene documento firmado" + +#: rein/lib/order.py:18 +msgid "" +"Funds for each job in Rein are stored in two multisig addresses. One address\n" +"is for the primary payment that will go to the worker on completion. The\n" +"second address pays the mediator to be available to resolve a dispute\n" +"if necessary. The second address should be funded according to the percentage\n" +"specified by the mediator and is in addition to the primary payment. The\n" +"listing below shows available mediators and the fee they charge. You should\n" +"consider the fee as well as any reputational data you are able to find when\n" +"choosing a mediator. Your choice may affect the number and quality of bids" +msgstr "" +"Los fondos para cada trabajo en Rein se almacenan en dos direcciones multi-firma. \n" +"En la primera se transfieren los pagos al trabajador, tras terminar el trabajo,\n" +"en la segunda dirección, los pagos al mediador que resolverá los conflictos.\n" +"A la segunda dirección se le transferirá un monto de acuerdo a los honorarios establecidos\n" +"por el mediador, en adición a los fondos transferidos a la primera dirección. La lista mostrada\n" +"debajo muestra los mediadores disponibles y sus respectivos honorarios. Debes considerar\n" +"dichos honorarios así como los datos disponibles de reputación al buscar un mediador.\n" +"La elección de un mediador podría influir en el número y calidad de las ofertas." + +#: rein/lib/forms.py:22 +msgid "Invalid address" +msgstr "Dirección no válida" + +#: rein/lib/forms.py:27 +msgid "Invalid signature" +msgstr "Firma no válida" + +#: rein/lib/forms.py:43 +msgid "Job name" +msgstr "Nombre del trabajo" + +#: rein/lib/forms.py:32 +msgid "Master Bitcoin address" +msgstr "Dirección Bitcoin principal" + +#: rein/lib/forms.py:36 +msgid "Mediator Fee" +msgstr "Honorarios del mediador" + +#: rein/lib/forms.py:30 +msgid "Name / Handle" +msgstr "Nombre" + +#: rein/lib/validate.py:168 +msgid "None found" +msgstr "No se encontró" + +#: rein/lib/forms.py:18 +msgid "Not a valid private key." +msgstr "Llave privada no válida" + +#: rein/lib/toolbox.py:9 +msgid "Please enter " +msgstr "Por favor entre" + +#: rein/lib/forms.py:35 +msgid "Register as a mediator?" +msgstr "Registrarse como mediador?" + +#: rein/lib/forms.py:73 +msgid "Resolution" +msgstr "Decisión del mediador" + +#: rein/lib/forms.py:40 +msgid "Signed enrollment" +msgstr "Matrícula firmada" + +#: rein/lib/forms.py:67 rein/lib/forms.py:72 +msgid "Signed mediator payment" +msgstr "Pago de mediador firmado" + +#: rein/lib/forms.py:66 rein/lib/forms.py:71 +msgid "Signed primary payment" +msgstr "Pago principal firmado" + +#: rein/lib/forms.py:45 +msgid "Tags" +msgstr "Etiquetas" + +#: rein/lib/validate.py:14 +msgid "Verifying block times..." +msgstr "Verificando block ..." + +#: rein/cli.py:98 +msgid "Welcome to Rein." +msgstr "Bienvenido a Rein" + +#: rein/lib/order.py:31 +msgid "bid submitted" +msgstr "oferta enviada" + +#: rein/lib/order.py:67 +msgid "complete, dispute resolved" +msgstr "completo, conflicto resuelto" + +#: rein/lib/order.py:61 +msgid "complete, work accepted" +msgstr "completo, trabajo aceptado" + +#: rein/lib/order.py:43 +msgid "deliverables submitted" +msgstr "entregas enviadas" + +#: rein/lib/order.py:49 +msgid "disputed by job creator" +msgstr "dispudato por el creador del trabajo" + +#: rein/lib/order.py:55 +msgid "disputed by worker" +msgstr "dispudato por el trabajador" + +#: rein/lib/order.py:37 +msgid "job awarded" +msgstr "trabajo otorgado" + +#: rein/lib/order.py:17 +msgid "posted" +msgstr "publicado" diff --git a/rein/locale/messages-LV.po b/rein/locale/messages-LV.po new file mode 100644 index 0000000..0f55a11 --- /dev/null +++ b/rein/locale/messages-LV.po @@ -0,0 +1,245 @@ +# Rein Patstāvīgo darbu tirgus. +# Copyright (C) 2017 +# Šis fails ir izplatīts zem tās pašas licenses kā python-rein paka. +# David Sterry , 2017. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.2\n" +"POT-Creation-Date: 2016-12-21 11:00+PST\n" +"PO-Revision-Date: 2016-12-21 11:00+PST\n" +"Last-Translator: Kaspars Lapiņš \n" +"Language-Team: Latviešu \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: rein/cli.py:52 +msgid "" +"\n" +" Rein ir centralizēts pakalpojumu tirgus un Python-rein ir klients\n" +"kas nodrošina lietotāja interfeisu. Izmanto šo programmu no jūsu patstāvīgās pārlukprogrammas \n" +"vieta kur reģistrēties, pievono darbu, liec likmes, u.c.\n" +"\n" +"\b\n" +" Ātrā palaišana:\n" +" $ rein start - izveidot identitāti, palaist tīklu UI\n" +" $ rein buy - pieprasīt microhostingu\n" +" $ rein sync - ielikt savu identitāti microhosting serveros\n" +" $ rein status - dabūt lietotāja statusus, vai kaudzi ar darba doukumentiem\n" +"\n" +"\b\n" +" Darbinieki\n" +" $ rein bid - apskatīt un ievietot darbus\n" +" $ rein deliver - pabeigt darbu nodrošinot nodevas\n" +"\n" +"\b\n" +" Strīdi\n" +" $ rein workerdispute - darbinieku failu apstrīde\n" +" $ rein creatordispute - darba devēju failu apstrīde\n" +" $ rein resolve - starpnieks pasludina lēmumu\n" +"\n" +" Vairāk info šeit: http://reinproject.org\n" +" " +msgstr "" + +#: rein/cli.py:85 +msgid "" +"\n" +" izveidot vai ievietot identitāti.\n" +"\n" +" Jūs izvēlēsieties savu vārdu priekš jūsu profila, ievietojot publisku kontaktinformāciju, \n" +" ievietojot Bitcoin adresi/privāto atslēgu ko programma izmantos parakstot dokumentus\n" +" jūsu vārdā. Uzņemšanas dokuments tiks izveidots un jums tas būs jāparaksta\n" +" ar jūsu Bitcoin private key/privāto atslēgu.\n" +" " +msgstr "" + +#: rein/cli.py:98 +msgid "" +"1 - Izveidot profilu\n" +"2 - atgūt dublētos datus\n" +msgstr "" + +#: rein/lib/forms.py:51 +msgid "Pieteikties" +msgstr "" + +#: rein/lib/forms.py:52 +msgid "Izvēlēties darbu" +msgstr "" + +#: rein/lib/forms.py:55 +msgid "Izvēlēties pieteikumu" +msgstr "" + +#: rein/lib/forms.py:63 +msgid "Izvēlēties darbu" +msgstr "" + +#: rein/lib/forms.py:59 +msgid "Izvēlēties darbu ar nodevām" +msgstr "" + +#: rein/lib/forms.py:47 +msgid "Izvēlēties starpnieku" +msgstr "" + +#: rein/lib/forms.py:33 +msgid "Pārskatīt BITCOIN adresi" +msgstr "" + +#: rein/lib/forms.py:34 +msgid "Pārskatīt Bitcoin Private Key/atslēgu" +msgstr "" + +#: rein/lib/forms.py:58 rein/lib/forms.py:68 +msgid "Nodevas" +msgstr "" + +#: rein/lib/forms.py:44 rein/lib/forms.py:50 +msgid "Apraksts" +msgstr "" + +#: rein/lib/forms.py:62 +msgid "apstrīdēt detaļas" +msgstr "" + +#: rein/lib/forms.py:74 +msgid "Strīdi" +msgstr "" + +#: rein/cli.py:97 +msgid "" +"Vai vēlaties atgūt dublētos datus vai izveidot jaunu profilu?\n" +"\n" +msgstr "" + +#: rein/lib/forms.py:31 +msgid "E-pasts / Bitvēstule" +msgstr "" + +#: rein/lib/io.py:16 +msgid "Kļuda piekļūšanai serverim." +msgstr "" + +#: rein/lib/forms.py:46 +msgid "Atlikušās dienas" +msgstr "" + +#: rein/lib/market.py:54 +msgid "Failā ietilpst parakstīts dokuments" +msgstr "" + +#: rein/lib/order.py:18 +msgid "" +"Uzkrājumi darbā Rein ir saglabāti divās adresēs. Viena adrese\n" +"ir priekš primārās samaksas darbiniekam par pabeigtu darbu.\n" +"Otrā adrese ir priekš starpnieka, lai varētu atrisināt strīdus\n" +"ja vajadzīgs. Otrā adrese tiks uzkrāta ņemot vērā attiecīgos procentus\n" +",to noteiks starpnieks arī ņemot vērā primāro samaksu. The\n" +"Saraksts lejā norāda brīvos starpniekus un to procentus ko viņi pieprasa. Jums vajadzētu\n" +"apsvērt samaksu starpniekam kā reputācijas datu kad\n" +"izvēlēsieties starpnieku. Jūsu izvēle nosaka skaitu un kvalitāti pieteikumiem" +msgstr "" + +#: rein/lib/forms.py:22 +msgid "Nederīga adrese" +msgstr "" + +#: rein/lib/forms.py:27 +msgid "Nederīgs paraksts" +msgstr "" + +#: rein/lib/forms.py:43 +msgid "Darba nosaukums" +msgstr "" + +#: rein/lib/forms.py:32 +msgid "Bitcoin adrese" +msgstr "" + +#: rein/lib/forms.py:36 +msgid "Starnieka samaksa" +msgstr "" + +#: rein/lib/forms.py:30 +msgid "Vārds" +msgstr "" + +#: rein/lib/validate.py:168 +msgid "Netika atrasts" +msgstr "" + +#: rein/lib/forms.py:18 +msgid "nederīga privātā atslēga." +msgstr "" + +#: rein/lib/toolbox.py:9 +msgid "Lūdzu ievadiet " +msgstr "" + +#: rein/lib/forms.py:35 +msgid "Reģistrēties kā starpniekam?" +msgstr "" + +#: rein/lib/forms.py:73 +msgid "Rezolūcija" +msgstr "" + +#: rein/lib/forms.py:40 +msgid "Parakstīta uzņemšana" +msgstr "" + +#: rein/lib/forms.py:67 rein/lib/forms.py:72 +msgid "Parakstīta starpnieka samaksa" +msgstr "" + +#: rein/lib/forms.py:66 rein/lib/forms.py:71 +msgid "Parakstīta primārā samaksa" +msgstr "" + +#: rein/lib/forms.py:45 +msgid "Etiķetes" +msgstr "" + +#: rein/lib/validate.py:14 +msgid "Pārbauda bloku laiku..." +msgstr "" + +#: rein/cli.py:98 +msgid "Sveicināti Rein." +msgstr "" + +#: rein/lib/order.py:31 +msgid "pieteikums apstiprināts" +msgstr "" + +#: rein/lib/order.py:67 +msgid "Pabeigts, strīds atrisināts" +msgstr "" + +#: rein/lib/order.py:61 +msgid "Pabeigts, darbs apstiprināts" +msgstr "" + +#: rein/lib/order.py:43 +msgid "nodevas pieņemtas" +msgstr "" + +#: rein/lib/order.py:49 +msgid "apstrīdēts no darba devēja" +msgstr "" + +#: rein/lib/order.py:55 +msgid "apstrīdēts no darbinieka" +msgstr "" + +#: rein/lib/order.py:37 +msgid "Darbs piešķirts" +msgstr "" + +#: rein/lib/order.py:17 +msgid "Publicēts" +msgstr "" diff --git a/rein/locale/messages-RU.po b/rein/locale/messages-RU.po new file mode 100644 index 0000000..83502d2 --- /dev/null +++ b/rein/locale/messages-RU.po @@ -0,0 +1,245 @@ +# Rein Decentralized Freelance Market. +# Copyright (C) 2017 +# This file is distributed under the same license as the python-rein package. +# David Sterry , 2017. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.2\n" +"POT-Creation-Date: 2016-12-21 11:00+PST\n" +"PO-Revision-Date: 2016-12-21 11:00+PST\n" +"Last-Translator: FULL NAME \n" +"Language-Team: RUSSIAN \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: rein/cli.py:52 +msgid "" +"\n" +" Rein это децентрализованный рынок профессиональных услуг и Python-rein это клиент\n" +"который предоставляет интерфейс пользователя. Используйте эту программу из вашего локального браузера \n" +"или коммандной строки что бы создать аккаунт, опубликовать работу, сделать ставку и т.д.\n" +"\n" +"\b\n" +" Быстрый старт:\n" +" $ rein start - создать идентификатор, запустить Web UI\n" +" $ rein buy - запросить микрохостинг\n" +" $ rein sync - синхронизировать идентификатор с серверами микрохостинга\n" +" $ rein status - узнать статус пользоваля, сбросить рабочие документы\n" +"\n" +"\b\n" +" Исполнители\n" +" $ rein bid - показать проекты и сделать ставку\n" +" $ rein deliver - окончить работу предоставив результат\n" +"\n" +"\b\n" +" Споры\n" +" $ rein workerdispute - оспорить рабочие файлы работника\n" +" $ rein creatordispute - оспорить рабочие файлы работодателя\n" +" $ rein resolve - публичное решение медиатора\n" +"\n" +" Для подробной информации и инструкции установки посетите ресурс: http://reinproject.org\n" +" " +msgstr "" + +#: rein/cli.py:85 +msgid "" +"\n" +" Установите или импортируйте идентификатор.\n" +"\n" +" Вы выберете имя для вашего аккаунта, включая публичную контактную информацию, \n" +" и Bitcoin адрес/приватный ключ, которые программа будет использовать для подписи документов\n" +" от вашего имени. Зарегистрированный документ будет создан и вы должны будете подписать это\n" +" вашим приватным Bitcoin ключем.\n" + +" " +msgstr "" + +#: rein/cli.py:98 +msgid "" +"1 - Создать новый аккаунт\n" +"2 - Импортировать бэкап\n" +msgstr "" + +#: rein/lib/forms.py:51 +msgid "Сделать ставку" +msgstr "" + +#: rein/lib/forms.py:52 +msgid "Выбрать проект для ставки" +msgstr "" + +#: rein/lib/forms.py:55 +msgid "Выбрать ставку" +msgstr "" + +#: rein/lib/forms.py:63 +msgid "Выбрать работу" +msgstr "" + +#: rein/lib/forms.py:59 +msgid "Выбрать работу ассоциированную с результатом" +msgstr "" + +#: rein/lib/forms.py:47 +msgid "Выбрать медиатора" +msgstr "" + +#: rein/lib/forms.py:33 +msgid "Выбрать Bitcoin адрес" +msgstr "" + +#: rein/lib/forms.py:34 +msgid "Выбрать приватный ключ Bitcoin" +msgstr "" + +#: rein/lib/forms.py:58 rein/lib/forms.py:68 +msgid "Результат" +msgstr "" + +#: rein/lib/forms.py:44 rein/lib/forms.py:50 +msgid "Описание" +msgstr "" + +#: rein/lib/forms.py:62 +msgid "Оспорить деталь" +msgstr "" + +#: rein/lib/forms.py:74 +msgid "Споры" +msgstr "" + +#: rein/cli.py:97 +msgid "" +"Вы хотите имортировать бэкап или создать новый аккаунт?\n" +"\n" +msgstr "" + +#: rein/lib/forms.py:31 +msgid "Email / Bitmessage" +msgstr "" + +#: rein/lib/io.py:16 +msgid "Ошибка подключения к серверу." +msgstr "" + +#: rein/lib/forms.py:46 +msgid "Истекает (дней)" +msgstr "" + +#: rein/lib/market.py:54 +msgid "Файл содержит подписанный документ" +msgstr "" + +#: rein/lib/order.py:18 +msgid "" +"Средства для каждой работы в реин хранятся в двух мультиподписанных адресах. Один адрес\n" +"для личного платежа который будет отправлен работнику по окончании проекта. \n" +"Второй для медиатора, на случай разрешения спора при необходимости. Второй адрес должен быть пополнен опираясь на процент\n" +"указанный медиатором и быть в дополнении к личному платежу. \n" +"Список ниже показывает доступных медиаторов и комиссии, которые они требуют. \n" +"Вы должны учитывать комиссию так же, как и любую другую репутационную информацию, которую вы можете найти,\n" +"когда выбираете медиатора. Ваш выбор может повлиять на количество и качество ставок." +msgstr "" + +#: rein/lib/forms.py:22 +msgid "Неправильный адрес" +msgstr "" + +#: rein/lib/forms.py:27 +msgid "Неправильная подпись" +msgstr "" + +#: rein/lib/forms.py:43 +msgid "Имя работы" +msgstr "" + +#: rein/lib/forms.py:32 +msgid "Адрес Bitcoin" +msgstr "" + +#: rein/lib/forms.py:36 +msgid "Комиссия медиатора" +msgstr "" + +#: rein/lib/forms.py:30 +msgid "Имя / Держатель" +msgstr "" + +#: rein/lib/validate.py:168 +msgid "Ничего не найдено" +msgstr "" + +#: rein/lib/forms.py:18 +msgid "Не правильный приватный ключ." +msgstr "" + +#: rein/lib/toolbox.py:9 +msgid "Пожалуйста введите " +msgstr "" + +#: rein/lib/forms.py:35 +msgid "Зарегистрировать как медиатор?" +msgstr "" + +#: rein/lib/forms.py:73 +msgid "Решение" +msgstr "" + +#: rein/lib/forms.py:40 +msgid "Подписанное зачисление" +msgstr "" + +#: rein/lib/forms.py:67 rein/lib/forms.py:72 +msgid "Подписанный платеж медиатора" +msgstr "" + +#: rein/lib/forms.py:66 rein/lib/forms.py:71 +msgid "Подписанный частный платеж" +msgstr "" + +#: rein/lib/forms.py:45 +msgid "Тэги" +msgstr "" + +#: rein/lib/validate.py:14 +msgid "Верификация блока раз..." +msgstr "" + +#: rein/cli.py:98 +msgid "Добро пожаловать в Rein." +msgstr "" + +#: rein/lib/order.py:31 +msgid "ставка принята" +msgstr "" + +#: rein/lib/order.py:67 +msgid "окончено, спор окончен" +msgstr "" + +#: rein/lib/order.py:61 +msgid "окончено, работа принята" +msgstr "" + +#: rein/lib/order.py:43 +msgid "результаты отправлены" +msgstr "" + +#: rein/lib/order.py:49 +msgid "оспорено работодателем" +msgstr "" + +#: rein/lib/order.py:55 +msgid "оспорено исполнителем" +msgstr "" + +#: rein/lib/order.py:37 +msgid "выбран исполнитель" +msgstr "" + +#: rein/lib/order.py:17 +msgid "опубликовано" +msgstr "" diff --git a/rein/locale/messages-fil.po b/rein/locale/messages-fil.po new file mode 100755 index 0000000..15ca5f4 --- /dev/null +++ b/rein/locale/messages-fil.po @@ -0,0 +1,290 @@ +# Rein Decentralized Freelance Market. +# Copyright (C) 2017 +# This file is distributed under the same license as the python-rein package. +# David Sterry , 2017. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.2\n" +"POT-Creation-Date: 2016-12-21 11:00+PST\n" +"PO-Revision-Date: 2016-12-21 11:00+PST\n" +"Last-Translator: FULL NAME \n" +"Language-Team: FILIPINO \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: rein/cli.py:52 +msgid "" +"\n" +" Rein is a decentralized professional services market and Python-rein is a client\n" +"that provides a user interface. Use this program from your local browser or command \n" +"line to create an account, post a job, bid, etc.\n" +"\n" +"\b\n" +" Quick start:\n" +" $ rein start - create an identity, run the Web UI\n" +" $ rein buy - request microhosting\n" +" $ rein sync - push your identity to microhosting servers\n" +" $ rein status - get user status, or dump of job's documents\n" +"\n" +"\b\n" +" Workers\n" +" $ rein bid - view and bid on jobs\n" +" $ rein deliver - complete job by providing deliverables\n" +"\n" +"\b\n" +" Disputes\n" +" $ rein workerdispute - worker files dispute\n" +" $ rein creatordispute - job creator files dispute\n" +" $ rein resolve - mediator posts decision\n" +"\n" +" For more info and the setup guide visit: http://reinproject.org\n" +" " +msgstr "" +"\n" +" Ang Rein ay isang desentrilisadong merkado ng serbisyo ng mga propesyonal at anv Python-rein ay isang client\n" +"na nagbibigay ng user interface. Gamitin ang program na ito sa iyong local browser o sa command \n" +"linya para sa account , mag post ng trabaho, bid, at iba pa.\n" +"\n" +"\b\n" +" Mabilis na panimula:\n" +" $ rein start - gumawa ng kilanlan, patakbuhin ang Web UI\n" +" $ rein buy - humiling ng microhosting\n" +" $ rein sync - ilagay ay iyong pagkilablan sa microhosting servers\n" +" $ rein status - kunin ang status ng user o ibasura ang dokumento ng trabaho\n" +"\n" +"\b\n" +" Mga trabahador\n" +" $ rein bid - tingnan at mag bid sa mga trabaho\n" +" $ rein deliver - kompletuhin ang trabaho sa pamamagitan ng deliverables \n" +"\n" +"\b\n" +" Disputes\n" +" $ rein workerdispute - mga dispute files ng mga trabahador \n" +" $ rein creatordispute - mga dispute files ng mga tagagawa ng trabaho\n" +" $ rein resolve - paglathala ng desisyon ng mediator\n" +"\n" +" Para sa iba pang impormasyon bumisita sa: http://reinproject.org\n" +" " + +#: rein/cli.py:85 +msgid "" +"\n" +" Setup or import an identity.\n" +"\n" +" You will choose a name or handle for your account, include public contact information, \n" +" and a delegate Bitcoin address/private key that the program will use to sign documents\n" +" on your behalf. An enrollment document will be created and you will need to sign it\n" +" with your master Bitcoin private key.\n" +" " +msgstr "" +"\n" +" Setup o i-angkat ang pagkakilanlan.\n" +"\n" +" Pipili ka ng pangalan o hawakan ang iyong account, kasama ang mga impormasyon ng pampublikong contacts , \n" +" at mga delegadong Bitcoin address/private key na program na gagamitin sa pag sign ng documents\n" +" sa ngalan mo. Ang mga dokumento ng mga enrollment ay magagaqa at kailangan mo itong isign it\n" +" kasama ang iyong Master Bitcoin key.\n" +" " + +#: rein/cli.py:98 +msgid "" +"1 - Create new account\n" +"2 - Import backup\n" +msgstr "" +"1 - Gumawa ng bagong account\n" +"2 - Iimport ang backup\n" + +#: rein/lib/forms.py:51 +msgid "Bid amount" +msgstr "Halaga ng tawaran" + +#: rein/lib/forms.py:52 +msgid "Choose Job to bid on" +msgstr "Pumili ng trabaho kung saan mag tatawaran" + +#: rein/lib/forms.py:55 +msgid "Choose bid" +msgstr "Pumili ng tatawaran" + +#: rein/lib/forms.py:63 +msgid "Choose job" +msgstr "Pumili ng trabaho" + +#: rein/lib/forms.py:59 +msgid "Choose job associated with deliverables" +msgstr "Pumili ng trabaho kaugnay sa paghatid" + +#: rein/lib/forms.py:47 +msgid "Choose mediator" +msgstr "Mamili ng mediator" + +#: rein/lib/forms.py:33 +msgid "Delegate Bitcoin address" +msgstr "Delegado ng Bitcoin address" + +#: rein/lib/forms.py:34 +msgid "Delegate Bitcoin private Key" +msgstr "Delegado ng Bitcoin private Key" + +#: rein/lib/forms.py:58 rein/lib/forms.py:68 +msgid "Deliverables" +msgstr "Paghahatid" + +#: rein/lib/forms.py:44 rein/lib/forms.py:50 +msgid "Description" +msgstr "Paglalarawan" + +#: rein/lib/forms.py:62 +msgid "Dispute detail" +msgstr "Detalye sa pagmamatwiranan " + +#: rein/lib/forms.py:74 +msgid "Disputes" +msgstr "Pagmamatwiranan" + +#: rein/cli.py:97 +msgid "" +"Do you want to import a backup or create a new account?\n" +"\n" +msgstr "" +"Gusto mong iimport ang backup o gumawa na bagong account?\n" +"\n" + +#: rein/lib/forms.py:31 +msgid "Email / Bitmessage" +msgstr "Email / Bitmessage" + +#: rein/lib/io.py:16 +msgid "Error connecting to server." +msgstr "May mali sa pagkonekta sa server." + +#: rein/lib/forms.py:46 +msgid "Expiration (days)" +msgstr "Paglipas (araw)" + +#: rein/lib/market.py:54 +msgid "File containing signed document" +msgstr "File ng dokumento na may perma" + +#: rein/lib/order.py:18 +msgid "" +"Funds for each job in Rein are stored in two multisig addresses. One address\n" +"is for the primary payment that will go to the worker on completion. The\n" +"second address pays the mediator to be available to resolve a dispute\n" +"if necessary. The second address should be funded according to the percentage\n" +"specified by the mediator and is in addition to the primary payment. The\n" +"listing below shows available mediators and the fee they charge. You should\n" +"consider the fee as well as any reputational data you are able to find when\n" +"choosing a mediator. Your choice may affect the number and quality of bids" +msgstr "" +"Ang pondo sa bawat trabaho sa Rein ay itatago sa dalawanv multisig addresses. Ang isang address\n" +"ay para sa pangunahing bayad na mapupunta sa trabahador kapag natapos ito. Ang\n" +"pangalawang address ay pambayad sa mediator na puwedeng ma resolba sa pangangatwiran.\n" +"kung kinakailangan. Anv pangalawang ay dapat pondihan ayon sa porsyento\n" +"na ibinigay o gusto ng mediator at idagdag sa pangunahing bayad. Ang\n" +"nakalista sa baba ay mga bakanteng mediators at ang kanilang bayad na sisingilin. Dapat mong\n" +"ikonsidera ang fee pati ng ang kaniyang reputational data na mahahanap mo sa\n" +"pagpili ng mediator. Ang iyong nais ay makaka-epekto sa bilang at kalidad ng pakikipatawaran." + +#: rein/lib/forms.py:22 +msgid "Invalid address" +msgstr "" + +#: rein/lib/forms.py:27 +msgid "Invalid signature" +msgstr "Mali ang address" + +#: rein/lib/forms.py:43 +msgid "Job name" +msgstr "Pangalan ng trabaho" + +#: rein/lib/forms.py:32 +msgid "Master Bitcoin address" +msgstr "Master Bitcoin address" + +#: rein/lib/forms.py:36 +msgid "Mediator Fee" +msgstr "Singil ng Mediator" + +#: rein/lib/forms.py:30 +msgid "Name / Handle" +msgstr "Pangalan / Tagahawak" + +#: rein/lib/validate.py:168 +msgid "None found" +msgstr "Hindi makita" + +#: rein/lib/forms.py:18 +msgid "Not a valid private key." +msgstr "Hindi tama ang private key." + +#: rein/lib/toolbox.py:9 +msgid "Please enter " +msgstr "Pakiusap i-enter " + +#: rein/lib/forms.py:35 +msgid "Register as a mediator?" +msgstr "Magrehistro bilang mediator?" + +#: rein/lib/forms.py:73 +msgid "Resolution" +msgstr "Resolusyon" + +#: rein/lib/forms.py:40 +msgid "Signed enrollment" +msgstr "Permado ng pagpapalista" + +#: rein/lib/forms.py:67 rein/lib/forms.py:72 +msgid "Signed mediator payment" +msgstr "Permado ng bayad sa mediator " + +#: rein/lib/forms.py:66 rein/lib/forms.py:71 +msgid "Signed primary payment" +msgstr "Permado na paunang bayad" + +#: rein/lib/forms.py:45 +msgid "Tags" +msgstr "Mga tag" + +#: rein/lib/validate.py:14 +msgid "Verifying block times..." +msgstr "Pag beripiko ng oras ng block..." + +#: rein/cli.py:98 +msgid "Welcome to Rein." +msgstr "Maligayang Pagdating sa Rein." + +#: rein/lib/order.py:31 +msgid "bid submitted" +msgstr "Na sumite na ang tawad" + +#: rein/lib/order.py:67 +msgid "complete, dispute resolved" +msgstr "Tapos na, na resolba na ang pangagatwiran" + +#: rein/lib/order.py:61 +msgid "complete, work accepted" +msgstr "Tapos na, ang trabaho ay tinanggap" + +#: rein/lib/order.py:43 +msgid "deliverables submitted" +msgstr "na sumite na ang hatid" + +#: rein/lib/order.py:49 +msgid "disputed by job creator" +msgstr "pangagatwiran ng tagagawa ng trabaho" + +#: rein/lib/order.py:55 +msgid "disputed by worker" +msgstr "pangagatwiran ng trabahador" + +#: rein/lib/order.py:37 +msgid "job awarded" +msgstr "ang tabaho ay naibigay na" + +#: rein/lib/order.py:17 +msgid "posted" +msgstr "ipaskil" From 04bbd839830656f43340aa2e6f3a0028c9e82150 Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Thu, 16 Feb 2017 20:19:50 +0100 Subject: [PATCH 04/13] Cleaned up .po language files, compiled to .mo --- rein/cli.py | 2 +- rein/locale/ReinProjectCode.docx | Bin 40833 -> 0 bytes rein/locale/compile.py | 7 + rein/locale/messages-ES.mo | Bin 0 -> 7560 bytes rein/locale/messages-HI.mo | Bin 0 -> 11295 bytes rein/locale/messages-HI.po | 289 +++++++++++++++++++++++++++++++ rein/locale/messages-LV.mo | Bin 0 -> 6863 bytes rein/locale/messages-LV.po | 244 +++++++++++++++----------- rein/locale/messages-RU.mo | Bin 0 -> 9129 bytes rein/locale/messages-RU.po | 225 ++++++++++++++---------- rein/locale/messages-fil.mo | Bin 0 -> 7141 bytes 11 files changed, 578 insertions(+), 189 deletions(-) delete mode 100644 rein/locale/ReinProjectCode.docx create mode 100644 rein/locale/compile.py create mode 100644 rein/locale/messages-ES.mo create mode 100644 rein/locale/messages-HI.mo create mode 100644 rein/locale/messages-HI.po create mode 100644 rein/locale/messages-LV.mo create mode 100644 rein/locale/messages-RU.mo create mode 100644 rein/locale/messages-fil.mo diff --git a/rein/cli.py b/rein/cli.py index 66873e6..a3d2c83 100644 --- a/rein/cli.py +++ b/rein/cli.py @@ -105,7 +105,7 @@ def setup(multi): rein.set_multiuser() log.info('entering setup') if multi or rein.has_no_account(): - click.echo("\n" + hilight(_("Welcome to Rein."), True, True) + "\n\n" + + click.echo("\n" + highlight(_("Welcome to Rein."), True, True) + "\n\n" + _("Do you want to import a backup or create a new account?\n\n") + _("1 - Create new account\n2 - Import backup\n")) choice = click.prompt(highlight("Choice", True, True), type=int, default=1) diff --git a/rein/locale/ReinProjectCode.docx b/rein/locale/ReinProjectCode.docx deleted file mode 100644 index a31d7e3fb86c625356d80aaff7a1b97cdf95f4b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40833 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 literal 0 HcmV?d00001 diff --git a/rein/locale/messages-HI.mo b/rein/locale/messages-HI.mo new file mode 100644 index 0000000000000000000000000000000000000000..40f2bd45e2d82348619cbb42190b8bb881084888 GIT binary patch literal 11295 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 literal 0 HcmV?d00001 diff --git a/rein/locale/messages-HI.po b/rein/locale/messages-HI.po new file mode 100644 index 0000000..c0057f4 --- /dev/null +++ b/rein/locale/messages-HI.po @@ -0,0 +1,289 @@ +# Rein Decentralized Freelance Market. +# Copyright (C) 2016 +# This file is distributed under the same license as the python-rein package. +# David Stery , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.2\n" +"POT-Creation-Date: 2016-12-21 11:00+PST\n" +"PO-Revision-Date: 2017-02-16 20:14+0100\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: hi_IN\n" +"X-Generator: Poedit 1.8.11\n" + +#: rein/cli.py:52 +msgid "" +"\n" +" Rein is a decentralized professional services market and Python-rein is a client\n" +"that provides a user interface. Use this program from your local browser or command \n" +"line to create an account, post a job, bid, etc.\n" +"\n" +"\b\n" +" Quick start:\n" +" $ rein start - create an identity, run the Web UI\n" +" $ rein buy - request microhosting\n" +" $ rein sync - push your identity to microhosting servers\n" +" $ rein status - get user status, or dump of job's documents\n" +"\n" +"\b\n" +" Workers\n" +" $ rein bid - view and bid on jobs\n" +" $ rein deliver - complete job by providing deliverables\n" +"\n" +"\b\n" +" Disputes\n" +" $ rein workerdispute - worker files dispute\n" +" $ rein creatordispute - job creator files dispute\n" +" $ rein resolve - mediator posts decision\n" +"\n" +" For more info and the setup guide visit: http://reinproject.org\n" +" " +msgstr "" +"\n" +" रेन एक विकेन्द्रीकृत पेशेवर सेवाओं का त्रय-विक्रय-स्थान है और Python-rein एक असामी है\n" +"जो एक उपयोगकर्ता अंतरापृष्ठ प्रदान करता है। अपने स्थानीय विचरक या आदेशसे इस क्रमादेश का उपयोग करना\n" +"एक खाता बनाने के लिए, कार्य का विज्ञापन, बोली, आदि भेजने के लिए यह पंक्ति है\n" +"\b\n" +" त्वरित प्रारंभ:\n" +" $ रेन की शुरूवात - एक पहचान बनाने, चलाने के लिए वेब यूआई\n" +" $ रेन की खरीद - सूक्ष्महोस्टिंग का अनुरोध करे\n" +" $ रेन का संकालन - सूक्ष्महोस्टिंग के सर्वर तक अपनी पहचान पहुंचाहिए\n" +" $ रेन की स्थिति - उपयोगकर्ता की स्थिति, या नौकरी के दस्तावेजों का ढेर जमा करे\n" +"\n" +"\b\n" +" श्रमिक\n" +" $ रेन बोली - देखे और कार्यों पर बोली लगाए\n" +" $ रेन पहुंचाना - प्रदेय का उपलब्ध करके पूरा काम ख़तम करना\n" +"\n" +"\b\n" +" मतभेद\n" +" $ रेन श्रमिकों का मतभेद - कार्यकर्ता फ़ाइलों विवाद\n" +" $ रेन निर्माताओं का विवाद - नौकरी के निर्माता मतभेद का दावा करता है\n" +" $ रेन का संकल्प - मध्यस्थ निर्णय को घोषित करता है\n" +"\n" +" अधिक जानकारी और स्थापित करने की सूचना के लिए: http://reinproject.org\n" +" " + +#: rein/cli.py:85 +msgid "" +"\n" +" Setup or import an identity.\n" +"\n" +" You will choose a name or handle for your account, include public contact information, \n" +" and a delegate Bitcoin address/private key that the program will use to sign documents\n" +" on your behalf. An enrollment document will be created and you will need to sign it\n" +" with your master Bitcoin private key.\n" +" " +msgstr "" +"\n" +" पहचान को स्थापित या आयत करें.\n" +"\n" +" आपको अपने खाते के लिए एक नाम या उपाधि का चयन करना होगा, जिसमे आप सार्वजनिक संपर्क जानकारी शामिल करेंगे, \n" +" और एक प्रतिनिधि बिटकॉइन की पता/गुप्त चाबी है जसिका उपयोग वो प्रोग्राम दस्तावेजों पर हस्ताक्षर करने के लिए करेगा\n" +" आपकी जगह पर। एक नामांकन दस्तावेज बनाया जाएगा और आपको इसपर हस्ताक्षर करने की आवश्यकता होगी\n" +" अपने विशेषज्ञ बिटकॉइन के गुप्त चाबी के साथ.\n" +" " + +#: rein/cli.py:98 +msgid "" +"1 - Create new account\n" +"2 - Import backup\n" +msgstr "" +"१ - एक नया खता बनाए\n" +"२ - बवैकअप का आयत करें\n" + +#: rein/lib/forms.py:51 +msgid "Bid amount" +msgstr " नीलामी राशि" + +#: rein/lib/forms.py:52 +msgid "Choose Job to bid on" +msgstr "बोली के लिए कार्य का चयन करें" + +#: rein/lib/forms.py:55 +msgid "Choose bid" +msgstr "बोली चुनें" + +#: rein/lib/forms.py:63 +msgid "Choose job" +msgstr "कार्य का चयन" + +#: rein/lib/forms.py:59 +msgid "Choose job associated with deliverables" +msgstr "प्रदेय के साथ जुड़े कार्य का चयन" + +#: rein/lib/forms.py:47 +msgid "Choose mediator" +msgstr "मध्यस्थ चुनें " + +#: rein/lib/forms.py:33 +msgid "Delegate Bitcoin address" +msgstr "बिटकॉइन के पता की नियुक्ति" + +#: rein/lib/forms.py:34 +msgid "Delegate Bitcoin private Key" +msgstr "प्बिटकॉइन गुप्त चाबी की नियुक्ति" + +#: rein/lib/forms.py:58 rein/lib/forms.py:68 +msgid "Deliverables" +msgstr "प्रदेय " + +#: rein/lib/forms.py:44 rein/lib/forms.py:50 +msgid "Description" +msgstr "विवरण" + +#: rein/lib/forms.py:62 +msgid "Dispute detail" +msgstr "मतभेद की जानकारी" + +#: rein/lib/forms.py:74 +msgid "Disputes" +msgstr "मतभेद" + +#: rein/cli.py:97 +msgid "" +"Do you want to import a backup or create a new account?\n" +"\n" +msgstr "" +"क्या आप एक बैकअप का आयात या एक नया खाता बनाना चाहते हैं?\n" +"\n" + +#: rein/lib/forms.py:31 +msgid "Email / Bitmessage" +msgstr "ईमेल/बिटकॉइन का सन्देश (Bitmessage)" + +#: rein/lib/io.py:16 +msgid "Error connecting to server." +msgstr "सर्वर से संपर्क बनाने में त्रुटि।" + +#: rein/lib/forms.py:46 +msgid "Expiration (days)" +msgstr "समय सीमा समाप्त (दिन)" + +#: rein/lib/market.py:54 +msgid "File containing signed document" +msgstr "फ़ाइल ज्सिमे हस्ताक्षर किए दस्तावेज़ युक्त है" + +#: rein/lib/order.py:18 +msgid "" +"Funds for each job in Rein are stored in two multisig addresses. One address\n" +"is for the primary payment that will go to the worker on completion. The\n" +"second address pays the mediator to be available to resolve a dispute\n" +"if necessary. The second address should be funded according to the percentage\n" +"specified by the mediator and is in addition to the primary payment. The\n" +"listing below shows available mediators and the fee they charge. You should\n" +"consider the fee as well as any reputational data you are able to find when\n" +"choosing a mediator. Your choice may affect the number and quality of bids" +msgstr "" +"\"Rein में किए गए प्रत्येक कार्य के लिए जमा की गई रकम दो एकाधिकहस्ताक्षर के पता में जमा हो जाती है। एक की पता\n" +"\"\"में प्राथमिक भुगतान है जो कि पूरा होने पर काम करनेवाले को मिलेगा।\n" +"\"दूसरी पता मध्यस्थ का भुगतान करती है ताकि वो मतभेद हल करने के लिए उपलब्ध हो सके\n" +"अगर आवश्यक है। दूसरी पता प्रतिशत के अनुसार रकम जमा किया जाना चाहिए\n" +"मध्यस्थ द्वारा निर्दिष्ट और इसके साथ में प्राथमिक भुगतान करने के लिए है।\n" +"निचे दी गयी सूची उपलब्ध मध्यस्थों और उनके शुल्क की जानकारी देता है। आपको\n" +"एक मध्यस्थ चुनें। आपकी पसंद आपके अंकों और बोलियों की गुणवत्ता को प्रभावित कर सकता है" + +#: rein/lib/forms.py:22 +msgid "Invalid address" +msgstr "अवैध पता" + +#: rein/lib/forms.py:27 +msgid "Invalid signature" +msgstr "अवैध हस्ताक्षर" + +#: rein/lib/forms.py:43 +msgid "Job name" +msgstr "कार्य का नाम" + +#: rein/lib/forms.py:32 +msgid "Master Bitcoin address" +msgstr "विशेषज्ञ बिटकॉइन का पता" + +#: rein/lib/forms.py:36 +msgid "Mediator Fee" +msgstr "मध्यस्थ का शुल्क" + +#: rein/lib/forms.py:30 +msgid "Name / Handle" +msgstr "नाम / उपाधि (Handle)" + +#: rein/lib/validate.py:168 +msgid "None found" +msgstr "कोई जानकारी नहीं मिला" + +#: rein/lib/forms.py:18 +msgid "Not a valid private key." +msgstr "एक अमान्य गुप्त चाबी।" + +#: rein/lib/toolbox.py:9 +msgid "Please enter " +msgstr "कृपया दर्ज करें " + +#: rein/lib/forms.py:35 +msgid "Register as a mediator?" +msgstr "एक मध्यस्थ के रूप में दर्ज करें?" + +#: rein/lib/forms.py:73 +msgid "Resolution" +msgstr "संकल्प" + +#: rein/lib/forms.py:40 +msgid "Signed enrollment" +msgstr "हस्ताक्षर किए गए नामांकन" + +#: rein/lib/forms.py:67 rein/lib/forms.py:72 +msgid "Signed mediator payment" +msgstr "हस्ताक्षर किए गए मध्यस्थ भुगतान" + +#: rein/lib/forms.py:66 rein/lib/forms.py:71 +msgid "Signed primary payment" +msgstr "हस्ताक्षर किए गए प्राथमिक भुगतान" + +#: rein/lib/forms.py:45 +msgid "Tags" +msgstr "टैग्स " + +#: rein/lib/validate.py:14 +msgid "Verifying block times..." +msgstr "ब्लॉक समय का सत्यापन ..." + +#: rein/cli.py:98 +msgid "Welcome to Rein." +msgstr "रेन में आपका स्वागत है|" + +#: rein/lib/order.py:31 +msgid "bid submitted" +msgstr "बोली प्रस्तुत की गई है " + +#: rein/lib/order.py:67 +msgid "complete, dispute resolved" +msgstr "पूरा करना, मतभेद सुलझाया" + +#: rein/lib/order.py:61 +msgid "complete, work accepted" +msgstr "पूरा करना, काम स्वीकार कर लिया" + +#: rein/lib/order.py:43 +msgid "deliverables submitted" +msgstr "प्रदेय प्रस्तुत की गई है" + +#: rein/lib/order.py:49 +msgid "disputed by job creator" +msgstr "काम निर्माता द्वारा मतभेद" + +#: rein/lib/order.py:55 +msgid "disputed by worker" +msgstr "काम करनेवालों द्वारा मतभेद" + +#: rein/lib/order.py:37 +msgid "job awarded" +msgstr "काम को सौंपा गया है" + +#: rein/lib/order.py:17 +msgid "posted" +msgstr "को दर्ज करना " diff --git a/rein/locale/messages-LV.mo b/rein/locale/messages-LV.mo new file mode 100644 index 0000000000000000000000000000000000000000..3ca53747990dcee573d4f9c9c14df7875d48b9c2 GIT binary patch literal 6863 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, 2017. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.2\n" "POT-Creation-Date: 2016-12-21 11:00+PST\n" -"PO-Revision-Date: 2016-12-21 11:00+PST\n" +"PO-Revision-Date: 2017-02-16 19:43+0100\n" "Last-Translator: Kaspars Lapiņš \n" "Language-Team: Latviešu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"X-Generator: Poedit 1.8.11\n" #: rein/cli.py:52 msgid "" "\n" +" Rein is a decentralized professional services market and Python-rein is a client\n" +"that provides a user interface. Use this program from your local browser or command \n" +"line to create an account, post a job, bid, etc.\n" +"\n" +"\b\n" +" Quick start:\n" +" $ rein start - create an identity, run the Web UI\n" +" $ rein buy - request microhosting\n" +" $ rein sync - push your identity to microhosting servers\n" +" $ rein status - get user status, or dump of job's documents\n" +"\n" +"\b\n" +" Workers\n" +" $ rein bid - view and bid on jobs\n" +" $ rein deliver - complete job by providing deliverables\n" +"\n" +"\b\n" +" Disputes\n" +" $ rein workerdispute - worker files dispute\n" +" $ rein creatordispute - job creator files dispute\n" +" $ rein resolve - mediator posts decision\n" +"\n" +" For more info and the setup guide visit: http://reinproject.org\n" +" " +msgstr "" +"\n" " Rein ir centralizēts pakalpojumu tirgus un Python-rein ir klients\n" -"kas nodrošina lietotāja interfeisu. Izmanto šo programmu no jūsu patstāvīgās pārlukprogrammas \n" +"kas nodrošina lietotāja interfeisu. Izmanto šo programmu no jūsu patstāvīgās " +"pārlukprogrammas \n" "vieta kur reģistrēties, pievono darbu, liec likmes, u.c.\n" "\n" "\b\n" @@ -27,7 +55,8 @@ msgid "" " $ rein start - izveidot identitāti, palaist tīklu UI\n" " $ rein buy - pieprasīt microhostingu\n" " $ rein sync - ielikt savu identitāti microhosting serveros\n" -" $ rein status - dabūt lietotāja statusus, vai kaudzi ar darba doukumentiem\n" +" $ rein status - dabūt lietotāja statusus, vai kaudzi ar darba " +"doukumentiem\n" "\n" "\b\n" " Darbinieki\n" @@ -42,204 +71,223 @@ msgid "" "\n" " Vairāk info šeit: http://reinproject.org\n" " " -msgstr "" #: rein/cli.py:85 msgid "" "\n" +" Setup or import an identity.\n" +"\n" +" You will choose a name or handle for your account, include public contact information, \n" +" and a delegate Bitcoin address/private key that the program will use to sign documents\n" +" on your behalf. An enrollment document will be created and you will need to sign it\n" +" with your master Bitcoin private key.\n" +" " +msgstr "" +"\n" " izveidot vai ievietot identitāti.\n" "\n" -" Jūs izvēlēsieties savu vārdu priekš jūsu profila, ievietojot publisku kontaktinformāciju, \n" -" ievietojot Bitcoin adresi/privāto atslēgu ko programma izmantos parakstot dokumentus\n" -" jūsu vārdā. Uzņemšanas dokuments tiks izveidots un jums tas būs jāparaksta\n" +" Jūs izvēlēsieties savu vārdu priekš jūsu profila, ievietojot publisku " +"kontaktinformāciju, \n" +" ievietojot Bitcoin adresi/privāto atslēgu ko programma izmantos " +"parakstot dokumentus\n" +" jūsu vārdā. Uzņemšanas dokuments tiks izveidots un jums tas būs " +"jāparaksta\n" " ar jūsu Bitcoin private key/privāto atslēgu.\n" " " -msgstr "" #: rein/cli.py:98 msgid "" +"1 - Create new account\n" +"2 - Import backup\n" +msgstr "" "1 - Izveidot profilu\n" "2 - atgūt dublētos datus\n" -msgstr "" #: rein/lib/forms.py:51 -msgid "Pieteikties" -msgstr "" +msgid "Bid amount" +msgstr "Pieteikties" -#: rein/lib/forms.py:52 -msgid "Izvēlēties darbu" -msgstr "" +#: rein/lib/forms.py:52 rein/lib/forms.py:63 +msgid "Choose Job to bid on" +msgstr "Izvēlēties darbu" #: rein/lib/forms.py:55 -msgid "Izvēlēties pieteikumu" -msgstr "" - -#: rein/lib/forms.py:63 -msgid "Izvēlēties darbu" -msgstr "" +msgid "Choose bid" +msgstr "Izvēlēties pieteikumu" #: rein/lib/forms.py:59 -msgid "Izvēlēties darbu ar nodevām" -msgstr "" +msgid "Choose job associated with deliverables" +msgstr "Izvēlēties darbu ar nodevām" #: rein/lib/forms.py:47 -msgid "Izvēlēties starpnieku" -msgstr "" +msgid "Choose mediator" +msgstr "Izvēlēties starpnieku" #: rein/lib/forms.py:33 -msgid "Pārskatīt BITCOIN adresi" -msgstr "" +msgid "Delegate Bitcoin address" +msgstr "Pārskatīt BITCOIN adresi" #: rein/lib/forms.py:34 -msgid "Pārskatīt Bitcoin Private Key/atslēgu" -msgstr "" +msgid "Delegate Bitcoin private Key" +msgstr "Pārskatīt Bitcoin Private Key/atslēgu" #: rein/lib/forms.py:58 rein/lib/forms.py:68 -msgid "Nodevas" -msgstr "" +msgid "Deliverables" +msgstr "Nodevas" #: rein/lib/forms.py:44 rein/lib/forms.py:50 -msgid "Apraksts" -msgstr "" +msgid "Description" +msgstr "Apraksts" #: rein/lib/forms.py:62 -msgid "apstrīdēt detaļas" -msgstr "" +msgid "Dispute detail" +msgstr "apstrīdēt detaļas" #: rein/lib/forms.py:74 -msgid "Strīdi" -msgstr "" +msgid "Disputes" +msgstr "Strīdi" #: rein/cli.py:97 msgid "" -"Vai vēlaties atgūt dublētos datus vai izveidot jaunu profilu?\n" +"Do you want to import a backup or create a new account?\n" "\n" msgstr "" +"Vai vēlaties atgūt dublētos datus vai izveidot jaunu profilu?\n" +"\n" #: rein/lib/forms.py:31 -msgid "E-pasts / Bitvēstule" -msgstr "" +msgid "Email / Bitmessage" +msgstr "E-pasts / Bitvēstule" #: rein/lib/io.py:16 -msgid "Kļuda piekļūšanai serverim." -msgstr "" +msgid "Error connecting to server." +msgstr "Kļuda piekļūšanai serverim." #: rein/lib/forms.py:46 -msgid "Atlikušās dienas" -msgstr "" +msgid "Expiration (days)" +msgstr "Atlikušās dienas" #: rein/lib/market.py:54 -msgid "Failā ietilpst parakstīts dokuments" -msgstr "" +msgid "File containing signed document" +msgstr "Failā ietilpst parakstīts dokuments" #: rein/lib/order.py:18 msgid "" +"Funds for each job in Rein are stored in two multisig addresses. One address\n" +"is for the primary payment that will go to the worker on completion. The\n" +"second address pays the mediator to be available to resolve a dispute\n" +"if necessary. The second address should be funded according to the percentage\n" +"specified by the mediator and is in addition to the primary payment. The\n" +"listing below shows available mediators and the fee they charge. You should\n" +"consider the fee as well as any reputational data you are able to find when\n" +"choosing a mediator. Your choice may affect the number and quality of bids" +msgstr "" "Uzkrājumi darbā Rein ir saglabāti divās adresēs. Viena adrese\n" "ir priekš primārās samaksas darbiniekam par pabeigtu darbu.\n" "Otrā adrese ir priekš starpnieka, lai varētu atrisināt strīdus\n" "ja vajadzīgs. Otrā adrese tiks uzkrāta ņemot vērā attiecīgos procentus\n" ",to noteiks starpnieks arī ņemot vērā primāro samaksu. The\n" -"Saraksts lejā norāda brīvos starpniekus un to procentus ko viņi pieprasa. Jums vajadzētu\n" +"Saraksts lejā norāda brīvos starpniekus un to procentus ko viņi pieprasa. " +"Jums vajadzētu\n" "apsvērt samaksu starpniekam kā reputācijas datu kad\n" "izvēlēsieties starpnieku. Jūsu izvēle nosaka skaitu un kvalitāti pieteikumiem" -msgstr "" #: rein/lib/forms.py:22 -msgid "Nederīga adrese" -msgstr "" +msgid "Invalid address" +msgstr "Nederīga adrese" #: rein/lib/forms.py:27 -msgid "Nederīgs paraksts" -msgstr "" +msgid "Invalid signature" +msgstr "Nederīgs paraksts" #: rein/lib/forms.py:43 -msgid "Darba nosaukums" -msgstr "" +msgid "Job name" +msgstr "Darba nosaukums" #: rein/lib/forms.py:32 -msgid "Bitcoin adrese" -msgstr "" +msgid "Master Bitcoin address" +msgstr "Bitcoin adrese" #: rein/lib/forms.py:36 -msgid "Starnieka samaksa" -msgstr "" +msgid "Mediator Fee" +msgstr "Starnieka samaksa" #: rein/lib/forms.py:30 -msgid "Vārds" -msgstr "" +msgid "Name / Handle" +msgstr "Vārds" #: rein/lib/validate.py:168 -msgid "Netika atrasts" -msgstr "" +msgid "None found" +msgstr "Netika atrasts" #: rein/lib/forms.py:18 -msgid "nederīga privātā atslēga." -msgstr "" +msgid "Not a valid private key." +msgstr "nederīga privātā atslēga." #: rein/lib/toolbox.py:9 -msgid "Lūdzu ievadiet " -msgstr "" +msgid "Please enter " +msgstr "Lūdzu ievadiet " #: rein/lib/forms.py:35 -msgid "Reģistrēties kā starpniekam?" -msgstr "" +msgid "Register as a mediator?" +msgstr "Reģistrēties kā starpniekam?" #: rein/lib/forms.py:73 -msgid "Rezolūcija" -msgstr "" +msgid "Resolution" +msgstr "Rezolūcija" #: rein/lib/forms.py:40 -msgid "Parakstīta uzņemšana" -msgstr "" +msgid "Signed enrollment" +msgstr "Parakstīta uzņemšana" #: rein/lib/forms.py:67 rein/lib/forms.py:72 -msgid "Parakstīta starpnieka samaksa" -msgstr "" +msgid "Signed mediator payment" +msgstr "Parakstīta starpnieka samaksa" #: rein/lib/forms.py:66 rein/lib/forms.py:71 -msgid "Parakstīta primārā samaksa" -msgstr "" +msgid "Signed primary payment" +msgstr "Parakstīta primārā samaksa" #: rein/lib/forms.py:45 -msgid "Etiķetes" -msgstr "" +msgid "Tags" +msgstr "Etiķetes" #: rein/lib/validate.py:14 -msgid "Pārbauda bloku laiku..." -msgstr "" +msgid "Verifying block times..." +msgstr "Pārbauda bloku laiku..." #: rein/cli.py:98 -msgid "Sveicināti Rein." -msgstr "" +msgid "Welcome to Rein." +msgstr "Sveicināti Rein." #: rein/lib/order.py:31 -msgid "pieteikums apstiprināts" -msgstr "" +msgid "bid submitted" +msgstr "pieteikums apstiprināts" #: rein/lib/order.py:67 -msgid "Pabeigts, strīds atrisināts" -msgstr "" +msgid "complete, dispute resolved" +msgstr "Pabeigts, strīds atrisināts" #: rein/lib/order.py:61 -msgid "Pabeigts, darbs apstiprināts" -msgstr "" +msgid "complete, work accepted" +msgstr "Pabeigts, darbs apstiprināts" #: rein/lib/order.py:43 -msgid "nodevas pieņemtas" -msgstr "" +msgid "deliverables submitted" +msgstr "nodevas pieņemtas" #: rein/lib/order.py:49 -msgid "apstrīdēts no darba devēja" -msgstr "" +msgid "disputed by job creator" +msgstr "apstrīdēts no darba devēja" #: rein/lib/order.py:55 -msgid "apstrīdēts no darbinieka" -msgstr "" +msgid "disputed by worker" +msgstr "apstrīdēts no darbinieka" #: rein/lib/order.py:37 -msgid "Darbs piešķirts" -msgstr "" +msgid "job awarded" +msgstr "Darbs piešķirts" #: rein/lib/order.py:17 -msgid "Publicēts" -msgstr "" +msgid "posted" +msgstr "Publicēts" diff --git a/rein/locale/messages-RU.mo b/rein/locale/messages-RU.mo new file mode 100644 index 0000000000000000000000000000000000000000..6bc89ee704f4e345cf84cc4d346171b4e552f23f GIT binary patch literal 9129 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 WS=4*Qb!L?khe8eJ_Waezko+sWB^GS} literal 0 HcmV?d00001 diff --git a/rein/locale/messages-RU.po b/rein/locale/messages-RU.po index 83502d2..76a8166 100644 --- a/rein/locale/messages-RU.po +++ b/rein/locale/messages-RU.po @@ -3,21 +3,48 @@ # This file is distributed under the same license as the python-rein package. # David Sterry , 2017. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.2\n" "POT-Creation-Date: 2016-12-21 11:00+PST\n" -"PO-Revision-Date: 2016-12-21 11:00+PST\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2017-02-16 19:44+0100\n" "Language-Team: RUSSIAN \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Last-Translator: \n" +"Language: ru\n" +"X-Generator: Poedit 1.8.11\n" #: rein/cli.py:52 msgid "" "\n" +" Rein is a decentralized professional services market and Python-rein is a client\n" +"that provides a user interface. Use this program from your local browser or command \n" +"line to create an account, post a job, bid, etc.\n" +"\n" +"\b\n" +" Quick start:\n" +" $ rein start - create an identity, run the Web UI\n" +" $ rein buy - request microhosting\n" +" $ rein sync - push your identity to microhosting servers\n" +" $ rein status - get user status, or dump of job's documents\n" +"\n" +"\b\n" +" Workers\n" +" $ rein bid - view and bid on jobs\n" +" $ rein deliver - complete job by providing deliverables\n" +"\n" +"\b\n" +" Disputes\n" +" $ rein workerdispute - worker files dispute\n" +" $ rein creatordispute - job creator files dispute\n" +" $ rein resolve - mediator posts decision\n" +"\n" +" For more info and the setup guide visit: http://reinproject.org\n" +" " +msgstr "" +"\n" " Rein это децентрализованный рынок профессиональных услуг и Python-rein это клиент\n" "который предоставляет интерфейс пользователя. Используйте эту программу из вашего локального браузера \n" "или коммандной строки что бы создать аккаунт, опубликовать работу, сделать ставку и т.д.\n" @@ -42,99 +69,118 @@ msgid "" "\n" " Для подробной информации и инструкции установки посетите ресурс: http://reinproject.org\n" " " -msgstr "" #: rein/cli.py:85 msgid "" "\n" +" Setup or import an identity.\n" +"\n" +" You will choose a name or handle for your account, include public contact information, \n" +" and a delegate Bitcoin address/private key that the program will use to sign documents\n" +" on your behalf. An enrollment document will be created and you will need to sign it\n" +" with your master Bitcoin private key.\n" +" " +msgstr "" +"\n" " Установите или импортируйте идентификатор.\n" "\n" " Вы выберете имя для вашего аккаунта, включая публичную контактную информацию, \n" " и Bitcoin адрес/приватный ключ, которые программа будет использовать для подписи документов\n" " от вашего имени. Зарегистрированный документ будет создан и вы должны будете подписать это\n" " вашим приватным Bitcoin ключем.\n" - " " -msgstr "" #: rein/cli.py:98 msgid "" +"1 - Create new account\n" +"2 - Import backup\n" +msgstr "" "1 - Создать новый аккаунт\n" "2 - Импортировать бэкап\n" -msgstr "" #: rein/lib/forms.py:51 -msgid "Сделать ставку" -msgstr "" +msgid "Bid amount" +msgstr "Сделать ставку" #: rein/lib/forms.py:52 -msgid "Выбрать проект для ставки" -msgstr "" +msgid "Choose Job to bid on" +msgstr "Выбрать проект для ставки" #: rein/lib/forms.py:55 -msgid "Выбрать ставку" -msgstr "" +msgid "Choose bid" +msgstr "Выбрать ставку" #: rein/lib/forms.py:63 -msgid "Выбрать работу" -msgstr "" +msgid "Choose job" +msgstr "Выбрать работу" #: rein/lib/forms.py:59 -msgid "Выбрать работу ассоциированную с результатом" -msgstr "" +msgid "Choose job associated with deliverables" +msgstr "Выбрать работу ассоциированную с результатом" #: rein/lib/forms.py:47 -msgid "Выбрать медиатора" -msgstr "" +msgid "Choose mediator" +msgstr "Выбрать медиатора" #: rein/lib/forms.py:33 -msgid "Выбрать Bitcoin адрес" -msgstr "" +msgid "Delegate Bitcoin address" +msgstr "Выбрать Bitcoin адрес" #: rein/lib/forms.py:34 -msgid "Выбрать приватный ключ Bitcoin" -msgstr "" +msgid "Delegate Bitcoin private Key" +msgstr "Выбрать приватный ключ Bitcoin" #: rein/lib/forms.py:58 rein/lib/forms.py:68 -msgid "Результат" -msgstr "" +msgid "Deliverables" +msgstr "Результат" #: rein/lib/forms.py:44 rein/lib/forms.py:50 -msgid "Описание" -msgstr "" +msgid "Description" +msgstr "Описание" #: rein/lib/forms.py:62 -msgid "Оспорить деталь" -msgstr "" +msgid "Dispute detail" +msgstr "Оспорить деталь" #: rein/lib/forms.py:74 -msgid "Споры" -msgstr "" +msgid "Disputes" +msgstr "Споры" #: rein/cli.py:97 msgid "" -"Вы хотите имортировать бэкап или создать новый аккаунт?\n" +"Do you want to import a backup or create a new account?\n" "\n" msgstr "" +"Вы хотите имортировать бэкап или создать новый аккаунт?\n" +"\n" #: rein/lib/forms.py:31 msgid "Email / Bitmessage" -msgstr "" +msgstr "Email / Bitmessage" #: rein/lib/io.py:16 -msgid "Ошибка подключения к серверу." -msgstr "" +msgid "Error connecting to server." +msgstr "Ошибка подключения к серверу." #: rein/lib/forms.py:46 -msgid "Истекает (дней)" -msgstr "" +msgid "Expiration (days)" +msgstr "Истекает (дней)" #: rein/lib/market.py:54 -msgid "Файл содержит подписанный документ" -msgstr "" +msgid "File containing signed document" +msgstr "Файл содержит подписанный документ" #: rein/lib/order.py:18 msgid "" +"Funds for each job in Rein are stored in two multisig addresses. One address\n" +"is for the primary payment that will go to the worker on completion. The\n" +"second address pays the mediator to be available to resolve a dispute\n" +"if necessary. The second address should be funded according to the percentage\n" +"specified by the mediator and is in addition to the primary payment. The\n" +"listing below shows available mediators and the fee they charge. You should\n" +"consider the fee as well as any reputational data you are able to find when\n" +"choosing a mediator. Your choice may affect the number and quality of bids" +msgstr "" "Средства для каждой работы в реин хранятся в двух мультиподписанных адресах. Один адрес\n" "для личного платежа который будет отправлен работнику по окончании проекта. \n" "Второй для медиатора, на случай разрешения спора при необходимости. Второй адрес должен быть пополнен опираясь на процент\n" @@ -142,104 +188,103 @@ msgid "" "Список ниже показывает доступных медиаторов и комиссии, которые они требуют. \n" "Вы должны учитывать комиссию так же, как и любую другую репутационную информацию, которую вы можете найти,\n" "когда выбираете медиатора. Ваш выбор может повлиять на количество и качество ставок." -msgstr "" #: rein/lib/forms.py:22 -msgid "Неправильный адрес" -msgstr "" +msgid "Invalid address" +msgstr "Неправильный адрес" #: rein/lib/forms.py:27 -msgid "Неправильная подпись" -msgstr "" +msgid "Invalid signature" +msgstr "Неправильная подпись" #: rein/lib/forms.py:43 -msgid "Имя работы" -msgstr "" +msgid "Job name" +msgstr "Имя работы" #: rein/lib/forms.py:32 -msgid "Адрес Bitcoin" -msgstr "" +msgid "Master Bitcoin address" +msgstr "Адрес Bitcoin" #: rein/lib/forms.py:36 -msgid "Комиссия медиатора" -msgstr "" +msgid "Mediator Fee" +msgstr "Комиссия медиатора" #: rein/lib/forms.py:30 -msgid "Имя / Держатель" -msgstr "" +msgid "Name / Handle" +msgstr "Имя / Держатель" #: rein/lib/validate.py:168 -msgid "Ничего не найдено" -msgstr "" +msgid "None found" +msgstr "Ничего не найдено" #: rein/lib/forms.py:18 -msgid "Не правильный приватный ключ." -msgstr "" +msgid "Not a valid private key." +msgstr "Не правильный приватный ключ." #: rein/lib/toolbox.py:9 -msgid "Пожалуйста введите " -msgstr "" +msgid "Please enter " +msgstr "Пожалуйста введите " #: rein/lib/forms.py:35 -msgid "Зарегистрировать как медиатор?" -msgstr "" +msgid "Register as a mediator?" +msgstr "Зарегистрировать как медиатор?" #: rein/lib/forms.py:73 -msgid "Решение" -msgstr "" +msgid "Resolution" +msgstr "Решение" #: rein/lib/forms.py:40 -msgid "Подписанное зачисление" -msgstr "" +msgid "Signed enrollment" +msgstr "Подписанное зачисление" #: rein/lib/forms.py:67 rein/lib/forms.py:72 -msgid "Подписанный платеж медиатора" -msgstr "" +msgid "Signed mediator payment" +msgstr "Подписанный платеж медиатора" #: rein/lib/forms.py:66 rein/lib/forms.py:71 -msgid "Подписанный частный платеж" -msgstr "" +msgid "Signed primary payment" +msgstr "Подписанный частный платеж" #: rein/lib/forms.py:45 -msgid "Тэги" -msgstr "" +msgid "Tags" +msgstr "Тэги" #: rein/lib/validate.py:14 -msgid "Верификация блока раз..." -msgstr "" +msgid "Verifying block times..." +msgstr "Верификация блока раз..." #: rein/cli.py:98 -msgid "Добро пожаловать в Rein." -msgstr "" +msgid "Welcome to Rein." +msgstr "Добро пожаловать в Rein." #: rein/lib/order.py:31 -msgid "ставка принята" -msgstr "" +msgid "bid submitted" +msgstr "ставка принята" #: rein/lib/order.py:67 -msgid "окончено, спор окончен" -msgstr "" +msgid "complete, dispute resolved" +msgstr "окончено, спор окончен" #: rein/lib/order.py:61 -msgid "окончено, работа принята" -msgstr "" +msgid "complete, work accepted" +msgstr "окончено, работа принята" #: rein/lib/order.py:43 -msgid "результаты отправлены" -msgstr "" +msgid "deliverables submitted" +msgstr "результаты отправлены" #: rein/lib/order.py:49 -msgid "оспорено работодателем" -msgstr "" +msgid "disputed by job creator" +msgstr "оспорено работодателем" #: rein/lib/order.py:55 -msgid "оспорено исполнителем" -msgstr "" +msgid "disputed by worker" +msgstr "оспорено исполнителем" #: rein/lib/order.py:37 -msgid "выбран исполнитель" -msgstr "" +msgid "job awarded" +msgstr "выбран исполнитель" #: rein/lib/order.py:17 -msgid "опубликовано" -msgstr "" +msgid "posted" +msgstr "опубликовано" diff --git a/rein/locale/messages-fil.mo b/rein/locale/messages-fil.mo new file mode 100644 index 0000000000000000000000000000000000000000..75302bd48d3baa3681fbc1cf929058eb6f8b7d76 GIT binary patch literal 7141 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 literal 0 HcmV?d00001 From be04b750141c94796e5ee1faaf3b565f89b306b9 Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Fri, 17 Feb 2017 18:28:44 +0100 Subject: [PATCH 05/13] Open correct localization file --- rein/lib/localization.py | 12 ++++++++---- rein/locale/__init__.py | 0 rein/locale/compile.py | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 rein/locale/__init__.py diff --git a/rein/lib/localization.py b/rein/lib/localization.py index f6a7bce..3cadd36 100644 --- a/rein/lib/localization.py +++ b/rein/lib/localization.py @@ -1,19 +1,23 @@ import gettext import locale import logging +import os +import rein.locale def init_localization(): '''prepare l10n''' locale.setlocale(locale.LC_ALL, '') # use user's preferred locale # take first two characters of country code loc = locale.getlocale() - filename = "res/messages_%s.mo" % locale.getlocale()[0][0:2] + file_name = "messages-%s.mo" % locale.getlocale()[0][0:2] + file_path = os.path.join(os.path.dirname(os.path.abspath(rein.locale.__file__)), file_name) + print(file_path) try: - logging.debug( "Opening message file %s for locale %s", filename, loc[0] ) - trans = gettext.GNUTranslations(open( filename, "rb" ) ) + logging.debug("Opening message file %s for locale %s", file_name, loc[0]) + trans = gettext.GNUTranslations(open(file_path, "rb" )) except IOError: - logging.debug( "Locale not found. Using default messages" ) + logging.debug("Locale not found. Using default messages") trans = gettext.NullTranslations() trans.install() diff --git a/rein/locale/__init__.py b/rein/locale/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rein/locale/compile.py b/rein/locale/compile.py index 9ffa0c8..e032d62 100644 --- a/rein/locale/compile.py +++ b/rein/locale/compile.py @@ -1,6 +1,7 @@ import os import subprocess +# Compile all .po files within the current working directory to .mo format for f in os.listdir(os.getcwd()): if f.endswith('.po'): subprocess.call("msgfmt {} -o {}".format(f, f.replace('.po', '.mo'))) From 0743cebd10c86d5f8a19f508830e69edfd33e66f Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Sun, 19 Feb 2017 14:07:17 +0100 Subject: [PATCH 06/13] Properly extract system locale, remove unnecessary file --- messages.po | 245 --------------------------------------- rein/lib/localization.py | 8 +- 2 files changed, 4 insertions(+), 249 deletions(-) delete mode 100644 messages.po diff --git a/messages.po b/messages.po deleted file mode 100644 index 0d06b43..0000000 --- a/messages.po +++ /dev/null @@ -1,245 +0,0 @@ -# Rein Decentralized Freelance Market. -# Copyright (C) 2016 -# This file is distributed under the same license as the python-rein package. -# David Stery , 2016. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: 0.2\n" -"POT-Creation-Date: 2016-12-21 11:00+PST\n" -"PO-Revision-Date: 2016-12-21 11:00+PST\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: rein/cli.py:52 -msgid "" -"\n" -" Rein is a decentralized professional services market and Python-rein is a client\n" -"that provides a user interface. Use this program from your local browser or command \n" -"line to create an account, post a job, bid, etc.\n" -"\n" -"\b\n" -" Quick start:\n" -" $ rein start - create an identity, run the Web UI\n" -" $ rein buy - request microhosting\n" -" $ rein sync - push your identity to microhosting servers\n" -" $ rein status - get user status, or dump of job's documents\n" -"\n" -"\b\n" -" Workers\n" -" $ rein bid - view and bid on jobs\n" -" $ rein deliver - complete job by providing deliverables\n" -"\n" -"\b\n" -" Disputes\n" -" $ rein workerdispute - worker files dispute\n" -" $ rein creatordispute - job creator files dispute\n" -" $ rein resolve - mediator posts decision\n" -"\n" -" For more info and the setup guide visit: http://reinproject.org\n" -" " -msgstr "" - -#: rein/cli.py:85 -msgid "" -"\n" -" Setup or import an identity.\n" -"\n" -" You will choose a name or handle for your account, include public contact information, \n" -" and a delegate Bitcoin address/private key that the program will use to sign documents\n" -" on your behalf. An enrollment document will be created and you will need to sign it\n" -" with your master Bitcoin private key.\n" -" " -msgstr "" - -#: rein/cli.py:98 -msgid "" -"1 - Create new account\n" -"2 - Import backup\n" -msgstr "" - -#: rein/lib/forms.py:51 -msgid "Bid amount" -msgstr "" - -#: rein/lib/forms.py:52 -msgid "Choose Job to bid on" -msgstr "" - -#: rein/lib/forms.py:55 -msgid "Choose bid" -msgstr "" - -#: rein/lib/forms.py:63 -msgid "Choose job" -msgstr "" - -#: rein/lib/forms.py:59 -msgid "Choose job associated with deliverables" -msgstr "" - -#: rein/lib/forms.py:47 -msgid "Choose mediator" -msgstr "" - -#: rein/lib/forms.py:33 -msgid "Delegate Bitcoin address" -msgstr "" - -#: rein/lib/forms.py:34 -msgid "Delegate Bitcoin private Key" -msgstr "" - -#: rein/lib/forms.py:58 rein/lib/forms.py:68 -msgid "Deliverables" -msgstr "" - -#: rein/lib/forms.py:44 rein/lib/forms.py:50 -msgid "Description" -msgstr "" - -#: rein/lib/forms.py:62 -msgid "Dispute detail" -msgstr "" - -#: rein/lib/forms.py:74 -msgid "Disputes" -msgstr "" - -#: rein/cli.py:97 -msgid "" -"Do you want to import a backup or create a new account?\n" -"\n" -msgstr "" - -#: rein/lib/forms.py:31 -msgid "Email / Bitmessage" -msgstr "" - -#: rein/lib/io.py:16 -msgid "Error connecting to server." -msgstr "" - -#: rein/lib/forms.py:46 -msgid "Expiration (days)" -msgstr "" - -#: rein/lib/market.py:54 -msgid "File containing signed document" -msgstr "" - -#: rein/lib/order.py:18 -msgid "" -"Funds for each job in Rein are stored in two multisig addresses. One address\n" -"is for the primary payment that will go to the worker on completion. The\n" -"second address pays the mediator to be available to resolve a dispute\n" -"if necessary. The second address should be funded according to the percentage\n" -"specified by the mediator and is in addition to the primary payment. The\n" -"listing below shows available mediators and the fee they charge. You should\n" -"consider the fee as well as any reputational data you are able to find when\n" -"choosing a mediator. Your choice may affect the number and quality of bids" -msgstr "" - -#: rein/lib/forms.py:22 -msgid "Invalid address" -msgstr "" - -#: rein/lib/forms.py:27 -msgid "Invalid signature" -msgstr "" - -#: rein/lib/forms.py:43 -msgid "Job name" -msgstr "" - -#: rein/lib/forms.py:32 -msgid "Master Bitcoin address" -msgstr "" - -#: rein/lib/forms.py:36 -msgid "Mediator Fee" -msgstr "" - -#: rein/lib/forms.py:30 -msgid "Name / Handle" -msgstr "" - -#: rein/lib/validate.py:168 -msgid "None found" -msgstr "" - -#: rein/lib/forms.py:18 -msgid "Not a valid private key." -msgstr "" - -#: rein/lib/toolbox.py:9 -msgid "Please enter " -msgstr "" - -#: rein/lib/forms.py:35 -msgid "Register as a mediator?" -msgstr "" - -#: rein/lib/forms.py:73 -msgid "Resolution" -msgstr "" - -#: rein/lib/forms.py:40 -msgid "Signed enrollment" -msgstr "" - -#: rein/lib/forms.py:67 rein/lib/forms.py:72 -msgid "Signed mediator payment" -msgstr "" - -#: rein/lib/forms.py:66 rein/lib/forms.py:71 -msgid "Signed primary payment" -msgstr "" - -#: rein/lib/forms.py:45 -msgid "Tags" -msgstr "" - -#: rein/lib/validate.py:14 -msgid "Verifying block times..." -msgstr "" - -#: rein/cli.py:98 -msgid "Welcome to Rein." -msgstr "" - -#: rein/lib/order.py:31 -msgid "bid submitted" -msgstr "" - -#: rein/lib/order.py:67 -msgid "complete, dispute resolved" -msgstr "" - -#: rein/lib/order.py:61 -msgid "complete, work accepted" -msgstr "" - -#: rein/lib/order.py:43 -msgid "deliverables submitted" -msgstr "" - -#: rein/lib/order.py:49 -msgid "disputed by job creator" -msgstr "" - -#: rein/lib/order.py:55 -msgid "disputed by worker" -msgstr "" - -#: rein/lib/order.py:37 -msgid "job awarded" -msgstr "" - -#: rein/lib/order.py:17 -msgid "posted" -msgstr "" diff --git a/rein/lib/localization.py b/rein/lib/localization.py index 3cadd36..c5833af 100644 --- a/rein/lib/localization.py +++ b/rein/lib/localization.py @@ -6,16 +6,16 @@ def init_localization(): '''prepare l10n''' - locale.setlocale(locale.LC_ALL, '') # use user's preferred locale - # take first two characters of country code - loc = locale.getlocale() - file_name = "messages-%s.mo" % locale.getlocale()[0][0:2] + # Extract system locale identifier + loc = locale.getdefaultlocale()[0] + file_name = "messages-%s.mo" % loc.split('_')[0] file_path = os.path.join(os.path.dirname(os.path.abspath(rein.locale.__file__)), file_name) print(file_path) try: logging.debug("Opening message file %s for locale %s", file_name, loc[0]) trans = gettext.GNUTranslations(open(file_path, "rb" )) + except IOError: logging.debug("Locale not found. Using default messages") trans = gettext.NullTranslations() From 8632330b7d948e7500e163b94f7ef884b059ad08 Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Mon, 20 Feb 2017 16:14:13 +0100 Subject: [PATCH 07/13] Added locale folder to manifest.in, removed unnecessary folder, lower-cased locale names --- MANIFEST.in | 1 + rein/lib/maybe/dochashcash.py | 37 ------------------ .../locale/{messages-ES.mo => messages-es.mo} | Bin .../locale/{messages-ES.po => messages-es.po} | 0 rein/locale/messages-fil.po | 0 .../locale/{messages-HI.mo => messages-hi.mo} | Bin .../locale/{messages-HI.po => messages-hi.po} | 0 .../locale/{messages-LV.mo => messages-lv.mo} | Bin .../locale/{messages-LV.po => messages-lv.po} | 0 .../locale/{messages-RU.mo => messages-ru.mo} | Bin .../locale/{messages-RU.po => messages-ru.po} | 0 11 files changed, 1 insertion(+), 37 deletions(-) delete mode 100644 rein/lib/maybe/dochashcash.py rename rein/locale/{messages-ES.mo => messages-es.mo} (100%) rename rein/locale/{messages-ES.po => messages-es.po} (100%) mode change 100755 => 100644 rein/locale/messages-fil.po rename rein/locale/{messages-HI.mo => messages-hi.mo} (100%) rename rein/locale/{messages-HI.po => messages-hi.po} (100%) rename rein/locale/{messages-LV.mo => messages-lv.mo} (100%) rename rein/locale/{messages-LV.po => messages-lv.po} (100%) rename rein/locale/{messages-RU.mo => messages-ru.mo} (100%) rename rein/locale/{messages-RU.po => messages-ru.po} (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 32faac0..cdc112e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,3 @@ recursive-include rein/html * recursive-include rein/lib/crypto/resources * +recursive-include rein/locale * \ No newline at end of file diff --git a/rein/lib/maybe/dochashcash.py b/rein/lib/maybe/dochashcash.py deleted file mode 100644 index 1defecf..0000000 --- a/rein/lib/maybe/dochashcash.py +++ /dev/null @@ -1,37 +0,0 @@ -import scrypt -import time -from bitcoin.core import x, b2x - -if __name__ == '__main__': - text = """-----BEGIN BITCOIN SIGNED MESSAGE----- -- ----BEGIN BITCOIN SIGNED MESSAGE----- -- ----BEGIN BITCOIN SIGNED MESSAGE----- -Name/Handle: Knightdk -Contact: knightdk on Bitcointalk.org -Master signing address: 16mT7jrpkjnJBD7a3TM2awyxHub58H6r6Z -Delegate signing address: N/A -Willing to mediate: Y -Mediation public key: 04594f2582c859c4f65084ee7fe8e9ec2d695bb988a3f53db48eaaff6ff3a0282b2be0c79"""\ -"""fefca01277404d0fdc3a923e8ed02efd6ab96980f3e229a81fbe032e9 -- ----BEGIN SIGNATURE----- -16mT7jrpkjnJBD7a3TM2awyxHub58H6r6Z -GxHE6iJH2aMpsRk7cszvXsLieDawzArpt7XDdOPhVFD5KVqIvKve1fwUKeN6ct4bld41XLdrZ7Dvaj7x1Oiw0uo= -- ----END BITCOIN SIGNED MESSAGE----- -- ----BEGIN SIGNATURE----- -1BbgnPQYeXAt39ifLNUWP1RBktpzGLmRZS -IGJcg+MoqpBQNtptelyZfC2zBKk5SZQQjtf4pHSxb0yZH6kn/9Dhd1TWFfXUXsWmZq78xYye4lKi1aQUeNQ2ZFs= -- ----END BITCOIN SIGNED MESSAGE----- ------BEGIN SIGNATURE----- -1DVK9Rdi2wcpcfEkep7FSNUui7fzadmxsW -IMcU7MvLl7T+hY0mmMw6mblLstnXd9Ly36z7uYMqv7ZZEuZQOvuXN2GjYU0Nq4So9GKQRkQwIis7EiN6luTMcOY= ------END BITCOIN SIGNED MESSAGE-----""" - - start = time.time() - count = 1 - - h1 = scrypt.hash(text, 'random salt', 32768, 8, 1, 16) - while 1: - h1 = scrypt.hash(h1, 'random salt', 32768, 8, 1, 16) - count += 1 - if h1 < x('04ffffffffffffffffffffffffffffff'): - print(b2x(h1), time.time() - start, count) diff --git a/rein/locale/messages-ES.mo b/rein/locale/messages-es.mo similarity index 100% rename from rein/locale/messages-ES.mo rename to rein/locale/messages-es.mo diff --git a/rein/locale/messages-ES.po b/rein/locale/messages-es.po similarity index 100% rename from rein/locale/messages-ES.po rename to rein/locale/messages-es.po diff --git a/rein/locale/messages-fil.po b/rein/locale/messages-fil.po old mode 100755 new mode 100644 diff --git a/rein/locale/messages-HI.mo b/rein/locale/messages-hi.mo similarity index 100% rename from rein/locale/messages-HI.mo rename to rein/locale/messages-hi.mo diff --git a/rein/locale/messages-HI.po b/rein/locale/messages-hi.po similarity index 100% rename from rein/locale/messages-HI.po rename to rein/locale/messages-hi.po diff --git a/rein/locale/messages-LV.mo b/rein/locale/messages-lv.mo similarity index 100% rename from rein/locale/messages-LV.mo rename to rein/locale/messages-lv.mo diff --git a/rein/locale/messages-LV.po b/rein/locale/messages-lv.po similarity index 100% rename from rein/locale/messages-LV.po rename to rein/locale/messages-lv.po diff --git a/rein/locale/messages-RU.mo b/rein/locale/messages-ru.mo similarity index 100% rename from rein/locale/messages-RU.mo rename to rein/locale/messages-ru.mo diff --git a/rein/locale/messages-RU.po b/rein/locale/messages-ru.po similarity index 100% rename from rein/locale/messages-RU.po rename to rein/locale/messages-ru.po From b947ba2b4895a9e8a275be6adc2fe420d3252de8 Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Mon, 20 Feb 2017 17:45:59 +0100 Subject: [PATCH 08/13] Separated unit tests from source, implemented nose for test discovery instead of unittest --- Makefile | 3 +-- rein/lib/bitcoinaddress.py | 12 --------- rein/lib/script.py | 42 +---------------------------- requirements.txt | 20 +++++++------- tests/{test_cli.py => _test_cli.py} | 0 tests/lib/test_bitcoinaddress.py | 12 +++++++++ tests/lib/test_script.py | 42 +++++++++++++++++++++++++++++ 7 files changed, 67 insertions(+), 64 deletions(-) rename tests/{test_cli.py => _test_cli.py} (100%) create mode 100644 tests/lib/test_bitcoinaddress.py create mode 100644 tests/lib/test_script.py diff --git a/Makefile b/Makefile index 341b589..2cd35ee 100644 --- a/Makefile +++ b/Makefile @@ -3,5 +3,4 @@ clean: rm -f enrollment.txt.sig test: - python -m unittest2 rein/lib/script.py - python -m unittest2 rein/lib/bitcoinaddress.py + nosetests -v diff --git a/rein/lib/bitcoinaddress.py b/rein/lib/bitcoinaddress.py index ced735e..4e9700a 100644 --- a/rein/lib/bitcoinaddress.py +++ b/rein/lib/bitcoinaddress.py @@ -2,11 +2,9 @@ from crypto.util import ripemd160 from bitcoin import base58 from binascii import unhexlify -import unittest digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' - def to_bytes(n, length, endianess='big'): h = '%x' % n s = ('0' * (len(h) % 2) + h).zfill(length * 2).decode('hex') @@ -26,16 +24,6 @@ def check_bitcoin_address(bc): bcbytes = decode_base58(bc, 25) return bcbytes[-4:] == sha256(sha256(bcbytes[:-4]).digest()).digest()[:4] - -class BitcoinAddressTest(unittest.TestCase): - def test_check_bitcoin_address(self): - self.assertTrue(check_bitcoin_address('1CptxARjqcfkVwGFSjR82zmPT8YtRMubub')) - self.assertTrue(check_bitcoin_address('3746f7fjJ6fG1pQXDjA8xy9WAzf4968WWv')) - self.assertFalse(check_bitcoin_address('2746f7fjJ6fG1pQXDjA8xy9WAzf4968WWv')) - - def test_check_sin(self): - self.assertEqual(generate_sin('02F840A04114081690223B7069071A70D6DABB891763B638CC20C7EC3BD58E6C86'), 'TfG4ScDgysrSpodWD4Re5UtXmcLbY5CiUHA') - def generate_sin(master_key): """Generates a type 2 'Secure Identity Number' using the bip32 master public key""" prefix = 0x0F diff --git a/rein/lib/script.py b/rein/lib/script.py index 1b39a92..14a5869 100644 --- a/rein/lib/script.py +++ b/rein/lib/script.py @@ -4,7 +4,6 @@ from bitcoin.core.script import CScript, OP_CHECKMULTISIG, OP_CHECKSIGVERIFY from bitcoin.wallet import CBitcoinAddress from .validate import parse_document -import unittest def parse_script(text): try: @@ -80,43 +79,4 @@ def check_redeem_scripts(document): ret['Mediator public key'], pubkeys): click.echo("2-of-3 check failed") return False - return True - -class BitcoinScriptTest(unittest.TestCase): - def test_2_of_3(self): - # primary payment 2-of-3 redeem script - p = parse_script('5221029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb0052102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c4651921026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc53ae') - self.assertTrue(check_2_of_3(p, ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', - '02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', - '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) - # switch key order - self.assertTrue(check_2_of_3(p, ['02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', - '029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', - '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) - - def test_mandatory_multisig(self): - # mandatory multisig for mediator - - m = parse_script('2102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519ad5121029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb00521026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc52ae') - self.assertTrue(check_mandatory_multisig(m, '02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', - ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', - '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) - # switch non-mandatory key order - self.assertTrue(check_mandatory_multisig(m, '02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', - ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', - '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) - # mix up mandatory and non-mandatory keys - self.assertFalse(check_mandatory_multisig(m, '029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', - ['02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', - '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) - - def test_build_redeem_scripts(self): - self.assertEquals(build_2_of_3(['02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', - '029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', - '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])[0], - '522102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c4651921029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb00521026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc53ae') - - self.assertEquals(build_mandatory_multisig('02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', - ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', - '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])[0], - '2102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519ad5121029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb00521026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc52ae') + return True \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 9105e47..aa713ba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,18 +1,20 @@ +appdirs==1.4.0 bip32utils==0.3.post3 -click==6.2 +click==6.7 ecdsa==0.13 Flask==0.12 -Flask-WTF==0.14 +Flask-WTF==0.14.2 itsdangerous==0.24 -Jinja2==2.9.3 +Jinja2==2.9.5 MarkupSafe==0.23 +nose==1.3.7 +packaging==16.8 pbkdf2==1.3 -PySocks==1.6.5 -python-bitcoinlib==0.5.0 -python-dateutil==2.4.2 -requests==2.10.0 +pyparsing==2.1.10 +PySocks==1.6.6 +python-bitcoinlib==0.7.0 +requests==2.13.0 six==1.10.0 -unittest2 -SQLAlchemy==1.0.11 +SQLAlchemy==1.1.5 Werkzeug==0.11.15 WTForms==2.1 diff --git a/tests/test_cli.py b/tests/_test_cli.py similarity index 100% rename from tests/test_cli.py rename to tests/_test_cli.py diff --git a/tests/lib/test_bitcoinaddress.py b/tests/lib/test_bitcoinaddress.py new file mode 100644 index 0000000..1aa43b7 --- /dev/null +++ b/tests/lib/test_bitcoinaddress.py @@ -0,0 +1,12 @@ +import unittest + +from rein.lib.bitcoinaddress import check_bitcoin_address, generate_sin + +class TestBitcoinAddress(unittest.TestCase): + def test_check_bitcoin_address(self): + self.assertTrue(check_bitcoin_address('1CptxARjqcfkVwGFSjR82zmPT8YtRMubub')) + self.assertTrue(check_bitcoin_address('3746f7fjJ6fG1pQXDjA8xy9WAzf4968WWv')) + self.assertFalse(check_bitcoin_address('2746f7fjJ6fG1pQXDjA8xy9WAzf4968WWv')) + + def test_sin_generation(self): + self.assertEqual(generate_sin('02F840A04114081690223B7069071A70D6DABB891763B638CC20C7EC3BD58E6C86'), 'TfG4ScDgysrSpodWD4Re5UtXmcLbY5CiUHA') \ No newline at end of file diff --git a/tests/lib/test_script.py b/tests/lib/test_script.py new file mode 100644 index 0000000..e3200a6 --- /dev/null +++ b/tests/lib/test_script.py @@ -0,0 +1,42 @@ +import unittest + +from rein.lib.script import parse_script, check_2_of_3, check_mandatory_multisig, build_2_of_3, build_mandatory_multisig + +class TestScript(unittest.TestCase): + def test_2_of_3(self): + # primary payment 2-of-3 redeem script + p = parse_script('5221029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb0052102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c4651921026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc53ae') + self.assertTrue(check_2_of_3(p, ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', + '02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', + '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) + # switch key order + self.assertTrue(check_2_of_3(p, ['02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', + '029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', + '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) + + def test_mandatory_multisig(self): + # mandatory multisig for mediator + + m = parse_script('2102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519ad5121029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb00521026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc52ae') + self.assertTrue(check_mandatory_multisig(m, '02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', + ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', + '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) + # switch non-mandatory key order + self.assertTrue(check_mandatory_multisig(m, '02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', + ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', + '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) + # mix up mandatory and non-mandatory keys + self.assertFalse(check_mandatory_multisig(m, '029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', + ['02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', + '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])) + + def test_build_redeem_scripts(self): + self.assertEquals(build_2_of_3(['02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', + '029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', + '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])[0], + '522102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c4651921029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb00521026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc53ae') + + self.assertEquals(build_mandatory_multisig('02f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519', + ['029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb005', + '026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc'])[0], + '2102f719f009fb8eb20ccdbfda7d38f378ed2f103ac0a6768df830740c6835c46519ad5121029fcafbe2dced6fe79865b265ea90387c5411658ca11449999d5020a9f67bb00521026bc363139ebc1cad8e6eee402507d2b4874f5450585f1e6a1cd30a63ecdfc9dc52ae') \ No newline at end of file From c6acc5db8b6619f1ff4be80c457186cd24489b23 Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Mon, 20 Feb 2017 17:49:16 +0100 Subject: [PATCH 09/13] Rename falsely renamed file --- tests/{_test_cli.py => test_cli.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{_test_cli.py => test_cli.py} (100%) diff --git a/tests/_test_cli.py b/tests/test_cli.py similarity index 100% rename from tests/_test_cli.py rename to tests/test_cli.py From eff8f027ba5b01daaf0ef17f0905f962299c5897 Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Mon, 20 Feb 2017 18:03:40 +0100 Subject: [PATCH 10/13] Two separate tests: One for travis (test), one for testing in a vagrant environment(test_all) --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 2cd35ee..6f267a4 100644 --- a/Makefile +++ b/Makefile @@ -3,4 +3,7 @@ clean: rm -f enrollment.txt.sig test: + nosetests -v --ignore-files="test_cli.py" + +test_all: nosetests -v From 0d361c476f3be971b1a7c54de8172ae3b57992eb Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Mon, 20 Feb 2017 20:25:44 +0100 Subject: [PATCH 11/13] Updated readme to reflect testing changes --- README.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index dbe4ac4..8d2f543 100644 --- a/README.md +++ b/README.md @@ -92,23 +92,28 @@ To generate or update pot files for translation, run the following from the root We have [a quick Vagrant-based setup](https://github.com/ReinProject/devsetup) that gives you a virtual machine with the python-rein client, Causway server and its Bitcoin Core (testnet) node all configured to work together. Testing usually involves creating users and walking through jobs so a virtual machine that has all components going, even allowing payments to be sent is very helpful. -Tests are run using nose: +Tests are run using nose, with the make file specifying two different test commands: - $ nosetests + $ make test + nosetests -v --ignore-files="test_cli.py" .. ---------------------------------------------------------------------- - Ran 2 tests in 0.837s + Ran 5 tests in 0.344 OK -And unittest2: +and - $ make test - python -m unittest2 rein/lib/*.py - .... + $ make test_all + nosetests -v + .. ---------------------------------------------------------------------- - Ran 4 tests in 0.001s - + Ran 7 tests in 2.393s + OK +By default, the more limited "test" command should be used when a dedicated test-environment, such as the Vagrant set-up mentioned above, is not available. It currently runs all tests except the tests specified in "tests/test_cli.py". + Tox fails right now but does run flake so will be helpful for cleanup. + +Be aware that new unit tests should be added to a file within the tests directory. Both the file name and the test method names should follow the naming convention "test_*". \ No newline at end of file From 459884520b6d638107e1749a5995ff488ee95448 Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Fri, 24 Feb 2017 10:49:01 +0100 Subject: [PATCH 12/13] Removed unnecessary print --- rein/lib/localization.py | 1 - 1 file changed, 1 deletion(-) diff --git a/rein/lib/localization.py b/rein/lib/localization.py index c5833af..c967cb2 100644 --- a/rein/lib/localization.py +++ b/rein/lib/localization.py @@ -10,7 +10,6 @@ def init_localization(): loc = locale.getdefaultlocale()[0] file_name = "messages-%s.mo" % loc.split('_')[0] file_path = os.path.join(os.path.dirname(os.path.abspath(rein.locale.__file__)), file_name) - print(file_path) try: logging.debug("Opening message file %s for locale %s", file_name, loc[0]) From 3f7f5fec03afcdee63b71f65d2e645edc7aeab6f Mon Sep 17 00:00:00 2001 From: FreakJoe Date: Fri, 24 Feb 2017 21:01:17 +0100 Subject: [PATCH 13/13] Upper-casing locale --- rein/lib/localization.py | 3 ++- rein/locale/{messages-es.mo => messages-ES.mo} | Bin rein/locale/{messages-es.po => messages-ES.po} | 0 rein/locale/{messages-fil.mo => messages-FIL.mo} | Bin rein/locale/{messages-fil.po => messages-FIL.po} | 0 rein/locale/{messages-hi.mo => messages-HI.mo} | Bin rein/locale/{messages-hi.po => messages-HI.po} | 0 rein/locale/{messages-lv.mo => messages-LV.mo} | Bin rein/locale/{messages-lv.po => messages-LV.po} | 0 rein/locale/{messages-ru.mo => messages-RU.mo} | Bin rein/locale/{messages-ru.po => messages-RU.po} | 0 11 files changed, 2 insertions(+), 1 deletion(-) rename rein/locale/{messages-es.mo => messages-ES.mo} (100%) rename rein/locale/{messages-es.po => messages-ES.po} (100%) rename rein/locale/{messages-fil.mo => messages-FIL.mo} (100%) rename rein/locale/{messages-fil.po => messages-FIL.po} (100%) rename rein/locale/{messages-hi.mo => messages-HI.mo} (100%) rename rein/locale/{messages-hi.po => messages-HI.po} (100%) rename rein/locale/{messages-lv.mo => messages-LV.mo} (100%) rename rein/locale/{messages-lv.po => messages-LV.po} (100%) rename rein/locale/{messages-ru.mo => messages-RU.mo} (100%) rename rein/locale/{messages-ru.po => messages-RU.po} (100%) diff --git a/rein/lib/localization.py b/rein/lib/localization.py index c967cb2..e0d3863 100644 --- a/rein/lib/localization.py +++ b/rein/lib/localization.py @@ -8,7 +8,7 @@ def init_localization(): '''prepare l10n''' # Extract system locale identifier loc = locale.getdefaultlocale()[0] - file_name = "messages-%s.mo" % loc.split('_')[0] + file_name = "messages-%s.mo" % loc.split('_')[0].upper() file_path = os.path.join(os.path.dirname(os.path.abspath(rein.locale.__file__)), file_name) try: @@ -23,3 +23,4 @@ def init_localization(): if __name__ == '__main__': init_localization() + \ No newline at end of file diff --git a/rein/locale/messages-es.mo b/rein/locale/messages-ES.mo similarity index 100% rename from rein/locale/messages-es.mo rename to rein/locale/messages-ES.mo diff --git a/rein/locale/messages-es.po b/rein/locale/messages-ES.po similarity index 100% rename from rein/locale/messages-es.po rename to rein/locale/messages-ES.po diff --git a/rein/locale/messages-fil.mo b/rein/locale/messages-FIL.mo similarity index 100% rename from rein/locale/messages-fil.mo rename to rein/locale/messages-FIL.mo diff --git a/rein/locale/messages-fil.po b/rein/locale/messages-FIL.po similarity index 100% rename from rein/locale/messages-fil.po rename to rein/locale/messages-FIL.po diff --git a/rein/locale/messages-hi.mo b/rein/locale/messages-HI.mo similarity index 100% rename from rein/locale/messages-hi.mo rename to rein/locale/messages-HI.mo diff --git a/rein/locale/messages-hi.po b/rein/locale/messages-HI.po similarity index 100% rename from rein/locale/messages-hi.po rename to rein/locale/messages-HI.po diff --git a/rein/locale/messages-lv.mo b/rein/locale/messages-LV.mo similarity index 100% rename from rein/locale/messages-lv.mo rename to rein/locale/messages-LV.mo diff --git a/rein/locale/messages-lv.po b/rein/locale/messages-LV.po similarity index 100% rename from rein/locale/messages-lv.po rename to rein/locale/messages-LV.po diff --git a/rein/locale/messages-ru.mo b/rein/locale/messages-RU.mo similarity index 100% rename from rein/locale/messages-ru.mo rename to rein/locale/messages-RU.mo diff --git a/rein/locale/messages-ru.po b/rein/locale/messages-RU.po similarity index 100% rename from rein/locale/messages-ru.po rename to rein/locale/messages-RU.po