diff --git a/qubesmanager.pro b/qubesmanager.pro index f186c52..ce1577d 100644 --- a/qubesmanager.pro +++ b/qubesmanager.pro @@ -1,44 +1,56 @@ SOURCES = \ ui/about.ui \ ui/backupdlg.ui \ + ui/bootfromdevice.ui \ + ui/devicelist.ui \ ui/globalsettingsdlg.ui \ + ui/informationnotes.ui \ ui/logdlg.ui \ - ui/mainwindow.ui \ ui/multiselectwidget.ui \ ui/newappvmdlg.ui \ ui/newfwruledlg.ui \ + ui/qubemanager.ui \ ui/releasenotes.ui \ ui/restoredlg.ui \ ui/settingsdlg.ui \ + ui/templatemanager.ui \ qubesmanager/about.py \ qubesmanager/appmenu_select.py \ qubesmanager/backup.py \ qubesmanager/backup_utils.py \ - qubesmanager/block.py \ + qubesmanager/bootfromdevice.py \ qubesmanager/clipboard.py \ - qubesmanager/create_new_vm.py \ qubesmanager/common_threads.py \ + qubesmanager/create_new_vm.py \ + qubesmanager/device_list.py \ qubesmanager/firewall.py \ qubesmanager/global_settings.py \ + qubesmanager/informationnotes.py \ qubesmanager/log_dialog.py \ - qubesmanager/main.py \ qubesmanager/multiselectwidget.py \ + qubesmanager/qube_manager.py \ qubesmanager/releasenotes.py \ qubesmanager/resources_rc.py \ qubesmanager/restore.py \ qubesmanager/settings.py \ qubesmanager/table_widgets.py \ + qubesmanager/template_manager.py \ qubesmanager/ui_about.py \ qubesmanager/ui_backupdlg.py \ + qubesmanager/ui_bootfromdevice.py \ + qubesmanager/ui_devicelist.py \ qubesmanager/ui_globalsettingsdlg.py \ + qubesmanager/ui_informationnotes.py \ qubesmanager/ui_logdlg.py \ - qubesmanager/ui_mainwindow.py \ qubesmanager/ui_multiselectwidget.py \ qubesmanager/ui_newappvmdlg.py \ qubesmanager/ui_newfwruledlg.py \ + qubesmanager/ui_qubemanager.py \ qubesmanager/ui_releasenotes.py \ qubesmanager/ui_restoredlg.py \ - qubesmanager/ui_settingsdlg.py + qubesmanager/ui_settingsdlg.py \ + qubesmanager/ui_templatemanager.py \ + qubesmanager/utils.py TRANSLATIONS = \ qubesmanager/i18n/qubesmanager_en.ts \ diff --git a/qubesmanager/appmenu_select.py b/qubesmanager/appmenu_select.py index 67b55e0..d2b1420 100755 --- a/qubesmanager/appmenu_select.py +++ b/qubesmanager/appmenu_select.py @@ -20,13 +20,12 @@ # import subprocess -import PyQt5.QtWidgets # pylint: disable=import-error - +from PyQt5 import QtWidgets, QtCore # pylint: disable=import-error # TODO description in tooltip # TODO icon # pylint: disable=too-few-public-methods -class AppListWidgetItem(PyQt5.QtWidgets.QListWidgetItem): +class AppListWidgetItem(QtWidgets.QListWidgetItem): def __init__(self, name, ident, tooltip=None, parent=None): super(AppListWidgetItem, self).__init__(name, parent) if tooltip: @@ -85,6 +84,9 @@ class AppmenuSelectManager: stdin=subprocess.PIPE) p.communicate('\n'.join(new_whitelisted).encode()) if p.returncode != 0: - raise RuntimeError('qvm-appmenus --set-whitelist failed') + exception_text = QtCore.QCoreApplication.translate( + "Command {command} failed", "exception").format( + command='qvm-appmenus --set-whitelist') + raise RuntimeError(exception_text) return True diff --git a/qubesmanager/backup.py b/qubesmanager/backup.py index bec7d48..f73590e 100644 --- a/qubesmanager/backup.py +++ b/qubesmanager/backup.py @@ -24,7 +24,7 @@ import signal from qubesadmin import exc from qubesadmin import utils as admin_utils -from PyQt5 import QtCore, QtWidgets # pylint: disable=import-error +from PyQt5 import QtCore, QtWidgets, QtGui # pylint: disable=import-error from . import ui_backupdlg # pylint: disable=no-name-in-module from . import multiselectwidget @@ -120,6 +120,10 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): self.dispatcher = dispatcher dispatcher.add_handler('backup-progress', self.on_backup_progress) + def setup_application(self): + self.qt_app.setApplicationName(self.tr("Qubes Backup VMs")) + self.qt_app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) + def on_backup_progress(self, __submitter, _event, **kwargs): self.progress_bar.setValue(int(float(kwargs['progress']))) @@ -323,9 +327,9 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): def backup_finished(self): if self.thread.msg: - self.progress_status.setText(self.tr("Backup error.")) + self.progress_status.setText(self.tr("Backup error")) QtWidgets.QMessageBox.warning( - self, self.tr("Backup error!"), + self, self.tr("Backup error"), self.tr("ERROR: {}").format( self.thread.msg)) self.button(self.CancelButton).setEnabled(False) @@ -368,7 +372,7 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): self.thread.wait() QtWidgets.QMessageBox.warning( self, self.tr("Backup aborted!"), - self.tr("ERROR: {}").format("Aborted!")) + self.tr("ERROR: Aborted")) self.cleanup_temporary_files() self.done(0) @@ -390,9 +394,7 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): def main(): - utils.run_asynchronous("Qubes Backup VMs", - "qubes-manager", - BackupVMsWindow) + utils.run_asynchronous(BackupVMsWindow) if __name__ == "__main__": diff --git a/qubesmanager/block.py b/qubesmanager/block.py deleted file mode 100644 index 779193a..0000000 --- a/qubesmanager/block.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/python2 -# -*- coding: utf8 -*- -# pylint: skip-file -# -# The Qubes OS Project, http://www.qubes-os.org -# -# Copyright (C) 2014 Marek Marczykowski-Górecki -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with this program; if not, see . - -import threading -import time -from PyQt4.QtGui import QMessageBox -from qubes import qubesutils - - -class QubesBlockDevicesManager(): - def __init__(self, qvm_collection): - self.qvm_collection = qvm_collection - self.attached_devs = {} - self.free_devs = {} - - self.current_blk = {} - self.current_attached = {} - self.devs_changed = False - - self.last_update_time = time.time() - self.blk_state_changed = True - self.msg = [] - self.check_counter = 0 - self.blk_lock = threading.Lock() - self.tray_message_func = None - - self.update() - - def block_devs_event(self, xid): - now = time.time() - #don't update more often than 1/10 s - if now - self.last_update_time >= 0.1: - self.last_update_time = now - - self.blk_lock.acquire() - - self.blk_state_changed = True - - self.blk_lock.release() - - def check_for_updates(self): - self.blk_lock.acquire() - - ret = (self.blk_state_changed, self.msg) - - if self.blk_state_changed == True: - self.check_counter += 1 - - self.update() - ret = (self.blk_state_changed, self.msg) - - #let the update last for 3 manager-update cycles - if self.check_counter == 3: - self.check_counter = 0 - self.blk_state_changed = False - self.msg = [] - - self.blk_lock.release() - - return ret - - def update(self): - blk = qubesutils.block_list(self.qvm_collection) - for b in blk: - att = qubesutils.block_check_attached(self.qvm_collection, blk[b]) - if b in self.current_blk: - if blk[b] == self.current_blk[b]: - if self.current_attached[b] != att: #devices the same, sth with attaching changed - self.current_attached[b] = att - else: #device changed ?! - self.current_blk[b] = blk[b] - self.current_attached[b] = att - else: #new device - self.current_blk[b] = blk[b] - self.current_attached[b] = att - self.msg.append("Attached new device to {}: {}".format( - blk[b]['vm'], blk[b]['device'])) - - to_delete = [] - for b in self.current_blk: #remove devices that are not there anymore - if b not in blk: - to_delete.append(b) - self.msg.append("Detached device from {}: {}".format( - self.current_blk[b]['vm'], - self.current_blk[b]['device'])) - - for d in to_delete: - del self.current_blk[d] - del self.current_attached[d] - - self.__update_blk_entries__() - - - def __update_blk_entries__(self): - self.free_devs.clear() - self.attached_devs.clear() - - for b in self.current_attached: - if self.current_attached[b]: - self.attached_devs[b] = self.__make_entry__(b, self.current_blk[b], self.current_attached[b]) - else: - self.free_devs[b] = self.__make_entry__(b, self.current_blk[b], None) - - def __make_entry__(self, k, dev, att): - size_str = qubesutils.bytes_to_kmg(dev['size']) - entry = { 'dev': dev['device'], - 'dev_obj': dev, - 'backend_name': dev['vm'], - 'desc': dev['desc'], - 'mode': dev['mode'], - 'size': size_str, - 'attached_to': att, } - return entry - - def attach_device(self, vm, dev): - mode = self.free_devs[dev]['mode'] - if self.tray_message_func: - self.tray_message_func("{0} - attaching {1}" - .format(vm.name, dev), msecs=3000) - qubesutils.block_attach(self.qvm_collection, vm, - self.free_devs[dev]['dev_obj'], mode=mode) - - def detach_device(self, vm, dev_name): - frontend = self.attached_devs[dev_name]['attached_to']['frontend'] - vm = self.attached_devs[dev_name]['attached_to']['vm'] - if self.tray_message_func: - self.tray_message_func("{0} - detaching {1}".format(vm.name, - dev_name), msecs=3000) - qubesutils.block_detach(vm, frontend) - - def check_if_serves_as_backend(self, vm): - serves_for = [] - for d in self.attached_devs: - if self.attached_devs[d]['backend_name'] == vm.name: - serves_for.append((self.attached_devs[d]['dev'], self.attached_devs[d]['attached_to']['vm'])) - - if len(serves_for) > 0: - msg = "Qube " + vm.name + " attaches block devices to other qubes: " - msg += ', '.join([""+v.name+"("+d+")" for (d,v) in serves_for ]) - msg += ".

