Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • appimage
  • check_uniq_node_by_endpoints
  • dev
  • feature/agent_architecture
  • feature/backend
  • fix_ci
  • fix_ci_osx
  • fix_dbus_error
  • fix_gitlab
  • fix_travis#1105
  • fixappveyor
  • gitlab
  • landscape
  • master
  • pyinstaller
  • pyqt5.6
  • qt5.7
  • qtwebengine
  • sakia020
  • translations
  • 0.1.0
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.11.0
  • 0.11.1
  • 0.11.2
  • 0.11.3
  • 0.11.4
  • 0.11.4.post1
  • 0.11.5
  • 0.12.0
  • 0.12.1dev1
  • 0.12.1dev2
  • 0.12.1dev3
  • 0.12.1dev4
  • 0.12.dev1
  • 0.12.dev2
  • 0.12.dev3
  • 0.12.dev4
  • 0.12.dev5
  • 0.12rc1
  • 0.2.0
  • 0.2.1
  • 0.20.0
  • 0.20.0dev1
  • 0.20.0dev10
  • 0.20.0dev12
  • 0.20.0dev13
  • 0.20.0dev14
  • 0.20.0dev15
  • 0.20.0dev16
  • 0.20.0dev2
  • 0.20.0dev3
  • 0.20.0dev3-test1
  • 0.20.0dev4
  • 0.20.0dev5
  • 0.20.0dev6
  • 0.20.0dev7
  • 0.20.0dev8
  • 0.20.0dev9
  • 0.20.1
  • 0.20.10
  • 0.20.11
  • 0.20.13
  • 0.20.2
  • 0.20.3
  • 0.20.4
  • 0.20.5
  • 0.20.6
  • 0.20.7
  • 0.20.8
  • 0.20.9
  • 0.3.0
  • 0.30.0
  • 0.30.0beta
  • 0.30.0beta1
  • 0.30.0beta2
  • 0.30.0beta3
  • 0.30.0beta4
  • 0.30.0beta5
  • 0.30.0beta6
  • 0.30.0beta7
  • 0.30.0beta8
  • 0.30.0beta9
  • 0.30.1
  • 0.30.10
  • 0.30.11
  • 0.30.12
  • 0.30.13
  • 0.30.14
  • 0.30.2
  • 0.30.3
  • 0.30.4
  • 0.30.5
  • 0.30.6
  • 0.30.7
  • 0.30.8
  • 0.30.9
  • 0.31.0
  • 0.31.0.post1
  • 0.31.1
  • 0.31.2
  • 0.31.3
  • 0.31.4
  • 0.31.5
  • 0.31.6
  • 0.32.0
  • 0.32.0-linux
  • 0.32.0RC1
  • 0.32.0RC2
  • 0.32.0RC3
  • 0.32.0RC4
  • 0.32.0RC5
  • 0.32.0RC6
  • 0.32.1
  • 0.32.10
  • 0.32.10post1
  • 0.32.2
  • 0.32.3
120 results

Target

Select target project
  • cebash/sakia
  • santiago/sakia
  • jonas/sakia
3 results
Select Git revision
  • Docker
  • Docker-debian9
  • check_uniq_node_by_endpoints
  • dev
  • feature/agent_architecture
  • feature/backend
  • fix_ci
  • fix_ci_osx
  • fix_dbus_error
  • fix_travis#1105
  • fixappveyor
  • gitlab
  • landscape
  • master
  • pyinstaller
  • pyqt5.6
  • qt5.7
  • qtwebengine
  • sakia020
  • translations
  • 0.1.0
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.11.0
  • 0.11.1
  • 0.11.2
  • 0.11.3
  • 0.11.4
  • 0.11.4.post1
  • 0.11.5
  • 0.12.0
  • 0.12.1dev1
  • 0.12.1dev2
  • 0.12.1dev3
  • 0.12.1dev4
  • 0.12.dev1
  • 0.12.dev2
  • 0.12.dev3
  • 0.12.dev4
  • 0.12.dev5
  • 0.12rc1
  • 0.2.0
  • 0.2.1
  • 0.20.0
  • 0.20.0dev1
  • 0.20.0dev10
  • 0.20.0dev12
  • 0.20.0dev13
  • 0.20.0dev14
  • 0.20.0dev15
  • 0.20.0dev16
  • 0.20.0dev2
  • 0.20.0dev3
  • 0.20.0dev3-test1
  • 0.20.0dev4
  • 0.20.0dev5
  • 0.20.0dev6
  • 0.20.0dev7
  • 0.20.0dev8
  • 0.20.0dev9
  • 0.20.1
  • 0.20.10
  • 0.20.11
  • 0.20.13
  • 0.20.2
  • 0.20.3
  • 0.20.4
  • 0.20.5
  • 0.20.6
  • 0.20.7
  • 0.20.8
  • 0.20.9
  • 0.3.0
  • 0.30.0
  • 0.30.0beta
  • 0.30.0beta1
  • 0.30.0beta2
  • 0.30.0beta3
  • 0.30.0beta4
  • 0.30.0beta5
  • 0.30.0beta6
  • 0.30.0beta7
  • 0.30.0beta8
  • 0.30.0beta9
  • 0.30.1
  • 0.30.10
  • 0.30.11
  • 0.30.12
  • 0.30.13
  • 0.30.14
  • 0.30.2
  • 0.30.3
  • 0.30.4
  • 0.30.5
  • 0.30.6
  • 0.30.7
  • 0.30.8
  • 0.30.9
  • 0.31.0
  • 0.31.0.post1
  • 0.31.1
  • 0.31.2
  • 0.31.3
  • 0.31.4
  • 0.31.5
  • 0.31.6
  • 0.32.0
  • 0.32.0-linux
  • 0.32.0RC1
  • 0.32.0RC2
  • 0.32.0RC3
  • 0.32.0RC4
  • 0.32.0RC5
  • 0.32.0RC6
  • 0.32.1
  • 0.32.10
  • 0.32.10post1
  • 0.32.2
  • 0.32.3
