diff --git a/README.md b/README.md index e050db9a..491d8d34 100644 --- a/README.md +++ b/README.md @@ -16,5 +16,5 @@ Type in the terminal: sudo python3 sandbox_installer.py. If you want to uninstal ### Roadmap - Test installer for Ubuntu -- Locales +- Show update commands - Search and install applications. \ No newline at end of file diff --git a/app.py b/app.py index e1d42cab..764ce9fe 100755 --- a/app.py +++ b/app.py @@ -8,18 +8,24 @@ from PyQt5.QtWidgets import QApplication, QWidget from core.controller import FlatpakController from core.model import FlatpakManager from view.qt.systray import TrayIcon -from core import __version__ +from core import __version__, resource, util parser = argparse.ArgumentParser(prog='fpakman', description="GUI for Flatpak applications management") parser.add_argument('-v', '--version', action='version', version='%(prog)s {}'.format(__version__)) args = parser.parse_args() +locale_keys = util.get_locale_keys() + app = QApplication(sys.argv) manager = FlatpakManager() manager.load_database_async() controller = FlatpakController(manager) hidden_widget = QWidget() -trayIcon = TrayIcon(parent=hidden_widget, controller=controller, check_interval=int(os.getenv('FPAKMAN_CHECK_INTERVAL', 30))) + +trayIcon = TrayIcon(locale_keys=locale_keys, + parent=hidden_widget, + controller=controller, + check_interval=int(os.getenv('FPAKMAN_CHECK_INTERVAL', 30))) trayIcon.show() sys.exit(app.exec_()) diff --git a/core/resource.py b/core/resource.py index b8927afb..0918e299 100755 --- a/core/resource.py +++ b/core/resource.py @@ -2,5 +2,9 @@ import os def get_path(resource_path): - cur_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - return cur_dir + '/resources/' + resource_path + app_dir = get_app_dir() + return app_dir + '/resources/' + resource_path + + +def get_app_dir(): + return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) diff --git a/core/util.py b/core/util.py new file mode 100644 index 00000000..a12a9b41 --- /dev/null +++ b/core/util.py @@ -0,0 +1,35 @@ +import locale + +from core import resource +import glob + + +def get_locale_keys(): + + current_locale = locale.getdefaultlocale() + locale_path = None + if current_locale: + current_locale = current_locale[0] + + locale_dir = '{}/resources/locale'.format(resource.get_app_dir()) + + for locale_file in glob.glob(locale_dir + '/*'): + name = locale_file.split('/')[-1] + + if current_locale == name or current_locale.startswith(name + '_'): + locale_path = locale_file + break + + if not locale_path: + locale_path = '{}/resources/locale/en'.format(resource.get_app_dir()) + + with open(locale_path, 'r') as f: + locale_keys = f.readlines() + + locale_obj = {} + for line in locale_keys: + if line: + keyval = line.strip().split('=') + locale_obj[keyval[0].strip()] = keyval[1].strip() + + return locale_obj diff --git a/resources/locale/en b/resources/locale/en new file mode 100644 index 00000000..6a3a38ff --- /dev/null +++ b/resources/locale/en @@ -0,0 +1,17 @@ +manage_window.columns.name=Name +manage_window.columns.version=Version +manage_window.columns.latest_version=Latest Version +manage_window.columns.branch=Branch +manage_window.columns.arch=Arch +manage_window.columns.ref=Ref +manage_window.columns.origin=Origin +manage_window.columns.update=Update ? +manage_window.checkbox.only_apps=Apps +manage_window.label.updates=Updates +manage_window.status.refreshing=Refreshing +manage_window.status.updating=Updating +popup.flatpak_not_installed.title=Error +popup.flatpak_not_installed.msg=flatpak seems not to be installed. Exiting +tray.action.manage=Manage applications +tray.action.exit=Exit +notification.new_updates=Updates found \ No newline at end of file diff --git a/resources/locale/es b/resources/locale/es new file mode 100644 index 00000000..801c5b26 --- /dev/null +++ b/resources/locale/es @@ -0,0 +1,17 @@ +manage_window.columns.name=Nombre +manage_window.columns.version=Versión +manage_window.columns.latest_version=Ultima Versión +manage_window.columns.branch=Branch +manage_window.columns.arch=Arch +manage_window.columns.ref=Ref +manage_window.columns.origin=Origen +manage_window.columns.update=¿Actualizar? +manage_window.checkbox.only_apps=Apps +manage_window.label.updates=Actualizaciones +manage_window.status.refreshing=Recargando +manage_window.status.updating=Actualizando +popup.flatpak_not_installed.title=Error +popup.flatpak_not_installed.msg=flatpak no parece estar instalado. Saliendo +tray.action.manage=Administrar aplicativos +tray.action.exit=Salir +notification.new_updates=Actualizaciones encontradas \ No newline at end of file diff --git a/resources/locale/pt b/resources/locale/pt new file mode 100644 index 00000000..5b817152 --- /dev/null +++ b/resources/locale/pt @@ -0,0 +1,17 @@ +manage_window.columns.name=Nome +manage_window.columns.version=Versão +manage_window.columns.latest_version=Última Versão +manage_window.columns.branch=Branch +manage_window.columns.arch=Arch +manage_window.columns.ref=Ref +manage_window.columns.origin=Origem +manage_window.columns.update=Atualizar ? +manage_window.checkbox.only_apps=Apps +manage_window.label.updates=Actualizaciones +manage_window.status.refreshing=Recarregando +manage_window.status.updating=Atualizando +popup.flatpak_not_installed.title=Erro +popup.flatpak_not_installed.msg=flatpak não parece estar instalado. Saindo +tray.action.manage=Gerenciar aplicativos +tray.action.exit=Sair +notification.new_updates=Atualizações encontradas \ No newline at end of file diff --git a/view/qt/systray.py b/view/qt/systray.py index 76ebf5e0..f822ccbf 100755 --- a/view/qt/systray.py +++ b/view/qt/systray.py @@ -36,7 +36,8 @@ class UpdateCheck(QThread): class TrayIcon(QSystemTrayIcon): - def __init__(self, controller: FlatpakController, check_interval: int = 60, parent=None): + def __init__(self, locale_keys: dict, controller: FlatpakController, check_interval: int = 60, parent=None): + self.locale_keys = locale_keys self.controller = controller self.icon_default = QIcon(resource.get_path('img/flathub_45.svg')) @@ -44,13 +45,13 @@ class TrayIcon(QSystemTrayIcon): QSystemTrayIcon.__init__(self, self.icon_default, parent) self.menu = QMenu(parent) - self.action_manage = self.menu.addAction("Manage applications") + self.action_manage = self.menu.addAction(self.locale_keys['tray.action.manage']) self.action_manage.triggered.connect(self.show_manage_window) - self.action_exit = self.menu.addAction("Exit") + self.action_exit = self.menu.addAction(self.locale_keys['tray.action.exit']) self.action_exit.triggered.connect(lambda: QCoreApplication.exit()) self.setContextMenu(self.menu) - self.manage_window = ManageWindow(controller=controller, tray_icon=self) + self.manage_window = ManageWindow(locale_keys=self.locale_keys, controller=controller, tray_icon=self) self.check_thread = UpdateCheck(check_interval=check_interval, controller=self.controller) self.check_thread.signal.connect(self.notify_updates) self.check_thread.start() @@ -60,7 +61,7 @@ class TrayIcon(QSystemTrayIcon): if self.icon().cacheKey() != self.icon_update.cacheKey(): self.setIcon(self.icon_update) - msg = 'Updates found: {}'.format(updates) + msg = '{}: {}'.format(self.locale_keys['notification.new_updates'], updates) self.setToolTip(msg) if bool(os.getenv('FPAKMAN_UPDATE_NOTIFICATION', 1)): diff --git a/view/qt/window.py b/view/qt/window.py index 5f862cf7..ae75deb3 100755 --- a/view/qt/window.py +++ b/view/qt/window.py @@ -38,11 +38,19 @@ class UpdateToggleButton(QToolButton): class ManageWindow(QWidget): - __COLUMNS__ = ['Name', 'Version', 'Latest Version', 'Branch', 'Arch', 'Ref', 'Origin', 'Update ?'] __BASE_HEIGHT__ = 400 - def __init__(self, controller: FlatpakController, tray_icon = None): + def __init__(self, locale_keys: dict, controller: FlatpakController, tray_icon = None): super(ManageWindow, self).__init__() + self.locale_keys = locale_keys + self.column_names = [locale_keys['manage_window.columns.name'], + locale_keys['manage_window.columns.version'], + locale_keys['manage_window.columns.latest_version'], + locale_keys['manage_window.columns.branch'], + locale_keys['manage_window.columns.arch'], + locale_keys['manage_window.columns.ref'], + locale_keys['manage_window.columns.origin'], + locale_keys['manage_window.columns.update']] self.controller = controller self.icon_cache = {} self.tray_icon = tray_icon @@ -64,7 +72,7 @@ class ManageWindow(QWidget): self.setLayout(self.layout) self.checkbox_only_apps = QCheckBox() - self.checkbox_only_apps.setText('Only apps') + self.checkbox_only_apps.setText(self.locale_keys['manage_window.checkbox.only_apps']) self.checkbox_only_apps.setChecked(True) self.checkbox_only_apps.stateChanged.connect(self.filter_only_apps) @@ -97,12 +105,12 @@ class ManageWindow(QWidget): self.layout.addWidget(toolbar) self.table_apps = QTableWidget() - self.table_apps.setColumnCount(len(ManageWindow.__COLUMNS__)) + self.table_apps.setColumnCount(len(self.column_names)) self.table_apps.setFocusPolicy(Qt.NoFocus) self.table_apps.setShowGrid(False) self.table_apps.verticalHeader().setVisible(False) self.table_apps.setSelectionBehavior(QTableView.SelectRows) - self.table_apps.setHorizontalHeaderLabels(ManageWindow.__COLUMNS__) + self.table_apps.setHorizontalHeaderLabels(self.column_names) self.table_apps.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self._change_table_headers_policy() @@ -130,7 +138,7 @@ class ManageWindow(QWidget): def _change_table_headers_policy(self, policy: QHeaderView = QHeaderView.ResizeToContents): header_horizontal = self.table_apps.horizontalHeader() - for i in range(0, len(ManageWindow.__COLUMNS__)): + for i in range(0, len(self.column_names)): header_horizontal.setSectionResizeMode(i, policy) def changeEvent(self, e: QEvent): @@ -162,8 +170,8 @@ class ManageWindow(QWidget): if not self.controller.check_installed(): error_msg = QMessageBox() error_msg.setIcon(QMessageBox.Critical) - error_msg.setText('flatpak seems not to be installed. Exiting...') - error_msg.setWindowTitle('Error') + error_msg.setWindowTitle(self.locale_keys['popup.flatpak_not_installed.title']) + error_msg.setText(self.locale_keys['popup.flatpak_not_installed.msg'] + '...') error_msg.setWindowIcon(self.icon_flathub) error_msg.exec_() exit(1) @@ -197,7 +205,7 @@ class ManageWindow(QWidget): if self._acquire_lock(): self._check_flatpak_installed() - self._begin_action('Refreshing...') + self._begin_action(self.locale_keys['manage_window.status.refreshing'] + '...') self.thread_refresh.start() def _finish_refresh(self): @@ -225,7 +233,7 @@ class ManageWindow(QWidget): updates = len([app for app in self.apps if app['model']['update']]) if updates > 0: - self.label_updates.setText('Updates: {}'.format(updates)) + self.label_updates.setText('{}: {}'.format(self.locale_keys['manage_window.label.updates'], updates)) else: self.label_updates.setText('') @@ -318,7 +326,7 @@ class ManageWindow(QWidget): self.resize_and_center() def resize_and_center(self): - new_width = reduce(operator.add, [self.table_apps.columnWidth(i) for i in range(len(ManageWindow.__COLUMNS__))]) * 1.05 + new_width = reduce(operator.add, [self.table_apps.columnWidth(i) for i in range(len(self.column_names))]) * 1.05 self.resize(new_width, self.height()) self.centralize() @@ -329,7 +337,7 @@ class ManageWindow(QWidget): to_update = [pak['model']['ref'] for pak in self.apps if pak['visible'] and pak['update_checked']] if to_update: - self._begin_action('Updating...') + self._begin_action(self.locale_keys['manage_window.status.updating'] + '...') self.thread_update.refs_to_update = to_update self.thread_update.start()