Shutting the qube down will dettach the devices from them." - - QMessageBox.warning (None, "Warning!", msg) diff --git a/qubesmanager/bootfromdevice.py b/qubesmanager/bootfromdevice.py index 6377a78..5a9add1 100644 --- a/qubesmanager/bootfromdevice.py +++ b/qubesmanager/bootfromdevice.py @@ -21,7 +21,7 @@ import functools import subprocess from . import utils from . import ui_bootfromdevice # pylint: disable=no-name-in-module -from PyQt5 import QtWidgets # pylint: disable=import-error +from PyQt5 import QtWidgets, QtGui # pylint: disable=import-error from qubesadmin import tools from qubesadmin.tools import qvm_start @@ -47,6 +47,10 @@ class VMBootFromDeviceWindow(ui_bootfromdevice.Ui_BootDialog, # warn user if the VM is currently running self.__warn_if_running__() + def setup_application(self): + self.qapp.setApplicationName(self.tr("Boot Qube From Device")) + self.qapp.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) + def reject(self): self.done(0) @@ -148,8 +152,7 @@ def main(args=None): args = parser.parse_args(args) vm = args.domains.pop() - utils.run_synchronous("Boot Qube From Device", - functools.partial(VMBootFromDeviceWindow, vm)) + utils.run_synchronous(functools.partial(VMBootFromDeviceWindow, vm)) if __name__ == "__main__": diff --git a/qubesmanager/clipboard.py b/qubesmanager/clipboard.py index 277e42f..a407d9c 100644 --- a/qubesmanager/clipboard.py +++ b/qubesmanager/clipboard.py @@ -27,6 +27,7 @@ from math import log # pylint: disable=import-error from PyQt5.QtWidgets import QApplication, QMessageBox +from PyQt5.QtCore import QCoreApplication APPVIEWER_LOCK = "/var/run/qubes/appviewer.lock" CLIPBOARD_CONTENTS = "/var/run/qubes/qubes-clipboard.bin" @@ -43,14 +44,20 @@ def copy_text_to_qubes_clipboard(text): try: file = os.open(APPVIEWER_LOCK, os.O_RDWR | os.O_CREAT, 0o0666) except Exception: # pylint: disable=broad-except - QMessageBox.warning(None, "Warning!", - "Error while accessing Qubes clipboard!") + QMessageBox.warning( + None, + QCoreApplication.translate("Clipboard", "Warning!"), + QCoreApplication.translate( + "Clipboard", "Error while accessing Qubes clipboard!")) else: try: fcntl.flock(file, fcntl.LOCK_EX) except Exception: # pylint: disable=broad-except - QMessageBox.warning(None, "Warning!", - "Error while locking Qubes clipboard!") + QMessageBox.warning( + None, + QCoreApplication.translate("Clipboard", "Warning!"), + QCoreApplication.translate( + "Clipboard", "Error while locking Qubes clipboard!")) else: try: with open(CLIPBOARD_CONTENTS, "w") as contents: @@ -58,8 +65,11 @@ def copy_text_to_qubes_clipboard(text): with open(CLIPBOARD_SOURCE, "w") as source: source.write("dom0") except Exception: # pylint: disable=broad-except - QMessageBox.warning(None, "Warning!", - "Error while writing to Qubes clipboard!") + QMessageBox.warning( + None, + QCoreApplication.translate("Clipboard", "Warning!"), + QCoreApplication.translate( + "Clipboard", "Error while writing to Qubes clipboard!")) fcntl.flock(file, fcntl.LOCK_UN) os.close(file) @@ -71,11 +81,14 @@ def get_qubes_clipboard_formatted_size(): try: file_size = os.path.getsize(CLIPBOARD_CONTENTS) except Exception: # pylint: disable=broad-except - QMessageBox.warning(None, "Warning!", - "Error while accessing Qubes clipboard!") + QMessageBox.warning( + None, + QCoreApplication.translate("Clipboard", "Warning!"), + QCoreApplication.translate( + "Clipboard", "Error while accessing Qubes clipboard!")) else: - formatted_bytes = '1 byte' if file_size == 1 \ - else str(file_size) + ' bytes' + formatted_bytes = QCoreApplication.translate( + "Clipboard", "%n byte(s)", "", file_size) if file_size > 0: magnitude = min(int(log(file_size)/log(2)*0.1), len(units)-1) if magnitude > 0: @@ -84,4 +97,4 @@ def get_qubes_clipboard_formatted_size(): units[magnitude]) return '%s' % formatted_bytes - return '? bytes' + return QCoreApplication.translate("Clipboard", '? bytes') diff --git a/qubesmanager/common_threads.py b/qubesmanager/common_threads.py index e2bf9e5..a04d28a 100644 --- a/qubesmanager/common_threads.py +++ b/qubesmanager/common_threads.py @@ -50,7 +50,7 @@ class RemoveVMThread(QubesThread): try: del self.vm.app.domains[self.vm.name] except (exc.QubesException, KeyError) as ex: - self.msg = ("Error removing qube!", str(ex)) + self.msg = (self.tr("Error removing qube!"), str(ex)) # pylint: disable=too-few-public-methods @@ -62,7 +62,8 @@ class CloneVMThread(QubesThread): def run(self): try: self.vm.app.clone_vm(self.vm, self.dst_name) - self.msg = ("Sucess", "The qube was cloned sucessfully.") + self.msg = (self.tr("Sucess"), + self.tr("The qube was cloned sucessfully.")) self.msg_is_success = True except exc.QubesException as ex: - self.msg = ("Error while cloning qube!", str(ex)) + self.msg = (self.tr("Error while cloning qube!"), str(ex)) diff --git a/qubesmanager/create_new_vm.py b/qubesmanager/create_new_vm.py index f239894..2523b1f 100644 --- a/qubesmanager/create_new_vm.py +++ b/qubesmanager/create_new_vm.py @@ -21,6 +21,7 @@ # # +import os import sys import subprocess @@ -204,7 +205,7 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): self.thread.start() self.progress = QtWidgets.QProgressDialog( - self.tr("Creating new qube {}...").format(name), "", 0, 0) + self.tr("Creating new qube {0}...").format(name), "", 0, 0) self.progress.setCancelButton(None) self.progress.setModal(True) self.progress.show() @@ -216,7 +217,7 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): QtWidgets.QMessageBox.warning( self, self.tr("Error creating the qube!"), - self.tr("ERROR: {}").format(self.thread.msg)) + self.tr("ERROR: {0}").format(self.thread.msg)) self.done(0) @@ -266,9 +267,20 @@ def main(args=None): args = parser.parse_args(args) qtapp = QtWidgets.QApplication(sys.argv) + + translator = QtCore.QTranslator(qtapp) + locale = QtCore.QLocale.system().name() + i18n_dir = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + 'i18n') + translator.load("qubesmanager_{!s}.qm".format(locale), i18n_dir) + qtapp.installTranslator(translator) + QtCore.QCoreApplication.installTranslator(translator) + qtapp.setOrganizationName('Invisible Things Lab') qtapp.setOrganizationDomain('https://www.qubes-os.org/') - qtapp.setApplicationName('Create qube') + qtapp.setApplicationName(QtCore.QCoreApplication.translate( + "appname", 'Create qube')) dialog = NewVmDlg(qtapp, args.app) dialog.exec_() diff --git a/qubesmanager/firewall.py b/qubesmanager/firewall.py index c224d46..c27947e 100644 --- a/qubesmanager/firewall.py +++ b/qubesmanager/firewall.py @@ -280,8 +280,7 @@ class QubesFirewallRulesModel(QtCore.QAbstractItemModel): return str(rule.proto) return "unknown" - @staticmethod - def get_firewall_conf(vm): + def get_firewall_conf(self, vm): conf = { 'allow': None, 'expire': 0, @@ -296,14 +295,15 @@ class QubesFirewallRulesModel(QtCore.QAbstractItemModel): last_rule = next(reversed_rules, None) if last_rule is None: - raise FirewallModifiedOutsideError('At least one rule must exist.') + raise FirewallModifiedOutsideError( + self.tr('At least one rule must exist.')) if last_rule == qubesadmin.firewall.Rule('action=accept') \ or last_rule == qubesadmin.firewall.Rule('action=drop'): common_action = last_rule.action else: - raise FirewallModifiedOutsideError('Last rule must be either ' - 'drop all or accept all.') + raise FirewallModifiedOutsideError( + self.tr('Last rule must be either drop all or accept all.')) dns_rule = qubesadmin.firewall.Rule(None, action='accept', specialtarget='dns') @@ -319,29 +319,31 @@ class QubesFirewallRulesModel(QtCore.QAbstractItemModel): continue if rule.specialtarget is not None or rule.icmptype is not None: - raise FirewallModifiedOutsideError("Rule type unknown!") + raise FirewallModifiedOutsideError( + self.tr("Rule type unknown!")) if (rule.dsthost is not None or rule.proto is not None) \ and rule.expire is None: if rule.action == 'accept': conf['rules'].insert(0, rule) continue - raise FirewallModifiedOutsideError('No blacklist support.') + raise FirewallModifiedOutsideError( + self.tr('No blacklist support.')) if rule.expire is not None and rule.dsthost is None \ and rule.proto is None: conf['expire'] = int(str(rule.expire)) continue - raise FirewallModifiedOutsideError('it does not add up.') + raise FirewallModifiedOutsideError(self.tr('it does not add up.')) conf['allow'] = (common_action == 'accept') if not allow_icmp and not conf['allow']: - raise FirewallModifiedOutsideError('ICMP must be allowed.') + raise FirewallModifiedOutsideError(self.tr('ICMP must be allowed.')) if not allow_dns and not conf['allow']: - raise FirewallModifiedOutsideError('DNS must be allowed') + raise FirewallModifiedOutsideError(self.tr('DNS must be allowed')) return conf diff --git a/qubesmanager/global_settings.py b/qubesmanager/global_settings.py index b8ce891..eca9250 100644 --- a/qubesmanager/global_settings.py +++ b/qubesmanager/global_settings.py @@ -21,7 +21,7 @@ # import subprocess -from PyQt5 import QtWidgets # pylint: disable=import-error +from PyQt5 import QtWidgets, QtCore, QtGui # pylint: disable=import-error from qubesadmin.utils import parse_size @@ -42,13 +42,19 @@ def _run_qrexec_repo(service, arg=''): check=False ) if p.stderr: - raise RuntimeError('qrexec call stderr was not empty', - {'stderr': p.stderr.decode('utf-8')}) + raise RuntimeError( + QtCore.QCoreApplication.translate( + "GlobalSettings", 'qrexec call stderr was not empty'), + {'stderr': p.stderr.decode('utf-8')}) if p.returncode != 0: - raise RuntimeError('qrexec call exited with non-zero return code', - {'returncode': p.returncode}) + raise RuntimeError( + QtCore.QCoreApplication.translate( + "GlobalSettings", + 'qrexec call exited with non-zero return code'), + {'returncode': p.returncode}) return p.stdout.decode('utf-8') + # pylint: disable=too-many-instance-attributes class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, QtWidgets.QDialog): @@ -69,6 +75,10 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, self.__init_mem_defaults__() self.__init_updates__() + def setup_application(self): + self.qt_app.setApplicationName(self.tr("Qubes Global Settings")) + self.qt_app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) + def __init_system_defaults__(self): # set up updatevm choice self.update_vm_vmlist, self.update_vm_idx = utils.prepare_vm_choice( @@ -272,15 +282,16 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, elif repos['qubes-dom0-current']['enabled']: self.dom0_updates_repo.setCurrentIndex(0) else: - raise Exception('Cannot detect enabled dom0 update repositories') + raise Exception( + self.tr('Cannot detect enabled dom0 update repositories')) if repos['qubes-templates-itl-testing']['enabled']: self.itl_tmpl_updates_repo.setCurrentIndex(1) elif repos['qubes-templates-itl']['enabled']: self.itl_tmpl_updates_repo.setCurrentIndex(0) else: - raise Exception('Cannot detect enabled ITL template update ' - 'repositories') + raise Exception(self.tr('Cannot detect enabled ITL template update ' + 'repositories')) if repos['qubes-templates-community-testing']['enabled']: self.comm_tmpl_updates_repo.setCurrentIndex(2) @@ -335,7 +346,8 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, result = _run_qrexec_repo('qubes.repos.' + action, name) if result != 'ok\n': raise RuntimeError( - 'qrexec call stdout did not contain "ok" as expected', + self.tr('qrexec call stdout did not contain "ok"' + ' as expected'), {'stdout': result}) except RuntimeError as ex: msg = '{desc}; {args}'.format(desc=ex.args[0], args=', '.join( @@ -400,7 +412,7 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, def main(): - utils.run_synchronous("Qubes Global Settings", GlobalSettingsWindow) + utils.run_synchronous(GlobalSettingsWindow) if __name__ == "__main__": diff --git a/qubesmanager/i18n/qubesmanager_en.ts b/qubesmanager/i18n/qubesmanager_en.ts index 6a71aad..64569a6 100644 --- a/qubesmanager/i18n/qubesmanager_en.ts +++ b/qubesmanager/i18n/qubesmanager_en.ts @@ -3,338 +3,654 @@ AboutDialog - + About - + Qubes OS - + Qubes OS release - + Release notes - + OK + + + Version Information + + Backup - - Qubes Backup VMs - - - - - Shutdown all running selected VMs - - - - - Refresh running states. - - - - - Some of the selected VMs are running (red). Running VMs cannot be backed up! - - - - - Select VMs to backup: - - - - + Total size: - + 0 - + Backup destination directory - + ... - - Target AppVM: - - - - - Backup directory or VM command: - - - - + Backup security - + <html><head/><body><p>Encryption / Verification<br/>passphrase:</p></body></html> - - Encrypt backup: - - - - + <html><head/><body><p>Reenter passphrase:</p></body></html> - + You're about to perform the following actions: - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - - + To continue press Next. - + Backup in progress... - + When finished, open file selection dialog to allow me to unmount the disk + + + Qubes OS - Backup qubes + + + + + Select qubes to backup: + + + + + Compress the backup + + + + + Warning: unrecognized data found in configuration files. + + + + + Target qube: + + + + + Backup directory or command: + + + + + Save backup profile + + + + + Save settings as default backup profile: + + + + + <html><head/><body><p>WARNING: password will be saved in dom0 in plain text.<br/>The file is located in dom0 in /etc/qubes/backup/qubes-manager-backup .</p></body></html> + + + + + NOTE: Only running qubes are listed. + + + + + Other + + + + + Turn computer off after backup is finished + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-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:'Sans Serif'; font-size:9pt;"><br /></p></body></html> + + BackupVMsWindow - + Backup in progress... + + + Error loading backup profile + + + + + Unable to load saved backup profile. + + + + + Qubes Backup VMs + + + + + BootDialog + + + Boot from device + + + + + Boot qube from device + + + + + from existing block device + + + + + from file in qube + + + + + ... + + + + + Clipboard + + + Warning! + + + + + Error while accessing Qubes clipboard! + + + + + Error while locking Qubes clipboard! + + + + + Error while writing to Qubes clipboard! + + + + + %n byte(s) + + + + + + + ? bytes + + + + + CloneVMThread + + + Sucess + + + + + The qube was cloned sucessfully. + + + + + Error while cloning qube! + + + + + Command {command} failed + + + exception + + DevListWidgetItem - + Service already on the list! - - Service can not be removed + + Error re-assigning device - - Service meminfo-writer can not be removed from the list. + + Refresh in progress... - - Invalid service ports range + + Refresh Applications + + + + + Dialog + + + Select devices - - Port {0} is lower than port {1}. + + Which PCI devices should use the no strict reset option? - - Invalid service name - - - - - Service '{0}' is unknown. + + Note: use this option only if "unable to reset PCI device" error occurs. GlobalSettings - + Qubes Global Settings - + System defaults - - UpdateVM: - - - - + ClockVM: - + Default netVM: - + Default template: - + Default memory settings - - Minimal VM's memory: - - - - + MiB - + dom0 memory boost: - - Keep dispVM in memory - - - - + Kernel - + Default kernel: - + Updates - + Check for dom0 updates - - Unknown current state + + Dom0 UpdateVM: - - Check for VM updates + + This is updateVM ONLY for dom0; if you want to change updateVMs for other VMs, use /etc/qubes-rpc/policy/qubes.UpdatesProxy + + + + + Default DisposableVM Template: + + + + + Minimal qube memory: + + + + + Stable updates + + + + + Testing updates (security only) + + + + + Testing updates + + + + + Unstable updates + + + + + Disable checking for updates for all qubes + + + + + Default value for new qubes; to change it for existing qubes, use buttons below. + + + + + Check for qube updates by default + + + + + Enable checking for updates for all qubes + + + + + ITL template updates + + + + + ITL template updates (testing) + + + + + (Community templates disabled) + + + + + Community template updates + + + + + Community template updates (testing) + + + + + qrexec call stderr was not empty + + + + + qrexec call exited with non-zero return code GlobalSettingsWindow - - (current) + + Change state of all qubes + + + + + Are you sure you want to set all qubes to check for updates? + + + + + Are you sure you want to set all qubes to not check for updates? + + + + + ERROR! + + + + + Error managing {repo} repository settings: {msg} + + + + + Cannot detect enabled dom0 update repositories + + + + + Cannot detect enabled ITL template update repositories + + + + + qrexec call stdout did not contain "ok" as expected + + + + + Qubes Global Settings + + + + + InformationNotesDialog + + + More Information LogDialog - + (Showing only last %d bytes of file) - + Dialog - + Copy Dom0 clipboard to Qubes clipboard - + Copy to Qubes clipboard + + MainWindow + + + Template Manager + + + + + Change all selected to: + + + + + <html><head/><body><p>To select all qubes with a given template, double-click the template name in any row.</p><p><span style=" font-weight:600;">IMPORTANT</span>: Changes will be applied only when you click OK.</p></body></html> + + + + + Clear Selection + + + + + ManagerUtils + + + default ({}) + + + + + (none) + + + + + (current) + + + + + Unexpected characters in path. + + + + + - Global property <b>{}</b> <br> + + + + + - <b>{0}</b> for qube <b>{1}</b> <br> + + + + + Houston, we have a problem... + + + + + Whoops. A critical error has occured. This is most likely a bug in Qubes Manager.<br><br><b><i>{0}</i></b><br/>at line <b>{1}</b><br/>of file {2}.<br/><br/> + + + MultiSelectWidget - + Form - + Available - + >> - + > - + < - + << - + Selected @@ -342,1667 +658,1934 @@ p, li { white-space: pre-wrap; } NewFwRuleDlg - + Firewall rule - + You need to fill service name/port for TCP/UDP rule - + New Address - + Protocol - - Service - - - - + Address - + TCP - + UDP - + Any + + + Invalid address + + + + + Address '{0}' is invalid. + + + + + Invalid port or service + + + + + Port number or service '{0}' is invalid. + + + + + Port/Service + + + + + <html><head/><body><p>Port/service can be provided as either port number (e.g. 122), port range (1024-1234) or service name (e.g. smtp) . For full list of services known, see /etc/services in dom0.</p></body></html> + + NewVMDlg - - Create New VM - - - - - <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Make sure that the license of the OS installed in a template VM grants you permission to run multiple instances of an installed system.</span></p></body></html> - - - - + Name and label: - - my-new-vm + + Create new qube - - Use this template: + + Networking: - - Standalone + + Template: - - AppVM + + my-new-qube - - NetVM + + Type: - - ProxyVM + + launch settings after creation - - HVM + + Basic - - HVM template + + install system from device (also available from settings) - - Allow networking: + + provides network to other qubes + + + + + Initial RAM (also available from settings) + + + + + <html><head/><body><p><span style=" font-weight:600;">Caution</span>: changing these settings can compromise your system or make the qube unable to boot. Use only if you know what you are doing.</p></body></html> + + + + + Storage pool + + + + + Advanced + + + + + (default) + + + + + MB NewVmDlg - - (default) - - - - - Incorrect AppVM Name! - - - - - A VM with the name <b>{0}</b> already exists in the system! - - - - + No template available! - - Cannot create non-standalone VM when no compatible template exists. Create template VM first or choose to create standalone VM. + + Cannot create a qube when no template exists. - - Error creating AppVM! + + Qube based on a template (AppVM) - - Unknown VM type, this is error in Qubes Manager + + Standalone qube copied from a template - - Creating new {0} <b>{1}</b>... + + Empty standalone qube (install your own OS) - + + Incorrect qube name! + + + + + A qube with the name <b>{}</b> already exists in the system! + + + + + Error creating the qube! + + + + + Creating new qube <b>{0}</b>... + + + + ERROR: {0} - QubesManagerFileWatcher + QubeManager - - Qubes Clipboard has been copied to the VM and wiped.<i/> -<small>Trigger a paste operation (e.g. Ctrl-v) to insert it into an application.</small> + + n/a - - Qubes Clipboard fetched from VM: <b>'{0}'</b> -<small>Press Ctrl-Shift-v to copy this clipboard into dest VM's clipboard.</small> + + Yes - - Qubes dom0 updates available. + + default ({}) + + + + + Check updates + + + + + Updates pending! + + + + + Qube outdated + + + + + The qube must be restarted for its filesystem to reflect the template's recent committed changes. + + + + + Template running + + + + + The Template must be stopped before changes from its current session can be picked up by this qube. - QubesTrayIcon + QubesFirewallRulesModel - - Open VM Manager + + At least one rule must exist. - - Copy Dom0 clipboard + + Last rule must be either drop all or accept all. - - Make backup + + Rule type unknown! - - Preferences + + No blacklist support. - - Set default NetVM + + it does not add up. - - System Info + + ICMP must be allowed. - - Exit + + DNS must be allowed + + + + + RefreshAppsVMThread + + + Refresh in progress (refreshing applications from {}) - - Block devices - - - - - Qubes dom0 updates available. - - - - - Detach {dev} {desc} ({size}) from {vm} - - - - - Attach {dev} {size} {desc} - - - - - Block attach/detach error! + + Refresh failed! ReleaseNotesDialog - + Qubes Release Notes + + RemoveVMThread + + + Error removing qube! + + + + + RenameVMThread + + + Warning: rename partially unsuccessful! + + + + + Some properties could not be changed to the new name. The system has now both {} and {} qubes. To resolve this, please check and change the following properties and remove the qube {} manually.<br> + + + + + Rename error! + + + Restore - - Qubes Restore VMs - - - - + Restore options - + Ignore missing templates or netvms, restore VMs anyway. - - ignore missing - - - - + Ignore dom0 username mismatch while restoring homedir. - + ignore username mismatch - + Verify backup integrity, do not restore the data - + Backup source location - + ... - + <html><head/><body><p>Backup file:<br><span style=" font-size:8pt;">(for old backup format select qubes.xml file)</span></p></body></html> - - AppVM: - - - - + Security options - + Encrypted backup: - + <html><head/><body><p>Decryption / Verification<br/>passphrase:</p></body></html> - - VMs to restore - - - - + You're about to perform the following actions: - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p></body></html> - - - - + To continue press Next. - + When finished, open file selection dialog to allow me to unmount the disk + + + Qubes OS - Restore qubes + + + + + ignore missing templates and net VMs + + + + + Qube: + + + + + Qubes to restore + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style="-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:'Sans Serif'; font-size:9pt;"><br /></p></body></html> + + + + + <html><head/><body><p><span style=" font-weight:600;">WARNING: restored dom0 files are located in ~/home-restore-&lt;timestamp&gt; directory</span></p></body></html> + + + + + RestoreThread + + + Partially restored files left in /var/tmp/restore_*, investigate them and/or clean them up + + + + + Finished with errors! + + + + + Finished successfully! + + RestoreVMsWindow - + Restore error! - - Partially restored files left in /var/tmp/restore_*, investigate them and/or clean them up - - - - - Restore aborted! - - - - - Finished with errors! - - - - - Finished successfully! - - - - - Restore aborted - - - - - Do you want to remove temporary files from %s? - - - - - Backup error! - - - - - ERROR: {0} - - - - + Please unmount your backup volume and cancel the file selection dialog. - - Detach backup device + + Aborting the operation... - - Aborting the operation... + + Restore qubes + + + + + Qubes Restore VMs + + + + + RunCommandThread + + + Error while running command! SettingsDialog - + Settings - + <html><head/><body><p>Name &amp;&amp; label<span style=" color:#ff0000;">*</span>:</p></body></html> - + ---- - + <html><head/><body><p>Template<span style=" color:#ff0000;">*</span>:</p></body></html> - - NetVM: - - - - + Include in backups by default - + Run in debug mode - - Start VM automatically on boot - - - - - Seamless GUI - - - - + General - + Type: - + --- - + Installed by RPM: - + Disk storage - - MB - - - - + Private storage max. size: - + System storage max. size: - + Networking - + IP: - + Netmask: - + Gateway: - - <html><head/><body><p><span style=" color:#ff0000;">* </span><span style=" color:#000000;">Cannot be changed while the VM is running</span></p></body></html> - - - - + Basic - + Memory/CPU - + Initial memory: - + Max memory: - + VCPUs no.: - + Include in memory balancing - + Dynamic memory balancing can result in some devices not working! - - Paths - - - - - dir: - - - - - dir_path - - - - - config: - - - - - config_path - - - - - root img: - - - - - root_img_path - - - - - root volatile img: - - - - - volatile_path - - - - - private img: - - - - - private_path - - - - + Other - - NetVM for DispVM: - - - - + Kernel - + Kernel: - + Kernel opts: - + [] - - Additional drive - - - - - Path: - - - - - Backend domain: - - - - - ... - - - - - New drive will be used only at next VM startup - - - - + Advanced - - Allow network access except... - - - - - Allow ICMP traffic - - - - - Deny network access except... - - - - - Allow DNS queries - - - - - Allow connections to Updates Proxy - - - - + Allow full access for - + min - + Firewall rules - + You've enabled dynamic memory balancing, some devices might not work! - - To modify PCI devices you have to turn off the VM. - - - - + Devices - + Applications - + Checked services will be turned on. - + Unchecked services will be turned off. - + Unlisted services will follow default settings. - + Services + + + MiB + + + + + Virtual DNS: + + + + + <html><head/><body><p><span style=" color:#ff0000;">* </span><span style=" color:#000000;">Cannot be changed while the qube is running</span></p></body></html> + + + + + Networking: + + + + + Rename + + + + + <html><head/><body><p>&quot;default ([name])&quot; denotes system-wide default - if the default is changed in Global Settings, the networking qube will change. <br/>If you want to keep using a given networking qube regardless of system settings, select &quot;[name]&quot;.</p></body></html> + + + + + Start qube automatically on boot + + + + + Delete qube + + + + + Clone qube + + + + + WARNING: PVH mode requires Linux 4.11 or newer. + + + + + Virtualization + + + + + Mode: + + + + + Using PV mode exposes more hypervisor attack surface! + + + + + PVH mode is hidden since it doesn't support PCI passthrough. + + + + + PVH mode is recommended if possible (Linux kernel 4.11 or newer, no PCI passthrough). For Windows qubes always use HVM. + + + + + MB + + + + + Provides network + + + + + <html><head/><body><p>Allows using this qube as a template for DisposableVMs. The DisposableVMs will inherit the VM's state (configuration, installed programs etc.), but their state will not persist between restarts. </p><p>Setting this option will cause this qube to be listed as an option in the &quot;Default DisposableVM Template&quot; dropdown for all other qubes. </p></body></html> + + + + + Disposable VM Template + + + + + Boot qube from CDROM + + + + + Windows (with Qubes Windows Tools installed) only. +The qube must be running to enable seamless mode; this setting is not persistent. + + + + + Enable seamless mode + + + + + Windows (with Qubes Windows Tools installed) only. +The qube must be running to disable seamless mode; this setting is not persistent. + + + + + Disable seamless mode + + + + + <html><head/><body><p>Which qube should be used by default as a template for DisposableVMs started from this one? DisposableVMs will inherit their template's configuration and installed programs.<br/>For a qube to to appear in this list, it must have the &quot;DisposableVM Template&quot; checkbox enabled. </p></body></html> + + + + + Default DisposableVM Template + + + + + This qube has no networking - it will not have any network access anyway. + + + + + Networking qube does not support 'qubes-firewall' - firewall restrictions will not be applied. + + + + + Firewall has been modified manually - please use qvm-firewall for any further configuration. + + + + + Allow all outgoing Internet connections + + + + + Changing firewall settings does NOT affect existing connections. + + + + + Limit outgoing Internet connections to ... + + + + + List of allowed (whitelisted) addresses: + + + + + NOTE: To block all network access, set Networking to (none) on the Basic settings tab. This tab provides a very simplified firewall configuration. All DNS requests and ICMP (pings) will be allowed. For more granular control, use the command line tool qvm-firewall. + + + + + To modify PCI devices you have to turn off the qube. + + + + + Currently PVH qubes don't support PCI passthrough. Select another virtualization mode if you want to add PCI devices + + + + + Configure strict reset for PCI devices + + + + + Refresh Applications + + + + + Services listed here are only base Qubes services - other services may be installed and implemented. + + + + + <html><head/><body><p><span style=" font-weight:600;">Caution:</span> The Default DisposableVM Template (see the Advanced tab) has a different Networking setting than this qube. This configuration may result in unexpected network access. For example, you may have set this qube's Networking to &quot;none&quot; in order to prevent any data from being transmitted out. However, if the Default DisposableVM Template's Networking is set to &quot;sys-firewall,&quot; then a DisposableVM started from this qube may be able to transmit data out, contrary to your intention. You may wish to set the Default DisposableVM Template for this qube to one with equally restrictive Networking settings.</p></body></html> + + + + + This qube has direct network access - to configure its firewall, use a dedicated firewall qube. + + + + + StatusItem + + + TemplateManager + + + qube is running + + + + + TemplateManagerWindow + + + Errors encountered! + + + + + Errors encountered on template change in the following qubes: <br> {}. + + + + + (select template) + + + + + Qube + + + + + Current + + + + + New + + + + + Template Manager + + + + + UpdateVMThread + + + Debian DSA-4371 fix installed in {} + + + + + Failed to apply DSA-4371 fix: {} + + + + + Error on qube update! + + + + + VMBootFromDeviceWindow + + + Boot {vm} from device + + + + + ERROR! + + + + + No file or block device selected; please select one. + + + + + Warning! + + + + + Qube must be turned off before booting it from device. Please turn off the qube. + + + + + Failed to display file selection dialog + + + + + Check if the qube {0} can be started and has a file manager installed. + + + + + Boot Qube From Device + + VMSettingsWindow - + Settings: {vm} - - Applying settings to <b>{0}</b>... - - - - + Error while changing settings for {0}! - + ERROR: {0} - + Error while saving changes: - + Firewall tab: - + Applications tab: - - VM configuration problem! - - - - - The '{vm}' AppVM is not network connected to a FirewallVM!<p>You may edit the '{vm}' VM firewall rules, but these will not take any effect until you connect it to a working Firewall VM. - - - - - (default) - - - - - (current) - - - - - Can't change name of a running VM. - - - - - Can't change VM name - a VM named <b>{0}</b>already exists in the system! - - - - + Warning! - + Max memory can not be less than initial memory.<br>Setting max memory to equal initial memory. - + Initial memory can not be less than one tenth Max memory.<br>Setting initial memory to the minimum allowed value. + + + Delete qube (cannot delete a running qube) + + + + + To change system storage size, change properties of the underlying template. + + + + + Qube cannot be renamed! + + + + + The following qubes using this qube as a template are running: <br> {}. <br> In order to rename this qube, you must first shut them down. + + + + + Rename qube + + + + + New name: (WARNING: all other changes will be discarded) + + + + + Renaming Qube... + + + + + Qube cannot be removed! + + + + + This qube cannot be removed. It is used as: <br> {} <small>If you want to remove this qube, you should remove or change settings of each qube or setting that uses it.</small> + + + + + Delete qube + + + + + Are you absolutely sure you want to delete this qube? <br/> All qube settings and data will be irrevocably deleted. <br/> If you are sure, please enter this qube's name below. + + + + + Removal cancelled + + + + + The qube will not be removed. + + + + + Clone qube + + + + + Name for the cloned qube: + + + + + Cloning Qube... + + + + + No finished thread found + + + + + Basic tab: + + + + + Advanced tab: + + + + + Devices tab: + + + + + Sevices tab: + + + + + Cannot change this setting while this qube is used as a NetVM by the following qubes: + + + + + + Qube Settings + + VmListItem - - VM Shutdown Confirmation - - - - - Are you sure you want to power down the following VMs: <b>{0}</b>?<br/><small>This will shutdown all the running applications within them.</small> - - - - + Wait! - - Some selected VMs are running. Running VMs can not be backuped. Please shut them down or remove them from the list. - - - - + Enter backup target location first. - + Selected directory do not exists or not a directory (%s). - + Enter passphrase for backup encryption/verification first. - + Enter the same passphrase in both fields. - - Error while preparing backup. - - - - - ERROR: {0} - - - - - Backup aborted. - - - - - Backup aborted - - - - - Do you want to remove temporary files from %s? - - - - - Backup error. - - - - - Backup error! - - - - + ERROR: {} - + Backup finished. - + Please unmount your backup volume and cancel the file selection dialog. + + + Backup aborted! + + + + + Backup error + + + + + ERROR: Aborted + + + + + Error cancelling backup! + + VmManagerWindow - + + Manager settings unreadable + + + + + Qube Manager settings cannot be parsed. Previously saved display settings may not be restored correctly. +Error: {} + + + + + Loading Qube Manager... + + + + + Qube Manager + + + + Warning! - - This Template VM cannot be removed, because there is at least one AppVM that is based on it.<br><small>If you want to remove this Template VM and all the AppVMs based on it,you should first remove each individual AppVM that uses this template.</small> + + This qube cannot be removed. It is used as: <br> {} <small>If you want to remove this qube, you should remove or change settings of each qube or setting that uses it.</small> - - VM Removal Confirmation + + Qube Removal Confirmation - - Are you sure you want to remove the VM <b>'{0}'</b>?<br>All data on this VM's private storage will be lost!<br><br>Type the name of the VM (<b>{1}</b>) below to confirm: + + Are you sure you want to remove the Qube <b>'{0}'</b>?<br> All data on this Qube's private storage will be lost!<br><br>Type the name of the Qube (<b>{1}</b>) below to confirm: - - VM removal confirmation failed + + Qube removal confirmation failed - + Entered name did not match! Not removing {0}. - - Removing VM: <b>{0}</b>... + + Qubes clone Qube - - VM '{0}' has been removed. + + Enter name for Qube <b>{}</b> clone: - - Error removing VM! + + Name already in use! - + + There already exists a qube called '{}'. Cloning aborted. + + + + + Cloning Qube... + + + + + Error unpausing Qube! + + + + ERROR: {0} - - Qubes clone VM + + Error pausing Qube! - - Enter name for VM <b>{}</b> clone: + + Qube Shutdown Confirmation - - Cloning VM <b>{0}</b> to <b>{1}</b>... + + Are you sure you want to power down the Qube <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this Qube.</small> - - Error while cloning VM + + Error shutting down Qube! - - Exception while cloning:<br>{0} + + Qube Restart Confirmation - - Error unpausing VM! + + Are you sure you want to restart the Qube <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this Qube.</small> - - Starting '{0}'... + + Qube <b>'{0}'</b> is not running. Are you absolutely sure you want to try to kill it?<br><small>This will end <b>(not shutdown!)</b> all the running applications within this Qube.</small> - - VM '{0}' has been started. + + Are you sure you want to kill the Qube <b>'{0}'</b>?<br><small>This will end <b>(not shutdown!)</b> all the running applications within this Qube.</small> - - Error starting VM <b>'{0}'</b>: {1} + + Qube Kill Confirmation - - Error starting VM: %s + + Error while killing Qube! - - Error starting VM! - - - - - You need to install 'qubes-windows-tools' package to use this option - - - - - VM '{0}' has been started. Start Qubes Tools installation from attached CD - - - - - Error pausing VM! - - - - - VM Shutdown Confirmation - - - - - Are you sure you want to power down the VM <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this VM.</small> - - - - - Error shutting down VM! - - - - - VM '{0}' is shutting down... - - - - - VM Restart Confirmation - - - - - Are you sure you want to restart the VM <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this VM.</small> - - - - - VM Kill Confirmation - - - - - Are you sure you want to kill the VM <b>'{0}'</b>?<br><small>This will end <b>(not shutdown!)</b> all the running applications within this VM.</small> - - - - - Error while killing VM! - - - - + <b>An exception ocurred while killing {0}.</b><br>ERROR: {1} - - VM Update Confirmation + + Qube Update Confirmation - - <b>{0}</b><br>The VM has to be running to be updated.<br>Do you want to start it?<br> + + <b>{0}</b><br>The Qube has to be running to be updated.<br>Do you want to start it?<br> - - <b>{0}</b><br>Please wait for the updater to launch... - - - - - Error VM update! - - - - + Qubes command entry - + Run command in <b>{}</b>: - - Error while running command - - - - - Exception while running command:<br>{0} - - - - - Detach {dev} {size} {desc} - - - - - Attach {dev} {size} {desc} - - - - - Block attach/detach error! - - - - - Qubes VM Manager - - - - + Search: - + Nowy wiersz - + Name - - VM name + + Qube name - + State - + Update info - + Template - - VM's template + + Qube template - + NetVM - - VM's netVM + + Qube netVM - - CPU + + Disk +usage - - CPU Graph - - - - - CPU usage graph - - - - - MEM - - - - - MEM Graph - - - - - Memory usage graph - - - - - Size - - - - + Internal - + IP - - Backups + + Include +in backups - + Last backup - + + Default DisposableVM +Template + + + + + DisposableVM +Template + + + + + Virtualization Mode + + + + &System - + &View - - V&M + + &Qube - + &Logs - - Attach/detach &block devices - - - - + &About - + toolBar - - Create &New VM + + Create &new qube - - Create a new VM + + Create a new qube - - &Delete VM + + &Delete qube - - Remove an existing VM (must be stopped first) + + Remove an existing qube (must be stopped first) - - Start/Resume V&M + + Start/Resu&me qube - - Start/Resume selected VM + + Start/Resume selected qube - - &Pause VM + + &Pause qube - - Pause selected VM + + <p>Pause selected qube</p><p>Stops all CPU activity in the selected VM until the VM is unpaused. This action does not change how much memory is allocated to the VM. (EXPERIMENTAL)</p> - - &Shutdown VM + + &Shutdown qube - - Shutdown selected VM + + Shutdown selected qube - - Restar&t VM + + Restar&t qube - - Restart selected VM + + Restart selected qube - + Add/remove app s&hortcuts - - Add/remove app shortcuts for this VM + + Add/remove app shortcuts for this qube - - &Update VM + + &Update qube - - Update VM system + + Update qube system - - Attach/detach &audio-input to the VM + + Edit qube &firewall rules - - Attach/detach audio-input to the VM + + Edit qube firewall rules - - Show/Hide inactive VMs - - - - - Edit VM &firewall rules - - - - - Edit VM firewall rules - - - - + Show graphs - + Show Graphs - + Options - + View - - &CPU - - - - - CPU &Graph - - - - - &MEM - - - - - M&EM Graph - - - - + &Template - + &NetVM - - VM s&ettings + + Qube s&ettings - - VM Settings + + Qube Settings - - &Restore VMs from backup + + &Restore qubes from backup - - &Backup VMs + + Restore qubes from backup - + + &Backup qubes + + + + + Backup qubes + + + + &Global settings - + + &Qubes Network + + + + &State - - &Kill VM + + &Kill qube - - Kill selected VM + + Kill selected qube - + Set keyboard la&yout - - Set keyboard layout per VM + + Set keyboard layout per qube - + T&ype - - VM Type + + Qube Type - + &Label - + N&ame - + Show tool bar - + Show menu bar - + &Qubes OS - + Si&ze - - Size on Disk + + Size on disk - - &Run command in VM + + &Run command in qube - - Run command in the specified VM + + Run command in the specified qube - - &Clone VM + + &Clone qube - + + Clone qube + + + + Inte&rnal - - Is an internal VM + + Is an internal qube - - Show/Hide internal VMs + + Start qube for Window Tools installation - - Start VM for Window Tools installation - - - - + &IP - + Include in &backups - + Last back&up - + Search - + Ctrl+F + + + &Exit Qube Manager + + + + + Manage templates for qubes + + + + + Launch a tool that allows multiple templates to be changed at once + + + + + Default DisposableVM Template + + + + + <html><head/><body><p>Default DisposableVM Template<br/><br/>Which qube should be used by default as a template for DisposableVMs started from this one? DisposableVMs will inherit their template's configuration and installed programs.</p></body></html> + + + + + DisposableVM Template + + + + + <html><head/><body><p>DisposableVM Template</p><p><br/></p><p>Allows using this qube as a template for DisposableVMs. The DisposableVMs will inherit the VM's state (configuration, installed programs etc.), but their state will not persist between restarts. </p></body></html> + + + + + No finished thread found + + + + + Cloning qube... + + VmShutdownMonitor - - VM Shutdown + + Qube Shutdown - - The VM <b>'{0}'</b> hasn't shutdown within the last {1} seconds, do you want to kill it?<br> + + The Qube <b>'{0}'</b> hasn't shutdown within the last {1} seconds, do you want to kill it?<br> - + Kill it! - + Wait another {0} seconds... - VmUpdateInfoItem + appname - - Updates pending! - - - - - The VM must be restarted for its filesystem to reflect the template's recent committed changes. - - - - - The TemplateVM must be stopped before changes from its current session can be picked up by this VM. + + Create qube dialog - + Select backup location. + + + Nothing selected! + + + + + No file or directory selected. + + + + + exception + + + template-manager + + + Cannot change template on a running VM. + + diff --git a/qubesmanager/i18n/qubesmanager_es.ts b/qubesmanager/i18n/qubesmanager_es.ts index 6ebd6ac..6afa02b 100644 --- a/qubesmanager/i18n/qubesmanager_es.ts +++ b/qubesmanager/i18n/qubesmanager_es.ts @@ -1,96 +1,102 @@ - + + AboutDialog - + About Acerca de... - + Qubes OS Qubes OS - + Qubes OS release Versión de Qubes OS - + Release notes Notas de esta versión - + OK Ok + + + Version Information + + Backup Qubes Backup VMs - Qubes: Respaldo de VMs + Qubes: Respaldo de VMs Shutdown all running selected VMs - Apagar todas las VMs seleccionadas en funcionamiento + Apagar todas las VMs seleccionadas en funcionamiento Refresh running states. - Refrescar el estado de funcionamiento + Refrescar el estado de funcionamiento Some of the selected VMs are running (red). Running VMs cannot be backed up! - Algunas de las VMs seleccionadas estan funcionando (en rojo). Una VM en funcionamiento no puede ser respaldada. + Algunas de las VMs seleccionadas estan funcionando (en rojo). Una VM en funcionamiento no puede ser respaldada. Select VMs to backup: - Selecciones VMs a respaldar + Selecciones VMs a respaldar - + Total size: Tamaño total: - + 0 0 - + Backup destination directory Directorio de destino para los archivos de respaldo - + ... ... Target AppVM: - AppVM de destino: + AppVM de destino: Backup directory or VM command: - Directorio o comando en la VM: + Directorio o comando en la VM: - + Backup security Seguridad del respaldo - + <html><head/><body><p>Encryption / Verification<br/>passphrase:</p></body></html> <html><head/><body><p> Frase de contraseña<br/>de cifrado/verificación:</p></body></html> @@ -98,175 +104,468 @@ Frase de contraseña<br/>de cifrado/verificación:</p></body>& Encrypt backup: - Cifrar el respaldo: + Cifrar el respaldo: - + <html><head/><body><p>Reenter passphrase:</p></body></html> <html><head/><body><p>Reescribe la frase de contraseña:</p></body></html> - + You're about to perform the following actions: Se van a realizar las siguientes operaciones: - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - - + To continue press Next. Para continuar oprima Siguiente. - + Backup in progress... Respaldo en proceso... - + When finished, open file selection dialog to allow me to unmount the disk Al terminar, abrir el diálogo de selección de archivos para permitir desmontar la unidad + + + Qubes OS - Backup qubes + + + + + Select qubes to backup: + + + + + Compress the backup + + + + + Warning: unrecognized data found in configuration files. + + + + + Target qube: + + + + + Backup directory or command: + + + + + Save backup profile + + + + + Save settings as default backup profile: + + + + + <html><head/><body><p>WARNING: password will be saved in dom0 in plain text.<br/>The file is located in dom0 in /etc/qubes/backup/qubes-manager-backup .</p></body></html> + + + + + NOTE: Only running qubes are listed. + + + + + Other + Otros + + + + Turn computer off after backup is finished + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-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:'Sans Serif'; font-size:9pt;"><br /></p></body></html> + + BackupVMsWindow - + Backup in progress... Respaldo en proceso... + + + Error loading backup profile + + + + + Unable to load saved backup profile. + + + + + Qubes Backup VMs + Qubes: Respaldo de VMs + + + + BootDialog + + + Boot from device + + + + + Boot qube from device + + + + + from existing block device + + + + + from file in qube + + + + + ... + ... + + + + Clipboard + + + Warning! + ¡Atencion! + + + + Error while accessing Qubes clipboard! + + + + + Error while locking Qubes clipboard! + + + + + Error while writing to Qubes clipboard! + + + + + %n byte(s) + + + + + + + + ? bytes + + + + + CloneVMThread + + + Sucess + + + + + The qube was cloned sucessfully. + + + + + Error while cloning qube! + + + + + Command {command} failed + + + exception + + DevListWidgetItem - + Service already on the list! ¡El servicio ya está en la lista! Service can not be removed - El servicio no puede ser removido + El servicio no puede ser removido Service meminfo-writer can not be removed from the list. - El servicio meminfo-writer no puede ser removido de la lista. + El servicio meminfo-writer no puede ser removido de la lista. Invalid service ports range - Rango de puertos de servicio no válido + Rango de puertos de servicio no válido Port {0} is lower than port {1}. - El puerto {0} es menor que el puerto {1} + El puerto {0} es menor que el puerto {1} Invalid service name - El nombre de servicio no es válido + El nombre de servicio no es válido Service '{0}' is unknown. - El servicio '{0}' es desconocido. + El servicio '{0}' es desconocido. + + + + Error re-assigning device + + + + + Refresh in progress... + + + + + Refresh Applications + + + + + Dialog + + + Select devices + + + + + Which PCI devices should use the no strict reset option? + + + + + Note: use this option only if "unable to reset PCI device" error occurs. + GlobalSettings - + Qubes Global Settings Opciones de configuración global de Qubes OS - + System defaults Valores predeterminados del sistema UpdateVM: - UpdateVM: + UpdateVM: - + ClockVM: ClockVM: - + Default netVM: NetVM predeterminado - + Default template: Plantilla predeterminada - + Default memory settings Configuración de memoria predeterminada Minimal VM's memory: - Memoria mínima de la VM: + Memoria mínima de la VM: - + MiB MiB - + dom0 memory boost: Aumento de memoria de dom0: Keep dispVM in memory - Mantener DispVM en memoria + Mantener DispVM en memoria - + Kernel Kernel - + Default kernel: Kernel por defecto: - + Updates Actualizaciones - + Check for dom0 updates Buscar actualizaciones para dom0 Unknown current state - Estado actual desconocido + Estado actual desconocido Check for VM updates - Buscar actualizaciones para la VM + Buscar actualizaciones para la VM + + + + Dom0 UpdateVM: + + + + + This is updateVM ONLY for dom0; if you want to change updateVMs for other VMs, use /etc/qubes-rpc/policy/qubes.UpdatesProxy + + + + + Default DisposableVM Template: + + + + + Minimal qube memory: + + + + + Stable updates + + + + + Testing updates (security only) + + + + + Testing updates + + + + + Unstable updates + + + + + Disable checking for updates for all qubes + + + + + Default value for new qubes; to change it for existing qubes, use buttons below. + + + + + Check for qube updates by default + + + + + Enable checking for updates for all qubes + + + + + ITL template updates + + + + + ITL template updates (testing) + + + + + (Community templates disabled) + + + + + Community template updates + + + + + Community template updates (testing) + + + + + qrexec call stderr was not empty + + + + + qrexec call exited with non-zero return code + @@ -274,68 +573,187 @@ p, li { white-space: pre-wrap; } (current) - (actual) + (actual) + + + + Change state of all qubes + + + + + Are you sure you want to set all qubes to check for updates? + + + + + Are you sure you want to set all qubes to not check for updates? + + + + + ERROR! + + + + + Error managing {repo} repository settings: {msg} + + + + + Cannot detect enabled dom0 update repositories + + + + + Cannot detect enabled ITL template update repositories + + + + + qrexec call stdout did not contain "ok" as expected + + + + + Qubes Global Settings + Opciones de configuración global de Qubes OS + + + + InformationNotesDialog + + + More Information + LogDialog - + (Showing only last %d bytes of file) (Mostrando solamente los últimos %d bytes del archivo) - + Dialog Diálogo - + Copy Dom0 clipboard to Qubes clipboard Copiar el portapapeles de dom0 al portapapeles de Qubes - + Copy to Qubes clipboard Copiar al portapapeles de Qubes + + MainWindow + + + Template Manager + + + + + Change all selected to: + + + + + <html><head/><body><p>To select all qubes with a given template, double-click the template name in any row.</p><p><span style=" font-weight:600;">IMPORTANT</span>: Changes will be applied only when you click OK.</p></body></html> + + + + + Clear Selection + + + + + ManagerUtils + + + default ({}) + + + + + (none) + + + + + (current) + (actual) + + + + Unexpected characters in path. + + + + + - Global property <b>{}</b> <br> + + + + + - <b>{0}</b> for qube <b>{1}</b> <br> + + + + + Houston, we have a problem... + + + + + Whoops. A critical error has occured. This is most likely a bug in Qubes Manager.<br><br><b><i>{0}</i></b><br/>at line <b>{1}</b><br/>of file {2}.<br/><br/> + + + MultiSelectWidget - + Form Formulario - + Available Disponible - + >> >> - + > > - + < < - + << << - + Selected Seleccionado @@ -343,112 +761,217 @@ p, li { white-space: pre-wrap; } NewFwRuleDlg - + Firewall rule Regla de firewall - + You need to fill service name/port for TCP/UDP rule Necesita indicar el nombre/puerto de servicio para la regla TCP / UDP - + New Address Nueva dirección - + Protocol Protocolo Service - Servicio + Servicio - + Address Dirección - + TCP TCP - + UDP UDP - + Any Cualquier + + + Invalid address + + + + + Address '{0}' is invalid. + + + + + Invalid port or service + + + + + Port number or service '{0}' is invalid. + + + + + Port/Service + + + + + <html><head/><body><p>Port/service can be provided as either port number (e.g. 122), port range (1024-1234) or service name (e.g. smtp) . For full list of services known, see /etc/services in dom0.</p></body></html> + + NewVMDlg Create New VM - Crear nueva VM + Crear nueva VM <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Make sure that the license of the OS installed in a template VM grants you permission to run multiple instances of an installed system.</span></p></body></html> - <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Asegúrese de que la licencia del sistema operativo instalado en una plantilla de VM tenga permiso para ejecutar varias instancias de un sistema instalado.</span></p></body></html> + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Asegúrese de que la licencia del sistema operativo instalado en una plantilla de VM tenga permiso para ejecutar varias instancias de un sistema instalado.</span></p></body></html> - + Name and label: Nombre y etiqueta: my-new-vm - mi-nueva-vm + mi-nueva-vm Use this template: - Usar esta plantilla: + Usar esta plantilla: Standalone - Standalone + Standalone AppVM - AppVM + AppVM NetVM - NetVM + NetVM ProxyVM - ProxyVM + ProxyVM HVM - HVM + HVM HVM template - Plantilla de máquina virtual de hardware (HVM) + Plantilla de máquina virtual de hardware (HVM) Allow networking: - Permitir conexión a la red: + Permitir conexión a la red: + + + + Create new qube + + + + + Networking: + + + + + Template: + + + + + my-new-qube + + + + + Type: + Tipo: + + + + launch settings after creation + + + + + Basic + Básico + + + + install system from device (also available from settings) + + + + + provides network to other qubes + + + + + Initial RAM (also available from settings) + + + + + <html><head/><body><p><span style=" font-weight:600;">Caution</span>: changing these settings can compromise your system or make the qube unable to boot. Use only if you know what you are doing.</p></body></html> + + + + + Storage pool + + + + + Advanced + Avanzado + + + + (default) + + + + + MB + @@ -456,47 +979,178 @@ p, li { white-space: pre-wrap; } (default) - (por defecto) + (por defecto) Incorrect AppVM Name! - Nombre de AppVM incorrecto + Nombre de AppVM incorrecto A VM with the name <b>{0}</b> already exists in the system! - Ya existe en el sistema una VM con el nombre <b>{0}</b> + Ya existe en el sistema una VM con el nombre <b>{0}</b> - + No template available! No hay una plantillas disponibles Cannot create non-standalone VM when no compatible template exists. Create template VM first or choose to create standalone VM. - No se puede crear una VM no independiente cuando no existe una plantilla compatible. Cree primero una plantilla de VM o elija crear una VM autónoma. + No se puede crear una VM no independiente cuando no existe una plantilla compatible. Cree primero una plantilla de VM o elija crear una VM autónoma. Error creating AppVM! - Error al crear una AppVM + Error al crear una AppVM Unknown VM type, this is error in Qubes Manager - Tipo de VM desconocido, es un error en Qubes Manager + Tipo de VM desconocido, es un error en Qubes Manager Creating new {0} <b>{1}</b>... - Creando nueva {0} <b>{1}</b>... + Creando nueva {0} <b>{1}</b>... - + ERROR: {0} - ERROR: {0} + ERROR: {0} + + + + Cannot create a qube when no template exists. + + + + + Qube based on a template (AppVM) + + + + + Standalone qube copied from a template + + + + + Empty standalone qube (install your own OS) + + + + + Incorrect qube name! + + + + + A qube with the name <b>{}</b> already exists in the system! + + + + + Error creating the qube! + + + + + ERROR: {} + ERROR: {} + + + + Creating new qube <b>{0}</b>... + + + + + QubeManager + + + n/a + + + + + Yes + + + + + default ({}) + + + + + Check updates + + + + + Updates pending! + ¡Actualizaciones pendientes! + + + + Qube outdated + + + + + The qube must be restarted for its filesystem to reflect the template's recent committed changes. + + + + + Template running + + + + + The Template must be stopped before changes from its current session can be picked up by this qube. + + + + + QubesFirewallRulesModel + + + At least one rule must exist. + + + + + Last rule must be either drop all or accept all. + + + + + Rule type unknown! + + + + + No blacklist support. + + + + + it does not add up. + + + + + ICMP must be allowed. + + + + + DNS must be allowed + @@ -505,20 +1159,20 @@ p, li { white-space: pre-wrap; } Qubes Clipboard has been copied to the VM and wiped.<i/> <small>Trigger a paste operation (e.g. Ctrl-v) to insert it into an application.</small> - El portapapeles de Qubes fue enviado a la VM y ha sido borrado.<i/> + El portapapeles de Qubes fue enviado a la VM y ha sido borrado.<i/> <small>Ejecute la operación de pegar (por ejemplo Ctrl-v) para insertar el contenido en una aplicación.</small> - Qubes Clipboard fetched from VM: <b>'{0}'</b> + Qubes Clipboard fetched from VM: <b>'{0}'</b> <small>Press Ctrl-Shift-v to copy this clipboard into dest VM's clipboard.</small> - El portapapeles de Qubes ha tomado el contenido del VM: <b>'{0}'</b> + El portapapeles de Qubes ha tomado el contenido del VM: <b>'{0}'</b> <small>Presione Ctrl-Shift-v para copiarlo al portapapeles de la VM de destino.</small> Qubes dom0 updates available. - Actualizaciones disponibles para el dom0 de Qubes. + Actualizaciones disponibles para el dom0 de Qubes. @@ -526,1437 +1180,2360 @@ p, li { white-space: pre-wrap; } Open VM Manager - Abrir el gestor de VMs + Abrir el gestor de VMs Copy Dom0 clipboard - Copiar el portapapeles de dom0 + Copiar el portapapeles de dom0 Make backup - Hacer respaldo + Hacer respaldo Preferences - Preferencias + Preferencias Set default NetVM - Establecer NetVM predeterminada + Establecer NetVM predeterminada System Info - Información de sistema + Información de sistema Exit - Salir + Salir Block devices - Dispositivos de almacenamiento + Dispositivos de almacenamiento Qubes dom0 updates available. - Actualizaciones disponibles para el dom0 de Qubes. + Actualizaciones disponibles para el dom0 de Qubes. Detach {dev} {desc} ({size}) from {vm} - Desconectar {dev} {desc} ({size}) de {vm} + Desconectar {dev} {desc} ({size}) de {vm} Attach {dev} {size} {desc} - Conectar {dev} {size} {desc} + Conectar {dev} {size} {desc} Block attach/detach error! - Ocurrió un error al conectar o desconectar un dispositivo de almacenamiento + Ocurrió un error al conectar o desconectar un dispositivo de almacenamiento + + + + RefreshAppsVMThread + + + Refresh in progress (refreshing applications from {}) + + + + + Refresh failed! + ReleaseNotesDialog - + Qubes Release Notes Notas sobre esta versión de Qubes + + RemoveVMThread + + + Error removing qube! + + + + + RenameVMThread + + + Warning: rename partially unsuccessful! + + + + + Some properties could not be changed to the new name. The system has now both {} and {} qubes. To resolve this, please check and change the following properties and remove the qube {} manually.<br> + + + + + Rename error! + + + Restore Qubes Restore VMs - Qubes: Recuperar VM desde copia de respaldo + Qubes: Recuperar VM desde copia de respaldo - + Restore options Opciones de restauración - + Ignore missing templates or netvms, restore VMs anyway. Ignore las plantillas o netvms que faltan, restaure las máquinas virtuales de todos modos. ignore missing - ignore los faltantes + ignore los faltantes - + Ignore dom0 username mismatch while restoring homedir. Ignore la discrepancia del nombre de usuario dom0 mientras restaura homedir. - + ignore username mismatch ignore la discrepancia de nombre de usuario - + Verify backup integrity, do not restore the data Verificar la integridad de la copia de respaldo, no restaurar los datos - + Backup source location Ubicación del archivo de respaldo - + ... ... - + <html><head/><body><p>Backup file:<br><span style=" font-size:8pt;">(for old backup format select qubes.xml file)</span></p></body></html> <html><head/><body><p>Archivo de copia de respaldo:<br><span style=" font-size:8pt;">(para el antiguo formato de respaldo use el archivo qubes.xml)</span></p></body></html> AppVM: - AppVM: + AppVM: - + Security options Opciones de seguridad - + Encrypted backup: Copia de respaldo cifrada: - + <html><head/><body><p>Decryption / Verification<br/>passphrase:</p></body></html> <html><head/><body><p>Frase de contrasena para<br/> Descifrado / Verificación:</p></body></html> VMs to restore - VMs a restaurar + VMs a restaurar - + You're about to perform the following actions: Estás a punto de realizar las siguientes acciones: - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><br /></p></body></html> - - - - + To continue press Next. Para continuar presione Siguiente - + When finished, open file selection dialog to allow me to unmount the disk Cuando haya terminado, abra el diálogo de selección de archivos para permitirme desmontar el disco + + + Qubes OS - Restore qubes + + + + + ignore missing templates and net VMs + + + + + Qube: + + + + + Qubes to restore + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style="-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:'Sans Serif'; font-size:9pt;"><br /></p></body></html> + + + + + <html><head/><body><p><span style=" font-weight:600;">WARNING: restored dom0 files are located in ~/home-restore-&lt;timestamp&gt; directory</span></p></body></html> + + + + + RestoreThread + + + Partially restored files left in /var/tmp/restore_*, investigate them and/or clean them up + Los archivos parcialmente restaurados fueron dejados en /var/tmp/restore_*, revisalos y/o limpialos. + + + + Finished with errors! + Finalizado con errores + + + + Finished successfully! + Finalizado existosamente + RestoreVMsWindow - + Restore error! Ocurrió un error al restaurar Partially restored files left in /var/tmp/restore_*, investigate them and/or clean them up - Los archivos parcialmente restaurados fueron dejados en /var/tmp/restore_*, revisalos y/o limpialos. + Los archivos parcialmente restaurados fueron dejados en /var/tmp/restore_*, revisalos y/o limpialos. Restore aborted! - La restauración ha sido abortada + La restauración ha sido abortada Finished with errors! - Finalizado con errores + Finalizado con errores Finished successfully! - Finalizado existosamente + Finalizado existosamente Restore aborted - Restauración abortada + Restauración abortada Do you want to remove temporary files from %s? - ¿Desea eliminar los archivos temporales de% s? + ¿Desea eliminar los archivos temporales de% s? Backup error! - Ocurrió un error al respaldar + Ocurrió un error al respaldar ERROR: {0} - ERROR: {0} + ERROR: {0} - + Please unmount your backup volume and cancel the file selection dialog. Desmonte el volumen de la copia de seguridad y cancele el cuadro de diálogo de selección de archivos. Detach backup device - Desconecte el dispositivo de respaldo + Desconecte el dispositivo de respaldo - + Aborting the operation... Abortando la operación... + + + Restore qubes + + + + + Qubes Restore VMs + Qubes: Recuperar VM desde copia de respaldo + + + + RunCommandThread + + + Error while running command! + + SettingsDialog - + Settings Opciones de configuración - + <html><head/><body><p>Name &amp;&amp; label<span style=" color:#ff0000;">*</span>:</p></body></html> - + - + ---- ---- - + <html><head/><body><p>Template<span style=" color:#ff0000;">*</span>:</p></body></html> - + NetVM: - NetVM: + NetVM: - + Include in backups by default Incluir en copias de respaldo por defecto - + Run in debug mode Ejecutar en modo de depuración Start VM automatically on boot - Iniciar VM automáticamente al inicio + Iniciar VM automáticamente al inicio Seamless GUI - Interfaz gráfica integrada + Interfaz gráfica integrada - + General General - + Type: Tipo: - + --- --- - + Installed by RPM: Instalada mediante RPM: - + Disk storage Almacenamiento en disco MB - MB + MB - + Private storage max. size: Tamaño máximo del almacenamiento privado: - + System storage max. size: Tamaño máximo del almacenamiento del sistema: - + Networking Conexión a la red - + IP: IP: - + Netmask: Máscara de red: - + Gateway: Puerta de enlace: <html><head/><body><p><span style=" color:#ff0000;">* </span><span style=" color:#000000;">Cannot be changed while the VM is running</span></p></body></html> - <html><head/><body><p><span style=" color:#ff0000;">* </span><span style=" color:#000000;">No puede modificarse mientras la VM esta funcionando</span></p></body></html> + <html><head/><body><p><span style=" color:#ff0000;">* </span><span style=" color:#000000;">No puede modificarse mientras la VM esta funcionando</span></p></body></html> - + Basic Básico - + Memory/CPU Memoria / Procesador - + Initial memory: Memoria inicial: - + Max memory: Memoria máxima: - + VCPUs no.: Cantidad de VCPUs: - + Include in memory balancing Incluir en el balanceo de memoria - + Dynamic memory balancing can result in some devices not working! ¡Utilizar el balanceo dinámico de memoria puede ocasionar que algunos dispositivos no funcionen! Paths - Rutas + Rutas dir: - directorio: - - - - dir_path - + directorio: config: - config: - - - - config_path - + config: root img: - imagen root: - - - - root_img_path - + imagen root: root volatile img: - imagen no volátil: - - - - volatile_path - + imagen no volátil: private img: - imagen privada: + imagen privada: - - private_path - - - - + Other Otros NetVM for DispVM: - NetVM para máquinas virtuales desechables: + NetVM para máquinas virtuales desechables: - + Kernel Kernel - + Kernel: Kernel: - + Kernel opts: Opciones para el kernel: - + [] - + Additional drive - Unidad adicional + Unidad adicional Path: - Ruta: + Ruta: Backend domain: - Dominio del backend: - - - - ... - + Dominio del backend: New drive will be used only at next VM startup - El nuevo dispositivo será utilizado en el próximo arranque de la VM + El nuevo dispositivo será utilizado en el próximo arranque de la VM - + Advanced Avanzado Allow network access except... - Permitir acceso a la red excepto a... + Permitir acceso a la red excepto a... Allow ICMP traffic - Permitir tráfico ICMP (ping, etc.) + Permitir tráfico ICMP (ping, etc.) Deny network access except... - Denegar acceso a la red excepto a... + Denegar acceso a la red excepto a... Allow DNS queries - Permitir consultas DNS + Permitir consultas DNS Allow connections to Updates Proxy - Permitir conexión al proxy de actualizaciones + Permitir conexión al proxy de actualizaciones - + Allow full access for Permitir acceso total por - + min minutos(s) - + Firewall rules Reglas del firewall - + You've enabled dynamic memory balancing, some devices might not work! Ha habilitado el balanceo dinámico de memoria, ¡algunos dispositivos pueden fallar! To modify PCI devices you have to turn off the VM. - Para modificar los dispositivos PCI debe apagar la máquina virtual. + Para modificar los dispositivos PCI debe apagar la máquina virtual. - + Devices Dispositivos - + Applications Aplicaciones - + Checked services will be turned on. Los servicios marcados estarán encendidos. - + Unchecked services will be turned off. Los servicios no marcados estar apagados. - + Unlisted services will follow default settings. Los servicios que no están en la lista tomarán la configuración por defecto. - + Services Servicios + + + MiB + + + + + Virtual DNS: + + + + + <html><head/><body><p><span style=" color:#ff0000;">* </span><span style=" color:#000000;">Cannot be changed while the qube is running</span></p></body></html> + + + + + Networking: + + + + + Rename + + + + + <html><head/><body><p>&quot;default ([name])&quot; denotes system-wide default - if the default is changed in Global Settings, the networking qube will change. <br/>If you want to keep using a given networking qube regardless of system settings, select &quot;[name]&quot;.</p></body></html> + + + + + Start qube automatically on boot + + + + + Delete qube + + + + + Clone qube + + + + + WARNING: PVH mode requires Linux 4.11 or newer. + + + + + Virtualization + + + + + Mode: + + + + + Using PV mode exposes more hypervisor attack surface! + + + + + PVH mode is hidden since it doesn't support PCI passthrough. + + + + + PVH mode is recommended if possible (Linux kernel 4.11 or newer, no PCI passthrough). For Windows qubes always use HVM. + + + + + MB + + + + + Provides network + + + + + <html><head/><body><p>Allows using this qube as a template for DisposableVMs. The DisposableVMs will inherit the VM's state (configuration, installed programs etc.), but their state will not persist between restarts. </p><p>Setting this option will cause this qube to be listed as an option in the &quot;Default DisposableVM Template&quot; dropdown for all other qubes. </p></body></html> + + + + + Disposable VM Template + + + + + Boot qube from CDROM + + + + + Windows (with Qubes Windows Tools installed) only. +The qube must be running to enable seamless mode; this setting is not persistent. + + + + + Enable seamless mode + + + + + Windows (with Qubes Windows Tools installed) only. +The qube must be running to disable seamless mode; this setting is not persistent. + + + + + Disable seamless mode + + + + + <html><head/><body><p>Which qube should be used by default as a template for DisposableVMs started from this one? DisposableVMs will inherit their template's configuration and installed programs.<br/>For a qube to to appear in this list, it must have the &quot;DisposableVM Template&quot; checkbox enabled. </p></body></html> + + + + + Default DisposableVM Template + + + + + This qube has no networking - it will not have any network access anyway. + + + + + Networking qube does not support 'qubes-firewall' - firewall restrictions will not be applied. + + + + + Firewall has been modified manually - please use qvm-firewall for any further configuration. + + + + + Allow all outgoing Internet connections + + + + + Changing firewall settings does NOT affect existing connections. + + + + + Limit outgoing Internet connections to ... + + + + + List of allowed (whitelisted) addresses: + + + + + NOTE: To block all network access, set Networking to (none) on the Basic settings tab. This tab provides a very simplified firewall configuration. All DNS requests and ICMP (pings) will be allowed. For more granular control, use the command line tool qvm-firewall. + + + + + To modify PCI devices you have to turn off the qube. + + + + + Currently PVH qubes don't support PCI passthrough. Select another virtualization mode if you want to add PCI devices + + + + + Configure strict reset for PCI devices + + + + + Refresh Applications + + + + + Services listed here are only base Qubes services - other services may be installed and implemented. + + + + + <html><head/><body><p><span style=" font-weight:600;">Caution:</span> The Default DisposableVM Template (see the Advanced tab) has a different Networking setting than this qube. This configuration may result in unexpected network access. For example, you may have set this qube's Networking to &quot;none&quot; in order to prevent any data from being transmitted out. However, if the Default DisposableVM Template's Networking is set to &quot;sys-firewall,&quot; then a DisposableVM started from this qube may be able to transmit data out, contrary to your intention. You may wish to set the Default DisposableVM Template for this qube to one with equally restrictive Networking settings.</p></body></html> + + + + + This qube has direct network access - to configure its firewall, use a dedicated firewall qube. + + + + + StatusItem + + + TemplateManager + + + qube is running + + + + + TemplateManagerWindow + + + Errors encountered! + + + + + Errors encountered on template change in the following qubes: <br> {}. + + + + + (select template) + + + + + Qube + + + + + Current + + + + + New + + + + + Template Manager + + + + + UpdateVMThread + + + Debian DSA-4371 fix installed in {} + + + + + Failed to apply DSA-4371 fix: {} + + + + + Error on qube update! + + + + + VMBootFromDeviceWindow + + + Boot {vm} from device + + + + + ERROR! + + + + + No file or block device selected; please select one. + + + + + Warning! + ¡Atencion! + + + + Qube must be turned off before booting it from device. Please turn off the qube. + + + + + Failed to display file selection dialog + + + + + Check if the qube {0} can be started and has a file manager installed. + + + + + Boot Qube From Device + + VMSettingsWindow - + Settings: {vm} Configuración: {vm} Applying settings to <b>{0}</b>... - Aplicando la configuración a <b>{0}</b>... + Aplicando la configuración a <b>{0}</b>... - + Error while changing settings for {0}! ¡Error al cambiar la configuración de {0}! - + ERROR: {0} ERROR: {0} - + Error while saving changes: Error al guardar los cambios: - + Firewall tab: Solapa de firewall: - + Applications tab: Solapa de aplicaciones: VM configuration problem! - ¡Hubo un problema al configurar la VM! + ¡Hubo un problema al configurar la VM! The '{vm}' AppVM is not network connected to a FirewallVM!<p>You may edit the '{vm}' VM firewall rules, but these will not take any effect until you connect it to a working Firewall VM. - La AppVM '{vm}' no esta conectada una FirewallVM!<p>Puede editar las reglas de firewall de '{vm}', pero éstas no surtirán efecto hasta que la conecte a una FirewallVM en funcionamento. + La AppVM '{vm}' no esta conectada una FirewallVM!<p>Puede editar las reglas de firewall de '{vm}', pero éstas no surtirán efecto hasta que la conecte a una FirewallVM en funcionamento. (default) - (por defecto) + (por defecto) (current) - (actual) + (actual) Can't change name of a running VM. - No es posible cambiar el nombre de una VM en funcionamiento. + No es posible cambiar el nombre de una VM en funcionamiento. Can't change VM name - a VM named <b>{0}</b>already exists in the system! - No es posible cambiar el nombre de la VM - Ya existe una VM llamada <b>{0}</b>en el sistema. + No es posible cambiar el nombre de la VM - Ya existe una VM llamada <b>{0}</b>en el sistema. - + Warning! ¡Atencion! - + Max memory can not be less than initial memory.<br>Setting max memory to equal initial memory. La memoria máxima no puede ser menor que la cantidad de memoria inicial.<br>Fijando la memoria máxima al mismo valor de la memoria inicial. - + Initial memory can not be less than one tenth Max memory.<br>Setting initial memory to the minimum allowed value. La memoria inicial no puede ser menor a un décimo de la memoria máxima.<br>Fijando la memoria inicial al mínimo aceptable. + + + Delete qube (cannot delete a running qube) + + + + + To change system storage size, change properties of the underlying template. + + + + + Qube cannot be renamed! + + + + + The following qubes using this qube as a template are running: <br> {}. <br> In order to rename this qube, you must first shut them down. + + + + + Rename qube + + + + + New name: (WARNING: all other changes will be discarded) + + + + + Renaming Qube... + + + + + Qube cannot be removed! + + + + + This qube cannot be removed. It is used as: <br> {} <small>If you want to remove this qube, you should remove or change settings of each qube or setting that uses it.</small> + + + + + Delete qube + + + + + Are you absolutely sure you want to delete this qube? <br/> All qube settings and data will be irrevocably deleted. <br/> If you are sure, please enter this qube's name below. + + + + + Removal cancelled + + + + + The qube will not be removed. + + + + + Clone qube + + + + + Name for the cloned qube: + + + + + Cloning Qube... + + + + + No finished thread found + + + + + Basic tab: + + + + + Advanced tab: + + + + + Devices tab: + + + + + Sevices tab: + + + + + Cannot change this setting while this qube is used as a NetVM by the following qubes: + + + + + + Qube Settings + + VmListItem VM Shutdown Confirmation - Confirmación del apagado de la VM + Confirmación del apagado de la VM Are you sure you want to power down the following VMs: <b>{0}</b>?<br/><small>This will shutdown all the running applications within them.</small> - ¿Está seguro de que desea apagar las siguientes VMs: <b>{0}</b>?<br/><small>Esto finalizará todas las aplicaciones que estén ejecutándose en ellas.</small> + ¿Está seguro de que desea apagar las siguientes VMs: <b>{0}</b>?<br/><small>Esto finalizará todas las aplicaciones que estén ejecutándose en ellas.</small> - + Wait! ¡Atención! Some selected VMs are running. Running VMs can not be backuped. Please shut them down or remove them from the list. - Algunas de las VMs seleccionadas estan funcionando. Una VM en funcionamiento no puede ser respaldada. Por favor, apáguela o quítela de la lista. + Algunas de las VMs seleccionadas estan funcionando. Una VM en funcionamiento no puede ser respaldada. Por favor, apáguela o quítela de la lista. - + Enter backup target location first. Indique antes el destino de la copia de respaldo. - + Selected directory do not exists or not a directory (%s). El directorio seleccionado no existe, o no es un directorio (%s). - + Enter passphrase for backup encryption/verification first. Introduzca antes la frase de contraseña de cifrado y verificación. - + Enter the same passphrase in both fields. Introduzca la misma frase de contraseña en ambos campos. Error while preparing backup. - Ocurrió un error en la preparación del respaldo. + Ocurrió un error en la preparación del respaldo. ERROR: {0} - ERROR: {0} + ERROR: {0} Backup aborted. - Copia de respaldo abortada. + Copia de respaldo abortada. Backup aborted - Copia de respaldo abortada. + Copia de respaldo abortada. Do you want to remove temporary files from %s? - ¿Desea borrar los archivos temporales de %s? + ¿Desea borrar los archivos temporales de %s? - + Backup error. - Error en la copia de respaldo. + Error en la copia de respaldo. - + Backup error! - Error en la copia de respaldo. + Error en la copia de respaldo. - + ERROR: {} ERROR: {} - + Backup finished. Copia de respaldo terminada. - + Please unmount your backup volume and cancel the file selection dialog. Por favor, desmonte el volumen de respaldo y cancele el diálogo de selección de archivos. + + + Backup aborted! + + + + + Backup error + + + + + ERROR: Aborted + + + + + Error cancelling backup! + + VmManagerWindow - + Warning! - ¡Cuidado! + ¡Cuidado! This Template VM cannot be removed, because there is at least one AppVM that is based on it.<br><small>If you want to remove this Template VM and all the AppVMs based on it,you should first remove each individual AppVM that uses this template.</small> - Esta VM modelo (TemplateVM) no puede ser removida debido a que existe al menos una AppVM que esta basada en ella.<br><small>Si desea remover esta TemplateVM debe borrar antes todas las AppVM que la utilizan de modelo.</small> + Esta VM modelo (TemplateVM) no puede ser removida debido a que existe al menos una AppVM que esta basada en ella.<br><small>Si desea remover esta TemplateVM debe borrar antes todas las AppVM que la utilizan de modelo.</small> VM Removal Confirmation - Confirmación de borrado de VM + Confirmación de borrado de VM Are you sure you want to remove the VM <b>'{0}'</b>?<br>All data on this VM's private storage will be lost!<br><br>Type the name of the VM (<b>{1}</b>) below to confirm: - ¿Está seguro que desea borrar la VM <b>'{0}'</b>?<br>Toda la información contenida en su almacenamiento privado se perderá<br><br>Para confirmar que desea esto, introduzca el nombre completo de la VM (<b>{1}</b>) debajo: + ¿Está seguro que desea borrar la VM <b>'{0}'</b>?<br>Toda la información contenida en su almacenamiento privado se perderá<br><br>Para confirmar que desea esto, introduzca el nombre completo de la VM (<b>{1}</b>) debajo: VM removal confirmation failed - La confirmación de borrado del VM falló. + La confirmación de borrado del VM falló. - + Entered name did not match! Not removing {0}. - ¡El nombre ingresado no coincide! La VM {0} no será borrada. + ¡El nombre ingresado no coincide! La VM {0} no será borrada. Removing VM: <b>{0}</b>... - Borrando VM: <b>{0}</b>... + Borrando VM: <b>{0}</b>... VM '{0}' has been removed. - La VM '{0}' ha sido borrada. + La VM '{0}' ha sido borrada. Error removing VM! - Ocurrió un error al borrar la VM. + Ocurrió un error al borrar la VM. - + ERROR: {0} - ERROR: {0} + ERROR: {0} Qubes clone VM - Qubes: Clonado de VMs + Qubes: Clonado de VMs Enter name for VM <b>{}</b> clone: - Introduzca el nombre del clon de <b>{}</b>: + Introduzca el nombre del clon de <b>{}</b>: Cloning VM <b>{0}</b> to <b>{1}</b>... - Clonando VM <b>{0}</b> como <b>{1}</b>... + Clonando VM <b>{0}</b> como <b>{1}</b>... Error while cloning VM - Error al clonar la VM + Error al clonar la VM Exception while cloning:<br>{0} - Ocurrió una excepción mientras se clonaba<br>{0} + Ocurrió una excepción mientras se clonaba<br>{0} Error unpausing VM! - Ocurrió un error al reanudar la VM + Ocurrió un error al reanudar la VM Starting '{0}'... - Iniciando '{0}'... + Iniciando '{0}'... VM '{0}' has been started. - La VM '{0}' se ha iniciado. + La VM '{0}' se ha iniciado. Error starting VM <b>'{0}'</b>: {1} - Ocurrió un error al iniciar la VM <b>'{0}'</b>: {1} + Ocurrió un error al iniciar la VM <b>'{0}'</b>: {1} Error starting VM: %s - Ocurrió un error al iniciar la VM: %s + Ocurrió un error al iniciar la VM: %s Error starting VM! - Ocurrió un error al iniciar la VM + Ocurrió un error al iniciar la VM You need to install 'qubes-windows-tools' package to use this option - Debe instalar el paquete 'qubes-windows-tools' para utilizar esta opción + Debe instalar el paquete 'qubes-windows-tools' para utilizar esta opción VM '{0}' has been started. Start Qubes Tools installation from attached CD - La VM '{0}' ha sido iniciada. Ejecute el instalador de Qubes Tools desde la unidad de CD que se ha conectado + La VM '{0}' ha sido iniciada. Ejecute el instalador de Qubes Tools desde la unidad de CD que se ha conectado Error pausing VM! - Ocurrió un error al pausar la VM. + Ocurrió un error al pausar la VM. VM Shutdown Confirmation - Confirmación al detener VM + Confirmación al detener VM Are you sure you want to power down the VM <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this VM.</small> - ¿Está seguro que desea terminar la VM <b>'{0}'</b>?<br><small>Esto finalizará todas las aplicaciones que se encuentren ejecutando en ella.</small> + ¿Está seguro que desea terminar la VM <b>'{0}'</b>?<br><small>Esto finalizará todas las aplicaciones que se encuentren ejecutando en ella.</small> Error shutting down VM! - Ocurrió un error al apagar la VM + Ocurrió un error al apagar la VM VM '{0}' is shutting down... - La VM '{0}' se esta deteniendo... + La VM '{0}' se esta deteniendo... VM Restart Confirmation - Confirmación al reiniciar VM + Confirmación al reiniciar VM Are you sure you want to restart the VM <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this VM.</small> - ¿Está seguro que desea reiniciar la VM <b>'{0}'</b>?<br><small>Esto finalizará todas las aplicaciones que se encuentren ejecutando en ella.</small> + ¿Está seguro que desea reiniciar la VM <b>'{0}'</b>?<br><small>Esto finalizará todas las aplicaciones que se encuentren ejecutando en ella.</small> VM Kill Confirmation - Confirmación al apagar VM + Confirmación al apagar VM Are you sure you want to kill the VM <b>'{0}'</b>?<br><small>This will end <b>(not shutdown!)</b> all the running applications within this VM.</small> - ¿Está seguro que desea apagar la VM <b>'{0}'</b>?<br><small>Esto terminará<b>(de manera abrupta)</b> todas las aplicaciones que se encuentren ejecutando en ella.</small> + ¿Está seguro que desea apagar la VM <b>'{0}'</b>?<br><small>Esto terminará<b>(de manera abrupta)</b> todas las aplicaciones que se encuentren ejecutando en ella.</small> Error while killing VM! - Ocurrió un error al terminar la VM + Ocurrió un error al terminar la VM - + <b>An exception ocurred while killing {0}.</b><br>ERROR: {1} - <b>Ocurrió una excepción al terminar {0}.</b><br>ERROR: {1} + <b>Ocurrió una excepción al terminar {0}.</b><br>ERROR: {1} VM Update Confirmation - Confirmación al actualizar VM + Confirmación al actualizar VM <b>{0}</b><br>The VM has to be running to be updated.<br>Do you want to start it?<br> - <b>{0}</b><br>La VM debe estar en funcionamiento para poder actualizarse.<br>¿Desea iniciarla?<br> + <b>{0}</b><br>La VM debe estar en funcionamiento para poder actualizarse.<br>¿Desea iniciarla?<br> <b>{0}</b><br>Please wait for the updater to launch... - <b>{0}</b><br>Por favor espere mientras se inicia el proceso de actualización... + <b>{0}</b><br>Por favor espere mientras se inicia el proceso de actualización... Error VM update! - Ocurrió un error al actualizar la VM + Ocurrió un error al actualizar la VM - + Qubes command entry - Qubes: Ejecución de comandos + Qubes: Ejecución de comandos - + Run command in <b>{}</b>: - Ejecutar el comando en <b>{}</b>: + Ejecutar el comando en <b>{}</b>: Error while running command - Ocurrió un error al ejecutar el comando + Ocurrió un error al ejecutar el comando Exception while running command:<br>{0} - Ocurrió una excepción al ejecutar el comando:<br>{0} + Ocurrió una excepción al ejecutar el comando:<br>{0} Detach {dev} {size} {desc} - Desconecta {dev} {size} {desc} + Desconecta {dev} {size} {desc} Attach {dev} {size} {desc} - Conecta {dev} {size} {desc} + Conecta {dev} {size} {desc} Block attach/detach error! - Ocurrió un error al conectar o desconectar un dispositivo + Ocurrió un error al conectar o desconectar un dispositivo Qubes VM Manager - Qubes: Gestor de VMs + Qubes: Gestor de VMs - + Search: - Buscar: + Buscar: - + Nowy wiersz - Nueva fila + Nueva fila - + Name - Nombre + Nombre VM name - Nombre de la VM + Nombre de la VM - + State - Estado + Estado - + Update info - Información de actualizacion + Información de actualizacion - + Template - Plantilla + Plantilla VM's template - Plantilla de la VM + Plantilla de la VM - + NetVM - NetVM + NetVM VM's netVM - NetVM de la VM + NetVM de la VM CPU - CPU + CPU CPU Graph - Gráfico de CPU + Gráfico de CPU CPU usage graph - Gráfico de uso de CPU + Gráfico de uso de CPU MEM - MEM + MEM MEM Graph - Gráfico de memoria + Gráfico de memoria Memory usage graph - Gráfico de uso de memoria + Gráfico de uso de memoria Size - Tamaño + Tamaño - + Internal - Interno + Interno - + IP - IP + IP Backups - Respaldos + Respaldos - + Last backup - Ultimo respaldo + Ultimo respaldo - + &System - &Sistema + &Sistema - + &View - &Ver + &Ver V&M - V&M + V&M - + &Logs - Registros + Registros Attach/detach &block devices - Conectar/desconectar almacenamiento + Conectar/desconectar almacenamiento - + &About - Acerca de + Acerca de - + toolBar - toolBar + toolBar Create &New VM - Crear &nueva VM + Crear &nueva VM Create a new VM - Crear nueva VM + Crear nueva VM &Delete VM - Borrar VM + Borrar VM Remove an existing VM (must be stopped first) - Remover una VM existente (debe detenerse primero) + Remover una VM existente (debe detenerse primero) Start/Resume V&M - Iniciar/continuar la VM + Iniciar/continuar la VM Start/Resume selected VM - Iniciar/continuar la VM seleccionada + Iniciar/continuar la VM seleccionada &Pause VM - &Pausar la VM + &Pausar la VM Pause selected VM - Pausar la VM seleccionada + Pausar la VM seleccionada &Shutdown VM - Apagar la VM + Apagar la VM Shutdown selected VM - Apagar la VM seleccionada + Apagar la VM seleccionada Restar&t VM - Reiniciar la VM + Reiniciar la VM Restart selected VM - Reiniciar la VM seleccionada + Reiniciar la VM seleccionada - + Add/remove app s&hortcuts - Añadir/remover accesos directos a aplicaciones + Añadir/remover accesos directos a aplicaciones Add/remove app shortcuts for this VM - Añadir/remover accesos directos a aplicaciones de esta VM + Añadir/remover accesos directos a aplicaciones de esta VM &Update VM - Actualizar VM + Actualizar VM Update VM system - Actualizar el sistema de la VM + Actualizar el sistema de la VM Attach/detach &audio-input to the VM - Conectar/desconectar entrada de &audio a esta VM + Conectar/desconectar entrada de &audio a esta VM Attach/detach audio-input to the VM - Conectar/desconectar entrada de audio a la VM + Conectar/desconectar entrada de audio a la VM Show/Hide inactive VMs - Mostrar/Ocultar VMs inactivas + Mostrar/Ocultar VMs inactivas Edit VM &firewall rules - Editar las reglas de &firewall de la VM + Editar las reglas de &firewall de la VM Edit VM firewall rules - Editar las reglas de firewall de la VM + Editar las reglas de firewall de la VM - + Show graphs - Mostrar gráficos + Mostrar gráficos - + Show Graphs - Mostrar gráficos + Mostrar gráficos - + Options - Opciones + Opciones - + View - Ver + Ver &CPU - &CPU + &CPU CPU &Graph - &Gráfico de CPU + &Gráfico de CPU &MEM - &MEM + &MEM M&EM Graph - Gráfico de m&emoria + Gráfico de m&emoria - + &Template - Plantilla + Plantilla - + &NetVM - &NetVM + &NetVM VM s&ettings - Configuración de VM + Configuración de VM VM Settings - Configuración de VM + Configuración de VM &Restore VMs from backup - &Restaurar VMs desde copia de respaldo + &Restaurar VMs desde copia de respaldo &Backup VMs - Respaldar VMs + Respaldar VMs - + &Global settings - Opciones de configuración &globales + Opciones de configuración &globales - + &State - E&stado + E&stado &Kill VM - Terminar VM + Terminar VM Kill selected VM - Terminar la VM seleccionada + Terminar la VM seleccionada - + Set keyboard la&yout - Establecer el diseño de teclado + Establecer el diseño de teclado Set keyboard layout per VM - Establecer el diseño de teclado en cada VM + Establecer el diseño de teclado en cada VM - + T&ype - Tipo + Tipo VM Type - Tipo de VM + Tipo de VM - + &Label - Etiqueta + Etiqueta - + N&ame - Nombre + Nombre - + Show tool bar - Mostrar barra de herramientas + Mostrar barra de herramientas - + Show menu bar - Mostrar barra de menús + Mostrar barra de menús - + &Qubes OS - &Qubes OS + &Qubes OS - + Si&ze - Tamaño + Tamaño Size on Disk - Tamaño en Disco + Tamaño en Disco &Run command in VM - Ejecutar comando en VM + Ejecutar comando en VM Run command in the specified VM - Ejecutar el comando en la VM especificada + Ejecutar el comando en la VM especificada &Clone VM - &Clonar VM + &Clonar VM - + Inte&rnal - Interna + Interna Is an internal VM - Es una VM interna + Es una VM interna Show/Hide internal VMs - Mostrar/Ocultar VMs internas + Mostrar/Ocultar VMs internas Start VM for Window Tools installation - Iniciar VM para la instalación de Qubes Windows Tools + Iniciar VM para la instalación de Qubes Windows Tools - + &IP - IP + IP - + Include in &backups - Incluir en copias de respaldo + Incluir en copias de respaldo - + Last back&up - Ultimo respaldo + Ultimo respaldo - + Search - Buscar + Buscar - + Ctrl+F - Ctrl+F + Ctrl+F + + + + Manager settings unreadable + + + + + Qube Manager settings cannot be parsed. Previously saved display settings may not be restored correctly. +Error: {} + + + + + Loading Qube Manager... + + + + + Qube Manager + + + + + This qube cannot be removed. It is used as: <br> {} <small>If you want to remove this qube, you should remove or change settings of each qube or setting that uses it.</small> + + + + + Qube Removal Confirmation + + + + + Are you sure you want to remove the Qube <b>'{0}'</b>?<br> All data on this Qube's private storage will be lost!<br><br>Type the name of the Qube (<b>{1}</b>) below to confirm: + + + + + Qube removal confirmation failed + + + + + Qubes clone Qube + + + + + Enter name for Qube <b>{}</b> clone: + + + + + Name already in use! + + + + + There already exists a qube called '{}'. Cloning aborted. + + + + + Cloning Qube... + + + + + Error unpausing Qube! + + + + + Error pausing Qube! + + + + + Qube Shutdown Confirmation + + + + + Are you sure you want to power down the Qube <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this Qube.</small> + + + + + Error shutting down Qube! + + + + + Qube Restart Confirmation + + + + + Are you sure you want to restart the Qube <b>'{0}'</b>?<br><small>This will shutdown all the running applications within this Qube.</small> + + + + + Qube <b>'{0}'</b> is not running. Are you absolutely sure you want to try to kill it?<br><small>This will end <b>(not shutdown!)</b> all the running applications within this Qube.</small> + + + + + Are you sure you want to kill the Qube <b>'{0}'</b>?<br><small>This will end <b>(not shutdown!)</b> all the running applications within this Qube.</small> + + + + + Qube Kill Confirmation + + + + + Error while killing Qube! + + + + + Qube Update Confirmation + + + + + <b>{0}</b><br>The Qube has to be running to be updated.<br>Do you want to start it?<br> + + + + + Qube name + + + + + Qube template + + + + + Qube netVM + + + + + Disk +usage + + + + + Include +in backups + + + + + Default DisposableVM +Template + + + + + DisposableVM +Template + + + + + Virtualization Mode + + + + + &Qube + + + + + Create &new qube + + + + + Create a new qube + + + + + &Delete qube + + + + + Remove an existing qube (must be stopped first) + + + + + Start/Resu&me qube + + + + + Start/Resume selected qube + + + + + &Pause qube + + + + + <p>Pause selected qube</p><p>Stops all CPU activity in the selected VM until the VM is unpaused. This action does not change how much memory is allocated to the VM. (EXPERIMENTAL)</p> + + + + + &Shutdown qube + + + + + Shutdown selected qube + + + + + Restar&t qube + + + + + Restart selected qube + + + + + Add/remove app shortcuts for this qube + + + + + &Update qube + + + + + Update qube system + + + + + Edit qube &firewall rules + + + + + Edit qube firewall rules + + + + + Qube s&ettings + + + + + Qube Settings + + + + + &Restore qubes from backup + + + + + Restore qubes from backup + + + + + &Backup qubes + + + + + Backup qubes + + + + + &Qubes Network + + + + + &Kill qube + + + + + Kill selected qube + + + + + Set keyboard layout per qube + + + + + Qube Type + + + + + Size on disk + + + + + &Run command in qube + + + + + Run command in the specified qube + + + + + &Clone qube + + + + + Clone qube + + + + + Is an internal qube + + + + + Start qube for Window Tools installation + + + + + &Exit Qube Manager + + + + + Manage templates for qubes + + + + + Launch a tool that allows multiple templates to be changed at once + + + + + Default DisposableVM Template + + + + + <html><head/><body><p>Default DisposableVM Template<br/><br/>Which qube should be used by default as a template for DisposableVMs started from this one? DisposableVMs will inherit their template's configuration and installed programs.</p></body></html> + + + + + DisposableVM Template + + + + + <html><head/><body><p>DisposableVM Template</p><p><br/></p><p>Allows using this qube as a template for DisposableVMs. The DisposableVMs will inherit the VM's state (configuration, installed programs etc.), but their state will not persist between restarts. </p></body></html> + + + + + No finished thread found + + + + + Cloning qube... + @@ -1964,48 +3541,102 @@ p, li { white-space: pre-wrap; } VM Shutdown - Apagar VM + Apagar VM The VM <b>'{0}'</b> hasn't shutdown within the last {1} seconds, do you want to kill it?<br> - La VM <b>'{0}'</b> no fue apagada dentro de los últimos {1} segundos, ¿quieres terminarla?<br> + La VM <b>'{0}'</b> no fue apagada dentro de los últimos {1} segundos, ¿quieres terminarla?<br> - + Kill it! - Terminar el VM + Terminar el VM - + Wait another {0} seconds... - Esperar {0} segundos más... + Esperar {0} segundos más... + + + + Qube Shutdown + + + + + The Qube <b>'{0}'</b> hasn't shutdown within the last {1} seconds, do you want to kill it?<br> + VmUpdateInfoItem - + Updates pending! - ¡Actualizaciones pendientes! + ¡Actualizaciones pendientes! The VM must be restarted for its filesystem to reflect the template's recent committed changes. - La VM debe reiniciarse para que su sistema de archivos refleje los cambios confirmados recientes de la plantilla. + La VM debe reiniciarse para que su sistema de archivos refleje los cambios confirmados recientes de la plantilla. The TemplateVM must be stopped before changes from its current session can be picked up by this VM. - El TemplateVM debe detenerse antes de que los cambios de su sesión actual puedan ser recogidos por esta VM. + El TemplateVM debe detenerse antes de que los cambios de su sesión actual puedan ser recogidos por esta VM. + + + + appname + + + Qubes Backup VMs + Qubes: Respaldo de VMs + + + + Create qube + + + + + Qubes Global Settings + Opciones de configuración global de Qubes OS + + + + Qubes Restore VMs + Qubes: Recuperar VM desde copia de respaldo dialog - + Select backup location. Seleccione el destino de los archivos de respaldo. + + + Nothing selected! + + + + + No file or directory selected. + + - \ No newline at end of file + + exception + + + template-manager + + + Cannot change template on a running VM. + + + + diff --git a/qubesmanager/qube_manager.py b/qubesmanager/qube_manager.py index fc409b2..feb388d 100644 --- a/qubesmanager/qube_manager.py +++ b/qubesmanager/qube_manager.py @@ -159,6 +159,7 @@ class VmRowInTable: if not event or event.endswith(':netvm'): self.netvm_widget.update() if not event or event.endswith(':internal'): + # this is a feature, not a property; TODO: fix event handling self.internal_widget.update() if not event or event.endswith(':ip'): self.ip_widget.update() @@ -298,18 +299,18 @@ class UpdateVMThread(common_threads.QubesThread): if stdout == b'changed=yes\n': subprocess.call( ['notify-send', '-i', 'dialog-information', - 'Debian DSA-4371 fix installed in {}'.format( + self.tr('Debian DSA-4371 fix installed in {}').format( self.vm.name)]) elif stdout == b'changed=no\n': pass else: raise exc.QubesException( - "Failed to apply DSA-4371 fix: {}".format( + self.tr("Failed to apply DSA-4371 fix: {}").format( stderr.decode('ascii'))) self.vm.run_service("qubes.InstallUpdatesGUI", user="root", wait=False) except (ChildProcessError, exc.QubesException) as ex: - self.msg = ("Error on qube update!", str(ex)) + self.msg = (self.tr("Error on qube update!"), str(ex)) # pylint: disable=too-few-public-methods @@ -322,7 +323,7 @@ class RunCommandThread(common_threads.QubesThread): try: self.vm.run(self.command_to_run) except (ChildProcessError, exc.QubesException) as ex: - self.msg = ("Error while running command!", str(ex)) + self.msg = (self.tr("Error while running command!"), str(ex)) class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow): @@ -519,6 +520,11 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow): # correctly initialized self.table.selectRow(0) + def setup_application(self): + self.qt_app.setApplicationName(self.tr("Qube Manager")) + self.qt_app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) + + def keyPressEvent(self, event): # pylint: disable=invalid-name if event.key() == QtCore.Qt.Key_Escape: self.searchbox.clear() @@ -536,18 +542,18 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow): if thread.msg_is_success: QtWidgets.QMessageBox.information( self, - self.tr(title), - self.tr(msg)) + title, + msg) else: QtWidgets.QMessageBox.warning( self, - self.tr(title), - self.tr(msg)) + title, + msg) self.threads_list.remove(thread) return - raise RuntimeError('No finished thread found') + raise RuntimeError(self.tr('No finished thread found')) def closeEvent(self, event): # pylint: disable=invalid-name @@ -888,7 +894,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow): "Cloning Qube..."), "", 0, 0) self.progress.setCancelButton(None) self.progress.setModal(True) - self.progress.setWindowTitle("Cloning qube...") + self.progress.setWindowTitle(self.tr("Cloning qube...")) self.progress.show() thread = common_threads.CloneVMThread(vm, clone_name) @@ -1299,10 +1305,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow): def main(): - manager_utils.run_asynchronous( - "Qube Manager", - "qubes-manager", - VmManagerWindow) + manager_utils.run_asynchronous(VmManagerWindow) if __name__ == "__main__": diff --git a/qubesmanager/restore.py b/qubesmanager/restore.py index edc4baa..6b62b44 100644 --- a/qubesmanager/restore.py +++ b/qubesmanager/restore.py @@ -20,7 +20,7 @@ # # -from PyQt5 import QtCore, QtWidgets # pylint: disable=import-error +from PyQt5 import QtCore, QtWidgets, QtGui # pylint: disable=import-error import os import os.path import logging @@ -110,6 +110,10 @@ class RestoreVMsWindow(ui_restoredlg.Ui_Restore, QtWidgets.QWizard): backup_utils.fill_appvms_list(self) + def setup_application(self): + self.qt_app.setApplicationName(self.tr("Qubes Restore VMs")) + self.qt_app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) + @QtCore.pyqtSlot(name='on_select_path_button_clicked') def select_path_button_clicked(self): backup_utils.select_path_button_clicked(self, True) @@ -290,7 +294,7 @@ class RestoreVMsWindow(ui_restoredlg.Ui_Restore, QtWidgets.QWizard): def main(): - utils.run_synchronous("Qubes Restore VMs", RestoreVMsWindow) + utils.run_synchronous(RestoreVMsWindow) if __name__ == "__main__": diff --git a/qubesmanager/settings.py b/qubesmanager/settings.py index 6d267b1..52e1800 100644 --- a/qubesmanager/settings.py +++ b/qubesmanager/settings.py @@ -79,9 +79,9 @@ class RenameVMThread(common_threads.QubesThread): self.vm.name) + list_text) except qubesadmin.exc.QubesException as ex: - self.msg = ("Rename error!", str(ex)) + self.msg = (self.tr("Rename error!"), str(ex)) except Exception as ex: # pylint: disable=broad-except - self.msg = ("Rename error!", repr(ex)) + self.msg = (self.tr("Rename error!"), repr(ex)) # pylint: disable=too-few-public-methods @@ -112,7 +112,7 @@ class RefreshAppsVMThread(common_threads.QubesThread): if not_running: vm.shutdown() except Exception as ex: # pylint: disable=broad-except - self.msg = ("Refresh failed!", str(ex)) + self.msg = (self.tr("Refresh failed!"), str(ex)) # pylint: disable=too-many-instance-attributes @@ -222,6 +222,10 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): self.refresh_apps_button.clicked.connect( self.refresh_apps_button_pressed) + def setup_application(self): + self.qt_app.setApplicationName(self.tr("Qube Settings")) + self.qt_app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) + def clear_threads(self): for thread in self.threads_list: if thread.isFinished(): @@ -233,8 +237,8 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): (title, msg) = thread.msg QtWidgets.QMessageBox.warning( self, - self.tr(title), - self.tr(msg)) + title, + msg) self.threads_list.remove(thread) @@ -243,7 +247,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): return - raise RuntimeError('No finished thread found') + raise RuntimeError(self.tr('No finished thread found')) def keyPressEvent(self, event): # pylint: disable=invalid-name if event.key() == QtCore.Qt.Key_Enter \ @@ -278,16 +282,16 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): try: ret_tmp = self.__apply_basic_tab__() if ret_tmp: - ret += ["Basic tab:"] + ret_tmp + ret += [self.tr("Basic tab:")] + ret_tmp ret_tmp = self.__apply_advanced_tab__() if ret_tmp: - ret += ["Advanced tab:"] + ret_tmp + ret += [self.tr("Advanced tab:")] + ret_tmp ret_tmp = self.__apply_devices_tab__() if ret_tmp: - ret += ["Devices tab:"] + ret_tmp + ret += [self.tr("Devices tab:")] + ret_tmp ret_tmp = self.__apply_services_tab__() if ret_tmp: - ret += ["Sevices tab:"] + ret_tmp + ret += [self.tr("Sevices tab:")] + ret_tmp except qubesadmin.exc.QubesException as qex: ret.append(self.tr('Error while saving changes: ') + str(qex)) except Exception as ex: # pylint: disable=broad-except @@ -587,8 +591,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): thread.finished.connect(self.clear_threads) self.progress = QtWidgets.QProgressDialog( - self.tr( - "Renaming Qube..."), "", 0, 0) + self.tr("Renaming Qube..."), "", 0, 0) self.progress.setCancelButton(None) self.progress.setModal(True) self.thread_closes = True @@ -644,8 +647,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): self.threads_list.append(thread) self.progress = QtWidgets.QProgressDialog( - self.tr( - "Cloning Qube..."), "", 0, 0) + self.tr("Cloning Qube..."), "", 0, 0) self.progress.setCancelButton(None) self.progress.setModal(True) self.thread_closes = True @@ -727,9 +729,9 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): domains_using = [vm.name for vm in self.vm.connected_vms] if domains_using: self.provides_network_checkbox.setEnabled(False) - self.provides_network_checkbox.setToolTip( + self.provides_network_checkbox.setToolTip(self.tr( "Cannot change this setting while this qube is used as a " - "NetVM by the following qubes:\n" + + "NetVM by the following qubes:\n") + "\n".join(domains_using)) def enable_seamless(self): @@ -1218,8 +1220,7 @@ def main(args=None): args = parser.parse_args(args) vm = args.domains.pop() - utils.run_synchronous("Qube Settings", - functools.partial(VMSettingsWindow, vm, args.tab)) + utils.run_synchronous(functools.partial(VMSettingsWindow, vm, args.tab)) if __name__ == "__main__": diff --git a/qubesmanager/table_widgets.py b/qubesmanager/table_widgets.py index 9ec9c1d..a5d4a97 100644 --- a/qubesmanager/table_widgets.py +++ b/qubesmanager/table_widgets.py @@ -295,15 +295,16 @@ class VMPropertyItem(QtWidgets.QTableWidgetItem): if self.empty_function(val): text = "" elif val is None: - text = "n/a" + text = QtCore.QCoreApplication.translate("QubeManager", "n/a") elif val is True: - text = "Yes" + text = QtCore.QCoreApplication.translate("QubeManager", "Yes") else: text = str(val) if self.check_default and hasattr(self.vm, self.property_name) and \ self.vm.property_is_default(self.property_name): - text = 'default (' + text + ')' + text = QtCore.QCoreApplication.translate( + "QubeManager", 'default ({})').format(text) self.setText(text) def __lt__(self, other): @@ -338,7 +339,8 @@ class VmInternalItem(VMPropertyItem): def update(self): internal = self.vm.features.get('internal', False) - self.setText("Yes" if internal else "") + self.setText(QtCore.QCoreApplication.translate( + "QubeManager", "Yes") if internal else "") # features man qvm-features @@ -416,19 +418,28 @@ class VmUpdateInfoWidget(QtWidgets.QWidget): self.value = state self.table_item.set_value(state) if state == "update": - label_text = "Check updates" + label_text = "{}".format( + QtCore.QCoreApplication.translate("QubeManager", + "Check updates")) icon_path = ":/update-recommended.png" - tooltip_text = self.tr("Updates pending!") + tooltip_text = QtCore.QCoreApplication.translate("QubeManager", + "Updates pending!") elif state == "outdated": - label_text = "Qube outdated" + label_text = "{}".format( + QtCore.QCoreApplication.translate("QubeManager", + "Qube outdated")) icon_path = ":/outdated.png" - tooltip_text = self.tr( + tooltip_text = QtCore.QCoreApplication.translate( + "QubeManager", "The qube must be restarted for its filesystem to reflect the " "template's recent committed changes.") elif state == "to-be-outdated": - label_text = "Template running" + label_text = "{}".format( + QtCore.QCoreApplication.translate("QubeManager", + "Template running")) icon_path = ":/to-be-outdated.png" - tooltip_text = self.tr( + tooltip_text = QtCore.QCoreApplication.translate( + "QubeManager", "The Template must be stopped before changes from its " "current session can be picked up by this qube.") else: @@ -466,7 +477,8 @@ class VmSizeOnDiskItem(QtWidgets.QTableWidgetItem): def update(self): if self.vm.qid == 0: - self.setText("n/a") + self.setText(QtCore.QCoreApplication.translate("QubeManager", + "n/a")) else: self.value = 10 self.value = round(self.vm.get_disk_utilization()/(1024*1024), 2) diff --git a/qubesmanager/template_manager.py b/qubesmanager/template_manager.py index 0cde1c8..796b29f 100644 --- a/qubesmanager/template_manager.py +++ b/qubesmanager/template_manager.py @@ -62,11 +62,15 @@ class TemplateManagerWindow( self.vm_list.show() + def setup_application(self): + self.qt_app.setApplicationName(self.tr("Template Manager")) + self.qt_app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) + def prepare_lists(self): self.templates = [vm.name for vm in self.qubes_app.domains if vm.klass == 'TemplateVM'] - self.change_all_combobox.addItem('(select template)') + self.change_all_combobox.addItem(self.tr('(select template)')) for template in self.templates: self.change_all_combobox.addItem(template) @@ -84,7 +88,8 @@ class TemplateManagerWindow( self.rows_in_table[vm.name] = row row_count += 1 - self.vm_list.setHorizontalHeaderLabels(['', 'Qube', 'Current', 'New']) + self.vm_list.setHorizontalHeaderLabels( + ['', self.tr('Qube'), self.tr('Current'), self.tr('New')]) self.vm_list.resizeColumnsToContents() def initialize_table_events(self): @@ -258,7 +263,8 @@ class StatusItem(QtWidgets.QTableWidgetItem): if self.state: self.setIcon(QtGui.QIcon.fromTheme('dialog-warning')) - self.setToolTip("Cannot change template on a running VM.") + self.setToolTip(QtCore.QCoreApplication.translate( + "template-manager", "Cannot change template on a running VM.")) else: self.setIcon(QtGui.QIcon()) self.setToolTip("") @@ -331,7 +337,9 @@ class VMRow: self.current_item) # new template - self.dummy_new_item = QtWidgets.QTableWidgetItem("qube is running") + self.dummy_new_item = QtWidgets.QTableWidgetItem( + QtCore.QCoreApplication.translate("TemplateManager", + "qube is running")) self.new_item = NewTemplateItem(self.vm, templates, table_widget) table_widget.setItem(row_no, columns.index('New template'), @@ -378,9 +386,7 @@ class VMRow: def main(): - utils.run_asynchronous("Template Manager", - "qubes-manager", - TemplateManagerWindow) + utils.run_asynchronous(TemplateManagerWindow) if __name__ == "__main__": diff --git a/qubesmanager/utils.py b/qubesmanager/utils.py index 5684244..4830053 100644 --- a/qubesmanager/utils.py +++ b/qubesmanager/utils.py @@ -30,7 +30,7 @@ import sys import quamash from qubesadmin import events -from PyQt5 import QtWidgets # pylint: disable=import-error +from PyQt5 import QtWidgets, QtCore # pylint: disable=import-error from PyQt5.QtGui import QIcon # pylint: disable=import-error @@ -96,10 +96,11 @@ def prepare_choice(widget, holder, propname, choice, default, default_string = str(default) if default is not None else 'none' if transform is not None: default_string = transform(default_string) - text = 'default ({})'.format(default_string) + text = QtCore.QCoreApplication.translate( + "ManagerUtils", 'default ({})').format(default_string) # N+1: explicit None elif item is None: - text = '(none)' + text = QtCore.QCoreApplication.translate("ManagerUtils", '(none)') # 1..N: choices else: text = str(item) @@ -107,7 +108,8 @@ def prepare_choice(widget, holder, propname, choice, default, text = transform(text) if item == oldvalue: - text += ' (current)' + text += QtCore.QCoreApplication.translate( + "ManagerUtils", ' (current)') idx = i widget.insertItem(i, text) @@ -210,7 +212,8 @@ def get_path_from_vm(vm, service_name): assert '../' not in untrusted_path assert '\0' not in untrusted_path return untrusted_path.strip() - raise ValueError('Unexpected characters in path.') + raise ValueError(QtCore.QCoreApplication.translate( + "ManagerUtils", 'Unexpected characters in path.')) def format_dependencies_list(dependencies): @@ -220,9 +223,11 @@ def format_dependencies_list(dependencies): list_text = "" for (holder, prop) in dependencies: if holder is None: - list_text += "- Global property {}
".format(prop) + list_text += QtCore.QCoreApplication.translate( + "ManagerUtils", "- Global property {}
").format(prop) else: - list_text += "- {} for qube {}
".format( + list_text += QtCore.QCoreApplication.translate( + "ManagerUtils", "- {0} for qube {1}
").format( prop, holder.name) return list_text @@ -256,22 +261,31 @@ def handle_exception(exc_type, exc_value, exc_traceback): msg_box = QtWidgets.QMessageBox() msg_box.setDetailedText(strace) msg_box.setIcon(QtWidgets.QMessageBox.Critical) - msg_box.setWindowTitle("Houston, we have a problem...") - msg_box.setText("Whoops. A critical error has occured. " + msg_box.setWindowTitle(QtCore.QCoreApplication.translate( + "ManagerUtils", "Houston, we have a problem...")) + msg_box.setText(QtCore.QCoreApplication.translate( + "ManagerUtils", "Whoops. A critical error has occured. " "This is most likely a bug in Qubes Manager.