120 results
Show changes
Showing
with 11070 additions and 21550 deletions
#!/bin/bash
#__version_info__ = ('0', '20', '0dev6')
current=`grep -P "__version_info__ = \(\'\d+\', \'\d+\', \'\d+(\w*)\'\)" src/sakia/__init__.py | grep -oP "\'\d+\', \'\d+\', \'\d+(\w*)\'"`
current=`grep -P "__version_info__ = \(\"\d+\", \"\d+\", \"\d+(\w*)\"\)" src/sakia/__init__.py | grep -oP "\"\d+\", \"\d+\", \"\d+(\w*)\""`
echo "Current version: $current"
if [[ $1 =~ ^[0-9]+.[0-9]+.[0-9]+[0-9A-Za-z]*$ ]]; then
IFS='.' read -r -a array <<< "$1"
sed -i "s/__version_info__\ = ($current)/__version_info__ = ('${array[0]}', '${array[1]}', '${array[2]}')/g" src/sakia/__init__.py
sed -i "s/__version_info__\ = ($current)/__version_info__ = (\"${array[0]}\", \"${array[1]}\", \"${array[2]}\")/g" src/sakia/__init__.py
sed -i "s/#define MyAppVerStr .*/#define MyAppVerStr \"$1\"/g" ci/appveyor/sakia.iss
sed -i "s/Version: .*/Version: $1/g" ci/travis/debian/DEBIAN/control
sed -i "s/Version=.*/Version=$1/g" res/linux/usr/share/applications/sakia.desktop
git commit src/sakia/__init__.py ci/appveyor/sakia.iss ci/travis/debian/DEBIAN/control res/linux/usr/share/applications/sakia.desktop -m "$1"
sed -i "s/version=.*/version=$1/g" ci/appimage/config.env
git commit src/sakia/__init__.py ci/appveyor/sakia.iss ci/travis/debian/DEBIAN/control res/linux/usr/share/applications/sakia.desktop ci/appimage/config.env -m "$1"
git tag "$1" -a -m "$1"
else
echo "Wrong version format"
......
quamash
asynctest
networkx
attrs
duniter-mirage
duniterpy>=0.40
pytest
pytest-asyncio<0.6
pyyaml
aiohttp
async_timeout
PyQt5>=5.9,<5.10
\ No newline at end of file
pypeg2
aiohttp==3.6.2
async-timeout==3.0.1
attrs==19.3.0
duniterpy==0.58.1
jsonschema==3.2.0
networkx==2.4
PyQt5==5.9.2
PyYAML==5.3
Quamash==0.6.1
setuptools>=46.0.0
wheel
twine
\ No newline at end of file
black==20.8b1
duniter-mirage>=0.1.50
mypy==0.770
pylint==2.4.4
pytest
pytest-asyncio
md-to-html
\ No newline at end of file
Source diff could not be displayed: it is too large. Options to address this: view the blob.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="2.0" language="ru" sourcelanguage="">
<context>
<name>AboutPopup</name>
<message>
<location filename="../../ui/about.ui" line="14"/>
<source>About</source>
<translation type="obsolete">О программе</translation>
</message>
<message>
<location filename="../../ui/about.ui" line="22"/>
<source>label</source>
<translation type="obsolete">ярлык</translation>
</message>
</context>
<context>
<name>Account</name>
<message>
<location filename="../../../src/cutecoin/core/account.py" line="101"/>
<source>Units</source>
<translation type="obsolete">Единицы</translation>
</message>
<name>AboutMoney</name>
<message>
<location filename="../../../src/cutecoin/core/account.py" line="101"/>
<source>UD {0}</source>
<translation type="obsolete">УД {0}</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_money_uic.py" line="56"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/core/account.py" line="101"/>
<source>UD</source>
<translation type="obsolete">УД</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_money_uic.py" line="57"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/core/account.py" line="101"/>
<source>Quant Z-sum</source>
<translation type="obsolete">Колич. Z-сумма</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_money_uic.py" line="58"/>
<source>Rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/core/account.py" line="101"/>
<source>Relat Z-sum</source>
<translation type="obsolete">Относит. Z-сумма</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_money_uic.py" line="59"/>
<source>Money</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AboutPopup</name>
<message>
<location filename="../../../src/sakia/core/account.py" line="67"/>
<source>Warning : Your membership is expiring soon.</source>
<translation type="obsolete">Внимание: срок вашего членства скоро закончится.</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_uic.py" line="40"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/core/account.py" line="72"/>
<source>Warning : Your could miss certifications soon.</source>
<translation type="obsolete">Внимание: скоро вы можете пропустить сертификацию</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_uic.py" line="41"/>
<source>label</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AccountConfigurationDialog</name>
<name>AboutWot</name>
<message>
<location filename="../../ui/account_cfg.ui" line="14"/>
<source>Add an account</source>
<translation type="obsolete">Добавить аккаунт</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_wot_uic.py" line="33"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="30"/>
<source>Account parameters</source>
<translation type="obsolete">Параметры аккаунтa</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/about_wot_uic.py" line="34"/>
<source>WoT</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BaseGraph</name>
<message>
<location filename="../../ui/account_cfg.ui" line="51"/>
<source>Account name (uid)</source>
<translation type="obsolete">Имя аккаунтa (ИДП)</translation>
<location filename="../../../src/sakia/data/graphs/base_graph.py" line="19"/>
<source>(sentry)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CertificationController</name>
<message>
<location filename="../../ui/account_cfg.ui" line="68"/>
<source>Wallets</source>
<translation type="obsolete">Кошельки</translation>
<location filename="../../../src/sakia/gui/sub/certification/controller.py" line="208"/>
<source>{days} days</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="84"/>
<source>Delete account</source>
<translation type="obsolete">Удалить аккаунт</translation>
<location filename="../../../src/sakia/gui/sub/certification/controller.py" line="212"/>
<source>{hours}h {min}min</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="113"/>
<source>Key parameters</source>
<translation type="obsolete">Ключевые параметры</translation>
<location filename="../../../src/sakia/gui/sub/certification/controller.py" line="113"/>
<source>Certification</source>
<translation type="unfinished">Сертификация</translation>
</message>
</context>
<context>
<name>CertificationView</name>
<message>
<location filename="../../ui/account_cfg.ui" line="153"/>
<source>Your password</source>
<translation type="obsolete">Ваш пароль</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="36"/>
<source>&amp;Ok</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="166"/>
<source>Please repeat your password</source>
<translation type="obsolete">Пожалуйста, введите снова ваш пароль</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="31"/>
<source>No more certifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="185"/>
<source>Show public key</source>
<translation type="obsolete">Показать открытый ключ</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="35"/>
<source>Not a member</source>
<translation type="unfinished">Не член</translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="230"/>
<source>Add a community</source>
<translation type="obsolete">Добавить сообщество</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="39"/>
<source>Please select an identity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="237"/>
<source>Remove selected community</source>
<translation type="obsolete">Удалить избранное сообщество</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="43"/>
<source>&amp;Ok (Not validated before {remaining})</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="261"/>
<source>Previous</source>
<translation type="obsolete">Предыдущий</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="49"/>
<source>&amp;Process Certification</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="281"/>
<source>Next</source>
<translation type="obsolete">Следующий</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="57"/>
<source>Please enter correct password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/account_cfg.ui" line="215"/>
<source>Communities</source>
<translation type="obsolete">Cообществ</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="125"/>
<source>Import identity document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Application</name>
<message>
<location filename="../../../src/sakia/core/app.py" line="76"/>
<source>Warning : Your membership is expiring soon.</source>
<translation type="obsolete">Внимание: срок вашего членства скоро закончится.</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="125"/>
<source>Duniter documents (*.txt)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/core/app.py" line="81"/>
<source>Warning : Your could miss certifications soon.</source>
<translation type="obsolete">Внимание: скоро вы можете пропустить сертификацию</translation>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="140"/>
<source>Identity document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ButtonBoxState</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="88"/>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="190"/>
<source>Certification</source>
<translation type="unfinished">Сертификация</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="79"/>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="171"/>
<source>Success sending certification</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="88"/>
<source>Could not broadcast certification : {0}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="103"/>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="217"/>
<source>Certifications sent: {nb_certifications}/{stock}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="110"/>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="226"/>
<source>{days} days</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="112"/>
<location filename="../../../src/sakia/gui/sub/certification/view.py" line="230"/>
<source>{hours} hours and {min} min.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="115"/>
<source>Remaining time before next certification validation : {0}</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CertificationController</name>
<name>CertificationWidget</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/controller.py" line="144"/>
<source>{days} days</source>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="139"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/controller.py" line="146"/>
<source>{hours}h {min}min</source>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="140"/>
<source>Select your identity</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CertificationDialog</name>
<message>
<location filename="../../../src/sakia/gui/certification.py" line="136"/>
<source>Certification</source>
<translation type="obsolete">Сертификация</translation>
</message>
<message>
<location filename="../../ui/certification.ui" line="26"/>
<source>Community</source>
<translation type="obsolete">Сообщество</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="141"/>
<source>Certifications stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/certification.ui" line="54"/>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="142"/>
<source>Certify user</source>
<translation type="obsolete">Сертифицировать пользователя</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/certification.ui" line="40"/>
<source>Contact</source>
<translation type="obsolete">Контакт</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="143"/>
<source>Import identity document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/certification.ui" line="61"/>
<source>User public key</source>
<translation type="obsolete">Открытый ключ пользователя</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="144"/>
<source>Process certification</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/certification.ui" line="157"/>
<source>Key</source>
<translation type="obsolete">Ключ</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="150"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/certification.py" line="65"/>
<source>Success certifying {0} from {1}</source>
<translation type="obsolete">Успешная сертификация от {0} до {1}</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="147"/>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/certification.py" line="75"/>
<source>Error</source>
<translation type="obsolete">Ошибка</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="148"/>
<source>By going throught the process of creating a wallet, you accept the license above.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/certification.py" line="75"/>
<source>{0} : {1}</source>
<translation type="obsolete">{0} : {1}</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="149"/>
<source>I accept the above licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/certification.py" line="77"/>
<source>Ok</source>
<translation type="obsolete">ОК</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="151"/>
<source>Secret Key / Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/certification.py" line="232"/>
<source>Not a member</source>
<translation type="obsolete">Не член</translation>
<location filename="../../../src/sakia/gui/sub/certification/certification_uic.py" line="146"/>
<source>Step 1. Check the key and user / Step 2. Accept the money licence / Step 3. Sign to confirm certification</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CertificationView</name>
<name>CertifiersTableModel</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="29"/>
<source>&amp;Ok</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/navigation/identity/table_model.py" line="127"/>
<source>UID</source>
<translation type="unfinished">ИДП</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="22"/>
<source>No more certifications</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/navigation/identity/table_model.py" line="128"/>
<source>Pubkey</source>
<translation type="unfinished">Открытый ключ</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="24"/>
<source>Not a member</source>
<translation type="unfinished">Не член</translation>
<location filename="../../../src/sakia/gui/navigation/identity/table_model.py" line="130"/>
<source>Expiration</source>
<translation type="unfinished">Истечение срока</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="25"/>
<source>Please select an identity</source>
<location filename="../../../src/sakia/gui/navigation/identity/table_model.py" line="129"/>
<source>Publication</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/certification/view.py" line="26"/>
<source>&amp;Ok (Not validated before {remaining})</source>
<location filename="../../../src/sakia/gui/navigation/identity/table_model.py" line="131"/>
<source>available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunityConfigurationDialog</name>
<message>
<location filename="../../ui/community_cfg.ui" line="17"/>
<source>Add a community</source>
<translation type="obsolete">Добавить сообщество</translation>
</message>
<message>
<location filename="../../ui/community_cfg.ui" line="46"/>
<source>Please enter the address of a node :</source>
<translation type="obsolete">Пожалуйста, введите адрес узла</translation>
</message>
<name>CongratulationPopup</name>
<message>
<location filename="../../ui/community_cfg.ui" line="61"/>
<source>:</source>
<translation type="obsolete">:</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/congratulation_uic.py" line="51"/>
<source>Congratulation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/community_cfg.ui" line="98"/>
<source>Check node connectivity</source>
<translation type="obsolete">Проверить подключаемость узла</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/congratulation_uic.py" line="52"/>
<source>label</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConnectionConfigController</name>
<message>
<location filename="../../ui/community_cfg.ui" line="162"/>
<source>Communities nodes</source>
<translation type="obsolete">Узлы сообществ</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="212"/>
<source>Broadcasting identity...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/community_cfg.ui" line="180"/>
<source>Server</source>
<translation type="obsolete">Cервер</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="579"/>
<source>connecting...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/community_cfg.ui" line="203"/>
<source>Add</source>
<translation type="obsolete">Добавить</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="191"/>
<source>Next</source>
<translation type="unfinished">Следующий</translation>
</message>
<message>
<location filename="../../ui/community_cfg.ui" line="224"/>
<source>Previous</source>
<translation type="obsolete">Предыдущий</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="198"/>
<source> (Optional)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/community_cfg.ui" line="247"/>
<source>Next</source>
<translation type="obsolete">Следующий</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="377"/>
<source>Save a revocation document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunityState</name>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="42"/>
<source>Member</source>
<translation type="unfinished">Член</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="377"/>
<source>All text files (*.txt)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="42"/>
<source>Non-Member</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="301"/>
<source>Forbidden: pubkey is too short</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="43"/>
<source>#FF0000</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="308"/>
<source>Forbidden: pubkey is too long</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="56"/>
<source>members</source>
<translation type="unfinished">членами</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="316"/>
<source>Error: passwords are different</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="56"/>
<source>Monetary mass</source>
<translation type="unfinished">Денежная масса</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="324"/>
<source>Error: salts are different</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="56"/>
<source>Status</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="356"/>
<source>Forbidden: salt is too short</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="56"/>
<source>Certs. received</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="364"/>
<source>Forbidden: password is too short</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="56"/>
<source>Membership</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="396"/>
<source>Revocation file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="56"/>
<source>Balance</source>
<translation type="unfinished">Баланс</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="103"/>
<source>Ok</source>
<translation type="unfinished">ОК</translation>
</message>
</context>
<context>
<name>ConnectionConfigView</name>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="125"/>
<source>No Universal Dividend created yet.</source>
<translation type="unfinished">Универсальный дивиденд еще не создан.</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="141"/>
<source>UID broadcast</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>
&lt;table cellpadding=&quot;5&quot;&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:2.2%} / {:} days&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="131"/>
<source>Identity broadcasted to the network</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Universal Dividend UD(t) in</source>
<translation type="unfinished">Универсальный дивиденд УД(t) в</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="145"/>
<source>Error</source>
<translation type="unfinished">Ошибка</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Monetary Mass M(t-1) in</source>
<translation type="unfinished">Денежная масса M(t-1) в</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="233"/>
<source>{days} days, {hours}h and {min}min</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Members N(t)</source>
<translation type="unfinished">Члены N(t)</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="158"/>
<source>New sakia account on {0} network</source>
<translation type="unfinished"></translation>
</message>
</context>
<context encoding="UTF-8">
<name>ConnectionConfigurationDialog</name>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Monetary Mass per member M(t-1)/N(t) in</source>
<translation type="unfinished">Денежная масса на члена M(t-1)/N(t) в</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="260"/>
<source>I accept the above licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Actual growth c = UD(t)/[M(t-1)/N(t)]</source>
<translation type="unfinished">Фактический рост c = UD(t)/[M(t-1)/N(t)]</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="264"/>
<source>Public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Penultimate UD date and time (t-1)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="266"/>
<source>Secret key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Last UD date and time (t)</source>
<translation type="unfinished">Дата и время последнего УД (t)</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="267"/>
<source>Please repeat your secret key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="85"/>
<source>Next UD date and time (t+1)</source>
<translation type="unfinished">Дата и время следующего УД (t+1)</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="268"/>
<source>Your password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="134"/>
<source>
&lt;table cellpadding=&quot;5&quot;&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="269"/>
<source>Please repeat your password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="134"/>
<source>{:2.0%} / {:} days</source>
<translation type="unfinished">{:2.0%} / {:} дней</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="270"/>
<source>Show public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="134"/>
<source>Fundamental growth (c) / Delta time (dt)</source>
<translation type="unfinished">Основной рост (c) / Дельта времени (dt)</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="271"/>
<source>Scrypt parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="134"/>
<source>UD&#xc4;&#x9e;(t) = UD&#xc4;&#x9e;(t-1) + c&#xc2;&#xb2;*M(t-1)/N(t-1)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="272"/>
<source>Simple</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="134"/>
<source>Universal Dividend (formula)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="273"/>
<source>Secure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="134"/>
<source>{:} = {:} + {:2.0%}&#xc2;&#xb2;* {:} / {:}</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="274"/>
<source>Hardest</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="134"/>
<source>Universal Dividend (computed)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="275"/>
<source>Extreme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="176"/>
<source>Name</source>
<translation type="unfinished">Имя</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="279"/>
<source>Export revocation document to continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="176"/>
<source>Units</source>
<translation type="unfinished">Единицы</translation>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="237"/>
<source>Add an account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="176"/>
<source>Formula</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="242"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:large; font-weight:600;&quot;&gt;Licence&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message encoding="UTF-8">
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="243"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; This program is free software: you can redistribute it and/or modify&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; it under the terms of the GNU General Public License as published by&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; the Free Software Foundation, either version 3 of the License, or&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; (at your option) any later version.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; This program is distributed in the hope that it will be useful,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; GNU General Public License for more details.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; You should have received a copy of the GNU General Public License&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt;&quot;&gt; along with this program. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;. &lt;/span&gt;&lt;a name=&quot;TransNote1-rev&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://www.gnu.org/licenses/gpl-howto.fr.html#TransNote1&quot;&gt;&lt;span style=&quot; font-family:&apos;Hack&apos;; font-size:10pt; text-decoration: underline; color:#2980b9; vertical-align:super;&quot;&gt;1&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="176"/>
<source>Description</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="259"/>
<source>By going throught the process of creating a wallet, you accept the licence above.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="194"/>
<source>{:} day(s) {:} hour(s)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="261"/>
<source>Account parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="196"/>
<source>{:} hour(s)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="241"/>
<source>Create a new member account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>
&lt;table cellpadding=&quot;5&quot;&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:2.0%} / {:} days&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:} {:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:2.0%}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="240"/>
<source>Add an existing member account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>Fundamental growth (c)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="239"/>
<source>Add a wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>Initial Universal Dividend UD(0) in</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="238"/>
<source>Add using a public key (quick)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>Time period between two UD</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="262"/>
<source>Identity name (UID)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>Number of blocks used for calculating median time</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="265"/>
<source>Credentials</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>The average time in seconds for writing 1 block (wished time)</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="276"/>
<source>N</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>The number of blocks required to evaluate again PoWMin value</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="277"/>
<source>r</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="201"/>
<source>The percent of previous issuers to reach for personalized difficulty</source>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/connection_cfg_uic.py" line="278"/>
<source>p</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ContactDialog</name>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>
&lt;table cellpadding=&quot;5&quot;&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="109"/>
<source>Contacts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Minimum delay between 2 certifications (in days)</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="110"/>
<source>Contacts list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Maximum age of a valid signature (in days)</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="111"/>
<source>Delete selected contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Minimum quantity of signatures to be part of the WoT</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="112"/>
<source>Clear selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Maximum quantity of active certifications made by member.</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="113"/>
<source>Contact informations</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Maximum delay a certification can wait before being expired for non-writing.</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="114"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Minimum percent of sentries to reach to match the distance rule</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="115"/>
<source>Public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Maximum age of a valid membership (in days)</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="116"/>
<source>Add other informations</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/view.py" line="240"/>
<source>Maximum distance between each WoT member and a newcomer</source>
<location filename="../../../src/sakia/gui/dialogs/contact/contact_uic.py" line="117"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunityTabWidget</name>
<name>ContactsTableModel</name>
<message>
<location filename="../../ui/community_tab.ui" line="40"/>
<source>Identities</source>
<translation type="obsolete">Личности</translation>
<location filename="../../../src/sakia/gui/dialogs/contact/table_model.py" line="73"/>
<source>Name</source>
<translation type="unfinished">Имя</translation>
</message>
<message>
<location filename="../../ui/community_tab.ui" line="53"/>
<source>Research a pubkey, an uid...</source>
<translation type="obsolete">Исследовать открытый ключ, ИДП ...</translation>
<location filename="../../../src/sakia/gui/dialogs/contact/table_model.py" line="73"/>
<source>Public key</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ContextMenu</name>
<message>
<location filename="../../ui/community_tab.ui" line="60"/>
<source>Search</source>
<translation type="obsolete">Поиск</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="330"/>
<source>Warning</source>
<translation type="unfinished">Внимание</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="58"/>
<source>Web of Trust</source>
<translation type="obsolete">Сеть доверия</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="44"/>
<source>Informations</source>
<translation type="unfinished">Данные</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="59"/>
<source>Members</source>
<translation type="obsolete">Пользователи</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="54"/>
<source>Certify identity</source>
<translation type="unfinished">Удостоверить личность</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="62"/>
<source>Direct connections</source>
<translation type="obsolete">Прямые связи</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="63"/>
<source>View in Web of Trust</source>
<translation type="unfinished">Посмотреть в Сети доверия</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="76"/>
<source>Membership</source>
<translation type="obsolete">Членство</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="246"/>
<source>Send money</source>
<translation type="unfinished">Отправить деньги</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="76"/>
<source>Success sending Membership demand</source>
<translation type="obsolete">Заявка о членстве отправлена успешно</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="223"/>
<source>Copy pubkey to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="82"/>
<source>Revoke</source>
<translation type="obsolete">Отмена</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="232"/>
<source>Copy pubkey to clipboard (with CRC)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="82"/>
<source>Success sending Revoke demand</source>
<translation type="obsolete">Заявка об отмене отправлена успешно</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="98"/>
<source>Copy self-certification document to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="88"/>
<source>Self Certification</source>
<translation type="obsolete">Самостоятельная сертификация</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="115"/>
<source>Transfer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="88"/>
<source>Success sending Self Certification document</source>
<translation type="obsolete">Самостоятельная сертификация успешно</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="119"/>
<source>Send again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="102"/>
<source>Informations</source>
<translation type="obsolete">Данные</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="128"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="105"/>
<source>Add as contact</source>
<translation type="obsolete">Добавить контакт</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="166"/>
<source>Copy raw transaction to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="109"/>
<source>Send money</source>
<translation type="obsolete">Отправить деньги</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="178"/>
<source>Copy transaction block to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="113"/>
<source>Certify identity</source>
<translation type="obsolete">Удостоверить личность</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="210"/>
<source>Send as source</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_tab.py" line="117"/>
<source>View in Web of Trust</source>
<translation type="obsolete">Посмотреть в Сети доверия</translation>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="197"/>
<source>Dividend</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CommunityTile</name>
<name>HistoryTableModel</name>
<message>
<location filename="../../../src/sakia/gui/community_tile.py" line="123"/>
<source>Member</source>
<translation type="obsolete">Член</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_tile.py" line="137"/>
<source>members</source>
<translation type="obsolete">членами</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_tile.py" line="137"/>
<source>Monetary mass</source>
<translation type="obsolete">Денежная масса</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_tile.py" line="137"/>
<source>Balance</source>
<translation type="obsolete">Баланс</translation>
</message>
</context>
<context>
<name>CommunityWidget</name>
<message>
<location filename="../../ui/community_view.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
</message>
<message>
<location filename="../../ui/community_view.ui" line="59"/>
<source>Send money</source>
<translation type="obsolete">Отправить деньги</translation>
</message>
<message>
<location filename="../../ui/community_view.ui" line="76"/>
<source>Certification</source>
<translation type="obsolete">Сертификация</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="334"/>
<source>Renew membership</source>
<translation type="obsolete">Обновить членство</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="52"/>
<source>Date</source>
<translation>Дата</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="44"/>
<source>Warning : Your membership is expiring soon.</source>
<translation type="obsolete">Внимание: срок вашего членства скоро закончится.</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="52"/>
<source>Comment</source>
<translation>Комментарий</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="46"/>
<source>Warning : Your could miss certifications soon.</source>
<translation type="obsolete">Внимание: скоро вы можете пропустить сертификацию</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="52"/>
<source>Amount</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="33"/>
<source>Transactions</source>
<translation type="obsolete">Операции</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="52"/>
<source>Public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="34"/>
<source>Web of Trust</source>
<translation type="obsolete">Сеть доверия</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="201"/>
<source>Transactions missing from history</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="93"/>
<source>Network</source>
<translation type="obsolete">Сеть</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="499"/>
<source>{0} / {1} confirmations</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="240"/>
<source>Membership expiration</source>
<translation type="obsolete">Истечение срока членства</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="505"/>
<source>Confirming... {0} %</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HomescreenWidget</name>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="240"/>
<source>&lt;b&gt;Warning : Membership expiration in {0} days&lt;/b&gt;</source>
<translation type="obsolete">&lt;b&gt;Внимание: срок членства истекает через {0} дней&lt;/b&gt;</translation>
<location filename="../../../src/sakia/gui/navigation/homescreen/homescreen_uic.py" line="28"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentitiesTableModel</name>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="251"/>
<source>Certifications number</source>
<translation type="obsolete">Номер сертификации</translation>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="153"/>
<source>UID</source>
<translation>ИДП</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="251"/>
<source>&lt;b&gt;Warning : You are certified by only {0} persons, need {1}&lt;/b&gt;</source>
<translation type="obsolete">&lt;b&gt;Внимание: вы сертифицированы только {0} людьми, требуется {1}&lt;/b&gt;</translation>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="154"/>
<source>Pubkey</source>
<translation>Открытый ключ</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="235"/>
<source> Block {0}</source>
<translation type="obsolete"> Блокировать {0}</translation>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="155"/>
<source>Renewed</source>
<translation>Обновлено</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="340"/>
<source>Send membership demand</source>
<translation type="obsolete">Отправить запрос о членстве</translation>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="156"/>
<source>Expiration</source>
<translation>Истечение срока</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="385"/>
<source>Warning</source>
<translation type="obsolete">Внимание</translation>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="158"/>
<source>Publication Block</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="385"/>
<source>Are you sure ?
Sending a leaving demand cannot be canceled.
The process to join back the community later will have to be done again.</source>
<translation type="obsolete">Вы уверены?
Отправка запроса об уходе не может быть отменена.
В дальнейшем процесс присоединения обратно к сообществу придется выполнять заново.</translation>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="157"/>
<source>Publication</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentitiesView</name>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="272"/>
<source>Are you sure ?
Publishing your UID can be canceled by Revoke UID.</source>
<translation type="obsolete">Вы уверены?
Публикация ИДП может быть отменена через ИДП отмены.</translation>
<location filename="../../../src/sakia/gui/navigation/identities/view.py" line="16"/>
<source>Search direct certifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="283"/>
<source>UID Publishing</source>
<translation type="obsolete">Публикация ИДП</translation>
<location filename="../../../src/sakia/gui/navigation/identities/view.py" line="19"/>
<source>Research a pubkey, an uid...</source>
<translation type="unfinished">Исследовать открытый ключ, ИДП ...</translation>
</message>
</context>
<context>
<name>IdentitiesWidget</name>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="418"/>
<source>Success publishing your UID</source>
<translation type="obsolete">Ваш ИДП успешно опубликован</translation>
<location filename="../../../src/sakia/gui/navigation/identities/identities_uic.py" line="46"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="286"/>
<source>Publish UID error</source>
<translation type="obsolete">Ошибка публикации ИДП</translation>
<location filename="../../../src/sakia/gui/navigation/identities/identities_uic.py" line="47"/>
<source>Research a pubkey, an uid...</source>
<translation type="unfinished">Исследовать открытый ключ, ИДП ...</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="289"/>
<source>Network error</source>
<translation type="obsolete">Ошибка сети</translation>
<location filename="../../../src/sakia/gui/navigation/identities/identities_uic.py" line="48"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentityController</name>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="289"/>
<source>Couldn&apos;t connect to network : {0}</source>
<translation type="obsolete">Не удалось подключиться к сети: {0}</translation>
<location filename="../../../src/sakia/gui/navigation/identity/controller.py" line="191"/>
<source>Membership</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="293"/>
<source>Error</source>
<translation type="obsolete">Ошибка</translation>
<location filename="../../../src/sakia/gui/navigation/identity/controller.py" line="177"/>
<source>Success sending Membership demand</source>
<translation type="unfinished">Заявка о членстве отправлена успешно</translation>
</message>
</context>
<context>
<name>IdentityModel</name>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="298"/>
<source>Are you sure ?
Revoking your UID can only success if it is not already validated by the network.</source>
<translation type="obsolete">Вы уверены?
Отмена ИДП может быть успешна, только если она еще не подтверждена сетью.</translation>
<location filename="../../../src/sakia/gui/navigation/identity/model.py" line="216"/>
<source>Outdistanced</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="418"/>
<source>Membership</source>
<translation type="obsolete">членстве</translation>
<location filename="../../../src/sakia/gui/navigation/identity/model.py" line="255"/>
<source>In WoT range</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentityView</name>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="374"/>
<source>Success sending Membership demand</source>
<translation type="obsolete">Заявка о членстве отправлена успешно</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="91"/>
<source>Identity written in blockchain</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="405"/>
<source>Revoke</source>
<translation type="obsolete">Отмена</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="101"/>
<source>Identity not written in blockchain</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="399"/>
<source>Success sending Revoke demand</source>
<translation type="obsolete">Заявка об отмене отправлена успешно</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="101"/>
<source>Expires on: {0}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="325"/>
<source>Self Certification</source>
<translation type="obsolete">Самостоятельная сертификация</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="112"/>
<source>Member</source>
<translation type="unfinished">Член</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/community_view.py" line="325"/>
<source>Success sending Self Certification document</source>
<translation type="obsolete">Самостоятельная сертификация успешно</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="112"/>
<source>Not a member</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="98"/>
<source>Informations</source>
<translation type="obsolete">Данные</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="125"/>
<source>Renew membership</source>
<translation type="unfinished">Обновить членство</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/community_view.py" line="424"/>
<source>UID</source>
<translation type="obsolete">ИДП</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="131"/>
<source>Request membership</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConfigureContactDialog</name>
<message>
<location filename="../../ui/contact.ui" line="14"/>
<source>Add a contact</source>
<translation type="obsolete">Добавить контакт</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="135"/>
<source>Identity registration ready</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/contact.ui" line="22"/>
<source>Name</source>
<translation type="obsolete">Имя</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="140"/>
<source>{0} more certifications required</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/contact.ui" line="36"/>
<source>Pubkey</source>
<translation type="obsolete">Открытый ключ</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="147"/>
<source>Expires in </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/contact.py" line="81"/>
<source>Contact already exists</source>
<translation type="obsolete">Контакт уже существует</translation>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="151"/>
<source>{days} days</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConnectionConfigController</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="117"/>
<source>Could not connect. Check hostname, ip address or port : &lt;br/&gt;</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="155"/>
<source>{hours} hours and {min} min.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="151"/>
<source>Broadcasting identity...</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="159"/>
<source>Expired or never published</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="205"/>
<source>Forbidden : salt is too short</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="180"/>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="209"/>
<source>Forbidden : password is too short</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="191"/>
<source>Certs. received</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="213"/>
<source>Forbidden : Invalid characters in salt field</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="191"/>
<source>Membership</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="217"/>
<source>Forbidden : Invalid characters in password field</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="240"/>
<source>{:} day(s) {:} hour(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="223"/>
<source>Error : passwords are different</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="234"/>
<source>{:} hour(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="228"/>
<source>Error : secret keys are different</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Fundamental growth (c)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="297"/>
<source>connecting...</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Initial Universal Dividend UD(0) in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="251"/>
<source>Your pubkey is associated to a pubkey.
Yours : {0}, the network : {1}</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Time period between two UD</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="318"/>
<source>A connection already exists using this key.</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Time period between two UD reevaluation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="320"/>
<source>Could not connect. Check node peering entry</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Minimum delay between 2 certifications (in days)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="278"/>
<source>Could not find your identity on the network.</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Maximum validity time of a certification (in days)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="280"/>
<source>Your pubkey or UID is different on the network.
Yours : {0}, the network : {1}</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Maximum time before a pending certification expire</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="309"/>
<source>Your pubkey or UID was already found on the network.
Yours : {0}, the network : {1}</source>
<location filename="../../../src/sakia/gui/navigation/identity/view.py" line="247"/>
<source>Maximum validity time of a membership (in days)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ConnectionConfigView</name>
<name>IdentityWidget</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="101"/>
<source>UID broadcast</source>
<location filename="../../../src/sakia/gui/navigation/identity/identity_uic.py" line="109"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="96"/>
<source>Identity broadcasted to the network</source>
<location filename="../../../src/sakia/gui/navigation/identity/identity_uic.py" line="110"/>
<source>Certify an identity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="102"/>
<source>Error</source>
<translation type="unfinished">Ошибка</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/view.py" line="111"/>
<source>New connection to {0} network</source>
<location filename="../../../src/sakia/gui/navigation/identity/identity_uic.py" line="111"/>
<source>Membership status</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ContextMenu</name>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="145"/>
<source>Warning</source>
<translation type="unfinished">Внимание</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="145"/>
<source>Are you sure ?
This money transfer will be removed and not sent.</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/navigation/identity/identity_uic.py" line="112"/>
<source>Renew membership</source>
<translation type="unfinished">Обновить членство</translation>
</message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
<location filename="../../ui/create_wallet.ui" line="14"/>
<source>Create a new wallet</source>
<translation type="obsolete">Создать новый кошелек</translation>
</message>
<name>MainWindow</name>
<message>
<location filename="../../ui/create_wallet.ui" line="45"/>
<source>Wallet name :</source>
<translation type="obsolete">Название кошелька</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="79"/>
<source>Manage accounts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/create_wallet.ui" line="83"/>
<source>Previous</source>
<translation type="obsolete">Предыдущий</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="80"/>
<source>Configure trustable nodes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/create_wallet.ui" line="103"/>
<source>Next</source>
<translation type="obsolete">Следующий</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="81"/>
<source>A&amp;dd a contact</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CurrencyTabWidget</name>
<message>
<location filename="../../ui/currency_tab.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="85"/>
<source>Send a message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="44"/>
<source>Warning : Your membership is expiring soon.</source>
<translation type="obsolete">Внимание: срок вашего членства скоро закончится.</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="86"/>
<source>Send money</source>
<translation type="unfinished">Отправить деньги</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="46"/>
<source>Warning : Your could miss certifications soon.</source>
<translation type="obsolete">Внимание: скоро вы можете пропустить сертификацию</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="87"/>
<source>Remove contact</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="73"/>
<source>Wallets</source>
<translation type="obsolete">Кошельки</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="88"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="77"/>
<source>Transactions</source>
<translation type="obsolete">Операции</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="89"/>
<source>&amp;Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="89"/>
<source>Informations</source>
<translation type="obsolete">Данные</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="90"/>
<source>Account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="81"/>
<source>Community</source>
<translation type="obsolete">Сообщество</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="91"/>
<source>&amp;Transfer money</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="85"/>
<source>Network</source>
<translation type="obsolete">Сеть</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="92"/>
<source>&amp;Configure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="125"/>
<source>Membership expiration</source>
<translation type="obsolete">Истечение срока членства</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="93"/>
<source>&amp;Import</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="125"/>
<source>&lt;b&gt;Warning : Membership expiration in {0} days&lt;/b&gt;</source>
<translation type="obsolete">&lt;b&gt;Внимание: срок членства истекает через {0} дней&lt;/b&gt;</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="94"/>
<source>&amp;Export</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="132"/>
<source>Certifications number</source>
<translation type="obsolete">Номер сертификации</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="95"/>
<source>C&amp;ertification</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="132"/>
<source>&lt;b&gt;Warning : You are certified by only {0} persons, need {1}&lt;/b&gt;</source>
<translation type="obsolete">&lt;b&gt;Внимание: вы сертифицированы только {0} людьми, требуется {1}&lt;/b&gt;</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="96"/>
<source>&amp;Set as default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/currency_tab.py" line="163"/>
<source> Block {0}</source>
<translation type="obsolete"> Блокировать {0}</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="97"/>
<source>A&amp;bout</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DialogMember</name>
<message>
<location filename="../../ui/member.ui" line="14"/>
<source>Informations</source>
<translation type="obsolete">Данные</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="98"/>
<source>&amp;Preferences</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/member.ui" line="34"/>
<source>Member</source>
<translation type="obsolete">Член</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="99"/>
<source>&amp;Add account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/member.ui" line="65"/>
<source>uid</source>
<translation type="obsolete">ИДП</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="100"/>
<source>&amp;Manage local node</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/member.ui" line="72"/>
<source>properties</source>
<translation type="obsolete">Свойства</translation>
<location filename="../../../src/sakia/gui/main_window/mainwindow_uic.py" line="101"/>
<source>&amp;Revoke an identity</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ExplorerTabWidget</name>
<name>MainWindowController</name>
<message>
<location filename="../../ui/explorer_tab.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/main_window/controller.py" line="109"/>
<source>Please get the latest release {version}</source>
<translation type="unfinished">Пожалуйста, получите последний выпуск {version}</translation>
</message>
</context>
<context>
<name>GraphTabWidget</name>
<message>
<location filename="../../../src/sakia/gui/graphs/graph_tab.py" line="107"/>
<source>Not a member</source>
<translation type="obsolete">Не член</translation>
<location filename="../../../src/sakia/gui/main_window/controller.py" line="130"/>
<source>sakia {0} - {1}</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HistoryTableModel</name>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="193"/>
<source>Date</source>
<translation>Дата</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="193"/>
<source>UID/Public key</source>
<translation>ИДП / Открытый ключ</translation>
</message>
<name>Navigation</name>
<message>
<location filename="../../../src/sakia/models/txhistory.py" line="206"/>
<source>Payment</source>
<translation type="obsolete">Оплата</translation>
</message>
<message>
<location filename="../../../src/sakia/models/txhistory.py" line="206"/>
<source>Deposit</source>
<translation type="obsolete">Депозит</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="193"/>
<source>Comment</source>
<translation>Комментарий</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="193"/>
<source>Amount</source>
<location filename="../../../src/sakia/gui/navigation/navigation_uic.py" line="48"/>
<source>Frame</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HomeScreenWidget</name>
<message>
<location filename="../../ui/homescreen.ui" line="20"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
</message>
<name>NavigationController</name>
<message>
<location filename="../../ui/homescreen.ui" line="67"/>
<source>Create a new account</source>
<translation type="obsolete">Создать новый аккаунт</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="180"/>
<source>Publish UID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/homescreen.ui" line="100"/>
<source>Import an existing account</source>
<translation type="obsolete">Импорт существующий аккаунт</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="206"/>
<source>Leave the currency</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/homescreen.ui" line="127"/>
<source>Get to know more about ucoin</source>
<translation type="obsolete">Узнайте больше об uCoin</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="300"/>
<source>UID</source>
<translation type="unfinished">ИДП</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/homescreen.py" line="35"/>
<source>Please get the latest release {version}</source>
<translation type="obsolete">Пожалуйста, получите последний выпуск {version}</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="287"/>
<source>Success publishing your UID</source>
<translation type="unfinished">Ваш ИДП успешно опубликован</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/homescreen.py" line="39"/>
<source>
&lt;h1&gt;Welcome to Cutecoin {version}&lt;/h1&gt;
&lt;h2&gt;{version_info}&lt;/h2&gt;
&lt;h3&gt;&lt;a href={version_url}&gt;Download link&lt;/a&gt;&lt;/h3&gt;
</source>
<translation type="obsolete">
&lt;H1&gt; Добро пожаловать в Cutecoin {версия} &lt;/ h1&gt;
&lt;h2&gt; {инфо_o_версии}&lt;/ h2&gt;
&lt;h3&gt; &lt;a href={url_версии}&gt;Скачать ссылку&lt;/a&gt; &lt;/ h3&gt;
</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="308"/>
<source>Warning</source>
<translation type="unfinished">Внимание</translation>
</message>
</context>
<context>
<name>HomescreenWidget</name>
<message>
<location filename="../../ui/homescreen.ui" line="20"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="350"/>
<source>Revoke</source>
<translation type="unfinished">Отмена</translation>
</message>
<message>
<location filename="../../ui/homescreen.ui" line="54"/>
<source>Add a community</source>
<translation type="obsolete">Добавить сообщество</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="336"/>
<source>Success sending Revoke demand</source>
<translation type="unfinished">Заявка об отмене отправлена успешно</translation>
</message>
<message>
<location filename="../../ui/homescreen.ui" line="149"/>
<source>New account</source>
<translation type="obsolete">новый аккаунт</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="438"/>
<source>All text files (*.txt)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentitiesTab</name>
<message>
<location filename="../../ui/identities_tab.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="156"/>
<source>View in Web of Trust</source>
<translation type="unfinished">Посмотреть в Сети доверия</translation>
</message>
<message>
<location filename="../../ui/identities_tab.ui" line="25"/>
<source>Research a pubkey, an uid...</source>
<translation type="obsolete">Исследовать открытый ключ, ИДП ...</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="193"/>
<source>Export identity document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/identities_tab.ui" line="32"/>
<source>Search</source>
<translation type="obsolete">Поиск</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="438"/>
<source>Save an identity document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentitiesTabWidget</name>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="36"/>
<source>Members</source>
<translation type="obsolete">Пользователи</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="459"/>
<source>Identity file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="37"/>
<source>Direct connections</source>
<translation type="obsolete">Прямые связи</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="246"/>
<source>Remove the Sakia account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="112"/>
<source>Informations</source>
<translation type="obsolete">Данные</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="358"/>
<source>Removing the Sakia account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="115"/>
<source>Add as contact</source>
<translation type="obsolete">Добавить контакт</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="167"/>
<source>Save revocation document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="119"/>
<source>Send money</source>
<translation type="obsolete">Отправить деньги</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="386"/>
<source>Save a revocation document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="123"/>
<source>Certify identity</source>
<translation type="obsolete">Удостоверить личность</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="407"/>
<source>Revocation file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="127"/>
<source>View in Web of Trust</source>
<translation type="obsolete">Посмотреть в Сети доверия</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="220"/>
<source>Copy pubkey to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/identities_tab.py" line="33"/>
<source>Research a pubkey, an uid...</source>
<translation type="obsolete">Исследовать открытый ключ, ИДП ...</translation>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="233"/>
<source>Copy pubkey to clipboard (with CRC)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentitiesTableModel</name>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="113"/>
<source>UID</source>
<translation>ИДП</translation>
</message>
<name>NavigationModel</name>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="114"/>
<source>Pubkey</source>
<translation>Открытый ключ</translation>
<location filename="../../../src/sakia/gui/navigation/model.py" line="42"/>
<source>Network</source>
<translation type="unfinished">Сеть</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="115"/>
<source>Renewed</source>
<translation>Обновлено</translation>
<location filename="../../../src/sakia/gui/navigation/model.py" line="108"/>
<source>Transfers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="116"/>
<source>Expiration</source>
<translation>Истечение срока</translation>
<location filename="../../../src/sakia/gui/navigation/model.py" line="52"/>
<source>Identities</source>
<translation type="unfinished">Личности</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="117"/>
<source>Publication Date</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/navigation/model.py" line="62"/>
<source>Web of Trust</source>
<translation type="unfinished">Сеть доверия</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/table_model.py" line="118"/>
<source>Publication Block</source>
<location filename="../../../src/sakia/gui/navigation/model.py" line="72"/>
<source>Personal accounts</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IdentitiesView</name>
<name>NetworkController</name>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/view.py" line="15"/>
<source>Search direct certifications</source>
<location filename="../../../src/sakia/gui/navigation/network/controller.py" line="59"/>
<source>Open in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/identities/view.py" line="16"/>
<source>Research a pubkey, an uid...</source>
<translation type="unfinished">Исследовать открытый ключ, ИДП ...</translation>
</message>
</context>
<context>
<name>ImportAccountDialog</name>
<name>NetworkTableModel</name>
<message>
<location filename="../../ui/import_account.ui" line="14"/>
<source>Import an account</source>
<translation type="obsolete">Импортировать файл аккаунта</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="192"/>
<source>Online</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/import_account.ui" line="25"/>
<source>Import a file</source>
<translation type="obsolete">Импортировать файл</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="193"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/import_account.ui" line="36"/>
<source>Name of the account :</source>
<translation type="obsolete">Имя аккаунта:</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="194"/>
<source>Unsynchronized</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="36"/>
<source>Error</source>
<translation type="obsolete">Ошибка</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="90"/>
<source>yes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="40"/>
<source>Account import</source>
<translation type="obsolete">Импорт аккаунтa</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="91"/>
<source>no</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="40"/>
<source>Account imported succefully !</source>
<translation type="obsolete">Aккаунт успешно импортирован!</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="92"/>
<source>offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="45"/>
<source>Import an account file</source>
<translation type="obsolete">Импортировать файл аккаунта</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="148"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="45"/>
<source>All account files (*.acc)</source>
<translation type="obsolete">Все файлы аккаунта (*.acc)</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="149"/>
<source>Port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="60"/>
<source>Please enter a name</source>
<translation type="obsolete">Пожалуйста, введите имя</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="150"/>
<source>API</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="65"/>
<source>Name already exists</source>
<translation type="obsolete">Имя уже существует</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="151"/>
<source>Block</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/import_account.py" line="69"/>
<source>File is not an account format</source>
<translation type="obsolete">Файл не соответствует формату аккаунтa</translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="152"/>
<source>Hash</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InformationsModel</name>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/model.py" line="118"/>
<source>Expired or never published</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="153"/>
<source>UID</source>
<translation type="unfinished">ИДП</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="154"/>
<source>Member</source>
<translation type="unfinished">Член</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/model.py" line="119"/>
<source>Outdistanced</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="155"/>
<source>Pubkey</source>
<translation type="unfinished">Открытый ключ</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/model.py" line="130"/>
<source>In WoT range</source>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="156"/>
<source>Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/informations/model.py" line="134"/>
<source>Expires in </source>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="157"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InformationsTabWidget</name>
<name>NetworkWidget</name>
<message>
<location filename="../../ui/informations_tab.ui" line="14"/>
<location filename="../../../src/sakia/gui/navigation/network/network_uic.py" line="52"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
</message>
<message>
<location filename="../../ui/informations_tab.ui" line="52"/>
<source>General</source>
<translation type="obsolete">Общее</translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordInputController</name>
<message>
<location filename="../../ui/informations_tab.ui" line="61"/>
<source>label_general</source>
<translation type="obsolete">ярлый_общий</translation>
<location filename="../../../src/sakia/gui/sub/password_input/controller.py" line="83"/>
<source>Non printable characters in password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/informations_tab.ui" line="77"/>
<source>Rules</source>
<translation type="obsolete">Правила</translation>
<location filename="../../../src/sakia/gui/sub/password_input/controller.py" line="75"/>
<source>Non printable characters in secret key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/informations_tab.ui" line="83"/>
<source>label_rules</source>
<translation type="obsolete">ярык_правила</translation>
<location filename="../../../src/sakia/gui/sub/password_input/controller.py" line="52"/>
<source>Please enter your password</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordInputView</name>
<message>
<location filename="../../ui/informations_tab.ui" line="112"/>
<source>Money</source>
<translation type="obsolete">Деньги</translation>
<location filename="../../../src/sakia/gui/sub/password_input/view.py" line="37"/>
<source>Password is valid</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordInputWidget</name>
<message>
<location filename="../../ui/informations_tab.ui" line="102"/>
<source>label_money</source>
<translation type="obsolete">ярлык_ деньги</translation>
<location filename="../../../src/sakia/gui/sub/password_input/password_input_uic.py" line="37"/>
<source>Please enter your password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/informations_tab.ui" line="131"/>
<source>WoT</source>
<translation type="obsolete">СД</translation>
<location filename="../../../src/sakia/gui/sub/password_input/password_input_uic.py" line="36"/>
<source>Please enter your secret key</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PercentOfAverage</name>
<message>
<location filename="../../ui/informations_tab.ui" line="121"/>
<source>label_wot</source>
<translation type="obsolete">ярлык_сд</translation>
<location filename="../../../src/sakia/money/percent_of_average.py" line="12"/>
<source>PoA</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="139"/>
<source>Universal Dividend UD(t) in</source>
<translation type="obsolete">Универсальный дивиденд УД(t) в</translation>
<location filename="../../../src/sakia/money/percent_of_average.py" line="11"/>
<source>{0} {1}{2}</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PluginDialog</name>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="139"/>
<source>Monetary Mass M(t-1) in</source>
<translation type="obsolete">Денежная масса M(t-1) в</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/plugins_manager_uic.py" line="52"/>
<source>Plugins manager</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="139"/>
<source>Members N(t)</source>
<translation type="obsolete">Члены N(t)</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/plugins_manager_uic.py" line="53"/>
<source>Installed plugins list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="139"/>
<source>Monetary Mass per member M(t-1)/N(t) in</source>
<translation type="obsolete">Денежная масса на члена M(t-1)/N(t) в</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/plugins_manager_uic.py" line="54"/>
<source>Install a new plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="139"/>
<source>Actual growth c = UD(t)/[M(t-1)/N(t)]</source>
<translation type="obsolete">Фактический рост c = UD(t)/[M(t-1)/N(t)]</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/plugins_manager_uic.py" line="55"/>
<source>Uninstall selected plugin</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PluginsManagerController</name>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="139"/>
<source>Last UD date and time (t)</source>
<translation type="obsolete">Дата и время последнего УД (t)</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/controller.py" line="60"/>
<source>Open File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="139"/>
<source>Next UD date and time (t+1)</source>
<translation type="obsolete">Дата и время следующего УД (t+1)</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/controller.py" line="60"/>
<source>Sakia module (*.zip)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PluginsManagerView</name>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="204"/>
<source>No Universal Dividend created yet.</source>
<translation type="obsolete">Универсальный дивиденд еще не создан.</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/view.py" line="43"/>
<source>Plugin import</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PluginsTableModel</name>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="179"/>
<source>{:2.0%} / {:} days</source>
<translation type="obsolete">{:2.0%} / {:} дней</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/table_model.py" line="67"/>
<source>Name</source>
<translation type="unfinished">Имя</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="179"/>
<source>Fundamental growth (c) / Delta time (dt)</source>
<translation type="obsolete">Основной рост (c) / Дельта времени (dt)</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/table_model.py" line="67"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="221"/>
<source>Name</source>
<translation type="obsolete">Имя</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/table_model.py" line="67"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/informations_tab.py" line="221"/>
<source>Units</source>
<translation type="obsolete">Единицы</translation>
<location filename="../../../src/sakia/gui/dialogs/plugins_manager/table_model.py" line="67"/>
<source>Imported</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<name>PreferencesDialog</name>
<message>
<location filename="../../ui/mainwindow.ui" line="126"/>
<source>Send money</source>
<translation type="obsolete">Отправить деньги</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="214"/>
<source>Preferences</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/mainwindow.py" line="335"/>
<source>Please get the latest release {version}</source>
<translation type="obsolete">Пожалуйста, получите последний выпуск {version}</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="215"/>
<source>General</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/mainwindow.py" line="434"/>
<source>All account files (*.acc)</source>
<translation type="obsolete">Все файлы аккаунта (*.acc)</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="216"/>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowController</name>
<message>
<location filename="../../../src/sakia/gui/main_window/controller.py" line="109"/>
<source>Please get the latest release {version}</source>
<translation type="unfinished">Пожалуйста, получите последний выпуск {version}</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="217"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/controller.py" line="126"/>
<source>sakia {0} - {currency}</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="218"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:16pt; font-weight:600;&quot;&gt;General settings&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberView</name>
<message>
<location filename="../../ui/member.ui" line="34"/>
<source>Member</source>
<translation type="obsolete">Член</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="219"/>
<source>Default &amp;referential</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NavigationController</name>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="112"/>
<source>Save revokation document</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="220"/>
<source>Enable expert mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="117"/>
<source>Publish UID</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="221"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:16pt; font-weight:600;&quot;&gt;Display settings&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="124"/>
<source>Leave the currency</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="222"/>
<source>Digits after commas </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="135"/>
<source>Remove the connection</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="223"/>
<source>Language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="158"/>
<source>UID</source>
<translation type="unfinished">ИДП</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="224"/>
<source>Maximize Window at Startup</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="152"/>
<source>Success publishing your UID</source>
<translation type="unfinished">Ваш ИДП успешно опубликован</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="225"/>
<source>Enable notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="152"/>
<source>Membership</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="226"/>
<source>Dark Theme compatibility</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="163"/>
<source>Warning</source>
<translation type="unfinished">Внимание</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="227"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:16pt; font-weight:600;&quot;&gt;Network settings&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="163"/>
<source>Are you sure ?
Sending a leaving demand cannot be canceled.
The process to join back the community later will have to be done again.</source>
<translation type="unfinished">Вы уверены?
Отправка запроса об уходе не может быть отменена.
В дальнейшем процесс присоединения обратно к сообществу придется выполнять заново.</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="228"/>
<source>Use a http proxy server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="183"/>
<source>Revoke</source>
<translation type="unfinished">Отмена</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="229"/>
<source>Proxy server address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="177"/>
<source>Success sending Revoke demand</source>
<translation type="unfinished">Заявка об отмене отправлена успешно</translation>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="230"/>
<source>:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="188"/>
<source>Removing the connection</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="231"/>
<source>Proxy username</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="188"/>
<source>Are you sure ? This won&apos;t remove your money&quot;
neither your identity from the network.</source>
<location filename="../../../src/sakia/gui/preferences_uic.py" line="232"/>
<source>Proxy password</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Quantitative</name>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="204"/>
<source>Save a revokation document</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/money/quantitative.py" line="8"/>
<source>Units</source>
<translation type="unfinished">Единицы</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="204"/>
<source>All text files (*.txt)</source>
<location filename="../../../src/sakia/money/quantitative.py" line="9"/>
<source>{0} {1}{2}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="213"/>
<source>Revokation file</source>
<location filename="../../../src/sakia/money/quantitative.py" line="20"/>
<source>Base referential of the money. Units values are used here.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="213"/>
<source>&lt;div&gt;Your revokation document has been saved.&lt;/div&gt;
&lt;div&gt;&lt;b&gt;Please keep it in a safe place.&lt;/b&gt;&lt;/div&gt;
The publication of this document will remove your identity from the network.&lt;/p&gt;</source>
<location filename="../../../src/sakia/money/quantitative.py" line="10"/>
<source>units</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NavigationModel</name>
<name>QuantitativeZSum</name>
<message>
<location filename="../../../src/sakia/gui/navigation/model.py" line="27"/>
<source>Network</source>
<translation type="unfinished">Сеть</translation>
<location filename="../../../src/sakia/money/quant_zerosum.py" line="9"/>
<source>Quant Z-sum</source>
<translation type="unfinished">Колич. Z-сумма</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/model.py" line="59"/>
<source>Transfers</source>
<location filename="../../../src/sakia/money/quant_zerosum.py" line="10"/>
<source>{0}{1}{2}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/model.py" line="77"/>
<source>Identities</source>
<translation type="unfinished">Личности</translation>
<location filename="../../../src/sakia/money/quant_zerosum.py" line="11"/>
<source>Q0</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Relative</name>
<message>
<location filename="../../../src/sakia/gui/navigation/model.py" line="90"/>
<source>Web of Trust</source>
<translation type="unfinished">Сеть доверия</translation>
<location filename="../../../src/sakia/money/relative.py" line="11"/>
<source>UD</source>
<translation type="unfinished">УД</translation>
</message>
<message>
<location filename="../../../src/sakia/money/relative.py" line="10"/>
<source>{0} {1}{2}</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NetworkController</name>
<name>RelativeZSum</name>
<message>
<location filename="../../../src/sakia/gui/navigation/network/controller.py" line="54"/>
<source>Unset root node</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/money/relative_zerosum.py" line="9"/>
<source>Relat Z-sum</source>
<translation type="unfinished">Относит. Z-сумма</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/controller.py" line="60"/>
<source>Set as root node</source>
<location filename="../../../src/sakia/money/relative_zerosum.py" line="10"/>
<source>{0} {1}{2}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/controller.py" line="66"/>
<source>Open in browser</source>
<location filename="../../../src/sakia/money/relative_zerosum.py" line="11"/>
<source>R0 UD</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NetworkFilterProxyModel</name>
<name>RevocationDialog</name>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="40"/>
<source>Address</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="142"/>
<source>Revoke an identity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="41"/>
<source>Port</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="143"/>
<source>&lt;h2&gt;Select a revocation document&lt;/h1&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="42"/>
<source>Block</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="144"/>
<source>Load from file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="45"/>
<source>UID</source>
<translation type="unfinished">ИДП</translation>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="145"/>
<source>Revocation document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="46"/>
<source>Member</source>
<translation type="unfinished">Член</translation>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="146"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:x-large; font-weight:600;&quot;&gt;Select publication destination&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="47"/>
<source>Pubkey</source>
<translation type="unfinished">Открытый ключ</translation>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="147"/>
<source>To a co&amp;mmunity</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="48"/>
<source>Software</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="148"/>
<source>&amp;To an address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="49"/>
<source>Version</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="149"/>
<source>SSL/TLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="63"/>
<source>yes</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="150"/>
<source>Revocation information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="63"/>
<source>no</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/revocation_uic.py" line="151"/>
<source>Next</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RevocationView</name>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="63"/>
<source>offline</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="125"/>
<source>Load a revocation file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="43"/>
<source>Hash</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="125"/>
<source>All text files (*.txt)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="44"/>
<source>Time</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="135"/>
<source>Error loading document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NetworkTabWidget</name>
<message>
<location filename="../../ui/network_tab.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="135"/>
<source>Loaded document is not a revocation document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NetworkTableModel</name>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="143"/>
<source>Online</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="145"/>
<source>Error broadcasting document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="144"/>
<source>Offline</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="172"/>
<source>Revocation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="145"/>
<source>Unsynchronized</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="192"/>
<source>Revocation broadcast</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/network/table_model.py" line="146"/>
<source>Corrupted</source>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="192"/>
<source>The document was successfully broadcasted.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordInputController</name>
<name>SakiaToolbar</name>
<message>
<location filename="../../../src/sakia/gui/sub/password_input/controller.py" line="69"/>
<source>Non printable characters in password</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/toolbar_uic.py" line="72"/>
<source>Frame</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/password_input/controller.py" line="74"/>
<source>Wrong password typed. Cannot open the private key</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/toolbar_uic.py" line="73"/>
<source>Network</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordInputView</name>
<message>
<location filename="../../../src/sakia/gui/sub/password_input/view.py" line="28"/>
<source>Password is valid</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/toolbar_uic.py" line="74"/>
<source>Search an identity</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PreferencesDialog</name>
<message>
<location filename="../../ui/preferences.ui" line="382"/>
<source>:</source>
<translation type="obsolete">:</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/toolbar_uic.py" line="75"/>
<source>Contacts</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ProcessConfigureAccount</name>
<name>SearchUserView</name>
<message>
<location filename="../../../src/sakia/gui/process_cfg_account.py" line="168"/>
<source>New account</source>
<translation type="obsolete">новый аккаунт</translation>
<location filename="../../../src/sakia/gui/sub/search_user/view.py" line="63"/>
<source>Looking for {0}...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/process_cfg_account.py" line="193"/>
<source>Ok</source>
<translation type="obsolete">ОК</translation>
<location filename="../../../src/sakia/gui/sub/search_user/view.py" line="20"/>
<source>Research a pubkey, an uid...</source>
<translation type="unfinished">Исследовать открытый ключ, ИДП ...</translation>
</message>
</context>
<context>
<name>SearchUserWidget</name>
<message>
<location filename="../../../src/sakia/gui/process_cfg_account.py" line="229"/>
<source>Warning</source>
<translation type="obsolete">Внимание</translation>
<location filename="../../../src/sakia/gui/sub/search_user/search_user_uic.py" line="35"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/process_cfg_account.py" line="252"/>
<source>Error</source>
<translation type="obsolete">Ошибка</translation>
<location filename="../../../src/sakia/gui/sub/search_user/search_user_uic.py" line="36"/>
<source>Center the view on me</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ProcessConfigureCommunity</name>
<name>SourcesServices</name>
<message>
<location filename="../../../src/sakia/services/sources.py" line="11"/>
<source>missing secret key for public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/process_cfg_community.py" line="243"/>
<source>Add a community</source>
<translation type="obsolete">Добавить сообщество</translation>
<location filename="../../../src/sakia/services/sources.py" line="14"/>
<source>missing password for hash</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/process_cfg_community.py" line="276"/>
<source>Error</source>
<translation type="obsolete">Ошибка</translation>
<location filename="../../../src/sakia/services/sources.py" line="17"/>
<source>locked by a delay until</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/process_cfg_community.py" line="216"/>
<source>{0} : {1}</source>
<translation type="obsolete">{0} : {1}</translation>
<location filename="../../../src/sakia/services/sources.py" line="20"/>
<source>locked until</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PublicationMode</name>
<name>StartupDialog</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="63"/>
<source>All nodes of currency {name}</source>
<location filename="../../../src/sakia/gui/dialogs/startup_uic.py" line="54"/>
<source>Sakia</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="65"/>
<source>Address {address}:{port}</source>
<location filename="../../../src/sakia/gui/dialogs/startup_uic.py" line="55"/>
<source>Connecting to the network
please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="53"/>
<source>
&lt;div&gt;Identity revoked : {uid} (public key : {pubkey}...)&lt;/div&gt;
&lt;div&gt;Identity signed on block : {timestamp}&lt;/div&gt;
</source>
<location filename="../../../src/sakia/gui/dialogs/startup_uic.py" line="57"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusBarController</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="85"/>
<source>Load a revocation file</source>
<location filename="../../../src/sakia/gui/main_window/status_bar/controller.py" line="76"/>
<source>Blockchain sync: {0} BAT ({1})</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Toast</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="85"/>
<source>All text files (*.txt)</source>
<location filename="../../../src/sakia/gui/widgets/toast_uic.py" line="39"/>
<source>MainWindow</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ToolbarView</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="93"/>
<source>Error loading document</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="27"/>
<source>Publish a revocation document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="93"/>
<source>Loaded document is not a revocation document</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="35"/>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="98"/>
<source>Error broadcasting document</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="53"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="102"/>
<source>
&lt;div&gt;Identity revoked : {uid} (public key : {pubkey}...)&lt;/div&gt;
&lt;div&gt;Identity signed on block : {timestamp}&lt;/div&gt;
</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="65"/>
<source>About</source>
<translation type="unfinished">О программе</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="118"/>
<source>Membership</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="117"/>
<source>Revocation</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="58"/>
<source>Plugins manager</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="117"/>
<source>&lt;h4&gt;The publication of this document will remove your identity from the network.&lt;/h4&gt;
&lt;li&gt;
&lt;li&gt; &lt;b&gt;This identity won&apos;t be able to join the targeted currency anymore.&lt;/b&gt; &lt;/li&gt;
&lt;li&gt; &lt;b&gt;This identity won&apos;t be able to generate Universal Dividends anymore.&lt;/b&gt; &lt;/li&gt;
&lt;li&gt; &lt;b&gt;This identity won&apos;t be able to certify individuals anymore.&lt;/b&gt; &lt;/li&gt;
&lt;/li&gt;
Please think twice before publishing this document.
</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="70"/>
<source>About Money</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="130"/>
<source>Revocation broadcast</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="75"/>
<source>About Referentials</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/revocation/view.py" line="130"/>
<source>The document was successfully broadcasted.</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="80"/>
<source>About Web of Trust</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Quantitative</name>
<message>
<location filename="../../../src/sakia/money/quantitative.py" line="8"/>
<source>Units</source>
<translation type="unfinished">Единицы</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="85"/>
<source>About Sakia</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/quantitative.py" line="10"/>
<source>{0}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="143"/>
<source>Minimum delay between 2 certifications (days)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/quantitative.py" line="9"/>
<source>{0} {1}{2}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="198"/>
<source>Web of Trust rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/quantitative.py" line="11"/>
<source>Q = Q
&lt;br &gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Quantitative value&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="210"/>
<source>Money rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/quantitative.py" line="19"/>
<source>Base referential of the money. Units values are used here.</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="225"/>
<source>Referentials</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QuantitativeZSum</name>
<message>
<location filename="../../../src/sakia/money/quant_zerosum.py" line="9"/>
<source>Quant Z-sum</source>
<translation type="unfinished">Колич. Z-сумма</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Universal Dividend UD(t) in</source>
<translation type="unfinished">Универсальный дивиденд УД(t) в</translation>
</message>
<message>
<location filename="../../../src/sakia/money/quant_zerosum.py" line="11"/>
<source>Q0 {0}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Monetary Mass M(t) in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/quant_zerosum.py" line="12"/>
<source>Z0 = Q - ( M(t-1) / N(t) )
&lt;br &gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;Z0&lt;/td&gt;&lt;td&gt;Quantitative value at zero sum&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Quantitative value&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;M&lt;/td&gt;&lt;td&gt;Monetary mass&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;Members count&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;Last UD time&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;t-1&lt;/td&gt;&lt;td&gt;Penultimate UD time&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Members N(t)</source>
<translation type="unfinished">Члены N(t)</translation>
</message>
<message>
<location filename="../../../src/sakia/money/quant_zerosum.py" line="10"/>
<source>{0} {1}Q0{2}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Monetary Mass per member M(t)/N(t) in</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RecipientMode</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/transfer/view.py" line="154"/>
<source>Transfer</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>day</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/transfer/view.py" line="147"/>
<source>Success sending money to {0}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Actual growth c = UD(t)/[M(t)/N(t)]</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Relative</name>
<message>
<location filename="../../../src/sakia/money/relative.py" line="9"/>
<source>UD</source>
<translation type="unfinished">УД</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Last UD date and time (t)</source>
<translation type="unfinished">Дата и время последнего УД (t)</translation>
</message>
<message>
<location filename="../../../src/sakia/money/relative.py" line="11"/>
<source>UD {0}</source>
<translation type="unfinished">УД {0}</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Next UD date and time (t+1)</source>
<translation type="unfinished">Дата и время следующего УД (t+1)</translation>
</message>
<message>
<location filename="../../../src/sakia/money/relative.py" line="12"/>
<source>R = Q / UD(t)
&lt;br &gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;Relative value&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Quantitative value&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;UD&lt;/td&gt;&lt;td&gt;Universal Dividend&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;Last UD time&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="248"/>
<source>Next UD reevaluation (t+1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/relative.py" line="10"/>
<source>{0} {1}UD{2}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="293"/>
<source>{:2.2%} / {:} days</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RelativeZSum</name>
<message>
<location filename="../../../src/sakia/money/relative_zerosum.py" line="9"/>
<source>Relat Z-sum</source>
<translation type="unfinished">Относит. Z-сумма</translation>
</message>
<message>
<location filename="../../../src/sakia/money/relative_zerosum.py" line="11"/>
<source>R0 {0}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="293"/>
<source>UD&#xc4;&#x9e;(t) = UD&#xc4;&#x9e;(t-1) + c&#xc2;&#xb2;*M(t-1)/N(t)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/relative_zerosum.py" line="10"/>
<source>{0} {1}R0{2}</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="293"/>
<source>Universal Dividend (formula)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/money/relative_zerosum.py" line="12"/>
<source>R0 = (Q / UD(t)) - (( M(t-1) / N(t) ) / UD(t))
&lt;br &gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;R0&lt;/td&gt;&lt;td&gt;Relative value at zero sum&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;Relative value&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;M&lt;/td&gt;&lt;td&gt;Monetary mass&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;Members count&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;Last UD time&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;t-1&lt;/td&gt;&lt;td&gt;Penultimate UD time&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</source>
<translation type="unfinished"></translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="330"/>
<source>Name</source>
<translation type="unfinished">Имя</translation>
</message>
</context>
<context>
<name>RevocationDialog</name>
<message>
<location filename="../../ui/revocation.ui" line="210"/>
<source>Next</source>
<translation type="obsolete">Следующий</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="330"/>
<source>Units</source>
<translation type="unfinished">Единицы</translation>
</message>
</context>
<context>
<name>SearchUserView</name>
<message>
<location filename="../../../src/sakia/gui/sub/search_user/view.py" line="35"/>
<source>Looking for {0}...</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="330"/>
<source>Formula</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SearchUserWidget</name>
<message>
<location filename="../../ui/search_user_view.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="330"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/search_user/view.py" line="10"/>
<source>Research a pubkey, an uid...</source>
<translation type="unfinished">Исследовать открытый ключ, ИДП ...</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="360"/>
<source>{:} day(s) {:} hour(s)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StatusBarController</name>
<message>
<location filename="../../../src/sakia/gui/main_window/status_bar/controller.py" line="62"/>
<source>Blockchain sync : {0} ({1})</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="354"/>
<source>{:} hour(s)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StepPageInit</name>
<message>
<location filename="../../../src/sakia/gui/process_cfg_community.py" line="149"/>
<source>Error</source>
<translation type="obsolete">Ошибка</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="379"/>
<source>Fundamental growth (c)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/process_cfg_community.py" line="124"/>
<source>{0} : {1}</source>
<translation type="obsolete">{0} : {1}</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="379"/>
<source>Initial Universal Dividend UD(0) in</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ToolbarController</name>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/controller.py" line="77"/>
<source>Membership</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="379"/>
<source>Time period between two UD</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/controller.py" line="71"/>
<source>Success sending Membership demand</source>
<translation type="unfinished">Заявка о членстве отправлена успешно</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="379"/>
<source>Time period between two UD reevaluation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ToolbarView</name>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="12"/>
<source>Publish a revocation document</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="379"/>
<source>Number of blocks used for calculating median time</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="18"/>
<source>Tools</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="40"/>
<source>Add an Sakia account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="21"/>
<source>Add a connection</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="121"/>
<source>Select an account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="27"/>
<source>Settings</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="143"/>
<source>Maximum validity time of a certification (days)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="30"/>
<source>About</source>
<translation type="unfinished">О программе</translation>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="143"/>
<source>Maximum validity time of a membership (days)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="40"/>
<source>Membership</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="90"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/main_window/toolbar/view.py" line="41"/>
<source>Select a connection</source>
<location filename="../../../src/sakia/gui/main_window/toolbar/model.py" line="46"/>
<source>Download page</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransactionsTabWidget</name>
<name>TransferController</name>
<message>
<location filename="../../../src/sakia/gui/transactions_tab.py" line="201"/>
<source>Informations</source>
<translation type="obsolete">Данные</translation>
<location filename="../../../src/sakia/gui/sub/transfer/controller.py" line="173"/>
<source>Transfer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/transactions_tab.py" line="206"/>
<source>Add as contact</source>
<translation type="obsolete">Добавить контакт</translation>
<location filename="../../../src/sakia/gui/sub/transfer/controller.py" line="390"/>
<source>Check is successful!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/transactions_tab.py" line="211"/>
<source>Send money</source>
<translation type="obsolete">Отправить деньги</translation>
<location filename="../../../src/sakia/gui/sub/transfer/controller.py" line="397"/>
<source>&lt;p&gt;&lt;b&gt;Condition&lt;/b&gt;&lt;/p&gt;{}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/transactions_tab.py" line="217"/>
<source>View in Web of Trust</source>
<translation type="obsolete">Посмотреть в Сети доверия</translation>
<location filename="../../../src/sakia/gui/sub/transfer/controller.py" line="400"/>
<source>&lt;p&gt;&lt;b&gt;Errors&lt;/b&gt;&lt;p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/transactions_tab.py" line="288"/>
<source>Warning</source>
<translation type="obsolete">Внимание</translation>
<location filename="../../../src/sakia/gui/sub/transfer/controller.py" line="426"/>
<source>Check source condition</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferMoneyDialog</name>
<message>
<location filename="../../ui/transfer.ui" line="20"/>
<source>Community</source>
<translation type="obsolete">Сообщество</translation>
</message>
<message>
<location filename="../../ui/transfer.ui" line="40"/>
<source>Contact</source>
<translation type="obsolete">Контакт</translation>
</message>
<message>
<location filename="../../ui/transfer.ui" line="136"/>
<source>Key</source>
<translation type="obsolete">Ключ</translation>
</message>
<message>
<location filename="../../../src/cutecoin/gui/transfer.py" line="111"/>
<source>Error</source>
<translation type="obsolete">Ошибка</translation>
</message>
<name>TransferMoneyWidget</name>
<message>
<location filename="../../../src/cutecoin/gui/transfer.py" line="111"/>
<source>{0} : {1}</source>
<translation type="obsolete">{0} : {1}</translation>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="276"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferView</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/transfer/view.py" line="26"/>
<source>No amount. Please give the transfer amount</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="281"/>
<source>Transfer money to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/dialogs/transfer/view.py" line="29"/>
<source>Please enter correct password</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="282"/>
<source>&amp;Recipient public key</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TxFilterProxyModel</name>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="146"/>
<source>{0} / {1} confirmations</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="283"/>
<source>Key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/table_model.py" line="150"/>
<source>Confirming... {0} %</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="284"/>
<source>Search &amp;user</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TxHistoryController</name>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/controller.py" line="62"/>
<source>Received {amount} from {number} transfers</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="285"/>
<source>Local ke&amp;y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/controller.py" line="65"/>
<source>New transactions received</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="286"/>
<source>Con&amp;tact</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TxHistoryModel</name>
<message>
<location filename="../../../src/sakia/gui/navigation/txhistory/model.py" line="116"/>
<source>Loading...</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="287"/>
<source>Available money: </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserInformationView</name>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="61"/>
<source>
&lt;table cellpadding=&quot;5&quot;&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;{:}&lt;/b&gt;&lt;/td&gt;&lt;td&gt;{:}&lt;/td&gt;&lt;/tr&gt;
</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="288"/>
<source>Amount</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="68"/>
<source>Public key</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="295"/>
<source>Secret Key / Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="68"/>
<source>UID Published on</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="277"/>
<source>Select account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="68"/>
<source>Join date</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="291"/>
<source>Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="68"/>
<source>Expires in</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="292"/>
<source>Spend condition</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="68"/>
<source>Certs. received</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="293"/>
<source>Receiver signature</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="92"/>
<source>Member</source>
<translation type="unfinished">Член</translation>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="294"/>
<source>Receiver signature or (sender after one week)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="92"/>
<source>Non-Member</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="278"/>
<source>Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="93"/>
<source>#FF0000</source>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="279"/>
<source>Automatic</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WalletsTab</name>
<message>
<location filename="../../ui/wallets_tab.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="280"/>
<source>Check</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../ui/wallets_tab.ui" line="34"/>
<source>Balance</source>
<translation type="obsolete">Баланс</translation>
<location filename="../../../src/sakia/gui/sub/transfer/transfer_uic.py" line="290"/>
<source>Units</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WalletsTabWidget</name>
<name>TransferView</name>
<message>
<location filename="../../../src/cutecoin/gui/wallets_tab.py" line="124"/>
<source>Not a member</source>
<translation type="obsolete">Не член</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="30"/>
<source>No amount. Please give the transfer amount</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WalletsTableModel</name>
<message>
<location filename="../../../src/sakia/models/wallets.py" line="72"/>
<source>Name</source>
<translation type="obsolete">Имя</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="37"/>
<source>Please enter correct password</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/models/wallets.py" line="72"/>
<source>Pubkey</source>
<translation type="obsolete">Открытый ключ</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="41"/>
<source>Please enter a receiver</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WoT.Node</name>
<message>
<location filename="../../../src/sakia/gui/views/wot.py" line="294"/>
<source>Informations</source>
<translation type="obsolete">Данные</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="45"/>
<source>Incorrect receiver address or pubkey</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/views/wot.py" line="299"/>
<source>Add as contact</source>
<translation type="obsolete">Добавить контакт</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="229"/>
<source>Transfer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/views/wot.py" line="304"/>
<source>Send money</source>
<translation type="obsolete">Отправить деньги</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="214"/>
<source>Success sending money to {0}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/views/wot.py" line="309"/>
<source>Certify identity</source>
<translation type="obsolete">Удостоверить личность</translation>
<location filename="../../../src/sakia/gui/sub/transfer/view.py" line="49"/>
<source>Source locked</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WotTabWidget</name>
<message>
<location filename="../../ui/wot_tab.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
</message>
<name>TxHistoryController</name>
<message>
<location filename="../../../src/sakia/gui/wot_tab.py" line="25"/>
<source>Research a pubkey, an uid...</source>
<translation type="obsolete">Исследовать открытый ключ, ИДП ...</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/controller.py" line="95"/>
<source>Received {amount} from {number} transfers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/wot_tab.py" line="158"/>
<source>Not a member</source>
<translation type="obsolete">Не член</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/controller.py" line="99"/>
<source>New transactions received</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>certificationsTabWidget</name>
<name>TxHistoryModel</name>
<message>
<location filename="../../ui/certifications_tab.ui" line="14"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/model.py" line="137"/>
<source>Loading...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>menu</name>
<name>TxHistoryView</name>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="47"/>
<source>Certify identity</source>
<translation type="unfinished">Удостоверить личность</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/view.py" line="63"/>
<source> / {:} pages</source>
<translation type="unfinished"></translation>
</message>
</context>
<context encoding="UTF-8">
<name>TxHistoryWidget</name>
<message>
<location filename="../../../src/sakia/gui/navigation/controller.py" line="129"/>
<source>Copy pubkey to clipboard</source>
<location filename="../../../src/sakia/gui/navigation/txhistory/txhistory_uic.py" line="115"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>menu.qmenu</name>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="37"/>
<source>Informations</source>
<translation type="unfinished">Данные</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/txhistory_uic.py" line="116"/>
<source>Balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="47"/>
<source>Add as contact</source>
<translation type="obsolete">Добавить контакт</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/txhistory_uic.py" line="117"/>
<source>loading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="42"/>
<location filename="../../../src/sakia/gui/navigation/txhistory/txhistory_uic.py" line="118"/>
<source>Send money</source>
<translation type="unfinished">Отправить деньги</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="51"/>
<source>View in Web of Trust</source>
<translation type="unfinished">Посмотреть в Сети доверия</translation>
<location filename="../../../src/sakia/gui/navigation/txhistory/txhistory_uic.py" line="120"/>
<source>dd/MM/yyyy</source>
<translation type="unfinished"></translation>
</message>
<message encoding="UTF-8">
<location filename="../../../src/sakia/gui/navigation/txhistory/txhistory_uic.py" line="121"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#0000ff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;to send &lt;/span&gt;&lt;span style=&quot; color:#ffb000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;pending &lt;/span&gt;&lt;span style=&quot; color:#808080;&quot;&gt;&lt;/span&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;refused &lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;not confirmed &lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;&lt;/span&gt;validated &lt;span style=&quot; color:#000000;&quot;&gt;■ &lt;/span&gt;&lt;span style=&quot; text-decoration: underline;&quot;&gt;to unlock&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UserInformationView</name>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="55"/>
<source>Copy pubkey to clipboard</source>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="72"/>
<source>Public key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="60"/>
<source>Copy self-certification document to clipboard</source>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="72"/>
<source>UID Published on</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="70"/>
<source>Transfer</source>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="72"/>
<source>Join date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="72"/>
<source>Send again</source>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="72"/>
<source>Expires in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="76"/>
<source>Cancel</source>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="72"/>
<source>Certs. received</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="81"/>
<source>Copy raw transaction to clipboard</source>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="96"/>
<source>Member</source>
<translation type="unfinished">Член</translation>
</message>
<message>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="101"/>
<source>#FF0000</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../src/sakia/gui/widgets/context_menu.py" line="86"/>
<source>Copy transaction block to clipboard</source>
<location filename="../../../src/sakia/gui/sub/user_information/view.py" line="96"/>
<source>Not a member</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>password_input</name>
<name>UserInformationWidget</name>
<message>
<location filename="../../../src/sakia/gui/sub/password_input/controller.py" line="46"/>
<source>Please enter your password</source>
<location filename="../../../src/sakia/gui/sub/user_information/user_information_uic.py" line="76"/>
<source>Member informations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>self.config_dialog</name>
<message>
<location filename="../../../src/sakia/gui/dialogs/connection_cfg/controller.py" line="88"/>
<source>Ok</source>
<translation type="unfinished">ОК</translation>
<location filename="../../../src/sakia/gui/sub/user_information/user_information_uic.py" line="77"/>
<source>User</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>transactionsTabWidget</name>
<name>WotWidget</name>
<message>
<location filename="../../ui/transactions_tab.ui" line="14"/>
<location filename="../../../src/sakia/gui/navigation/graphs/wot/wot_tab_uic.py" line="27"/>
<source>Form</source>
<translation type="obsolete">Формуляр</translation>
</message>
<message>
<location filename="../../ui/transactions_tab.ui" line="20"/>
<source>Balance</source>
<translation type="obsolete">Баланс</translation>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
[Desktop Entry]
Version=0.32.10post1
Version=0.53.2
Name=Sakia
Comment=Duniter Qt Client
Exec=sakia
......
......@@ -81,7 +81,7 @@ else:
debug=True,
strip=False,
upx=True,
console=True,
console=False,
icon='sakia.ico')
......
from setuptools import setup, find_packages
import os
import re
import subprocess
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'src')))
import sakia
......@@ -26,11 +27,22 @@ def which(program):
return None
path = os.path.abspath(os.path.join(os.path.dirname(__file__)))
subprocess.call(
"python {0}/gen_resources.py".format(path), shell=True
)
subprocess.call(
"python {0}/gen_translations.py".format(path), shell=True
)
EDITABLE_REQUIREMENT = re.compile(r'^-e (?P<link>(?P<vcs>git|svn|hg|bzr).+#egg=(?P<package>.+)-(?P<version>\d(?:\.\d)*))$')
install_requires = []
dependency_links = []
data_files = [('sakia', ['src/sakia/root_servers.yml', 'src/sakia/g1_licence.html'])]
data_files = [('sakia', ['src/sakia/root_servers.yml', 'src/sakia/g1_license.html'])]
for requirement in (l.strip() for l in open('requirements.txt')):
match = EDITABLE_REQUIREMENT.match(requirement)
......@@ -61,6 +73,7 @@ setup(
description="A [duniter](https://github.com/duniter/duniter) Python client",
long_description=open('README.md').read(),
long_description_content_type="text/markdown",
# Active la prise en compte du fichier MANIFEST.in
include_package_data=True,
......
__version_info__ = ('0', '32', '10post1')
__version__ = '.'.join(__version_info__)
__version_info__ = ("0", "53", "2")
__version__ = ".".join(__version_info__)
import os
import shutil
import attr
import datetime
import logging
import socket
import yaml
import sakia.i18n_rc
import async_timeout
import aiohttp
from PyQt5.QtCore import QObject, pyqtSignal, QTranslator, QCoreApplication, QLocale, Qt
from PyQt5.QtCore import (
QObject,
pyqtSignal,
QTranslator,
QCoreApplication,
QLocale,
Qt,
QFile,
)
from . import __version__
from .options import SakiaOptions
from sakia.constants import GITLAB_RELEASES_API_URL, GITLAB_RELEASES_PAGE_URL
from sakia.options import SakiaOptions
from sakia.data.connectors import BmaConnector
from sakia.services import NetworkService, BlockchainService, IdentitiesService, \
SourcesServices, TransactionsService, DocumentsService
from sakia.services import (
NetworkService,
BlockchainService,
IdentitiesService,
SourcesServices,
TransactionsService,
DocumentsService,
)
from sakia.data.repositories import SakiaDatabase
from sakia.data.entities import Transaction, Connection, Identity, Dividend
from sakia.data.processors import BlockchainProcessor, NodesProcessor, IdentitiesProcessor, \
CertificationsProcessor, SourcesProcessor, TransactionsProcessor, ConnectionsProcessor, DividendsProcessor
from sakia.data.processors import (
BlockchainProcessor,
NodesProcessor,
IdentitiesProcessor,
CertificationsProcessor,
SourcesProcessor,
TransactionsProcessor,
ConnectionsProcessor,
DividendsProcessor,
)
from sakia.data.files import AppDataFile, UserParametersFile, PluginsDirectory
from sakia.decorators import asyncify
from sakia.money import *
......@@ -61,10 +90,11 @@ class Application(QObject):
loop = attr.ib()
options = attr.ib()
app_data = attr.ib()
parameters = attr.ib()
db = attr.ib()
currency = attr.ib()
plugins_dir = attr.ib()
root_servers = attr.ib(default=None)
parameters = attr.ib(default=None)
db = attr.ib(default=None)
currency = attr.ib(default=None)
plugins_dir = attr.ib(default=None)
network_service = attr.ib(default=None)
blockchain_service = attr.ib(default=None)
identities_service = attr.ib(default=None)
......@@ -72,9 +102,10 @@ class Application(QObject):
transactions_service = attr.ib(default=None)
documents_service = attr.ib(default=None)
current_ref = attr.ib(default=Quantitative)
_logger = attr.ib(default=attr.Factory(lambda:logging.getLogger('sakia')))
_logger = attr.ib(default=attr.Factory(lambda: logging.getLogger("sakia")))
available_version = attr.ib(init=False)
_translator = attr.ib(init=False)
_qt_translator = attr.ib(init=False)
def __attrs_post_init__(self):
super().__init__()
......@@ -86,21 +117,56 @@ class Application(QObject):
qapp.setAttribute(Qt.AA_EnableHighDpiScaling, True)
options = SakiaOptions.from_arguments(argv)
app_data = AppDataFile.in_config_path(options.config_path).load_or_init()
app = cls(qapp, loop, options, app_data, None, None, options.currency, None)
app = cls(
qapp, loop, options, app_data, None, None, None, options.currency, None
)
app.load_root_servers()
# app.set_proxy()
app.load_profile(options.profile)
app.documents_service = DocumentsService.instanciate(app)
app.switch_language()
return app
def load_root_servers(self):
"""
Load root servers config
:return:
"""
filename = "root_servers.yml"
root_servers_default_path = os.path.join(os.path.dirname(__file__), filename)
root_servers_config_path = os.path.join(self.options.config_path, filename)
self._logger.debug(
"Check root servers config file: {}...".format(root_servers_config_path)
)
if not os.path.exists(root_servers_config_path):
self._logger.debug(
"Create root servers config file: {}".format(root_servers_config_path)
)
shutil.copy(root_servers_default_path, root_servers_config_path)
self._logger.debug(
"Load root servers config file: {}".format(root_servers_config_path)
)
with open(
root_servers_config_path,
"r",
encoding="utf-8",
) as stream:
self.root_servers = yaml.load(stream, Loader=yaml.FullLoader)
def load_profile(self, profile_name):
"""
Initialize databases depending on profile loaded
:param profile_name:
:return:
"""
self.plugins_dir = PluginsDirectory.in_config_path(self.options.config_path, profile_name).load_or_init(self.options.with_plugin)
self.parameters = UserParametersFile.in_config_path(self.options.config_path, profile_name).load_or_init(profile_name)
self.plugins_dir = PluginsDirectory.in_config_path(
self.options.config_path, profile_name
).load_or_init(self.options.with_plugin)
self.parameters = UserParametersFile.in_config_path(
self.options.config_path, profile_name
).load_or_init(profile_name)
self.db = SakiaDatabase.load_or_init(self.options, profile_name)
self.instanciate_services()
......@@ -109,52 +175,87 @@ class Application(QObject):
nodes_processor = NodesProcessor(self.db.nodes_repo)
bma_connector = BmaConnector(nodes_processor, self.parameters)
connections_processor = ConnectionsProcessor(self.db.connections_repo)
identities_processor = IdentitiesProcessor(self.db.identities_repo, self.db.certifications_repo, self.db.blockchains_repo, bma_connector)
certs_processor = CertificationsProcessor(self.db.certifications_repo, self.db.identities_repo, bma_connector)
identities_processor = IdentitiesProcessor(
self.db.identities_repo,
self.db.certifications_repo,
self.db.blockchains_repo,
bma_connector,
)
certs_processor = CertificationsProcessor(
self.db.certifications_repo, self.db.identities_repo, bma_connector
)
blockchain_processor = BlockchainProcessor.instanciate(self)
sources_processor = SourcesProcessor.instanciate(self)
transactions_processor = TransactionsProcessor.instanciate(self)
dividends_processor = DividendsProcessor.instanciate(self)
nodes_processor.initialize_root_nodes(self.currency)
nodes_processor.initialize_root_nodes(self.currency, self.root_servers)
self.db.commit()
self.documents_service = DocumentsService.instanciate(self)
self.identities_service = IdentitiesService(self.currency, connections_processor,
self.identities_service = IdentitiesService(
self.currency,
connections_processor,
identities_processor,
certs_processor, blockchain_processor,
bma_connector)
certs_processor,
blockchain_processor,
bma_connector,
)
self.transactions_service = TransactionsService(self.currency, transactions_processor,
self.transactions_service = TransactionsService(
self.currency,
transactions_processor,
dividends_processor,
identities_processor, connections_processor,
bma_connector)
identities_processor,
connections_processor,
bma_connector,
)
self.sources_service = SourcesServices(self.currency, sources_processor,
connections_processor, transactions_processor,
blockchain_processor, bma_connector)
self.sources_service = SourcesServices(
self.currency,
sources_processor,
connections_processor,
transactions_processor,
blockchain_processor,
bma_connector,
)
self.blockchain_service = BlockchainService(self, self.currency, blockchain_processor, connections_processor,
self.blockchain_service = BlockchainService(
self,
self.currency,
blockchain_processor,
connections_processor,
bma_connector,
self.identities_service,
self.transactions_service,
self.sources_service)
self.sources_service,
)
self.network_service = NetworkService.load(self, self.currency, nodes_processor,
self.network_service = NetworkService.load(
self,
self.currency,
nodes_processor,
self.blockchain_service,
self.identities_service)
self.identities_service,
)
async def remove_connection(self, connection):
connections_processor = ConnectionsProcessor.instanciate(self)
connections_processor.remove_connections(connection)
CertificationsProcessor.instanciate(self).cleanup_connection(connection, connections_processor.pubkeys())
CertificationsProcessor.instanciate(self).cleanup_connection(
connection, connections_processor.pubkeys()
)
IdentitiesProcessor.instanciate(self).cleanup_connection(connection)
SourcesProcessor.instanciate(self).drop_all_of(currency=connection.currency, pubkey=connection.pubkey)
SourcesProcessor.instanciate(self).drop_all_of(
currency=connection.currency, pubkey=connection.pubkey
)
DividendsProcessor.instanciate(self).cleanup_connection(connection)
TransactionsProcessor.instanciate(self).cleanup_connection(connection, connections_processor.pubkeys())
TransactionsProcessor.instanciate(self).cleanup_connection(
connection, connections_processor.pubkeys()
)
self.db.commit()
self.connection_removed.emit(connection)
......@@ -171,13 +272,26 @@ class Application(QObject):
self._translator = QTranslator(self.qapp)
if locale == "en":
QCoreApplication.installTranslator(self._translator)
elif self._translator.load(":/i18n/{0}".format(locale)):
else:
# load chosen language
filepath = ":/i18n/{0}".format(locale)
if not QFile.exists(filepath):
self._logger.debug("File not found: {0}".format(filepath))
self._translator.load(filepath)
if QCoreApplication.installTranslator(self._translator):
self._logger.debug("Loaded i18n/{0}".format(locale))
self._logger.debug("Loaded {0}".format(filepath))
else:
self._logger.debug("Couldn't load translation")
self._logger.debug("Couldn't load {0}".format(filepath))
# load standardButtons Qt translation
filepath = ":/i18n/qtbase_{0}".format(locale)
if not QFile.exists(filepath):
self._logger.debug("File not found: {0}".format(filepath))
self._qt_translator = QTranslator(self.qapp)
self._qt_translator.load(filepath)
if QCoreApplication.installTranslator(self._qt_translator):
self._logger.debug("Loaded {0}".format(filepath))
else:
self._logger.debug("Couldn't load i18n/{0}".format(locale))
self._logger.debug("Couldn't load {0}".format(filepath))
def start_coroutines(self):
self.network_service.start_coroutines()
......@@ -195,33 +309,36 @@ class Application(QObject):
try:
async with aiohttp.ClientSession() as session:
async with async_timeout.timeout(10):
response = await session.get("https://api.github.com/repos/duniter/sakia/releases",
proxy=self.parameters.proxy())
response = await session.get(
GITLAB_RELEASES_API_URL,
proxy=self.parameters.proxy(),
)
if response.status == 200:
releases = await response.json()
latest = None
for r in releases:
if not latest:
latest = r
else:
latest_date = datetime.datetime.strptime(latest['published_at'], "%Y-%m-%dT%H:%M:%SZ")
date = datetime.datetime.strptime(r['published_at'], "%Y-%m-%dT%H:%M:%SZ")
if latest_date < date:
latest = r
latest_version = latest["tag_name"]
version = (__version__ == latest_version,
if len(releases) > 0:
release = releases[0]
latest_version = release["tag_name"]
version = (
__version__ == latest_version,
latest_version,
latest["html_url"])
GITLAB_RELEASES_PAGE_URL,
)
logging.debug("Found version: {0}".format(latest_version))
logging.debug("Current version: {0}".format(__version__))
self.available_version = version
except (aiohttp.ClientError, aiohttp.ServerDisconnectedError, asyncio.TimeoutError, socket.gaierror) as e:
self._logger.debug("Could not connect to github : {0}".format(str(e)))
except (
aiohttp.ClientError,
aiohttp.ServerDisconnectedError,
asyncio.TimeoutError,
socket.gaierror,
) as e:
self._logger.debug("Could not connect to gitlab: {0}".format(str(e)))
def save_parameters(self, parameters):
self.parameters = UserParametersFile\
.in_config_path(self.options.config_path, parameters.profile_name)\
.save(parameters)
self.parameters = UserParametersFile.in_config_path(
self.options.config_path, parameters.profile_name
).save(parameters)
def change_referential(self, index):
self.current_ref = Referentials[index]
......
import os
import yaml
MAX_CONFIRMATIONS = 6
with open(os.path.join(os.path.dirname(__file__), "root_servers.yml"), 'r') as stream:
ROOT_SERVERS = yaml.load(stream)
with open(
os.path.join(os.path.dirname(__file__), "g1_license.html"), "r", encoding="utf-8"
) as stream:
G1_LICENSE = stream.read()
with open(os.path.join(os.path.dirname(__file__), "g1_licence.html"), 'r') as stream:
G1_LICENCE = stream.read()
GITLAB_RELEASES_PAGE_URL = "https://git.duniter.org/clients/python/sakia/-/releases"
GITLAB_RELEASES_API_URL = (
"https://git.duniter.org/api/v4/projects/clients%2Fpython%2Fsakia/releases"
)
GITLAB_NEW_ISSUE_PAGE_URL = "https://git.duniter.org/clients/python/sakia/-/issues/new"
import logging
import aiohttp
from aiohttp import ClientError
from duniterpy.api import bma, errors
from duniterpy.documents import BMAEndpoint, SecuredBMAEndpoint
from duniterpy.api import client, bma, errors
from duniterpy.api.endpoint import BMAEndpoint, SecuredBMAEndpoint
from duniterpy.api.client import parse_error, Client
from sakia.errors import NoPeerAvailable
from pkg_resources import parse_version
from socket import gaierror
......@@ -23,7 +24,10 @@ async def parse_responses(responses):
elif r.status == 400:
error = await r.text()
try:
result = (False, errors.DuniterError(bma.parse_error(error)).message)
result = (
False,
errors.DuniterError(parse_error(error)).message,
)
except jsonschema.ValidationError:
result = (False, error)
elif r.status == 200:
......@@ -37,25 +41,29 @@ async def parse_responses(responses):
result = (False, str(e))
return result
def filter_endpoints(request, nodes):
def compare_versions(node, version):
if node.version and node.version != '':
if node.version and node.version != "":
try:
return parse_version(node.version) >= parse_version(version)
except TypeError:
return False
else:
return True
filters = {
bma.ud.history: lambda n: compare_versions(n, "0.11.0"),
bma.tx.history: lambda n: compare_versions(n, "0.11.0"),
bma.blockchain.membership: lambda n: compare_versions(n, "0.14")
bma.blockchain.membership: lambda n: compare_versions(n, "0.14"),
}
if request in filters:
nodes = [n for n in nodes if filters[request](n)]
endpoints = []
for n in nodes:
endpoints += [e for e in n.endpoints if type(e) in (BMAEndpoint, SecuredBMAEndpoint)]
endpoints += [
e for e in n.endpoints if type(e) in (BMAEndpoint, SecuredBMAEndpoint)
]
return endpoints
......@@ -116,7 +124,7 @@ def _filter_data(request, data):
for idty in filtered["identities"]:
for c in idty["certifications"]:
c.pop("expiresIn")
idty.pop('membershipPendingExpiresIn')
idty.pop("membershipPendingExpiresIn")
return filtered
......@@ -127,8 +135,7 @@ def _merge_lookups(answers_data):
if isinstance(data, errors.DuniterError):
raise data
lookup_data = {"partial": False,
"results": []}
lookup_data = {"partial": False, "results": []}
for dict_hash in answers_data:
if not isinstance(answers_data[dict_hash], errors.DuniterError):
for data in answers_data[dict_hash]["results"]:
......@@ -159,38 +166,83 @@ class BmaConnector:
"""
This class is used to access BMA API.
"""
_nodes_processor = attr.ib()
_user_parameters = attr.ib()
_logger = attr.ib(default=attr.Factory(lambda: logging.getLogger('sakia')))
_logger = attr.ib(default=attr.Factory(lambda: logging.getLogger("sakia")))
async def _verified_request(self, node, session, request):
try:
res = await request
self._nodes_processor.handle_success(node)
return res
except errors.DuniterError as e:
if e.ucode == errors.HTTP_LIMITATION:
self._logger.debug("Exception in responses: " + str(e))
self._nodes_processor.handle_failure(node)
else:
return e
except BaseException as e:
self._logger.debug(type(e))
self._nodes_processor.handle_failure(node)
return e
finally:
await session.close()
async def verified_get(self, currency, request, req_args):
synced_nodes = self._nodes_processor.synced_members_nodes(currency)
if not synced_nodes:
# If no node is known as a member, lookup synced nodes as a fallback
synced_nodes = self._nodes_processor.synced_nodes(currency)
offline_nodes = self._nodes_processor.offline_synced_nodes(currency)
random_offline_node = random.sample(offline_nodes, min(1, len(offline_nodes)))
nodes_generator = (n for n in synced_nodes)
answers = {}
answers_data = {}
nb_verification = min(max(1, 0.66 * len(synced_nodes)), 10)
nb_verification = min(max(1, 0.66 * len(synced_nodes)), 3)
# We try to find agreeing nodes from one 1 to 66% of nodes, max 10
session = aiohttp.ClientSession()
filtered_data = {}
try:
while max([len(nodes) for nodes in answers.values()] + [0]) <= nb_verification:
futures = []
try:
for i in range(0, int(nb_verification)+1):
for i in range(0, int(nb_verification * 1.4) + 1):
node = next(nodes_generator)
endpoints = filter_endpoints(request, [node])
if not endpoints:
continue
endpoint = random.choice(endpoints)
self._logger.debug(
"Requesting {0} on endpoint {1}".format(str(request.__name__), str(endpoint)))
futures.append(request(next(
endpoint.conn_handler(session, proxy=self._user_parameters.proxy())),
**req_args))
"Requesting {0} on endpoint {1}".format(
str(request.__name__), str(endpoint)
)
)
# create client
_client = client.Client(
endpoint, None, proxy=self._user_parameters.proxy()
)
futures.append(
self._verified_request(
node, _client.session, _client(request, **req_args)
)
)
if random_offline_node:
node = random_offline_node[0]
endpoints = filter_endpoints(request, [node])
if not endpoints:
continue
endpoint = random.choice(endpoints)
self._logger.debug(
"Requesting {0} on endpoint {1}".format(
str(request.__name__), str(endpoint)
)
)
# create client
_client = client.Client(
endpoint, None, proxy=self._user_parameters.proxy()
)
futures.append(
self._verified_request(
node, _client.session, _client(request, **req_args)
)
)
except StopIteration:
# When no more node is available, we go out of the while loop
break
......@@ -201,12 +253,21 @@ class BmaConnector:
for r in responses:
if isinstance(r, errors.DuniterError):
if r.ucode == errors.HTTP_LIMITATION:
self._logger.debug("Exception in responses : " + r.message)
self._logger.debug(
"Exception in responses: " + r.message
)
continue
else:
data_hash = hash(r.ucode)
elif isinstance(r, BaseException):
self._logger.debug("Exception in responses : " + str(r))
if str(r).strip() == "":
self._logger.debug(
"Exception in responses: {}".format(type(r))
)
else:
self._logger.debug(
"Exception in responses: {}".format(str(r))
)
continue
else:
filtered_data = _filter_data(request, r)
......@@ -216,8 +277,6 @@ class BmaConnector:
answers[data_hash] = [node]
else:
answers[data_hash].append(node)
finally:
await session.close()
if len(answers_data) > 0:
if request is bma.wot.lookup:
......@@ -228,26 +287,43 @@ class BmaConnector:
raise NoPeerAvailable("", len(synced_nodes))
async def simple_get(self, currency, request, req_args):
endpoints = filter_endpoints(request, self._nodes_processor.synced_nodes(currency))
endpoints = filter_endpoints(
request, self._nodes_processor.synced_nodes(currency)
)
tries = 0
while tries < 3 and endpoints:
async with aiohttp.ClientSession() as session:
endpoint = random.choice(endpoints)
endpoints.remove(endpoint)
try:
self._logger.debug("Requesting {0} on endpoint {1}".format(str(request.__name__), str(endpoint)))
async with aiohttp.ClientSession() as session:
json_data = await request(next(endpoint.conn_handler(session), **req_args))
return json_data
self._logger.debug(
"Requesting {0} on endpoint {1}".format(
str(request.__name__), str(endpoint)
)
)
_client = client.Client(
endpoint, session, proxy=self._user_parameters.proxy()
)
return await _client(request, **req_args)
except errors.DuniterError as e:
if e.ucode == errors.HTTP_LIMITATION:
self._logger.debug(str(e))
tries += 1
else:
raise
except (ClientError, gaierror, asyncio.TimeoutError,
ValueError, jsonschema.ValidationError) as e:
except (
ClientError,
gaierror,
asyncio.TimeoutError,
ValueError,
jsonschema.ValidationError,
) as e:
self._logger.debug(str(e))
tries += 1
except AttributeError as e:
if "feed_appdata" in str(e) or "do_handshake" in str(e):
self._logger.debug(str(e))
raise NoPeerAvailable("", len(endpoints))
async def get(self, currency, request, req_args={}, verify=True):
......@@ -277,20 +353,28 @@ class BmaConnector:
.. note:: If one node accept the requests (returns 200),
the broadcast should be considered accepted by the network.
"""
filtered_endpoints = filter_endpoints(request, self._nodes_processor.synced_nodes(currency))
endpoints = random.sample(filtered_endpoints, 6) if len(filtered_endpoints) > 6 else filtered_endpoints
filtered_endpoints = filter_endpoints(
request, self._nodes_processor.synced_nodes(currency)
)
endpoints = (
random.sample(filtered_endpoints, 6)
if len(filtered_endpoints) > 6
else filtered_endpoints
)
replies = []
if len(endpoints) > 0:
async with aiohttp.ClientSession() as session:
for endpoint in endpoints:
self._logger.debug("Trying to connect to: " + str(endpoint))
reply = asyncio.ensure_future(request(next(endpoint.conn_handler(session,
proxy=self._user_parameters.proxy())),
**req_args))
_client = client.Client(
endpoint, session, proxy=self._user_parameters.proxy()
)
reply = asyncio.ensure_future(_client(request, **req_args))
replies.append(reply)
result = await asyncio.gather(*replies, return_exceptions=True)
return tuple(result)
else:
raise NoPeerAvailable("", len(endpoints))
import asyncio
import logging
import time
import re
from asyncio import TimeoutError
from socket import gaierror
from typing import Union
import aiohttp
import jsonschema
......@@ -10,8 +12,11 @@ from PyQt5.QtCore import QObject, pyqtSignal
from aiohttp import ClientError
from duniterpy.api import bma, errors
from duniterpy.documents import BlockUID, MalformedDocumentError, BMAEndpoint
from duniterpy.documents.peer import Peer, ConnectionHandler
from duniterpy.api.client import Client
from duniterpy.constants import HOST_REGEX, IPV4_REGEX, IPV6_REGEX
from duniterpy.api.endpoint import BMAEndpoint, SecuredBMAEndpoint
from duniterpy.documents import BlockUID, MalformedDocumentError
from duniterpy.documents.peer import Peer
from sakia.decorators import asyncify
from sakia.errors import InvalidNodeCurrency
from ..entities.node import Node
......@@ -22,18 +27,22 @@ class NodeConnectorLoggerAdapter(logging.LoggerAdapter):
This example adapter expects the passed in dict-like object to have a
'connid' key, whose value in brackets is prepended to the log message.
"""
def process(self, msg, kwargs):
return '[%s] %s' % (self.extra['pubkey'][:5], msg), kwargs
return "[%s] %s" % (self.extra["pubkey"][:5], msg), kwargs
class NodeConnector(QObject):
"""
A node is a peer send from the client point of view.
"""
changed = pyqtSignal()
error = pyqtSignal()
success = pyqtSignal()
failure = pyqtSignal(int)
identity_changed = pyqtSignal()
neighbour_found = pyqtSignal(Peer)
block_found = pyqtSignal(BlockUID)
def __init__(self, node, user_parameters, session=None):
"""
......@@ -41,14 +50,14 @@ class NodeConnector(QObject):
"""
super().__init__()
self.node = node
self._ws_tasks = {'block': None,
'peer': None}
self._connected = {'block': False,
'peer': False}
self.failure_count = 0
self._ws_tasks = {"block": None, "peer": None}
self._connected = {"block": False, "peer": False}
self._user_parameters = user_parameters
self.session = session
self._raw_logger = logging.getLogger('sakia')
self._logger = NodeConnectorLoggerAdapter(self._raw_logger, {'pubkey': self.node.pubkey})
self._raw_logger = logging.getLogger("sakia")
self._logger = NodeConnectorLoggerAdapter(
self._raw_logger, {"pubkey": self.node.pubkey}
)
def __del__(self):
for ws in self._ws_tasks.values():
......@@ -67,27 +76,36 @@ class NodeConnector(QObject):
:return: A new node
:rtype: sakia.core.net.Node
"""
http_scheme = "https" if secured else "http"
ws_scheme = "ws" if secured else "wss"
session = aiohttp.ClientSession()
peer_data = await bma.network.peering(ConnectionHandler(http_scheme, ws_scheme, address, port, "",
proxy=user_parameters.proxy(), session=session))
endpoint = get_bma_endpoint_from_server_address(address, port, secured)
async with aiohttp.ClientSession() as session:
# Create Client from endpoint string in Duniter format
client = Client(endpoint, session, proxy=user_parameters.proxy())
peer_data = client(bma.network.peering)
peer = Peer.from_signed_raw("{0}{1}\n".format(peer_data['raw'],
peer_data['signature']))
peer = Peer.from_signed_raw(
"{0}{1}\n".format(peer_data["raw"], peer_data["signature"])
)
if currency and peer.currency != currency:
raise InvalidNodeCurrency(currency, peer.currency)
node = Node(peer.currency, peer.pubkey, peer.endpoints, peer.blockUID, last_state_change=time.time())
logging.getLogger('sakia').debug("Node from address : {:}".format(str(node)))
node = Node(
peer.currency,
peer.pubkey,
peer.endpoints,
peer.blockUID,
last_state_change=time.time(),
)
logging.getLogger("sakia").debug("Node from address: {:}".format(str(node)))
return cls(node, user_parameters, session=session)
return cls(node, user_parameters)
@classmethod
def from_peer(cls, currency, peer, user_parameters):
"""
Factory method to get a node from a peer document.
:param str currency: The node currency. None if we don't know\
the currency it should have, for example if its the first one we add
:param peer: The peer document
......@@ -97,37 +115,49 @@ class NodeConnector(QObject):
if currency and peer.currency != currency:
raise InvalidNodeCurrency(currency, peer.currency)
node = Node(peer.currency, peer.pubkey, peer.endpoints, peer.blockUID, last_state_change=time.time())
logging.getLogger('sakia').debug("Node from peer : {:}".format(str(node)))
node = Node(
peer.currency,
peer.pubkey,
peer.endpoints,
peer.blockUID,
current_buid=peer.blockUID,
last_state_change=time.time(),
)
logging.getLogger("sakia").debug("Node from peer: {:}".format(str(node)))
return cls(node, user_parameters, session=None)
async def safe_request(self, endpoint, request, proxy, req_args={}):
async with aiohttp.ClientSession() as session:
try:
conn_handler = next(endpoint.conn_handler(self.session, proxy=proxy))
data = await request(conn_handler, **req_args)
client = Client(endpoint, session, proxy)
data = await client(request, **req_args)
return data
except errors.DuniterError as e:
if e.ucode == 1006:
self._logger.debug("{0}".format(str(e)))
else:
raise
except (ClientError, gaierror, TimeoutError, ConnectionRefusedError, ValueError) as e:
except (
ClientError,
gaierror,
TimeoutError,
ConnectionRefusedError,
ValueError,
) as e:
self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
self.change_state_and_emit(Node.OFFLINE)
self.handle_failure()
except jsonschema.ValidationError as e:
self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
self.change_state_and_emit(Node.CORRUPTED)
except RuntimeError:
if self.session.closed:
pass
self.handle_failure(weight=3)
except RuntimeError as e:
self._logger.error(str(e))
except AttributeError as e:
if "feed_appdata" in str(e) or "do_handshake" in str(e):
self._logger.debug(str(e))
else:
raise
async def init_session(self):
if not self.session:
self.session = aiohttp.ClientSession()
async def close_ws(self):
for ws in self._ws_tasks.values():
if ws:
......@@ -141,7 +171,6 @@ class NodeConnector(QObject):
else:
closed = True
await asyncio.sleep(0)
await self.session.close()
await asyncio.sleep(0)
def refresh(self, manual=False):
......@@ -149,11 +178,13 @@ class NodeConnector(QObject):
Refresh all data of this node
:param bool manual: True if the refresh was manually initiated
"""
if not self._ws_tasks['block']:
self._ws_tasks['block'] = asyncio.ensure_future(self.connect_current_block())
if not self._ws_tasks["block"]:
self._ws_tasks["block"] = asyncio.ensure_future(
self.connect_current_block()
)
if not self._ws_tasks['peer']:
self._ws_tasks['peer'] = asyncio.ensure_future(self.connect_peers())
if not self._ws_tasks["peer"]:
self._ws_tasks["peer"] = asyncio.ensure_future(self.connect_peers())
if manual:
asyncio.ensure_future(self.request_peers())
......@@ -164,135 +195,59 @@ class NodeConnector(QObject):
If the connection fails, it tries the fallback mode on HTTP GET
"""
for endpoint in [e for e in self.node.endpoints if isinstance(e, BMAEndpoint)]:
if not self._connected['block']:
if not self._connected["block"]:
async with aiohttp.ClientSession() as session:
try:
conn_handler = next(endpoint.conn_handler(self.session, proxy=self._user_parameters.proxy()))
ws_connection = bma.ws.block(conn_handler)
async with ws_connection as ws:
self._connected['block'] = True
client = Client(
endpoint, session, self._user_parameters.proxy()
)
# Create Web Socket connection on block path (async method)
ws = await client(bma.ws.block) # Type: WSConnection
self._connected["block"] = True
self._logger.debug("Connected successfully to block ws")
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
loop = True
# Iterate on each message received...
while loop:
# Wait and capture next message
try:
block_data = await ws.receive_json()
jsonschema.validate(block_data, bma.ws.WS_BLOCK_SCHEMA)
self._logger.debug("Received a block")
block_data = bma.parse_text(msg.data, bma.ws.WS_BLOCk_SCHEMA)
await self.refresh_block(block_data)
elif msg.type == aiohttp.WSMsgType.CLOSED:
break
elif msg.type == aiohttp.WSMsgType.ERROR:
self.block_found.emit(
BlockUID(block_data["number"], block_data["hash"])
)
except TypeError as exception:
self._logger.debug(exception)
self.handle_failure()
break
except (aiohttp.WSServerHandshakeError, ValueError) as e:
self._logger.debug("Websocket block {0} : {1}".format(type(e).__name__, str(e)))
await self.request_current_block()
self._logger.debug(
"Websocket block {0}: {1}".format(type(e).__name__, str(e))
)
self.handle_failure()
except (ClientError, gaierror, TimeoutError) as e:
self._logger.debug("{0} : {1}".format(str(e), self.node.pubkey[:5]))
self.change_state_and_emit(Node.OFFLINE)
self._logger.debug(
"{0}: {1}".format(str(e), self.node.pubkey[:5])
)
self.handle_failure()
except jsonschema.ValidationError as e:
self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
self.change_state_and_emit(Node.CORRUPTED)
except RuntimeError:
if self.session.closed:
pass
self._logger.debug(
"{:}:{:}".format(str(e.__class__.__name__), str(e))
)
self.handle_failure(weight=3)
except RuntimeError as e:
self._logger.error(str(e))
except AttributeError as e:
if "feed_appdata" in str(e) or "do_handshake" in str(e):
self._logger.debug(str(e))
else:
raise
finally:
self._connected['block'] = False
self._ws_tasks['block'] = None
async def request_current_block(self):
"""
Request a node on the HTTP GET interface
If an error occurs, the node is considered offline
"""
for endpoint in [e for e in self.node.endpoints if isinstance(e, BMAEndpoint)]:
try:
block_data = await self.safe_request(endpoint, bma.blockchain.current,
proxy=self._user_parameters.proxy())
if not block_data:
continue
await self.refresh_block(block_data)
return # Do not try any more endpoint
except errors.DuniterError as e:
if e.ucode == errors.BLOCK_NOT_FOUND:
self.node.previous_buid = BlockUID.empty()
self.change_state_and_emit(Node.ONLINE)
else:
self.change_state_and_emit(Node.CORRUPTED)
self._logger.debug("Error in block reply : {0}".format(str(e)))
else:
if self.session.closed:
pass
else:
self._logger.debug("Could not connect to any BMA endpoint")
self.change_state_and_emit(Node.OFFLINE)
async def refresh_block(self, block_data):
"""
Refresh the blocks of this node
:param dict block_data: The block data in json format
"""
if not self.node.current_buid or self.node.current_buid.sha_hash != block_data['hash']:
for endpoint in [e for e in self.node.endpoints if isinstance(e, BMAEndpoint)]:
conn_handler = next(endpoint.conn_handler(self.session,
proxy=self._user_parameters.proxy()))
self._logger.debug("Requesting {0}".format(conn_handler))
try:
previous_block = await self.safe_request(endpoint, bma.blockchain.block,
proxy=self._user_parameters.proxy(),
req_args={'number': self.node.current_buid.number})
if not previous_block:
continue
self.node.previous_buid = BlockUID(previous_block['number'], previous_block['hash'])
break # Do not try any more endpoint
except errors.DuniterError as e:
if e.ucode == errors.BLOCK_NOT_FOUND:
self.node.previous_buid = BlockUID.empty()
# we don't change state here
break
else:
self.change_state_and_emit(Node.CORRUPTED)
break
finally:
if self.node.current_buid != BlockUID(block_data['number'], block_data['hash']):
self.node.current_buid = BlockUID(block_data['number'], block_data['hash'])
self.node.current_ts = block_data['medianTime']
self._logger.debug("Changed block {0} -> {1}".format(self.node.current_buid.number,
block_data['number']))
self.changed.emit()
else:
if self.session.closed:
pass
else:
self._logger.debug("Could not connect to any BMA endpoint")
self.change_state_and_emit(Node.OFFLINE)
else:
self.change_state_and_emit(Node.ONLINE)
@asyncify
async def refresh_summary(self):
"""
Refresh the summary of this node
"""
for endpoint in [e for e in self.node.endpoints if isinstance(e, BMAEndpoint)]:
try:
summary_data = await self.safe_request(endpoint, bma.node.summary,
proxy=self._user_parameters.proxy())
if not summary_data:
continue
self.node.software = summary_data["duniter"]["software"]
self.node.version = summary_data["duniter"]["version"]
self.node.state = Node.ONLINE
self.identity_changed.emit()
return # Break endpoints loop
except errors.DuniterError as e:
self._logger.debug("Error in summary : {:}".format(str(e)))
self.change_state_and_emit(Node.OFFLINE)
else:
if self.session.closed:
pass
else:
self._logger.debug("Could not connect to any BMA endpoint")
self.change_state_and_emit(Node.OFFLINE)
self._connected["block"] = False
self._ws_tasks["block"] = None
async def connect_peers(self):
"""
......@@ -300,96 +255,133 @@ class NodeConnector(QObject):
If the connection fails, it tries the fallback mode on HTTP GET
"""
for endpoint in [e for e in self.node.endpoints if isinstance(e, BMAEndpoint)]:
if not self._connected['peer']:
if not self._connected["peer"]:
async with aiohttp.ClientSession() as session:
try:
conn_handler = next(endpoint.conn_handler(self.session,
proxy=self._user_parameters.proxy()))
ws_connection = bma.ws.peer(conn_handler)
async with ws_connection as ws:
self._connected['peer'] = True
client = Client(
endpoint, session, self._user_parameters.proxy()
)
# Create Web Socket connection on peer path (async method)
ws = await client(bma.ws.peer) # Type: WSConnection
self._connected["peer"] = True
self._logger.debug("Connected successfully to peer ws")
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
loop = True
# Iterate on each message received...
while loop:
try:
# Wait and capture next message
peer_data = await ws.receive_json()
jsonschema.validate(peer_data, bma.ws.WS_PEER_SCHEMA)
self._logger.debug("Received a peer")
peer_data = bma.parse_text(msg.data, bma.ws.WS_PEER_SCHEMA)
self.refresh_peer_data(peer_data)
elif msg.type == aiohttp.WSMsgType.CLOSED:
break
elif msg.type == aiohttp.WSMsgType.ERROR:
except TypeError as exception:
self._logger.debug(exception)
break
# Close session
await client.close()
except (aiohttp.WSServerHandshakeError, ValueError) as e:
self._logger.debug("Websocket peer {0} : {1}"
.format(type(e).__name__, str(e)))
self._logger.debug(
"Websocket peer {0}: {1}".format(type(e).__name__, str(e))
)
await self.request_peers()
except (ClientError, gaierror, TimeoutError) as e:
self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
self.change_state_and_emit(Node.OFFLINE)
self._logger.debug(
"{:}:{:}".format(str(e.__class__.__name__), str(e))
)
self.handle_failure()
except jsonschema.ValidationError as e:
self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
self.change_state_and_emit(Node.CORRUPTED)
except RuntimeError:
if self.session.closed:
pass
self._logger.debug(
"{:}:{:}".format(str(e.__class__.__name__), str(e))
)
self.handle_failure(weight=3)
except RuntimeError as e:
self._logger.error(str(e))
except AttributeError as e:
if "feed_appdata" in str(e) or "do_handshake" in str(e):
self._logger.debug(str(e))
else:
raise
finally:
self._connected['peer'] = False
self._ws_tasks['peer'] = None
self._connected["peer"] = False
self._ws_tasks["peer"] = None
async def request_peers(self):
"""
Refresh the list of peers knew by this node
"""
found_peer_data = False
for endpoint in [e for e in self.node.endpoints if isinstance(e, BMAEndpoint)]:
try:
peers_data = await self.safe_request(endpoint, bma.network.peers,
req_args={'leaves': 'true'},
proxy=self._user_parameters.proxy())
peers_data = await self.safe_request(
endpoint,
bma.network.peers,
req_args={"leaves": "true"},
proxy=self._user_parameters.proxy(),
)
if not peers_data:
continue
self.node.state = Node.ONLINE
if peers_data['root'] != self.node.merkle_peers_root:
leaves = [leaf for leaf in peers_data['leaves']
if leaf not in self.node.merkle_peers_leaves]
if peers_data["root"] != self.node.merkle_peers_root:
leaves = [
leaf
for leaf in peers_data["leaves"]
if leaf not in self.node.merkle_peers_leaves
]
for leaf_hash in leaves:
try:
leaf_data = await self.safe_request(endpoint,
leaf_data = await self.safe_request(
endpoint,
bma.network.peers,
proxy=self._user_parameters.proxy(),
req_args={'leaf': leaf_hash})
req_args={"leaf": leaf_hash},
)
if not leaf_data:
break
self.refresh_peer_data(leaf_data['leaf']['value'])
self.refresh_peer_data(leaf_data["leaf"]["value"])
found_peer_data = True
except (AttributeError, ValueError) as e:
self._logger.debug("Incorrect peer data in {leaf} : {err}".format(leaf=leaf_hash, err=str(e)))
self.change_state_and_emit(Node.OFFLINE)
if "feed_appdata" in str(e) or "do_handshake" in str(e):
self._logger.debug(str(e))
else:
self._logger.debug(
"Incorrect peer data in {leaf}: {err}".format(
leaf=leaf_hash, err=str(e)
)
)
self.handle_failure()
except errors.DuniterError as e:
if e.ucode == 2012:
# Since with multinodes, peers or not the same on all nodes, sometimes this request results
# in peer not found error
self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
self._logger.debug(
"{:}:{:}".format(str(e.__class__.__name__), str(e))
)
else:
self.change_state_and_emit(Node.OFFLINE)
self._logger.debug("Incorrect peer data in {leaf} : {err}".format(leaf=leaf_hash, err=str(e)))
self.handle_failure()
self._logger.debug(
"Incorrect peer data in {leaf}: {err}".format(
leaf=leaf_hash, err=str(e)
)
)
else:
self.node.merkle_peers_root = peers_data['root']
self.node.merkle_peers_leaves = tuple(peers_data['leaves'])
self.node.merkle_peers_root = peers_data["root"]
self.node.merkle_peers_leaves = tuple(peers_data["leaves"])
return # Break endpoints loop
except errors.DuniterError as e:
self._logger.debug("Error in peers reply: {0}".format(str(e)))
self.change_state_and_emit(Node.OFFLINE)
else:
if self.session.closed:
pass
self.handle_failure()
else:
if not found_peer_data:
self._logger.debug("Could not connect to any BMA endpoint")
self.change_state_and_emit(Node.OFFLINE)
self.handle_failure()
def refresh_peer_data(self, peer_data):
if "raw" in peer_data:
try:
str_doc = "{0}{1}\n".format(peer_data['raw'],
peer_data['signature'])
str_doc = "{0}{1}\n".format(peer_data["raw"], peer_data["signature"])
peer_doc = Peer.from_signed_raw(str_doc)
self.neighbour_found.emit(peer_doc)
except MalformedDocumentError as e:
......@@ -397,9 +389,65 @@ class NodeConnector(QObject):
else:
self._logger.debug("Incorrect leaf reply")
def change_state_and_emit(self, new_state):
if self.node.state != new_state:
self._logger.debug("Changing state {0} > {1}".format(self.node.state, new_state))
self.node.last_state_change = time.time()
self.node.state = new_state
self.changed.emit()
async def request_ws2p_heads(self):
"""
Refresh the list of peers knew by this node
"""
for endpoint in [e for e in self.node.endpoints if isinstance(e, BMAEndpoint)]:
try:
heads_data = await self.safe_request(
endpoint,
bma.network.ws2p_heads,
proxy=self._user_parameters.proxy(),
)
if not heads_data:
continue
self.handle_success()
self._logger.debug(
"Connection to BMA succeeded (%s,%s,%s)",
endpoint.server,
endpoint.port,
endpoint.API,
)
return heads_data # Break endpoints loop
except errors.DuniterError as e:
self._logger.debug("Error in peers reply: {0}".format(str(e)))
self.handle_failure()
else:
self._logger.debug("Could not connect to any BMA endpoint")
self.handle_failure()
def handle_success(self):
self.success.emit()
def handle_failure(self, weight=1):
self.failure.emit(weight)
def get_bma_endpoint_from_server_address(
address: str, port: int, secured: bool
) -> Union[BMAEndpoint, SecuredBMAEndpoint]:
"""
Return a BMA Endpoint from server address parameters
:param address: Domain Name or IPV4 ou IPV6
:param port: Port number
:param secured: True if SSL secured
:return:
"""
server = ""
ipv4 = ""
ipv6 = ""
if re.compile(HOST_REGEX).match(address):
server = address
elif re.compile(IPV4_REGEX).match(address):
ipv4 = address
elif re.compile(IPV6_REGEX).match(address):
ipv6 = address
if secured:
endpoint = SecuredBMAEndpoint(server, ipv4, ipv6, port, "")
else:
endpoint = BMAEndpoint(server, ipv4, ipv6, port)
return endpoint