diff --git a/src/sakia/gui/community_view.py b/src/sakia/gui/community_view.py index 6d6ad9166acac18d27ae293ccec4751720180b97..cd82efb6b8c5a346a799fef018d911c22e4465d6 100644 --- a/src/sakia/gui/community_view.py +++ b/src/sakia/gui/community_view.py @@ -9,7 +9,7 @@ import asyncio import time from PyQt5.QtWidgets import QWidget, QMessageBox, QDialog, QPushButton, QTabBar, QAction -from PyQt5.QtCore import pyqtSlot, QDateTime, QLocale, QEvent +from PyQt5.QtCore import pyqtSlot, QDateTime, QLocale, QEvent, QT_TRANSLATE_NOOP from PyQt5.QtGui import QIcon @@ -31,6 +31,16 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): classdocs """ + _tab_history_label = QT_TRANSLATE_NOOP("CommunityWidget", "Transactions") + _tab_wot_label = QT_TRANSLATE_NOOP("CommunityWidget", "Web of Trust") + _tab_identities_label = QT_TRANSLATE_NOOP("CommuityWidget", "Search Identities") + _tab_network_label = QT_TRANSLATE_NOOP("CommunityWidget", "Network") + _tab_informations_label = QT_TRANSLATE_NOOP("CommunityWidget", "Informations") + _action_showinfo_text = QT_TRANSLATE_NOOP("CommunityWidget", "Show informations") + _action_publish_uid_text = QT_TRANSLATE_NOOP("CommunityWidget", "Publish UID") + _action_revoke_uid_text = QT_TRANSLATE_NOOP("CommunityWidget", "Revoke UID") + + def __init__(self, app, status_label): """ Constructor @@ -44,17 +54,18 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): self.status_info = [] - super().setupUi(self) - self.tab_wot = WotTabWidget(self.app) - self.tab_identities = IdentitiesTabWidget(self.app) - self.tab_history = TransactionsTabWidget(self.app) - self.tab_informations = InformationsTabWidget(self.app) - self.tab_network = NetworkTabWidget(self.app) + + self.action_publish_uid = QAction(self.tr(CommunityWidget._action_publish_uid_text), self) + self.action_revoke_uid = QAction(self.tr(CommunityWidget._action_revoke_uid_text), self) + self.action_showinfo = QAction(self.tr(CommunityWidget._action_showinfo_text), self) + + super().setupUi(self) + self.tab_identities.view_in_wot.connect(self.tab_wot.draw_graph) self.tab_identities.view_in_wot.connect(lambda: self.tabs.setCurrentWidget(self.tab_wot)) self.tab_history.view_in_wot.connect(self.tab_wot.draw_graph) @@ -64,27 +75,25 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): self.tabs.addTab(self.tab_history, QIcon(':/icons/tx_icon'), - self.tr("Transactions")) + self.tr(CommunityWidget._tab_history_label)) self.tabs.addTab(self.tab_wot, QIcon(':/icons/wot_icon'), - self.tr("Web of Trust")) + self.tr(CommunityWidget._tab_wot_label)) self.tabs.addTab(self.tab_identities, QIcon(':/icons/members_icon'), - self.tr("Search Identities")) + self.tr(CommunityWidget._tab_identities_label)) self.tabs.addTab(self.tab_network, QIcon(":/icons/network_icon"), - self.tr("Network")) - - action_showinfo = QAction(self.tr("Show informations"), self.toolbutton_menu) + self.tr(CommunityWidget._tab_network_label)) def show_info(): if self.tabs.indexOf(self.tab_informations) == -1: self.tabs.addTab(self.tab_informations, QIcon(":/icons/informations_icon"), - self.tr("Informations")) + self.tr(CommunityWidget._tab_informations_label)) style = self.app.qapp.style() icon = style.standardIcon(style.SP_DockWidgetCloseButton) close_button = QPushButton(icon, '') @@ -92,14 +101,12 @@ class CommunityWidget(QWidget, Ui_CommunityWidget): close_button.setStyleSheet('border-style: inset;') self.tabs.tabBar().setTabButton(4, QTabBar.RightSide, close_button) - action_showinfo.triggered.connect(show_info) - self.toolbutton_menu.addAction(action_showinfo) + self.action_showinfo.triggered.connect(show_info) + self.toolbutton_menu.addAction(self.action_showinfo) - self.action_publish_uid = QAction(self.tr("Publish UID"), self.toolbutton_menu) self.action_publish_uid.triggered.connect(self.publish_uid) self.toolbutton_menu.addAction(self.action_publish_uid) - self.action_revoke_uid = QAction(self.tr("Revoke UID"), self.toolbutton_menu) self.action_revoke_uid.triggered.connect(self.revoke_uid) self.toolbutton_menu.addAction(self.action_revoke_uid) @@ -393,6 +400,22 @@ The process to join back the community later will have to be done again.""") yield from QAsyncMessageBox.critical(self, self.tr("UID"), result[1]) + def retranslateUi(self, widget): + """ + Method to complete translations missing from generated code + :param widget: + :return: + """ + self.tabs.setTabText(self.tabs.indexOf(self.tab_wot), self.tr(CommunityWidget._tab_wot_label)) + self.tabs.setTabText(self.tabs.indexOf(self.tab_network), self.tr(CommunityWidget._tab_network_label)) + self.tabs.setTabText(self.tabs.indexOf(self.tab_informations), self.tr(CommunityWidget._tab_informations_label)) + self.tabs.setTabText(self.tabs.indexOf(self.tab_history), self.tr(CommunityWidget._tab_history_label)) + self.tabs.setTabText(self.tabs.indexOf(self.tab_identities), self.tr(CommunityWidget._tab_identities_label)) + self.action_publish_uid.setText(self.tr(CommunityWidget._action_publish_uid_text)) + self.action_revoke_uid.setText(self.tr(CommunityWidget._action_revoke_uid_text)) + self.action_showinfo.setText(self.tr(CommunityWidget._action_showinfo_text)) + super().retranslateUi(self) + def showEvent(self, QShowEvent): """ @@ -400,6 +423,7 @@ The process to join back the community later will have to be done again.""") :return: """ self.refresh_status() + super().showEvent(QShowEvent) def changeEvent(self, event): """ diff --git a/src/sakia/gui/identities_tab.py b/src/sakia/gui/identities_tab.py index 11a2b2967cc01a2eaae0de69c5f0ce720f82d2b0..9dd2ef5d965f0ffe9d7f7a663b3062ed3b44ac67 100644 --- a/src/sakia/gui/identities_tab.py +++ b/src/sakia/gui/identities_tab.py @@ -7,7 +7,7 @@ Created on 2 févr. 2014 import asyncio import logging -from PyQt5.QtCore import Qt, pyqtSignal, QEvent +from PyQt5.QtCore import Qt, pyqtSignal, QEvent, QT_TRANSLATE_NOOP from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import QWidget, QAction, QMenu, QDialog, \ QAbstractItemView @@ -33,6 +33,9 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): view_in_wot = pyqtSignal(Identity) money_sent = pyqtSignal() + _members_action_text = QT_TRANSLATE_NOOP("IdentitiesTabWidget", "Members") + _direct_connections_text = QT_TRANSLATE_NOOP("IdentitiesTabWidget", "Direct connections") + def __init__(self, app): """ Init @@ -47,9 +50,11 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): self.account = None self.password_asker = None + self.members_action = QAction(self.tr(IdentitiesTabWidget._members_action_text), self) + self.direct_connections = QAction(self.tr(IdentitiesTabWidget._direct_connections_text), self) self.setupUi(self) - identities_model = IdentitiesTableModel(self.community) + identities_model = IdentitiesTableModel() proxy = IdentitiesFilterProxyModel() proxy.setSourceModel(identities_model) self.table_identities.setModel(proxy) @@ -60,12 +65,10 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): identities_model.modelAboutToBeReset.connect(lambda: self.table_identities.setEnabled(False)) identities_model.modelReset.connect(lambda: self.table_identities.setEnabled(True)) - members_action = QAction(self.tr("Members"), self) - members_action.triggered.connect(self._async_search_members) - self.button_search.addAction(members_action) - direct_connections = QAction(self.tr("Direct connections"), self) - direct_connections.triggered.connect(self._async_search_direct_connections) - self.button_search.addAction(direct_connections) + self.members_action.triggered.connect(self._async_search_members) + self.button_search.addAction(self.members_action) + self.direct_connections.triggered.connect(self._async_search_direct_connections) + self.button_search.addAction(self.direct_connections) self.button_search.clicked.connect(self._async_execute_search_text) self.busy = Busy(self.table_identities) @@ -286,6 +289,10 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab): yield from self.table_identities.model().sourceModel().refresh_identities(identities) self.table_identities.resizeColumnsToContents() + def retranslateUi(self, widget): + self.members_action.setText(self.tr(IdentitiesTabWidget._members_action_text)) + self.direct_connections.setText(self.tr(IdentitiesTabWidget._direct_connections_text)) + def resizeEvent(self, event): self.busy.resize(event.size()) super().resizeEvent(event) diff --git a/src/sakia/gui/network_tab.py b/src/sakia/gui/network_tab.py index 417c1e06ef0c4037e1eeadcc6158bdb9ce973890..a7e020dd033fd0f8404ff23155a45c4ed3a6f735 100644 --- a/src/sakia/gui/network_tab.py +++ b/src/sakia/gui/network_tab.py @@ -34,7 +34,7 @@ class NetworkTabWidget(QWidget, Ui_NetworkTabWidget): self.setupUi(self) model = NetworkTableModel(self.community) - proxy = NetworkFilterProxyModel(self) + proxy = NetworkFilterProxyModel() proxy.setSourceModel(model) self.table_network.setModel(proxy) self.table_network.sortByColumn(2, Qt.DescendingOrder) diff --git a/src/sakia/gui/wot_tab.py b/src/sakia/gui/wot_tab.py index ef7e3528c4f5b9174cf4acfea0c98ef8bebae99b..e51c902d444f9afc77e4eeae7ff6b3a4f4f1b934 100644 --- a/src/sakia/gui/wot_tab.py +++ b/src/sakia/gui/wot_tab.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- - import logging import asyncio from PyQt5.QtWidgets import QWidget, QComboBox, QDialog -from PyQt5.QtCore import pyqtSlot, QEvent, QLocale, QDateTime, pyqtSignal +from PyQt5.QtCore import pyqtSlot, QEvent, QLocale, QDateTime, pyqtSignal, QT_TRANSLATE_NOOP from ucoinpy.api import bma from ..tools.exceptions import MembershipNotFoundError @@ -24,6 +22,7 @@ from ..tools.exceptions import NoPeerAvailable class WotTabWidget(QWidget, Ui_WotTabWidget): money_sent = pyqtSignal() + _search_placeholder = QT_TRANSLATE_NOOP("WotTabWidget", "Research a pubkey, an uid...") def __init__(self, app): """ @@ -34,7 +33,7 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): self.setupUi(self) # Default text when combo lineEdit is empty - self.comboBoxSearch.lineEdit().setPlaceholderText(self.tr('Research a pubkey, an uid...')) + self.comboBoxSearch.lineEdit().setPlaceholderText(self.tr(WotTabWidget._search_placeholder)) #  add combobox events self.comboBoxSearch.lineEdit().returnPressed.connect(self.search) # To fix a recall of the same item with different case, @@ -360,6 +359,13 @@ class WotTabWidget(QWidget, Ui_WotTabWidget): if result == QDialog.Accepted: self.window().refresh_contacts() + def retranslateUi(self, widget): + """ + Retranslate missing widgets from generated code + """ + self.comboBoxSearch.lineEdit().setPlaceholderText(self.tr(WotTabWidget._search_placeholder)) + super().retranslateUi(self) + def resizeEvent(self, event): self.busy.resize(event.size()) super().resizeEvent(event) diff --git a/src/sakia/models/identities.py b/src/sakia/models/identities.py index cfabfbb4b734667d9b00dbb8c10f040f3929bcdd..6cc3b60efb524ca6400f8a32482ece94ebfa55dd 100644 --- a/src/sakia/models/identities.py +++ b/src/sakia/models/identities.py @@ -4,11 +4,9 @@ Created on 5 févr. 2014 @author: inso """ -from ..core.net.api import bma as bma from ..tools.exceptions import NoPeerAvailable, MembershipNotFoundError -from ..tools.decorators import asyncify, once_at_a_time, cancel_once_task from PyQt5.QtCore import QAbstractTableModel, QSortFilterProxyModel, Qt, \ - QDateTime, QModelIndex, QLocale + QDateTime, QModelIndex, QLocale, QEvent from PyQt5.QtGui import QColor import logging import asyncio @@ -87,12 +85,12 @@ class IdentitiesTableModel(QAbstractTableModel): """ super().__init__(parent) self.community = None - self.columns_titles = {'uid': self.tr('UID'), - 'pubkey': self.tr('Pubkey'), - 'renewed': self.tr('Renewed'), - 'expiration': self.tr('Expiration'), - 'publication': self.tr('Publication'), - 'validation': self.tr('Validation'),} + self.columns_titles = {'uid': lambda: self.tr('UID'), + 'pubkey': lambda: self.tr('Pubkey'), + 'renewed': lambda: self.tr('Renewed'), + 'expiration': lambda: self.tr('Expiration'), + 'publication': lambda: self.tr('Publication'), + 'validation': lambda: self.tr('Validation'),} self.columns_ids = ('uid', 'pubkey', 'renewed', 'expiration', 'publication') self.identities_data = [] self._sig_validity = 0 @@ -165,7 +163,7 @@ class IdentitiesTableModel(QAbstractTableModel): def headerData(self, section, orientation, role): if role == Qt.DisplayRole: col_id = self.columns_ids[section] - return self.columns_titles[col_id] + return self.columns_titles[col_id]() def data(self, index, role): if role == Qt.DisplayRole: diff --git a/src/sakia/models/network.py b/src/sakia/models/network.py index 20a6e7872ee1e67dfec620063209c88333569b84..b2a39de1a640c33e697c3d0156881ead5c9a9db2 100644 --- a/src/sakia/models/network.py +++ b/src/sakia/models/network.py @@ -132,10 +132,10 @@ class NetworkTableModel(QAbstractTableModel): Node.CORRUPTED: QColor(Qt.lightGray) } self.node_states = { - Node.ONLINE: self.tr('Online'), - Node.OFFLINE: self.tr('Offline'), - Node.DESYNCED: self.tr('Unsynchronized'), - Node.CORRUPTED: self.tr('Corrupted') + Node.ONLINE: lambda: self.tr('Online'), + Node.OFFLINE: lambda: self.tr('Offline'), + Node.DESYNCED: lambda: self.tr('Unsynchronized'), + Node.CORRUPTED: lambda: self.tr('Corrupted') } self.nodes_data = [] @@ -214,7 +214,7 @@ class NetworkTableModel(QAbstractTableModel): if role == Qt.BackgroundColorRole: return self.node_colors[node[self.columns_types.index('state')]] if role == Qt.ToolTipRole: - return self.node_states[node[self.columns_types.index('state')]] + return self.node_states[node[self.columns_types.index('state')]]() return QVariant() diff --git a/src/sakia/models/txhistory.py b/src/sakia/models/txhistory.py index de5d3adc44113296f1768ab9bfbfe45eb8da3b6e..7285a72ae91d775c417202983724c75d7919c92a 100644 --- a/src/sakia/models/txhistory.py +++ b/src/sakia/models/txhistory.py @@ -204,15 +204,15 @@ class HistoryTableModel(QAbstractTableModel): ) self.column_headers = ( - self.tr('Date'), - self.tr('UID/Public key'), - self.tr('Payment'), - self.tr('Deposit'), - self.tr('Comment'), - 'State', - 'TXID', - 'Pubkey', - 'Block Number' + lambda: self.tr('Date'), + lambda: self.tr('UID/Public key'), + lambda: self.tr('Payment'), + lambda: self.tr('Deposit'), + lambda: self.tr('Comment'), + lambda: 'State', + lambda: 'TXID', + lambda: 'Pubkey', + lambda: 'Block Number' ) def change_account(self, account): @@ -337,11 +337,11 @@ class HistoryTableModel(QAbstractTableModel): if role == Qt.DisplayRole: if self.columns_types[section] == 'payment' or self.columns_types[section] == 'deposit': return '{:}\n({:})'.format( - self.column_headers[section], + self.column_headers[section](), self.account.current_ref.diff_units(self.community.short_currency) ) - return self.column_headers[section] + return self.column_headers[section]() def data(self, index, role): row = index.row()