" - "%s" % error + - "
at line %d
of file %s.

" - % (line, filename)) + "{0}
at line {1}
of file " + "{2}.

").format(error, line, filename)) msg_box.exec_() -def run_asynchronous(app_name, icon_name, window_class): +def run_asynchronous(window_class): qt_app = QtWidgets.QApplication(sys.argv) + + translator = QtCore.QTranslator(qt_app) + locale = QtCore.QLocale.system().name() + i18n_dir = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + 'i18n') + translator.load("qubesmanager_{!s}.qm".format(locale), i18n_dir) + qt_app.installTranslator(translator) + QtCore.QCoreApplication.installTranslator(translator) + qt_app.setOrganizationName("The Qubes Project") qt_app.setOrganizationDomain("http://qubes-os.org") - qt_app.setApplicationName(app_name) - qt_app.setWindowIcon(QIcon.fromTheme(icon_name)) qt_app.lastWindowClosed.connect(loop_shutdown) qubes_app = qubesadmin.Qubes() @@ -281,6 +295,10 @@ def run_asynchronous(app_name, icon_name, window_class): dispatcher = events.EventsDispatcher(qubes_app) window = window_class(qt_app, qubes_app, dispatcher) + + if hasattr(window, "setup_application"): + window.setup_application() + window.show() try: @@ -294,11 +312,20 @@ def run_asynchronous(app_name, icon_name, window_class): handle_exception(exc_type, exc_value, exc_traceback) -def run_synchronous(app_name, window_class): +def run_synchronous(window_class): qt_app = QtWidgets.QApplication(sys.argv) + + translator = QtCore.QTranslator(qt_app) + locale = QtCore.QLocale.system().name() + i18n_dir = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + 'i18n') + translator.load("qubesmanager_{!s}.qm".format(locale), i18n_dir) + qt_app.installTranslator(translator) + QtCore.QCoreApplication.installTranslator(translator) + qt_app.setOrganizationName("The Qubes Project") qt_app.setOrganizationDomain("http://qubes-os.org") - qt_app.setApplicationName(app_name) sys.excepthook = handle_exception @@ -306,6 +333,9 @@ def run_synchronous(app_name, window_class): window = window_class(qt_app, qubes_app) + if hasattr(window, "setup_application"): + window.setup_application() + window.show() qt_app.exec_() diff --git a/rpm_spec/qmgr.spec.in b/rpm_spec/qmgr.spec.in index dcbaf25..68406a7 100644 --- a/rpm_spec/qmgr.spec.in +++ b/rpm_spec/qmgr.spec.in @@ -90,7 +90,6 @@ rm -rf $RPM_BUILD_ROOT %{python3_sitelib}/qubesmanager/__pycache__ %{python3_sitelib}/qubesmanager/__init__.py %{python3_sitelib}/qubesmanager/clipboard.py -%{python3_sitelib}/qubesmanager/block.py %{python3_sitelib}/qubesmanager/table_widgets.py %{python3_sitelib}/qubesmanager/appmenu_select.py %{python3_sitelib}/qubesmanager/backup.py