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