Explorar o código

Merge remote-tracking branch 'origin/pr/210'

* origin/pr/210:
  Fixed translation for application names
  Added translation support to all untranslated qubesmanager files
  Re-enabled translation support for Qt5
Marek Marczykowski-Górecki %!s(int64=4) %!d(string=hai) anos
pai
achega
283ed2540c

+ 18 - 6
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 \

+ 6 - 4
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

+ 9 - 7
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__":

+ 0 - 160
qubesmanager/block.py

@@ -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 <marmarek@invisiblethingslab.com>
-#
-# 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 <http://www.gnu.org/licenses/>.
-
-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 <b>{}</b>: {}".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 <b>{}</b>: {}".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 <b>" + vm.name + "</b> attaches block devices to other qubes: "
-            msg += ', '.join(["<b>"+v.name+"</b>("+d+")" for (d,v) in serves_for ])
-            msg += ".<br><br> Shutting the qube down will dettach the devices from them."
-
-            QMessageBox.warning (None, "Warning!", msg)

+ 6 - 3
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__":

+ 24 - 11
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')

+ 4 - 3
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))

+ 15 - 3
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 <b>{}</b>...").format(name), "", 0, 0)
+            self.tr("Creating new qube <b>{0}</b>...").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_()

+ 12 - 10
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
 

+ 22 - 10
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__":

+ 1347 - 764
qubesmanager/i18n/qubesmanager_en.ts

@@ -3,338 +3,654 @@
 <context>
     <name>AboutDialog</name>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="68"/>
+        <location filename="../ui_about.py" line="71"/>
         <source>About</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="69"/>
+        <location filename="../ui_about.py" line="72"/>
         <source>Qubes OS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="70"/>
+        <location filename="../ui_about.py" line="73"/>
         <source>Qubes OS release</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="71"/>
+        <location filename="../ui_about.py" line="74"/>
         <source>Release notes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="72"/>
+        <location filename="../ui_about.py" line="76"/>
         <source>OK</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../ui_about.py" line="75"/>
+        <source>Version Information</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>Backup</name>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="210"/>
-        <source>Qubes Backup VMs</source>
+        <location filename="../ui_backupdlg.py" line="254"/>
+        <source>Total size:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="211"/>
-        <source>Shutdown all running selected VMs</source>
+        <location filename="../ui_backupdlg.py" line="255"/>
+        <source>0</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="212"/>
-        <source>Refresh running states.</source>
+        <location filename="../ui_backupdlg.py" line="258"/>
+        <source>Backup destination directory</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="213"/>
-        <source>Some of the selected VMs are running (red). Running VMs cannot be backed up!</source>
+        <location filename="../ui_backupdlg.py" line="261"/>
+        <source>...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="214"/>
-        <source>Select VMs to backup:</source>
+        <location filename="../ui_backupdlg.py" line="265"/>
+        <source>Backup security</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="215"/>
-        <source>Total size:</source>
+        <location filename="../ui_backupdlg.py" line="266"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Encryption / Verification&lt;br/&gt;passphrase:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="216"/>
-        <source>0</source>
+        <location filename="../ui_backupdlg.py" line="267"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reenter passphrase:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="217"/>
-        <source>Backup destination directory</source>
+        <location filename="../ui_backupdlg.py" line="271"/>
+        <source>You&apos;re about to perform the following actions:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="218"/>
-        <source>...</source>
+        <location filename="../ui_backupdlg.py" line="277"/>
+        <source>To continue press Next. </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="219"/>
-        <source>Target AppVM:</source>
+        <location filename="../ui_backupdlg.py" line="278"/>
+        <source>Backup in progress...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="220"/>
-        <source>Backup directory or VM command:</source>
+        <location filename="../ui_backupdlg.py" line="279"/>
+        <source>When finished, open file selection dialog to allow me to unmount the disk</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="221"/>
-        <source>Backup security</source>
+        <location filename="../ui_backupdlg.py" line="252"/>
+        <source>Qubes OS - Backup qubes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="222"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Encryption / Verification&lt;br/&gt;passphrase:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_backupdlg.py" line="253"/>
+        <source>Select qubes to backup:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="223"/>
-        <source>Encrypt backup:</source>
+        <location filename="../ui_backupdlg.py" line="256"/>
+        <source>Compress the backup</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="224"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reenter passphrase:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_backupdlg.py" line="257"/>
+        <source>Warning: unrecognized data found in configuration files. </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="225"/>
-        <source>You&apos;re about to perform the following actions:</source>
+        <location filename="../ui_backupdlg.py" line="259"/>
+        <source>Target qube:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_backupdlg.py" line="260"/>
+        <source>Backup directory or command:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_backupdlg.py" line="262"/>
+        <source>Save backup profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_backupdlg.py" line="263"/>
+        <source>Save settings as default backup profile:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_backupdlg.py" line="264"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;WARNING: password will be saved in dom0 in plain text.&lt;br/&gt;The file is located in dom0 in /etc/qubes/backup/qubes-manager-backup .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_backupdlg.py" line="268"/>
+        <source>NOTE: Only running qubes are listed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_backupdlg.py" line="269"/>
+        <source>Other</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="226"/>
+        <location filename="../ui_backupdlg.py" line="270"/>
+        <source>Turn computer off after backup is finished</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_backupdlg.py" line="272"/>
         <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
 &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
 p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>BackupVMsWindow</name>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="231"/>
-        <source>To continue press Next. </source>
+        <location filename="../backup.py" line="75"/>
+        <source>Backup in progress...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="232"/>
-        <source>Backup in progress...</source>
+        <location filename="../backup.py" line="159"/>
+        <source>Error loading backup profile</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_backupdlg.py" line="233"/>
-        <source>When finished, open file selection dialog to allow me to unmount the disk</source>
+        <location filename="../backup.py" line="159"/>
+        <source>Unable to load saved backup profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../backup.py" line="125"/>
+        <source>Qubes Backup VMs</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
-    <name>BackupVMsWindow</name>
+    <name>BootDialog</name>
     <message>
-        <location filename="../qubesmanager/backup.py" line="81"/>
-        <source>Backup in progress...</source>
+        <location filename="../ui_bootfromdevice.py" line="90"/>
+        <source>Boot from device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_bootfromdevice.py" line="91"/>
+        <source>Boot qube from device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_bootfromdevice.py" line="92"/>
+        <source>from existing block device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_bootfromdevice.py" line="93"/>
+        <source>from file in qube</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_bootfromdevice.py" line="94"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Clipboard</name>
+    <message>
+        <location filename="../clipboard.py" line="84"/>
+        <source>Warning!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../clipboard.py" line="84"/>
+        <source>Error while accessing Qubes clipboard!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../clipboard.py" line="56"/>
+        <source>Error while locking Qubes clipboard!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../clipboard.py" line="68"/>
+        <source>Error while writing to Qubes clipboard!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../clipboard.py" line="90"/>
+        <source>%n byte(s)</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../clipboard.py" line="100"/>
+        <source>? bytes</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>CloneVMThread</name>
+    <message>
+        <location filename="../common_threads.py" line="65"/>
+        <source>Sucess</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../common_threads.py" line="65"/>
+        <source>The qube was cloned sucessfully.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../common_threads.py" line="69"/>
+        <source>Error while cloning qube!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Command {command} failed</name>
+    <message>
+        <location filename="../appmenu_select.py" line="87"/>
+        <source>exception</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>DevListWidgetItem</name>
     <message>
-        <location filename="../qubesmanager/settings.py" line="823"/>
+        <location filename="../settings.py" line="1092"/>
         <source>Service already on the list!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="837"/>
-        <source>Service can not be removed</source>
+        <location filename="../settings.py" line="986"/>
+        <source>Error re-assigning device </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="837"/>
-        <source>Service meminfo-writer can not be removed from the list.</source>
+        <location filename="../settings.py" line="1044"/>
+        <source>Refresh in progress...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="981"/>
-        <source>Invalid service ports range</source>
+        <location filename="../settings.py" line="1055"/>
+        <source>Refresh Applications</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>Dialog</name>
     <message>
-        <location filename="../qubesmanager/settings.py" line="981"/>
-        <source>Port {0} is lower than port {1}.</source>
+        <location filename="../ui_devicelist.py" line="56"/>
+        <source>Select devices</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="996"/>
-        <source>Invalid service name</source>
+        <location filename="../ui_devicelist.py" line="57"/>
+        <source>Which PCI devices should use the no strict reset option?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="996"/>
-        <source>Service &apos;{0}&apos; is unknown.</source>
+        <location filename="../ui_devicelist.py" line="58"/>
+        <source>Note: use this option only if &quot;unable to reset PCI device&quot; error occurs. </source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="139"/>
+        <location filename="../ui_globalsettingsdlg.py" line="167"/>
         <source>Qubes Global Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="140"/>
+        <location filename="../ui_globalsettingsdlg.py" line="168"/>
         <source>System defaults</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="141"/>
-        <source>UpdateVM:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="142"/>
+        <location filename="../ui_globalsettingsdlg.py" line="171"/>
         <source>ClockVM:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="143"/>
+        <location filename="../ui_globalsettingsdlg.py" line="172"/>
         <source>Default netVM:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="144"/>
+        <location filename="../ui_globalsettingsdlg.py" line="173"/>
         <source>Default template:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="145"/>
+        <location filename="../ui_globalsettingsdlg.py" line="175"/>
         <source>Default memory settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="146"/>
-        <source>Minimal VM&apos;s memory:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="149"/>
+        <location filename="../ui_globalsettingsdlg.py" line="179"/>
         <source> MiB</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="148"/>
+        <location filename="../ui_globalsettingsdlg.py" line="178"/>
         <source>dom0 memory boost:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="150"/>
-        <source>Keep dispVM in memory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="151"/>
+        <location filename="../ui_globalsettingsdlg.py" line="180"/>
         <source>Kernel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="152"/>
+        <location filename="../ui_globalsettingsdlg.py" line="181"/>
         <source>Default kernel:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="153"/>
+        <location filename="../ui_globalsettingsdlg.py" line="182"/>
         <source>Updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="154"/>
+        <location filename="../ui_globalsettingsdlg.py" line="188"/>
         <source>Check for dom0 updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="155"/>
-        <source>Unknown current state</source>
+        <location filename="../ui_globalsettingsdlg.py" line="169"/>
+        <source>Dom0 UpdateVM:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="170"/>
+        <source>This is updateVM ONLY for dom0; if you want to change updateVMs for other VMs, use /etc/qubes-rpc/policy/qubes.UpdatesProxy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="174"/>
+        <source>Default DisposableVM Template:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="176"/>
+        <source>Minimal qube memory:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="183"/>
+        <source>Stable updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="184"/>
+        <source>Testing updates (security only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="185"/>
+        <source>Testing updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="186"/>
+        <source>Unstable updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="187"/>
+        <source>Disable checking for updates for all qubes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="189"/>
+        <source>Default value for new qubes; to change it for existing qubes, use buttons below.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="190"/>
+        <source>Check for qube updates by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="191"/>
+        <source>Enable checking for updates for all qubes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="192"/>
+        <source>ITL template updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="193"/>
+        <source>ITL template updates (testing)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="194"/>
+        <source>(Community templates disabled)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="195"/>
+        <source>Community template updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_globalsettingsdlg.py" line="196"/>
+        <source>Community template updates (testing)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="45"/>
+        <source>qrexec call stderr was not empty</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="156"/>
-        <source>Check for VM updates</source>
+        <location filename="../global_settings.py" line="50"/>
+        <source>qrexec call exited with non-zero return code</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>GlobalSettingsWindow</name>
     <message>
-        <location filename="../qubesmanager/global_settings.py" line="183"/>
-        <source> (current)</source>
+        <location filename="../global_settings.py" line="315"/>
+        <source>Change state of all qubes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="304"/>
+        <source>Are you sure you want to set all qubes to check for updates?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="315"/>
+        <source>Are you sure you want to set all qubes to not check for updates?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="359"/>
+        <source>ERROR!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="359"/>
+        <source>Error managing {repo} repository settings: {msg}</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="285"/>
+        <source>Cannot detect enabled dom0 update repositories</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="293"/>
+        <source>Cannot detect enabled ITL template update repositories</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="348"/>
+        <source>qrexec call stdout did not contain &quot;ok&quot; as expected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../global_settings.py" line="79"/>
+        <source>Qubes Global Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>InformationNotesDialog</name>
+    <message>
+        <location filename="../ui_informationnotes.py" line="46"/>
+        <source>More Information</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>LogDialog</name>
     <message>
-        <location filename="../qubesmanager/log_dialog.py" line="60"/>
+        <location filename="../log_dialog.py" line="59"/>
         <source>(Showing only last %d bytes of file)
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_logdlg.py" line="72"/>
+        <location filename="../ui_logdlg.py" line="72"/>
         <source>Dialog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_logdlg.py" line="73"/>
+        <location filename="../ui_logdlg.py" line="73"/>
         <source>Copy Dom0 clipboard to Qubes clipboard</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_logdlg.py" line="74"/>
+        <location filename="../ui_logdlg.py" line="74"/>
         <source>Copy to Qubes clipboard</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../ui_templatemanager.py" line="95"/>
+        <source>Template Manager</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_templatemanager.py" line="97"/>
+        <source>Change all selected to:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_templatemanager.py" line="98"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;To select all qubes with a given template, double-click the template name in any row.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;IMPORTANT&lt;/span&gt;: Changes will be applied only when you click OK.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_templatemanager.py" line="99"/>
+        <source>Clear Selection</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ManagerUtils</name>
+    <message>
+        <location filename="../utils.py" line="99"/>
+        <source>default ({})</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../utils.py" line="103"/>
+        <source>(none)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../utils.py" line="111"/>
+        <source> (current)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../utils.py" line="211"/>
+        <source>Unexpected characters in path.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../utils.py" line="222"/>
+        <source>- Global property &lt;b&gt;{}&lt;/b&gt; &lt;br&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../utils.py" line="225"/>
+        <source>- &lt;b&gt;{0}&lt;/b&gt; for qube &lt;b&gt;{1}&lt;/b&gt; &lt;br&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../utils.py" line="260"/>
+        <source>Houston, we have a problem...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../utils.py" line="262"/>
+        <source>Whoops. A critical error has occured. This is most likely a bug in Qubes Manager.&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;i&gt;{0}&lt;/i&gt;&lt;/b&gt;&lt;br/&gt;at line &lt;b&gt;{1}&lt;/b&gt;&lt;br/&gt;of file {2}.&lt;br/&gt;&lt;br/&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>MultiSelectWidget</name>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="91"/>
+        <location filename="../ui_multiselectwidget.py" line="91"/>
         <source>Form</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="92"/>
+        <location filename="../ui_multiselectwidget.py" line="92"/>
         <source>Available</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="93"/>
+        <location filename="../ui_multiselectwidget.py" line="93"/>
         <source>&gt;&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="94"/>
+        <location filename="../ui_multiselectwidget.py" line="94"/>
         <source>&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="95"/>
+        <location filename="../ui_multiselectwidget.py" line="95"/>
         <source>&lt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="96"/>
+        <location filename="../ui_multiselectwidget.py" line="96"/>
         <source>&lt;&lt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="97"/>
+        <location filename="../ui_multiselectwidget.py" line="97"/>
         <source>Selected</source>
         <translation type="unfinished"></translation>
     </message>
@@ -342,1666 +658,1933 @@ p, li { white-space: pre-wrap; }
 <context>
     <name>NewFwRuleDlg</name>
     <message>
-        <location filename="../qubesmanager/firewall.py" line="95"/>
+        <location filename="../firewall.py" line="157"/>
         <source>Firewall rule</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/firewall.py" line="95"/>
+        <location filename="../firewall.py" line="157"/>
         <source>You need to fill service name/port for TCP/UDP rule</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="95"/>
+        <location filename="../ui_newfwruledlg.py" line="90"/>
         <source>New Address</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="96"/>
+        <location filename="../ui_newfwruledlg.py" line="97"/>
         <source>Protocol</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="97"/>
-        <source>Service</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="98"/>
+        <location filename="../ui_newfwruledlg.py" line="93"/>
         <source>Address</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="99"/>
+        <location filename="../ui_newfwruledlg.py" line="96"/>
         <source>TCP</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="100"/>
+        <location filename="../ui_newfwruledlg.py" line="91"/>
         <source>UDP</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="101"/>
+        <location filename="../ui_newfwruledlg.py" line="94"/>
         <source> Any   </source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../firewall.py" line="106"/>
+        <source>Invalid address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../firewall.py" line="106"/>
+        <source>Address &apos;{0}&apos; is invalid.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../firewall.py" line="139"/>
+        <source>Invalid port or service</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../firewall.py" line="139"/>
+        <source>Port number or service &apos;{0}&apos; is invalid.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_newfwruledlg.py" line="92"/>
+        <source>Port/Service</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_newfwruledlg.py" line="95"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>NewVMDlg</name>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="115"/>
-        <source>Create New VM</source>
+        <location filename="../ui_newappvmdlg.py" line="133"/>
+        <source>Name and label:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="116"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;Make sure that the license of the OS installed in a template VM grants you permission to run multiple instances of an installed system.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_newappvmdlg.py" line="130"/>
+        <source>Create new qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="117"/>
-        <source>Name and label:</source>
+        <location filename="../ui_newappvmdlg.py" line="131"/>
+        <source>Networking:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="118"/>
-        <source>my-new-vm</source>
+        <location filename="../ui_newappvmdlg.py" line="132"/>
+        <source>Template:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="119"/>
-        <source>Use this template:</source>
+        <location filename="../ui_newappvmdlg.py" line="134"/>
+        <source>my-new-qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="120"/>
-        <source>Standalone</source>
+        <location filename="../ui_newappvmdlg.py" line="136"/>
+        <source>Type:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="121"/>
-        <source>AppVM</source>
+        <location filename="../ui_newappvmdlg.py" line="135"/>
+        <source>launch settings after creation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="122"/>
-        <source>NetVM</source>
+        <location filename="../ui_newappvmdlg.py" line="137"/>
+        <source>Basic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_newappvmdlg.py" line="143"/>
+        <source>install system from device (also available from settings)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_newappvmdlg.py" line="144"/>
+        <source>provides network to other qubes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_newappvmdlg.py" line="142"/>
+        <source>Initial RAM (also available from settings)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_newappvmdlg.py" line="140"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Caution&lt;/span&gt;: changing these settings can compromise your system or make the qube unable to boot. Use only if you know what you are doing.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="123"/>
-        <source>ProxyVM</source>
+        <location filename="../ui_newappvmdlg.py" line="141"/>
+        <source>Storage pool</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="124"/>
-        <source>HVM</source>
+        <location filename="../ui_newappvmdlg.py" line="145"/>
+        <source>Advanced</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="125"/>
-        <source>HVM template</source>
+        <location filename="../ui_newappvmdlg.py" line="138"/>
+        <source>(default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_newappvmdlg.py" line="126"/>
-        <source>Allow networking:</source>
+        <location filename="../ui_newappvmdlg.py" line="139"/>
+        <source> MB</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>NewVmDlg</name>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="126"/>
-        <source> (default)</source>
+        <location filename="../create_new_vm.py" line="143"/>
+        <source>No template available!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="190"/>
-        <source>Incorrect AppVM Name!</source>
+        <location filename="../create_new_vm.py" line="143"/>
+        <source>Cannot create a qube when no template exists.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="190"/>
-        <source>A VM with the name &lt;b&gt;{0}&lt;/b&gt; already exists in the system!</source>
+        <location filename="../create_new_vm.py" line="150"/>
+        <source>Qube based on a template (AppVM)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="201"/>
-        <source>No template available!</source>
+        <location filename="../create_new_vm.py" line="151"/>
+        <source>Standalone qube copied from a template</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../create_new_vm.py" line="152"/>
+        <source>Empty standalone qube (install your own OS)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="201"/>
-        <source>Cannot create non-standalone VM when no compatible template exists. Create template VM first or choose to create standalone VM.</source>
+        <location filename="../create_new_vm.py" line="170"/>
+        <source>Incorrect qube name!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="258"/>
-        <source>Error creating AppVM!</source>
+        <location filename="../create_new_vm.py" line="170"/>
+        <source>A qube with the name &lt;b&gt;{}&lt;/b&gt; already exists in the system!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="230"/>
-        <source>Unknown VM type, this is error in Qubes Manager</source>
+        <location filename="../create_new_vm.py" line="217"/>
+        <source>Error creating the qube!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="242"/>
-        <source>Creating new {0} &lt;b&gt;{1}&lt;/b&gt;...</source>
+        <location filename="../create_new_vm.py" line="207"/>
+        <source>Creating new qube &lt;b&gt;{0}&lt;/b&gt;...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="258"/>
+        <location filename="../create_new_vm.py" line="217"/>
         <source>ERROR: {0}</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
-    <name>QubesManagerFileWatcher</name>
+    <name>QubeManager</name>
     <message>
-        <location filename="../qubesmanager/main.py" line="98"/>
-        <source>Qubes Clipboard has been copied to the VM and wiped.&lt;i/&gt;
-&lt;small&gt;Trigger a paste operation (e.g. Ctrl-v) to insert it into an application.&lt;/small&gt;</source>
+        <location filename="../table_widgets.py" line="480"/>
+        <source>n/a</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="104"/>
-        <source>Qubes Clipboard fetched from VM: &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;
-&lt;small&gt;Press Ctrl-Shift-v to copy this clipboard into dest VM&apos;s clipboard.&lt;/small&gt;</source>
+        <location filename="../table_widgets.py" line="342"/>
+        <source>Yes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="119"/>
-        <source>Qubes dom0 updates available.</source>
+        <location filename="../table_widgets.py" line="306"/>
+        <source>default ({})</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../table_widgets.py" line="421"/>
+        <source>Check updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../table_widgets.py" line="425"/>
+        <source>Updates pending!</source>
         <translation type="unfinished"></translation>
     </message>
-</context>
-<context>
-    <name>QubesTrayIcon</name>
     <message>
-        <location filename="../qubesmanager/main.py" line="1784"/>
-        <source>Open VM Manager</source>
+        <location filename="../table_widgets.py" line="428"/>
+        <source>Qube outdated</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1787"/>
-        <source>Copy Dom0 clipboard</source>
+        <location filename="../table_widgets.py" line="432"/>
+        <source>The qube must be restarted for its filesystem to reflect the template&apos;s recent committed changes.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1790"/>
-        <source>Make backup</source>
+        <location filename="../table_widgets.py" line="437"/>
+        <source>Template running</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1791"/>
-        <source>Preferences</source>
+        <location filename="../table_widgets.py" line="441"/>
+        <source>The Template must be stopped before changes from its current session can be picked up by this qube.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QubesFirewallRulesModel</name>
+    <message>
+        <location filename="../firewall.py" line="298"/>
+        <source>At least one rule must exist.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1792"/>
-        <source>Set default NetVM</source>
+        <location filename="../firewall.py" line="305"/>
+        <source>Last rule must be either drop all or accept all.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1794"/>
-        <source>System Info</source>
+        <location filename="../firewall.py" line="322"/>
+        <source>Rule type unknown!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1795"/>
-        <source>Exit</source>
+        <location filename="../firewall.py" line="330"/>
+        <source>No blacklist support.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1806"/>
-        <source>Block devices</source>
+        <location filename="../firewall.py" line="338"/>
+        <source>it does not add up.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1837"/>
-        <source>Qubes dom0 updates available.</source>
+        <location filename="../firewall.py" line="343"/>
+        <source>ICMP must be allowed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1866"/>
-        <source>Detach {dev} {desc} ({size}) from {vm}</source>
+        <location filename="../firewall.py" line="346"/>
+        <source>DNS must be allowed</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>RefreshAppsVMThread</name>
     <message>
-        <location filename="../qubesmanager/main.py" line="1881"/>
-        <source>Attach  {dev} {size} {desc}</source>
+        <location filename="../settings.py" line="100"/>
+        <source>Refresh in progress (refreshing applications from {})</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1918"/>
-        <source>Block attach/detach error!</source>
+        <location filename="../settings.py" line="115"/>
+        <source>Refresh failed!</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>ReleaseNotesDialog</name>
     <message>
-        <location filename="../qubesmanager/ui_releasenotes.py" line="46"/>
+        <location filename="../ui_releasenotes.py" line="46"/>
         <source>Qubes Release Notes</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
+<context>
+    <name>RemoveVMThread</name>
+    <message>
+        <location filename="../common_threads.py" line="53"/>
+        <source>Error removing qube!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>RenameVMThread</name>
+    <message>
+        <location filename="../settings.py" line="72"/>
+        <source>Warning: rename partially unsuccessful!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../settings.py" line="72"/>
+        <source>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.&lt;br&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../settings.py" line="84"/>
+        <source>Rename error!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>Restore</name>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="163"/>
-        <source>Qubes Restore VMs</source>
+        <location filename="../ui_restoredlg.py" line="168"/>
+        <source>Restore options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="169"/>
+        <source>Ignore missing templates or netvms, restore VMs anyway.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="171"/>
+        <source>Ignore dom0 username mismatch while restoring homedir.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="172"/>
+        <source>ignore username mismatch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="173"/>
+        <source>Verify backup integrity, do not restore the data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="174"/>
+        <source>Backup source location</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="175"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="176"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Backup file:&lt;br&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;(for old backup format select qubes.xml file)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="178"/>
+        <source>Security options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="179"/>
+        <source>Encrypted backup:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="180"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Decryption / Verification&lt;br/&gt;passphrase:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="182"/>
+        <source>You&apos;re about to perform the following actions:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="188"/>
+        <source>To continue press Next. </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="189"/>
+        <source>When finished, open file selection dialog to allow me to unmount the disk</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="167"/>
+        <source>Qubes OS - Restore qubes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="170"/>
+        <source>ignore missing templates and net VMs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="177"/>
+        <source>Qube:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="181"/>
+        <source>Qubes to restore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="183"/>
+        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Cantarell&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_restoredlg.py" line="190"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;WARNING: restored dom0 files are located in ~/home-restore-&amp;lt;timestamp&amp;gt; directory&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>RestoreThread</name>
+    <message>
+        <location filename="../restore.py" line="59"/>
+        <source>Partially restored files left in /var/tmp/restore_*, investigate them and/or clean them up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../restore.py" line="64"/>
+        <source>Finished with errors!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../restore.py" line="67"/>
+        <source>Finished successfully!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>RestoreVMsWindow</name>
+    <message>
+        <location filename="../restore.py" line="166"/>
+        <source>Restore error!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../restore.py" line="233"/>
+        <source>Please unmount your backup volume and cancel the file selection dialog.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../restore.py" line="269"/>
+        <source>Aborting the operation...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../restore.py" line="224"/>
+        <source>Restore qubes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../restore.py" line="114"/>
+        <source>Qubes Restore VMs</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>RunCommandThread</name>
+    <message>
+        <location filename="../qube_manager.py" line="326"/>
+        <source>Error while running command!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SettingsDialog</name>
+    <message>
+        <location filename="../ui_settingsdlg.py" line="770"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_settingsdlg.py" line="771"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Name &amp;amp;&amp;amp; label&lt;span style=&quot; color:#ff0000;&quot;&gt;*&lt;/span&gt;:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="164"/>
-        <source>Restore options</source>
+        <location filename="../ui_settingsdlg.py" line="774"/>
+        <source>----</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="165"/>
-        <source>Ignore missing templates or netvms, restore VMs anyway.</source>
+        <location filename="../ui_settingsdlg.py" line="772"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Template&lt;span style=&quot; color:#ff0000;&quot;&gt;*&lt;/span&gt;:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="166"/>
-        <source>ignore missing</source>
+        <location filename="../ui_settingsdlg.py" line="777"/>
+        <source>Include in backups by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="167"/>
-        <source>Ignore dom0 username mismatch while restoring homedir.</source>
+        <location filename="../ui_settingsdlg.py" line="778"/>
+        <source>Run in debug mode</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="168"/>
-        <source>ignore username mismatch</source>
+        <location filename="../ui_settingsdlg.py" line="750"/>
+        <source>General</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="169"/>
-        <source>Verify backup integrity, do not restore the data</source>
+        <location filename="../ui_settingsdlg.py" line="751"/>
+        <source>Type:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="170"/>
-        <source>Backup source location</source>
+        <location filename="../ui_settingsdlg.py" line="768"/>
+        <source>---</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="171"/>
-        <source>...</source>
+        <location filename="../ui_settingsdlg.py" line="753"/>
+        <source>Installed by RPM:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="172"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Backup file:&lt;br&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;(for old backup format select qubes.xml file)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_settingsdlg.py" line="755"/>
+        <source>Disk storage</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="173"/>
-        <source>AppVM:</source>
+        <location filename="../ui_settingsdlg.py" line="758"/>
+        <source>Private storage max. size:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="174"/>
-        <source>Security options</source>
+        <location filename="../ui_settingsdlg.py" line="759"/>
+        <source>System storage max. size:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="175"/>
-        <source>Encrypted backup:</source>
+        <location filename="../ui_settingsdlg.py" line="760"/>
+        <source>Networking</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="176"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Decryption / Verification&lt;br/&gt;passphrase:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_settingsdlg.py" line="761"/>
+        <source>IP:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="177"/>
-        <source>VMs to restore</source>
+        <location filename="../ui_settingsdlg.py" line="762"/>
+        <source>Netmask:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="178"/>
-        <source>You&apos;re about to perform the following actions:</source>
+        <location filename="../ui_settingsdlg.py" line="764"/>
+        <source>Gateway:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="179"/>
-        <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_settingsdlg.py" line="783"/>
+        <source>Basic</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="184"/>
-        <source>To continue press Next. </source>
+        <location filename="../ui_settingsdlg.py" line="794"/>
+        <source>Memory/CPU</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_restoredlg.py" line="185"/>
-        <source>When finished, open file selection dialog to allow me to unmount the disk</source>
+        <location filename="../ui_settingsdlg.py" line="795"/>
+        <source>Initial memory:</source>
         <translation type="unfinished"></translation>
     </message>
-</context>
-<context>
-    <name>RestoreVMsWindow</name>
     <message>
-        <location filename="../qubesmanager/restore.py" line="148"/>
-        <source>Restore error!</source>
+        <location filename="../ui_settingsdlg.py" line="801"/>
+        <source>Max memory:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="195"/>
-        <source>Partially restored files left in /var/tmp/restore_*, investigate them and/or clean them up</source>
+        <location filename="../ui_settingsdlg.py" line="798"/>
+        <source>VCPUs no.:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="201"/>
-        <source>Restore aborted!</source>
+        <location filename="../ui_settingsdlg.py" line="799"/>
+        <source>Include in memory balancing</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="207"/>
-        <source>Finished with errors!</source>
+        <location filename="../ui_settingsdlg.py" line="800"/>
+        <source>Dynamic memory balancing can result in some devices not working!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="211"/>
-        <source>Finished successfully!</source>
+        <location filename="../ui_settingsdlg.py" line="802"/>
+        <source>Other</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="267"/>
-        <source>Restore aborted</source>
+        <location filename="../ui_settingsdlg.py" line="784"/>
+        <source>Kernel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="267"/>
-        <source>Do you want to remove temporary files from %s?</source>
+        <location filename="../ui_settingsdlg.py" line="785"/>
+        <source>Kernel:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="274"/>
-        <source>Backup error!</source>
+        <location filename="../ui_settingsdlg.py" line="787"/>
+        <source>Kernel opts:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="274"/>
-        <source>ERROR: {0}</source>
+        <location filename="../ui_settingsdlg.py" line="788"/>
+        <source>[]</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="279"/>
-        <source>Please unmount your backup volume and cancel the file selection dialog.</source>
+        <location filename="../ui_settingsdlg.py" line="816"/>
+        <source>Advanced</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="290"/>
-        <source>Detach backup device</source>
+        <location filename="../ui_settingsdlg.py" line="817"/>
+        <source>Allow full access for </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/restore.py" line="311"/>
-        <source>Aborting the operation...</source>
+        <location filename="../ui_settingsdlg.py" line="818"/>
+        <source> min</source>
         <translation type="unfinished"></translation>
     </message>
-</context>
-<context>
-    <name>SettingsDialog</name>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="616"/>
-        <source>Settings</source>
+        <location filename="../ui_settingsdlg.py" line="829"/>
+        <source>Firewall rules</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="617"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Name &amp;amp;&amp;amp; label&lt;span style=&quot; color:#ff0000;&quot;&gt;*&lt;/span&gt;:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_settingsdlg.py" line="830"/>
+        <source>You&apos;ve enabled dynamic memory balancing, some devices might not work!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="618"/>
-        <source>----</source>
+        <location filename="../ui_settingsdlg.py" line="834"/>
+        <source>Devices</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="619"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Template&lt;span style=&quot; color:#ff0000;&quot;&gt;*&lt;/span&gt;:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_settingsdlg.py" line="836"/>
+        <source>Applications</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="620"/>
-        <source>NetVM:</source>
+        <location filename="../ui_settingsdlg.py" line="837"/>
+        <source>Checked services will be turned on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="621"/>
-        <source>Include in backups by default</source>
+        <location filename="../ui_settingsdlg.py" line="838"/>
+        <source>Unchecked services will be turned off.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="622"/>
-        <source>Run in debug mode</source>
+        <location filename="../ui_settingsdlg.py" line="839"/>
+        <source>Unlisted services will follow default settings.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="623"/>
-        <source>Start VM automatically on boot</source>
+        <location filename="../ui_settingsdlg.py" line="841"/>
+        <source>Services</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="624"/>
-        <source>Seamless GUI</source>
+        <location filename="../ui_settingsdlg.py" line="757"/>
+        <source>MiB</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="625"/>
-        <source>General</source>
+        <location filename="../ui_settingsdlg.py" line="767"/>
+        <source>Virtual DNS:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="672"/>
-        <source>Type:</source>
+        <location filename="../ui_settingsdlg.py" line="769"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;Cannot be changed while the qube is running&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="641"/>
-        <source>---</source>
+        <location filename="../ui_settingsdlg.py" line="773"/>
+        <source>Networking:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="628"/>
-        <source>Installed by RPM:</source>
+        <location filename="../ui_settingsdlg.py" line="775"/>
+        <source>Rename</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="630"/>
-        <source>Disk storage</source>
+        <location filename="../ui_settingsdlg.py" line="776"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&amp;quot;default ([name])&amp;quot; denotes system-wide default - if the default is changed in Global Settings, the networking qube will change. &lt;br/&gt;If you want to keep using a given networking qube regardless of system settings, select &amp;quot;[name]&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="648"/>
-        <source>MB</source>
+        <location filename="../ui_settingsdlg.py" line="779"/>
+        <source>Start qube automatically on boot</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="633"/>
-        <source>Private storage max. size:</source>
+        <location filename="../ui_settingsdlg.py" line="781"/>
+        <source>Delete qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="634"/>
-        <source>System storage max. size:</source>
+        <location filename="../ui_settingsdlg.py" line="782"/>
+        <source>Clone qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="635"/>
-        <source>Networking</source>
+        <location filename="../ui_settingsdlg.py" line="786"/>
+        <source>WARNING: PVH mode requires Linux 4.11 or newer.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="636"/>
-        <source>IP:</source>
+        <location filename="../ui_settingsdlg.py" line="789"/>
+        <source>Virtualization</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="637"/>
-        <source>Netmask:</source>
+        <location filename="../ui_settingsdlg.py" line="790"/>
+        <source>Mode:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="639"/>
-        <source>Gateway:</source>
+        <location filename="../ui_settingsdlg.py" line="791"/>
+        <source>Using PV mode exposes more hypervisor attack surface!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="642"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;Cannot be changed while the VM is running&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <location filename="../ui_settingsdlg.py" line="792"/>
+        <source>PVH mode is hidden since it doesn&apos;t support PCI passthrough.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="643"/>
-        <source>Basic</source>
+        <location filename="../ui_settingsdlg.py" line="793"/>
+        <source>PVH mode is recommended if possible (Linux kernel 4.11 or newer, no PCI passthrough). For Windows qubes always use HVM.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="644"/>
-        <source>Memory/CPU</source>
+        <location filename="../ui_settingsdlg.py" line="797"/>
+        <source> MB</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="645"/>
-        <source>Initial memory:</source>
+        <location filename="../ui_settingsdlg.py" line="803"/>
+        <source>Provides network</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="647"/>
-        <source>Max memory:</source>
+        <location filename="../ui_settingsdlg.py" line="804"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Allows using this qube as a template for DisposableVMs. The DisposableVMs will inherit the VM&apos;s state (configuration, installed programs etc.), but their state will not persist between restarts. &lt;/p&gt;&lt;p&gt;Setting this option will cause this qube to be listed as an option in the &amp;quot;Default DisposableVM Template&amp;quot; dropdown for all other qubes. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="649"/>
-        <source>VCPUs no.:</source>
+        <location filename="../ui_settingsdlg.py" line="805"/>
+        <source>Disposable VM Template</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="650"/>
-        <source>Include in memory balancing</source>
+        <location filename="../ui_settingsdlg.py" line="806"/>
+        <source>Boot qube from CDROM</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="651"/>
-        <source>Dynamic memory balancing can result in some devices not working!</source>
+        <location filename="../ui_settingsdlg.py" line="807"/>
+        <source>Windows (with Qubes Windows Tools installed) only.
+The qube must be running to enable seamless mode;  this setting is not persistent.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="652"/>
-        <source>Paths</source>
+        <location filename="../ui_settingsdlg.py" line="809"/>
+        <source>Enable seamless mode</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="653"/>
-        <source>dir:</source>
+        <location filename="../ui_settingsdlg.py" line="810"/>
+        <source>Windows (with Qubes Windows Tools installed) only.
+The qube must be running to disable seamless mode; this setting is not persistent.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="654"/>
-        <source>dir_path</source>
+        <location filename="../ui_settingsdlg.py" line="812"/>
+        <source>Disable seamless mode</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="655"/>
-        <source>config:</source>
+        <location filename="../ui_settingsdlg.py" line="815"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Which qube should be used by default as a template for DisposableVMs started from this one? DisposableVMs will inherit their template&apos;s configuration and installed programs.&lt;br/&gt;For a qube to to appear in this list, it must have the &amp;quot;DisposableVM Template&amp;quot; checkbox enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="656"/>
-        <source>config_path</source>
+        <location filename="../ui_settingsdlg.py" line="814"/>
+        <source>Default DisposableVM Template</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="657"/>
-        <source>root img:</source>
+        <location filename="../ui_settingsdlg.py" line="820"/>
+        <source>This qube has no networking - it will not have any network access anyway.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="658"/>
-        <source>root_img_path</source>
+        <location filename="../ui_settingsdlg.py" line="822"/>
+        <source>Networking qube does not support &apos;qubes-firewall&apos; - firewall restrictions will not be applied.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="659"/>
-        <source>root volatile img:</source>
+        <location filename="../ui_settingsdlg.py" line="823"/>
+        <source>Firewall has been modified manually - please use qvm-firewall for any further configuration.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="660"/>
-        <source>volatile_path</source>
+        <location filename="../ui_settingsdlg.py" line="825"/>
+        <source>Allow all outgoing Internet connections</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="661"/>
-        <source>private img:</source>
+        <location filename="../ui_settingsdlg.py" line="826"/>
+        <source>Changing firewall settings does NOT affect existing connections.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="662"/>
-        <source>private_path</source>
+        <location filename="../ui_settingsdlg.py" line="827"/>
+        <source>Limit outgoing Internet connections to ...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="663"/>
-        <source>Other</source>
+        <location filename="../ui_settingsdlg.py" line="821"/>
+        <source>List of allowed (whitelisted) addresses:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="664"/>
-        <source>NetVM for DispVM:</source>
+        <location filename="../ui_settingsdlg.py" line="819"/>
+        <source>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.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="665"/>
-        <source>Kernel</source>
+        <location filename="../ui_settingsdlg.py" line="831"/>
+        <source>To modify PCI devices you have to turn off the qube.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="666"/>
-        <source>Kernel:</source>
+        <location filename="../ui_settingsdlg.py" line="832"/>
+        <source>Currently PVH qubes don&apos;t support PCI passthrough. Select another virtualization mode if you want to add PCI devices</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="667"/>
-        <source>Kernel opts:</source>
+        <location filename="../ui_settingsdlg.py" line="833"/>
+        <source>Configure strict reset for PCI devices</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="668"/>
-        <source>[]</source>
+        <location filename="../ui_settingsdlg.py" line="835"/>
+        <source>Refresh Applications</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="669"/>
-        <source>Additional drive</source>
+        <location filename="../ui_settingsdlg.py" line="840"/>
+        <source>Services listed here are only base Qubes services - other services may be installed and implemented.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="670"/>
-        <source>Path:</source>
+        <location filename="../ui_settingsdlg.py" line="780"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Caution:&lt;/span&gt; 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&apos;s Networking to &amp;quot;none&amp;quot; in order to prevent any data from being transmitted out. However, if the Default DisposableVM Template&apos;s Networking is set to &amp;quot;sys-firewall,&amp;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.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="671"/>
-        <source>Backend domain:</source>
+        <location filename="../ui_settingsdlg.py" line="828"/>
+        <source>This qube has direct network access - to configure its firewall, use a dedicated firewall qube.</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>StatusItem</name>
+</context>
+<context>
+    <name>TemplateManager</name>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="673"/>
-        <source>...</source>
+        <location filename="../template_manager.py" line="340"/>
+        <source>qube is running</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>TemplateManagerWindow</name>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="674"/>
-        <source>New drive will be used only at next VM startup</source>
+        <location filename="../template_manager.py" line="235"/>
+        <source>Errors encountered!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="675"/>
-        <source>Advanced</source>
+        <location filename="../template_manager.py" line="235"/>
+        <source>Errors encountered on template change in the following qubes: &lt;br&gt; {}.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="676"/>
-        <source>Allow network access except...</source>
+        <location filename="../template_manager.py" line="73"/>
+        <source>(select template)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="677"/>
-        <source>Allow ICMP traffic</source>
+        <location filename="../template_manager.py" line="91"/>
+        <source>Qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="678"/>
-        <source>Deny network access except...</source>
+        <location filename="../template_manager.py" line="91"/>
+        <source>Current</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="679"/>
-        <source>Allow DNS queries</source>
+        <location filename="../template_manager.py" line="91"/>
+        <source>New</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="680"/>
-        <source>Allow connections to Updates Proxy</source>
+        <location filename="../template_manager.py" line="66"/>
+        <source>Template Manager</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>UpdateVMThread</name>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="681"/>
-        <source>Allow full access for </source>
+        <location filename="../qube_manager.py" line="300"/>
+        <source>Debian DSA-4371 fix installed in {}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="682"/>
-        <source> min</source>
+        <location filename="../qube_manager.py" line="307"/>
+        <source>Failed to apply DSA-4371 fix: {}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="683"/>
-        <source>Firewall rules</source>
+        <location filename="../qube_manager.py" line="313"/>
+        <source>Error on qube update!</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>VMBootFromDeviceWindow</name>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="684"/>
-        <source>You&apos;ve enabled dynamic memory balancing, some devices might not work!</source>
+        <location filename="../bootfromdevice.py" line="39"/>
+        <source>Boot {vm} from device</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="685"/>
-        <source>To modify PCI devices you have to turn off the VM.</source>
+        <location filename="../bootfromdevice.py" line="65"/>
+        <source>ERROR!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="686"/>
-        <source>Devices</source>
+        <location filename="../bootfromdevice.py" line="65"/>
+        <source>No file or block device selected; please select one.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="687"/>
-        <source>Applications</source>
+        <location filename="../bootfromdevice.py" line="80"/>
+        <source>Warning!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="688"/>
-        <source>Checked services will be turned on.</source>
+        <location filename="../bootfromdevice.py" line="80"/>
+        <source>Qube must be turned off before booting it from device. Please turn off the qube.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="689"/>
-        <source>Unchecked services will be turned off.</source>
+        <location filename="../bootfromdevice.py" line="137"/>
+        <source>Failed to display file selection dialog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="690"/>
-        <source>Unlisted services will follow default settings.</source>
+        <location filename="../bootfromdevice.py" line="137"/>
+        <source>Check if the qube {0} can be started and has a file manager installed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_settingsdlg.py" line="691"/>
-        <source>Services</source>
+        <location filename="../bootfromdevice.py" line="51"/>
+        <source>Boot Qube From Device</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>VMSettingsWindow</name>
     <message>
-        <location filename="../qubesmanager/settings.py" line="57"/>
+        <location filename="../settings.py" line="145"/>
         <source>Settings: {vm}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="121"/>
-        <source>Applying settings to &lt;b&gt;{0}&lt;/b&gt;...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/settings.py" line="134"/>
+        <location filename="../settings.py" line="266"/>
         <source>Error while changing settings for {0}!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="134"/>
+        <location filename="../settings.py" line="266"/>
         <source>ERROR: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="160"/>
+        <location filename="../settings.py" line="296"/>
         <source>Error while saving changes: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="175"/>
+        <location filename="../settings.py" line="309"/>
         <source>Firewall tab:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="181"/>
+        <location filename="../settings.py" line="317"/>
         <source>Applications tab:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="192"/>
-        <source>VM configuration problem!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/settings.py" line="192"/>
-        <source>The &apos;{vm}&apos; AppVM is not network connected to a FirewallVM!&lt;p&gt;You may edit the &apos;{vm}&apos; VM firewall rules, but these will not take any effect until you connect it to a working Firewall VM.</source>
+        <location filename="../settings.py" line="525"/>
+        <source>Warning!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="238"/>
-        <source> (default)</source>
+        <location filename="../settings.py" line="515"/>
+        <source>Max memory can not be less than initial memory.&lt;br&gt;Setting max memory to equal initial memory.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="597"/>
-        <source> (current)</source>
+        <location filename="../settings.py" line="525"/>
+        <source>Initial memory can not be less than one tenth Max memory.&lt;br&gt;Setting initial memory to the minimum allowed value.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="336"/>
-        <source>Can&apos;t change name of a running VM.</source>
+        <location filename="../settings.py" line="358"/>
+        <source>Delete qube (cannot delete a running qube)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="338"/>
-        <source>Can&apos;t change VM name - a VM named &lt;b&gt;{0}&lt;/b&gt;already exists in the system!</source>
+        <location filename="../settings.py" line="434"/>
+        <source>To change system storage size, change properties of the underlying template.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="461"/>
-        <source>Warning!</source>
+        <location filename="../settings.py" line="567"/>
+        <source>Qube cannot be renamed!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="454"/>
-        <source>Max memory can not be less than initial memory.&lt;br&gt;Setting max memory to equal initial memory.</source>
+        <location filename="../settings.py" line="567"/>
+        <source>The following qubes using this qube as a template are running: &lt;br&gt; {}. &lt;br&gt; In order to rename this qube, you must first shut them down.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="461"/>
-        <source>Initial memory can not be less than one tenth Max memory.&lt;br&gt;Setting initial memory to the minimum allowed value.</source>
+        <location filename="../settings.py" line="577"/>
+        <source>Rename qube</source>
         <translation type="unfinished"></translation>
     </message>
-</context>
-<context>
-    <name>VmListItem</name>
     <message>
-        <location filename="../qubesmanager/backup.py" line="227"/>
-        <source>VM Shutdown Confirmation</source>
+        <location filename="../settings.py" line="577"/>
+        <source>New name: (WARNING: all other changes will be discarded)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="227"/>
-        <source>Are you sure you want to power down the following VMs: &lt;b&gt;{0}&lt;/b&gt;?&lt;br/&gt;&lt;small&gt;This will shutdown all the running applications within them.&lt;/small&gt;</source>
+        <location filename="../settings.py" line="588"/>
+        <source>Renaming Qube...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="299"/>
-        <source>Wait!</source>
+        <location filename="../settings.py" line="603"/>
+        <source>Qube cannot be removed!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="271"/>
-        <source>Some selected VMs are running. Running VMs can not be backuped. Please shut them down or remove them from the list.</source>
+        <location filename="../settings.py" line="603"/>
+        <source>This qube cannot be removed. It is used as: &lt;br&gt; {} &lt;small&gt;If you want to  remove this qube, you should remove or change settings of each qube or setting that uses it.&lt;/small&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="285"/>
-        <source>Enter backup target location first.</source>
+        <location filename="../settings.py" line="613"/>
+        <source>Delete qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="290"/>
-        <source>Selected directory do not exists or not a directory (%s).</source>
+        <location filename="../settings.py" line="613"/>
+        <source>Are you absolutely sure you want to delete this qube? &lt;br/&gt; All qube settings and data will be irrevocably deleted. &lt;br/&gt; If you are sure, please enter this qube&apos;s name below.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="295"/>
-        <source>Enter passphrase for backup encryption/verification first.</source>
+        <location filename="../settings.py" line="627"/>
+        <source>Removal cancelled</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="299"/>
-        <source>Enter the same passphrase in both fields.</source>
+        <location filename="../settings.py" line="627"/>
+        <source>The qube will not be removed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="355"/>
-        <source>Error while preparing backup.</source>
+        <location filename="../settings.py" line="634"/>
+        <source>Clone qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="355"/>
-        <source>ERROR: {0}</source>
+        <location filename="../settings.py" line="634"/>
+        <source>Name for the cloned qube:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="383"/>
-        <source>Backup aborted.</source>
+        <location filename="../settings.py" line="644"/>
+        <source>Cloning Qube...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="385"/>
-        <source>Backup aborted</source>
+        <location filename="../settings.py" line="250"/>
+        <source>No finished thread found</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="385"/>
-        <source>Do you want to remove temporary files from %s?</source>
+        <location filename="../settings.py" line="285"/>
+        <source>Basic tab:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="391"/>
-        <source>Backup error.</source>
+        <location filename="../settings.py" line="288"/>
+        <source>Advanced tab:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="392"/>
-        <source>Backup error!</source>
+        <location filename="../settings.py" line="291"/>
+        <source>Devices tab:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="392"/>
-        <source>ERROR: {}</source>
+        <location filename="../settings.py" line="294"/>
+        <source>Sevices tab:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="397"/>
-        <source>Backup finished.</source>
+        <location filename="../settings.py" line="727"/>
+        <source>Cannot change this setting while this qube is used as a NetVM by the following qubes:
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/backup.py" line="400"/>
-        <source> Please unmount your backup volume and cancel the file selection dialog.</source>
+        <location filename="../settings.py" line="226"/>
+        <source>Qube Settings</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
-    <name>VmManagerWindow</name>
-    <message>
-        <location filename="../qubesmanager/main.py" line="1031"/>
-        <source>Warning!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/main.py" line="1031"/>
-        <source>This Template VM cannot be removed, because there is at least one AppVM that is based on it.&lt;br&gt;&lt;small&gt;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.&lt;/small&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
+    <name>VmListItem</name>
     <message>
-        <location filename="../qubesmanager/main.py" line="1042"/>
-        <source>VM Removal Confirmation</source>
+        <location filename="../backup.py" line="281"/>
+        <source>Wait!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1042"/>
-        <source>Are you sure you want to remove the VM &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt;All data on this VM&apos;s private storage will be lost!&lt;br&gt;&lt;br&gt;Type the name of the VM (&lt;b&gt;{1}&lt;/b&gt;) below to confirm:</source>
+        <location filename="../backup.py" line="262"/>
+        <source>Enter backup target location first.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1055"/>
-        <source>VM removal confirmation failed</source>
+        <location filename="../backup.py" line="268"/>
+        <source>Selected directory do not exists or not a directory (%s).</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1055"/>
-        <source>Entered name did not match! Not removing {0}.</source>
+        <location filename="../backup.py" line="274"/>
+        <source>Enter passphrase for backup encryption/verification first.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1067"/>
-        <source>Removing VM: &lt;b&gt;{0}&lt;/b&gt;...</source>
+        <location filename="../backup.py" line="281"/>
+        <source>Enter the same passphrase in both fields.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1080"/>
-        <source>VM &apos;{0}&apos; has been removed.</source>
+        <location filename="../backup.py" line="369"/>
+        <source>ERROR: {}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1083"/>
-        <source>Error removing VM!</source>
+        <location filename="../backup.py" line="342"/>
+        <source>Backup finished.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1467"/>
-        <source>ERROR: {0}</source>
+        <location filename="../backup.py" line="346"/>
+        <source> Please unmount your backup volume and cancel the file selection dialog.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1123"/>
-        <source>Qubes clone VM</source>
+        <location filename="../backup.py" line="374"/>
+        <source>Backup aborted!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1123"/>
-        <source>Enter name for VM &lt;b&gt;{}&lt;/b&gt; clone:</source>
+        <location filename="../backup.py" line="332"/>
+        <source>Backup error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1136"/>
-        <source>Cloning VM &lt;b&gt;{0}&lt;/b&gt; to &lt;b&gt;{1}&lt;/b&gt;...</source>
+        <location filename="../backup.py" line="374"/>
+        <source>ERROR: Aborted</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1151"/>
-        <source>Error while cloning VM</source>
+        <location filename="../backup.py" line="369"/>
+        <source>Error cancelling backup!</source>
         <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>VmManagerWindow</name>
     <message>
-        <location filename="../qubesmanager/main.py" line="1151"/>
-        <source>Exception while cloning:&lt;br&gt;{0}</source>
+        <location filename="../qube_manager.py" line="469"/>
+        <source>Manager settings unreadable</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1189"/>
-        <source>Error unpausing VM!</source>
+        <location filename="../qube_manager.py" line="469"/>
+        <source>Qube Manager settings cannot be parsed. Previously saved display settings may not be restored correctly.
+Error: {}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1441"/>
-        <source>Starting &apos;{0}&apos;...</source>
+        <location filename="../qube_manager.py" line="683"/>
+        <source>Loading Qube Manager...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1211"/>
-        <source>VM &apos;{0}&apos; has been started.</source>
+        <location filename="../ui_qubemanager.py" line="393"/>
+        <source>Qube Manager</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1264"/>
-        <source>Error starting VM &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;: {1}</source>
+        <location filename="../qube_manager.py" line="827"/>
+        <source>Warning!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1268"/>
-        <source>Error starting VM: %s</source>
+        <location filename="../qube_manager.py" line="828"/>
+        <source>This qube cannot be removed. It is used as: &lt;br&gt; {} &lt;small&gt;If you want to  remove this qube, you should remove or change settings of each qube or setting that uses it.&lt;/small&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1241"/>
-        <source>Error starting VM!</source>
+        <location filename="../qube_manager.py" line="838"/>
+        <source>Qube Removal Confirmation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1241"/>
-        <source>You need to install &apos;qubes-windows-tools&apos; package to use this option</source>
+        <location filename="../qube_manager.py" line="838"/>
+        <source>Are you sure you want to remove the Qube &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt; All data on this Qube&apos;s private storage will be lost!&lt;br&gt;&lt;br&gt;Type the name of the Qube (&lt;b&gt;{1}&lt;/b&gt;) below to confirm:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1260"/>
-        <source>VM &apos;{0}&apos; has been started. Start Qubes Tools installation from attached CD</source>
+        <location filename="../qube_manager.py" line="851"/>
+        <source>Qube removal confirmation failed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1293"/>
-        <source>Error pausing VM!</source>
+        <location filename="../qube_manager.py" line="851"/>
+        <source>Entered name did not match! Not removing {0}.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1304"/>
-        <source>VM Shutdown Confirmation</source>
+        <location filename="../qube_manager.py" line="876"/>
+        <source>Qubes clone Qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1304"/>
-        <source>Are you sure you want to power down the VM &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt;&lt;small&gt;This will shutdown all the running applications within this VM.&lt;/small&gt;</source>
+        <location filename="../qube_manager.py" line="876"/>
+        <source>Enter name for Qube &lt;b&gt;{}&lt;/b&gt; clone:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1321"/>
-        <source>Error shutting down VM!</source>
+        <location filename="../qube_manager.py" line="886"/>
+        <source>Name already in use!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1325"/>
-        <source>VM &apos;{0}&apos; is shutting down...</source>
+        <location filename="../qube_manager.py" line="886"/>
+        <source>There already exists a qube called &apos;{}&apos;. Cloning aborted.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1341"/>
-        <source>VM Restart Confirmation</source>
+        <location filename="../qube_manager.py" line="892"/>
+        <source>Cloning Qube...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1341"/>
-        <source>Are you sure you want to restart the VM &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt;&lt;small&gt;This will shutdown all the running applications within this VM.&lt;/small&gt;</source>
+        <location filename="../qube_manager.py" line="914"/>
+        <source>Error unpausing Qube!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1358"/>
-        <source>VM Kill Confirmation</source>
+        <location filename="../qube_manager.py" line="970"/>
+        <source>ERROR: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1358"/>
-        <source>Are you sure you want to kill the VM &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt;&lt;small&gt;This will end &lt;b&gt;(not shutdown!)&lt;/b&gt; all the running applications within this VM.&lt;/small&gt;</source>
+        <location filename="../qube_manager.py" line="943"/>
+        <source>Error pausing Qube!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1372"/>
-        <source>Error while killing VM!</source>
+        <location filename="../qube_manager.py" line="954"/>
+        <source>Qube Shutdown Confirmation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1372"/>
-        <source>&lt;b&gt;An exception ocurred while killing {0}.&lt;/b&gt;&lt;br&gt;ERROR: {1}</source>
+        <location filename="../qube_manager.py" line="954"/>
+        <source>Are you sure you want to power down the Qube &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt;&lt;small&gt;This will shutdown all the running applications within this Qube.&lt;/small&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1434"/>
-        <source>VM Update Confirmation</source>
+        <location filename="../qube_manager.py" line="970"/>
+        <source>Error shutting down Qube!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1434"/>
-        <source>&lt;b&gt;{0}&lt;/b&gt;&lt;br&gt;The VM has to be running to be updated.&lt;br&gt;Do you want to start it?&lt;br&gt;</source>
+        <location filename="../qube_manager.py" line="988"/>
+        <source>Qube Restart Confirmation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1452"/>
-        <source>&lt;b&gt;{0}&lt;/b&gt;&lt;br&gt;Please wait for the updater to launch...</source>
+        <location filename="../qube_manager.py" line="988"/>
+        <source>Are you sure you want to restart the Qube &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt;&lt;small&gt;This will shutdown all the running applications within this Qube.&lt;/small&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1467"/>
-        <source>Error VM update!</source>
+        <location filename="../qube_manager.py" line="1007"/>
+        <source>Qube &lt;b&gt;&apos;{0}&apos;&lt;/b&gt; is not running. Are you absolutely sure you want to try to kill it?&lt;br&gt;&lt;small&gt;This will end &lt;b&gt;(not shutdown!)&lt;/b&gt; all the running applications within this Qube.&lt;/small&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1496"/>
-        <source>Qubes command entry</source>
+        <location filename="../qube_manager.py" line="1013"/>
+        <source>Are you sure you want to kill the Qube &lt;b&gt;&apos;{0}&apos;&lt;/b&gt;?&lt;br&gt;&lt;small&gt;This will end &lt;b&gt;(not shutdown!)&lt;/b&gt; all the running applications within this Qube.&lt;/small&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1496"/>
-        <source>Run command in &lt;b&gt;{}&lt;/b&gt;:</source>
+        <location filename="../qube_manager.py" line="1018"/>
+        <source>Qube Kill Confirmation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1512"/>
-        <source>Error while running command</source>
+        <location filename="../qube_manager.py" line="1027"/>
+        <source>Error while killing Qube!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1512"/>
-        <source>Exception while running command:&lt;br&gt;{0}</source>
+        <location filename="../qube_manager.py" line="1027"/>
+        <source>&lt;b&gt;An exception ocurred while killing {0}.&lt;/b&gt;&lt;br&gt;ERROR: {1}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1723"/>
-        <source>Detach {dev} {size} {desc}</source>
+        <location filename="../qube_manager.py" line="1078"/>
+        <source>Qube Update Confirmation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1740"/>
-        <source>Attach {dev} {size} {desc}</source>
+        <location filename="../qube_manager.py" line="1078"/>
+        <source>&lt;b&gt;{0}&lt;/b&gt;&lt;br&gt;The Qube has to be running to be updated.&lt;br&gt;Do you want to start it?&lt;br&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="1775"/>
-        <source>Block attach/detach error!</source>
+        <location filename="../qube_manager.py" line="1098"/>
+        <source>Qubes command entry</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="426"/>
-        <source>Qubes VM Manager</source>
+        <location filename="../qube_manager.py" line="1098"/>
+        <source>Run command in &lt;b&gt;{}&lt;/b&gt;:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="427"/>
+        <location filename="../ui_qubemanager.py" line="394"/>
         <source>Search:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="430"/>
+        <location filename="../ui_qubemanager.py" line="397"/>
         <source>Nowy wiersz</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="432"/>
+        <location filename="../ui_qubemanager.py" line="399"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="433"/>
-        <source>VM name</source>
+        <location filename="../ui_qubemanager.py" line="400"/>
+        <source>Qube name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="435"/>
+        <location filename="../ui_qubemanager.py" line="402"/>
         <source>State</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="436"/>
+        <location filename="../ui_qubemanager.py" line="403"/>
         <source>Update info</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="438"/>
+        <location filename="../ui_qubemanager.py" line="405"/>
         <source>Template</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="439"/>
-        <source>VM&apos;s template</source>
+        <location filename="../ui_qubemanager.py" line="406"/>
+        <source>Qube template</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="441"/>
+        <location filename="../ui_qubemanager.py" line="408"/>
         <source>NetVM</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="442"/>
-        <source>VM&apos;s netVM</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="444"/>
-        <source>CPU</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="446"/>
-        <source>CPU Graph</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="447"/>
-        <source>CPU usage graph</source>
+        <location filename="../ui_qubemanager.py" line="409"/>
+        <source>Qube netVM</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="449"/>
-        <source>MEM</source>
+        <location filename="../ui_qubemanager.py" line="411"/>
+        <source>Disk
+usage</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="451"/>
-        <source>MEM Graph</source>
+        <location filename="../ui_qubemanager.py" line="414"/>
+        <source>Internal</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="452"/>
-        <source>Memory usage graph</source>
+        <location filename="../ui_qubemanager.py" line="416"/>
+        <source>IP</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="454"/>
-        <source>Size</source>
+        <location filename="../ui_qubemanager.py" line="418"/>
+        <source>Include
+in backups</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="456"/>
-        <source>Internal</source>
+        <location filename="../ui_qubemanager.py" line="421"/>
+        <source>Last backup</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="458"/>
-        <source>IP</source>
+        <location filename="../ui_qubemanager.py" line="423"/>
+        <source>Default DisposableVM
+Template</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="460"/>
-        <source>Backups</source>
+        <location filename="../ui_qubemanager.py" line="426"/>
+        <source>DisposableVM
+Template</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="462"/>
-        <source>Last backup</source>
+        <location filename="../ui_qubemanager.py" line="502"/>
+        <source>Virtualization Mode</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="463"/>
+        <location filename="../ui_qubemanager.py" line="430"/>
         <source>&amp;System</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="464"/>
+        <location filename="../ui_qubemanager.py" line="431"/>
         <source>&amp;View</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="465"/>
-        <source>V&amp;M</source>
+        <location filename="../ui_qubemanager.py" line="432"/>
+        <source>&amp;Qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="466"/>
+        <location filename="../ui_qubemanager.py" line="433"/>
         <source>&amp;Logs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="467"/>
-        <source>Attach/detach &amp;block devices</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="468"/>
+        <location filename="../ui_qubemanager.py" line="434"/>
         <source>&amp;About</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="469"/>
+        <location filename="../ui_qubemanager.py" line="435"/>
         <source>toolBar</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="470"/>
-        <source>Create &amp;New VM</source>
+        <location filename="../ui_qubemanager.py" line="436"/>
+        <source>Create &amp;new qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="471"/>
-        <source>Create a new VM</source>
+        <location filename="../ui_qubemanager.py" line="437"/>
+        <source>Create a new qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="472"/>
-        <source>&amp;Delete VM</source>
+        <location filename="../ui_qubemanager.py" line="438"/>
+        <source>&amp;Delete qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="473"/>
-        <source>Remove an existing VM (must be stopped first)</source>
+        <location filename="../ui_qubemanager.py" line="439"/>
+        <source>Remove an existing qube (must be stopped first)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="474"/>
-        <source>Start/Resume V&amp;M</source>
+        <location filename="../ui_qubemanager.py" line="440"/>
+        <source>Start/Resu&amp;me qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="475"/>
-        <source>Start/Resume selected VM</source>
+        <location filename="../ui_qubemanager.py" line="441"/>
+        <source>Start/Resume selected qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="476"/>
-        <source>&amp;Pause VM</source>
+        <location filename="../ui_qubemanager.py" line="442"/>
+        <source>&amp;Pause qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="477"/>
-        <source>Pause selected VM</source>
+        <location filename="../ui_qubemanager.py" line="443"/>
+        <source>&lt;p&gt;Pause selected qube&lt;/p&gt;&lt;p&gt;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)&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="478"/>
-        <source>&amp;Shutdown VM</source>
+        <location filename="../ui_qubemanager.py" line="444"/>
+        <source>&amp;Shutdown qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="479"/>
-        <source>Shutdown selected VM</source>
+        <location filename="../ui_qubemanager.py" line="445"/>
+        <source>Shutdown selected qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="480"/>
-        <source>Restar&amp;t VM</source>
+        <location filename="../ui_qubemanager.py" line="446"/>
+        <source>Restar&amp;t qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="481"/>
-        <source>Restart selected VM</source>
+        <location filename="../ui_qubemanager.py" line="447"/>
+        <source>Restart selected qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="482"/>
+        <location filename="../ui_qubemanager.py" line="448"/>
         <source>Add/remove app s&amp;hortcuts</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="483"/>
-        <source>Add/remove app shortcuts for this VM</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="484"/>
-        <source>&amp;Update VM</source>
+        <location filename="../ui_qubemanager.py" line="449"/>
+        <source>Add/remove app shortcuts for this qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="485"/>
-        <source>Update VM system</source>
+        <location filename="../ui_qubemanager.py" line="450"/>
+        <source>&amp;Update qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="486"/>
-        <source>Attach/detach &amp;audio-input to the VM</source>
+        <location filename="../ui_qubemanager.py" line="451"/>
+        <source>Update qube system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="487"/>
-        <source>Attach/detach audio-input to the VM</source>
+        <location filename="../ui_qubemanager.py" line="452"/>
+        <source>Edit qube &amp;firewall rules</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="489"/>
-        <source>Show/Hide inactive VMs</source>
+        <location filename="../ui_qubemanager.py" line="453"/>
+        <source>Edit qube firewall rules</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="490"/>
-        <source>Edit VM &amp;firewall rules</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="491"/>
-        <source>Edit VM firewall rules</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="492"/>
+        <location filename="../ui_qubemanager.py" line="454"/>
         <source>Show graphs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="493"/>
+        <location filename="../ui_qubemanager.py" line="455"/>
         <source>Show Graphs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="494"/>
+        <location filename="../ui_qubemanager.py" line="456"/>
         <source>Options</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="495"/>
+        <location filename="../ui_qubemanager.py" line="457"/>
         <source>View</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="496"/>
-        <source>&amp;CPU</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="497"/>
-        <source>CPU &amp;Graph</source>
+        <location filename="../ui_qubemanager.py" line="458"/>
+        <source>&amp;Template</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="498"/>
-        <source>&amp;MEM</source>
+        <location filename="../ui_qubemanager.py" line="459"/>
+        <source>&amp;NetVM</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="499"/>
-        <source>M&amp;EM Graph</source>
+        <location filename="../ui_qubemanager.py" line="460"/>
+        <source>Qube s&amp;ettings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="500"/>
-        <source>&amp;Template</source>
+        <location filename="../ui_qubemanager.py" line="461"/>
+        <source>Qube Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="501"/>
-        <source>&amp;NetVM</source>
+        <location filename="../ui_qubemanager.py" line="462"/>
+        <source>&amp;Restore qubes from backup</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="502"/>
-        <source>VM s&amp;ettings</source>
+        <location filename="../ui_qubemanager.py" line="463"/>
+        <source>Restore qubes from backup</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="503"/>
-        <source>VM Settings</source>
+        <location filename="../ui_qubemanager.py" line="464"/>
+        <source>&amp;Backup qubes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="504"/>
-        <source>&amp;Restore VMs from backup</source>
+        <location filename="../ui_qubemanager.py" line="465"/>
+        <source>Backup qubes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="505"/>
-        <source>&amp;Backup VMs</source>
+        <location filename="../ui_qubemanager.py" line="466"/>
+        <source>&amp;Global settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="506"/>
-        <source>&amp;Global settings</source>
+        <location filename="../ui_qubemanager.py" line="467"/>
+        <source>&amp;Qubes Network</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="507"/>
+        <location filename="../ui_qubemanager.py" line="468"/>
         <source>&amp;State</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="508"/>
-        <source>&amp;Kill VM</source>
+        <location filename="../ui_qubemanager.py" line="469"/>
+        <source>&amp;Kill qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="509"/>
-        <source>Kill selected VM</source>
+        <location filename="../ui_qubemanager.py" line="470"/>
+        <source>Kill selected qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="510"/>
+        <location filename="../ui_qubemanager.py" line="471"/>
         <source>Set keyboard la&amp;yout</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="511"/>
-        <source>Set keyboard layout per VM</source>
+        <location filename="../ui_qubemanager.py" line="472"/>
+        <source>Set keyboard layout per qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="512"/>
+        <location filename="../ui_qubemanager.py" line="473"/>
         <source>T&amp;ype</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="513"/>
-        <source>VM Type</source>
+        <location filename="../ui_qubemanager.py" line="474"/>
+        <source>Qube Type</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="514"/>
+        <location filename="../ui_qubemanager.py" line="475"/>
         <source>&amp;Label</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="515"/>
+        <location filename="../ui_qubemanager.py" line="476"/>
         <source>N&amp;ame</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="516"/>
+        <location filename="../ui_qubemanager.py" line="477"/>
         <source>Show tool bar</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="517"/>
+        <location filename="../ui_qubemanager.py" line="478"/>
         <source>Show menu bar</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="518"/>
+        <location filename="../ui_qubemanager.py" line="479"/>
         <source>&amp;Qubes OS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="519"/>
+        <location filename="../ui_qubemanager.py" line="480"/>
         <source>Si&amp;ze</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="520"/>
-        <source>Size on Disk</source>
+        <location filename="../ui_qubemanager.py" line="481"/>
+        <source>Size on disk</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="521"/>
-        <source>&amp;Run command in VM</source>
+        <location filename="../ui_qubemanager.py" line="482"/>
+        <source>&amp;Run command in qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="522"/>
-        <source>Run command in the specified VM</source>
+        <location filename="../ui_qubemanager.py" line="483"/>
+        <source>Run command in the specified qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="523"/>
-        <source>&amp;Clone VM</source>
+        <location filename="../ui_qubemanager.py" line="484"/>
+        <source>&amp;Clone qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="524"/>
-        <source>Inte&amp;rnal</source>
+        <location filename="../ui_qubemanager.py" line="485"/>
+        <source>Clone qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="525"/>
-        <source>Is an internal VM</source>
+        <location filename="../ui_qubemanager.py" line="486"/>
+        <source>Inte&amp;rnal</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="526"/>
-        <source>Show/Hide internal VMs</source>
+        <location filename="../ui_qubemanager.py" line="487"/>
+        <source>Is an internal qube</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="528"/>
-        <source>Start VM for Window Tools installation</source>
+        <location filename="../ui_qubemanager.py" line="489"/>
+        <source>Start qube for Window Tools installation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="529"/>
+        <location filename="../ui_qubemanager.py" line="490"/>
         <source>&amp;IP</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="530"/>
+        <location filename="../ui_qubemanager.py" line="491"/>
         <source>Include in &amp;backups</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="531"/>
+        <location filename="../ui_qubemanager.py" line="492"/>
         <source>Last back&amp;up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="532"/>
+        <location filename="../ui_qubemanager.py" line="493"/>
         <source>Search</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="533"/>
+        <location filename="../ui_qubemanager.py" line="494"/>
         <source>Ctrl+F</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../ui_qubemanager.py" line="495"/>
+        <source>&amp;Exit Qube Manager</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_qubemanager.py" line="496"/>
+        <source>Manage templates for qubes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_qubemanager.py" line="497"/>
+        <source>Launch a tool that allows multiple templates to be changed at once</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_qubemanager.py" line="498"/>
+        <source>Default DisposableVM Template</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_qubemanager.py" line="499"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Default DisposableVM Template&lt;br/&gt;&lt;br/&gt;Which qube should be used by default as a template for DisposableVMs started from this one? DisposableVMs will inherit their template&apos;s configuration and installed programs.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_qubemanager.py" line="500"/>
+        <source>DisposableVM Template</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui_qubemanager.py" line="501"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;DisposableVM Template&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Allows using this qube as a template for DisposableVMs. The DisposableVMs will inherit the VM&apos;s state (configuration, installed programs etc.), but their state will not persist between restarts. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../qube_manager.py" line="556"/>
+        <source>No finished thread found</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../qube_manager.py" line="897"/>
+        <source>Cloning qube...</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>VmShutdownMonitor</name>
     <message>
-        <location filename="../qubesmanager/main.py" line="282"/>
-        <source>VM Shutdown</source>
+        <location filename="../qube_manager.py" line="233"/>
+        <source>Qube Shutdown</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="282"/>
-        <source>The VM &lt;b&gt;&apos;{0}&apos;&lt;/b&gt; hasn&apos;t shutdown within the last {1} seconds, do you want to kill it?&lt;br&gt;</source>
+        <location filename="../qube_manager.py" line="234"/>
+        <source>The Qube &lt;b&gt;&apos;{0}&apos;&lt;/b&gt; hasn&apos;t shutdown within the last {1} seconds, do you want to kill it?&lt;br&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="282"/>
+        <location filename="../qube_manager.py" line="238"/>
         <source>Kill it!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/main.py" line="282"/>
+        <location filename="../qube_manager.py" line="240"/>
         <source>Wait another {0} seconds...</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
-    <name>VmUpdateInfoItem</name>
+    <name>appname</name>
     <message>
-        <location filename="../qubesmanager/table_widgets.py" line="608"/>
-        <source>Updates pending!</source>
+        <location filename="../create_new_vm.py" line="282"/>
+        <source>Create qube</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>dialog</name>
+    <message>
+        <location filename="../backup_utils.py" line="84"/>
+        <source>Select backup location.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/table_widgets.py" line="612"/>
-        <source>The VM must be restarted for its filesystem to reflect the template&apos;s recent committed changes.</source>
+        <location filename="../backup_utils.py" line="95"/>
+        <source>Nothing selected!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../qubesmanager/table_widgets.py" line="618"/>
-        <source>The TemplateVM must be stopped before changes from its current session can be picked up by this VM.</source>
+        <location filename="../backup_utils.py" line="95"/>
+        <source>No file or directory selected.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
-    <name>dialog</name>
+    <name>exception</name>
+</context>
+<context>
+    <name>template-manager</name>
     <message>
-        <location filename="../qubesmanager/backup_utils.py" line="93"/>
-        <source>Select backup location.</source>
+        <location filename="../template_manager.py" line="266"/>
+        <source>Cannot change template on a running VM.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 615 - 92
qubesmanager/i18n/qubesmanager_es.ts


+ 17 - 14
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__":

+ 6 - 2
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__":

+ 19 - 18
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__":

+ 23 - 11
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 = "<font color=\"#CCCC00\">Check updates</font>"
+            label_text = "<font color=\"#CCCC00\">{}</font>".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 = "<font color=\"red\">Qube outdated</font>"
+            label_text = "<font color=\"red\">{}</font>".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 = "<font color=\"#800000\">Template running</font>"
+            label_text = "<font color=\"#800000\">{}</font>".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)

+ 13 - 7
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__":

+ 47 - 17
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 <b>{}</b> <br>".format(prop)
+            list_text += QtCore.QCoreApplication.translate(
+                "ManagerUtils", "- Global property <b>{}</b> <br>").format(prop)
         else:
-            list_text += "- <b>{}</b> for qube <b>{}</b> <br>".format(
+            list_text += QtCore.QCoreApplication.translate(
+                "ManagerUtils", "- <b>{0}</b> for qube <b>{1}</b> <br>").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.<br><br>"
-                    "<b><i>%s</i></b>" % error +
-                    "<br/>at line <b>%d</b><br/>of file %s.<br/><br/>"
-                    % (line, filename))
+                    "<b><i>{0}</i></b><br/>at line <b>{1}</b><br/>of file "
+                        "{2}.<br/><br/>").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_()

+ 0 - 1
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

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio