Selaa lähdekoodia

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 4 vuotta sitten
vanhempi
commit
283ed2540c

+ 18 - 6
qubesmanager.pro

@@ -1,44 +1,56 @@
 SOURCES = \
 SOURCES = \
           ui/about.ui \
           ui/about.ui \
           ui/backupdlg.ui \
           ui/backupdlg.ui \
+          ui/bootfromdevice.ui \
+          ui/devicelist.ui \
           ui/globalsettingsdlg.ui \
           ui/globalsettingsdlg.ui \
+          ui/informationnotes.ui \
           ui/logdlg.ui \
           ui/logdlg.ui \
-          ui/mainwindow.ui \
           ui/multiselectwidget.ui \
           ui/multiselectwidget.ui \
           ui/newappvmdlg.ui \
           ui/newappvmdlg.ui \
           ui/newfwruledlg.ui \
           ui/newfwruledlg.ui \
+          ui/qubemanager.ui \
           ui/releasenotes.ui \
           ui/releasenotes.ui \
           ui/restoredlg.ui \
           ui/restoredlg.ui \
           ui/settingsdlg.ui \
           ui/settingsdlg.ui \
+          ui/templatemanager.ui \
           qubesmanager/about.py \
           qubesmanager/about.py \
           qubesmanager/appmenu_select.py \
           qubesmanager/appmenu_select.py \
           qubesmanager/backup.py \
           qubesmanager/backup.py \
           qubesmanager/backup_utils.py \
           qubesmanager/backup_utils.py \
-          qubesmanager/block.py \
+          qubesmanager/bootfromdevice.py \
           qubesmanager/clipboard.py \
           qubesmanager/clipboard.py \
-          qubesmanager/create_new_vm.py \
           qubesmanager/common_threads.py \
           qubesmanager/common_threads.py \
+          qubesmanager/create_new_vm.py \
+          qubesmanager/device_list.py \
           qubesmanager/firewall.py \
           qubesmanager/firewall.py \
           qubesmanager/global_settings.py \
           qubesmanager/global_settings.py \
+          qubesmanager/informationnotes.py \
           qubesmanager/log_dialog.py \
           qubesmanager/log_dialog.py \
-          qubesmanager/main.py \
           qubesmanager/multiselectwidget.py \
           qubesmanager/multiselectwidget.py \
+          qubesmanager/qube_manager.py \
           qubesmanager/releasenotes.py \
           qubesmanager/releasenotes.py \
           qubesmanager/resources_rc.py \
           qubesmanager/resources_rc.py \
           qubesmanager/restore.py \
           qubesmanager/restore.py \
           qubesmanager/settings.py \
           qubesmanager/settings.py \
           qubesmanager/table_widgets.py \
           qubesmanager/table_widgets.py \
+          qubesmanager/template_manager.py \
           qubesmanager/ui_about.py \
           qubesmanager/ui_about.py \
           qubesmanager/ui_backupdlg.py \
           qubesmanager/ui_backupdlg.py \
+          qubesmanager/ui_bootfromdevice.py \
+          qubesmanager/ui_devicelist.py \
           qubesmanager/ui_globalsettingsdlg.py \
           qubesmanager/ui_globalsettingsdlg.py \
+          qubesmanager/ui_informationnotes.py \
           qubesmanager/ui_logdlg.py \
           qubesmanager/ui_logdlg.py \
-          qubesmanager/ui_mainwindow.py \
           qubesmanager/ui_multiselectwidget.py \
           qubesmanager/ui_multiselectwidget.py \
           qubesmanager/ui_newappvmdlg.py \
           qubesmanager/ui_newappvmdlg.py \
           qubesmanager/ui_newfwruledlg.py \
           qubesmanager/ui_newfwruledlg.py \
+          qubesmanager/ui_qubemanager.py \
           qubesmanager/ui_releasenotes.py \
           qubesmanager/ui_releasenotes.py \
           qubesmanager/ui_restoredlg.py \
           qubesmanager/ui_restoredlg.py \
-          qubesmanager/ui_settingsdlg.py
+          qubesmanager/ui_settingsdlg.py \
+          qubesmanager/ui_templatemanager.py \
+          qubesmanager/utils.py
 
 
 TRANSLATIONS = \
 TRANSLATIONS = \
                qubesmanager/i18n/qubesmanager_en.ts \
                qubesmanager/i18n/qubesmanager_en.ts \

+ 6 - 4
qubesmanager/appmenu_select.py

@@ -20,13 +20,12 @@
 #
 #
 
 
 import subprocess
 import subprocess
-import PyQt5.QtWidgets  # pylint: disable=import-error
-
+from PyQt5 import QtWidgets, QtCore  # pylint: disable=import-error
 
 
 # TODO description in tooltip
 # TODO description in tooltip
 # TODO icon
 # TODO icon
 # pylint: disable=too-few-public-methods
 # pylint: disable=too-few-public-methods
-class AppListWidgetItem(PyQt5.QtWidgets.QListWidgetItem):
+class AppListWidgetItem(QtWidgets.QListWidgetItem):
     def __init__(self, name, ident, tooltip=None, parent=None):
     def __init__(self, name, ident, tooltip=None, parent=None):
         super(AppListWidgetItem, self).__init__(name, parent)
         super(AppListWidgetItem, self).__init__(name, parent)
         if tooltip:
         if tooltip:
@@ -85,6 +84,9 @@ class AppmenuSelectManager:
             stdin=subprocess.PIPE)
             stdin=subprocess.PIPE)
         p.communicate('\n'.join(new_whitelisted).encode())
         p.communicate('\n'.join(new_whitelisted).encode())
         if p.returncode != 0:
         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
         return True

+ 9 - 7
qubesmanager/backup.py

@@ -24,7 +24,7 @@ import signal
 from qubesadmin import exc
 from qubesadmin import exc
 from qubesadmin import utils as admin_utils
 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 ui_backupdlg  # pylint: disable=no-name-in-module
 from . import multiselectwidget
 from . import multiselectwidget
 
 
@@ -120,6 +120,10 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard):
         self.dispatcher = dispatcher
         self.dispatcher = dispatcher
         dispatcher.add_handler('backup-progress', self.on_backup_progress)
         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):
     def on_backup_progress(self, __submitter, _event, **kwargs):
         self.progress_bar.setValue(int(float(kwargs['progress'])))
         self.progress_bar.setValue(int(float(kwargs['progress'])))
 
 
@@ -323,9 +327,9 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard):
 
 
     def backup_finished(self):
     def backup_finished(self):
         if self.thread.msg:
         if self.thread.msg:
-            self.progress_status.setText(self.tr("Backup error."))
+            self.progress_status.setText(self.tr("Backup error"))
             QtWidgets.QMessageBox.warning(
             QtWidgets.QMessageBox.warning(
-                self, self.tr("Backup error!"),
+                self, self.tr("Backup error"),
                 self.tr("ERROR: {}").format(
                 self.tr("ERROR: {}").format(
                     self.thread.msg))
                     self.thread.msg))
             self.button(self.CancelButton).setEnabled(False)
             self.button(self.CancelButton).setEnabled(False)
@@ -368,7 +372,7 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard):
             self.thread.wait()
             self.thread.wait()
             QtWidgets.QMessageBox.warning(
             QtWidgets.QMessageBox.warning(
                 self, self.tr("Backup aborted!"),
                 self, self.tr("Backup aborted!"),
-                self.tr("ERROR: {}").format("Aborted!"))
+                self.tr("ERROR: Aborted"))
 
 
         self.cleanup_temporary_files()
         self.cleanup_temporary_files()
         self.done(0)
         self.done(0)
@@ -390,9 +394,7 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard):
 
 
 
 
 def main():
 def main():
-    utils.run_asynchronous("Qubes Backup VMs",
-                           "qubes-manager",
-                           BackupVMsWindow)
+    utils.run_asynchronous(BackupVMsWindow)
 
 
 
 
 if __name__ == "__main__":
 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
 import subprocess
 from . import utils
 from . import utils
 from . import ui_bootfromdevice  # pylint: disable=no-name-in-module
 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 import tools
 from qubesadmin.tools import qvm_start
 from qubesadmin.tools import qvm_start
 
 
@@ -47,6 +47,10 @@ class VMBootFromDeviceWindow(ui_bootfromdevice.Ui_BootDialog,
         # warn user if the VM is currently running
         # warn user if the VM is currently running
         self.__warn_if_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):
     def reject(self):
         self.done(0)
         self.done(0)
 
 
@@ -148,8 +152,7 @@ def main(args=None):
     args = parser.parse_args(args)
     args = parser.parse_args(args)
     vm = args.domains.pop()
     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__":
 if __name__ == "__main__":

+ 24 - 11
qubesmanager/clipboard.py

@@ -27,6 +27,7 @@ from math import log
 
 
 # pylint: disable=import-error
 # pylint: disable=import-error
 from PyQt5.QtWidgets import QApplication, QMessageBox
 from PyQt5.QtWidgets import QApplication, QMessageBox
+from PyQt5.QtCore import QCoreApplication
 
 
 APPVIEWER_LOCK = "/var/run/qubes/appviewer.lock"
 APPVIEWER_LOCK = "/var/run/qubes/appviewer.lock"
 CLIPBOARD_CONTENTS = "/var/run/qubes/qubes-clipboard.bin"
 CLIPBOARD_CONTENTS = "/var/run/qubes/qubes-clipboard.bin"
@@ -43,14 +44,20 @@ def copy_text_to_qubes_clipboard(text):
     try:
     try:
         file = os.open(APPVIEWER_LOCK, os.O_RDWR | os.O_CREAT, 0o0666)
         file = os.open(APPVIEWER_LOCK, os.O_RDWR | os.O_CREAT, 0o0666)
     except Exception:  # pylint: disable=broad-except
     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:
     else:
         try:
         try:
             fcntl.flock(file, fcntl.LOCK_EX)
             fcntl.flock(file, fcntl.LOCK_EX)
         except Exception:  # pylint: disable=broad-except
         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:
         else:
             try:
             try:
                 with open(CLIPBOARD_CONTENTS, "w") as contents:
                 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:
                 with open(CLIPBOARD_SOURCE, "w") as source:
                     source.write("dom0")
                     source.write("dom0")
             except Exception:  # pylint: disable=broad-except
             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)
             fcntl.flock(file, fcntl.LOCK_UN)
         os.close(file)
         os.close(file)
 
 
@@ -71,11 +81,14 @@ def get_qubes_clipboard_formatted_size():
     try:
     try:
         file_size = os.path.getsize(CLIPBOARD_CONTENTS)
         file_size = os.path.getsize(CLIPBOARD_CONTENTS)
     except Exception:  # pylint: disable=broad-except
     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:
     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:
         if file_size > 0:
             magnitude = min(int(log(file_size)/log(2)*0.1), len(units)-1)
             magnitude = min(int(log(file_size)/log(2)*0.1), len(units)-1)
             if magnitude > 0:
             if magnitude > 0:
@@ -84,4 +97,4 @@ def get_qubes_clipboard_formatted_size():
                                          units[magnitude])
                                          units[magnitude])
         return '%s' % formatted_bytes
         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:
         try:
             del self.vm.app.domains[self.vm.name]
             del self.vm.app.domains[self.vm.name]
         except (exc.QubesException, KeyError) as ex:
         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
 # pylint: disable=too-few-public-methods
@@ -62,7 +62,8 @@ class CloneVMThread(QubesThread):
     def run(self):
     def run(self):
         try:
         try:
             self.vm.app.clone_vm(self.vm, self.dst_name)
             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
             self.msg_is_success = True
         except exc.QubesException as ex:
         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 sys
 import subprocess
 import subprocess
 
 
@@ -204,7 +205,7 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg):
         self.thread.start()
         self.thread.start()
 
 
         self.progress = QtWidgets.QProgressDialog(
         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.setCancelButton(None)
         self.progress.setModal(True)
         self.progress.setModal(True)
         self.progress.show()
         self.progress.show()
@@ -216,7 +217,7 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg):
             QtWidgets.QMessageBox.warning(
             QtWidgets.QMessageBox.warning(
                 self,
                 self,
                 self.tr("Error creating the qube!"),
                 self.tr("Error creating the qube!"),
-                self.tr("ERROR: {}").format(self.thread.msg))
+                self.tr("ERROR: {0}").format(self.thread.msg))
 
 
         self.done(0)
         self.done(0)
 
 
@@ -266,9 +267,20 @@ def main(args=None):
     args = parser.parse_args(args)
     args = parser.parse_args(args)
 
 
     qtapp = QtWidgets.QApplication(sys.argv)
     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.setOrganizationName('Invisible Things Lab')
     qtapp.setOrganizationDomain('https://www.qubes-os.org/')
     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 = NewVmDlg(qtapp, args.app)
     dialog.exec_()
     dialog.exec_()

+ 12 - 10
qubesmanager/firewall.py

@@ -280,8 +280,7 @@ class QubesFirewallRulesModel(QtCore.QAbstractItemModel):
             return str(rule.proto)
             return str(rule.proto)
         return "unknown"
         return "unknown"
 
 
-    @staticmethod
-    def get_firewall_conf(vm):
+    def get_firewall_conf(self, vm):
         conf = {
         conf = {
             'allow': None,
             'allow': None,
             'expire': 0,
             'expire': 0,
@@ -296,14 +295,15 @@ class QubesFirewallRulesModel(QtCore.QAbstractItemModel):
         last_rule = next(reversed_rules, None)
         last_rule = next(reversed_rules, None)
 
 
         if last_rule is 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') \
         if last_rule == qubesadmin.firewall.Rule('action=accept') \
                 or last_rule == qubesadmin.firewall.Rule('action=drop'):
                 or last_rule == qubesadmin.firewall.Rule('action=drop'):
             common_action = last_rule.action
             common_action = last_rule.action
         else:
         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,
         dns_rule = qubesadmin.firewall.Rule(None,
                                         action='accept', specialtarget='dns')
                                         action='accept', specialtarget='dns')
@@ -319,29 +319,31 @@ class QubesFirewallRulesModel(QtCore.QAbstractItemModel):
                 continue
                 continue
 
 
             if rule.specialtarget is not None or rule.icmptype is not None:
             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) \
             if (rule.dsthost is not None or rule.proto is not None) \
                     and rule.expire is None:
                     and rule.expire is None:
                 if rule.action == 'accept':
                 if rule.action == 'accept':
                     conf['rules'].insert(0, rule)
                     conf['rules'].insert(0, rule)
                     continue
                     continue
-                raise FirewallModifiedOutsideError('No blacklist support.')
+                raise FirewallModifiedOutsideError(
+                    self.tr('No blacklist support.'))
 
 
             if rule.expire is not None and rule.dsthost is None \
             if rule.expire is not None and rule.dsthost is None \
                     and rule.proto is None:
                     and rule.proto is None:
                 conf['expire'] = int(str(rule.expire))
                 conf['expire'] = int(str(rule.expire))
                 continue
                 continue
 
 
-            raise FirewallModifiedOutsideError('it does not add up.')
+            raise FirewallModifiedOutsideError(self.tr('it does not add up.'))
 
 
         conf['allow'] = (common_action == 'accept')
         conf['allow'] = (common_action == 'accept')
 
 
         if not allow_icmp and not conf['allow']:
         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']:
         if not allow_dns and not conf['allow']:
-            raise FirewallModifiedOutsideError('DNS must be allowed')
+            raise FirewallModifiedOutsideError(self.tr('DNS must be allowed'))
 
 
         return conf
         return conf
 
 

+ 22 - 10
qubesmanager/global_settings.py

@@ -21,7 +21,7 @@
 #
 #
 
 
 import subprocess
 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
 from qubesadmin.utils import parse_size
 
 
@@ -42,13 +42,19 @@ def _run_qrexec_repo(service, arg=''):
         check=False
         check=False
     )
     )
     if p.stderr:
     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:
     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')
     return p.stdout.decode('utf-8')
 
 
+
 # pylint: disable=too-many-instance-attributes
 # pylint: disable=too-many-instance-attributes
 class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings,
 class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings,
                            QtWidgets.QDialog):
                            QtWidgets.QDialog):
@@ -69,6 +75,10 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings,
         self.__init_mem_defaults__()
         self.__init_mem_defaults__()
         self.__init_updates__()
         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):
     def __init_system_defaults__(self):
         # set up updatevm choice
         # set up updatevm choice
         self.update_vm_vmlist, self.update_vm_idx = utils.prepare_vm_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']:
         elif repos['qubes-dom0-current']['enabled']:
             self.dom0_updates_repo.setCurrentIndex(0)
             self.dom0_updates_repo.setCurrentIndex(0)
         else:
         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']:
         if repos['qubes-templates-itl-testing']['enabled']:
             self.itl_tmpl_updates_repo.setCurrentIndex(1)
             self.itl_tmpl_updates_repo.setCurrentIndex(1)
         elif repos['qubes-templates-itl']['enabled']:
         elif repos['qubes-templates-itl']['enabled']:
             self.itl_tmpl_updates_repo.setCurrentIndex(0)
             self.itl_tmpl_updates_repo.setCurrentIndex(0)
         else:
         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']:
         if repos['qubes-templates-community-testing']['enabled']:
             self.comm_tmpl_updates_repo.setCurrentIndex(2)
             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)
                 result = _run_qrexec_repo('qubes.repos.' + action, name)
                 if result != 'ok\n':
                 if result != 'ok\n':
                     raise RuntimeError(
                     raise RuntimeError(
-                        'qrexec call stdout did not contain "ok" as expected',
+                        self.tr('qrexec call stdout did not contain "ok"'
+                                ' as expected'),
                         {'stdout': result})
                         {'stdout': result})
             except RuntimeError as ex:
             except RuntimeError as ex:
                 msg = '{desc}; {args}'.format(desc=ex.args[0], args=', '.join(
                 msg = '{desc}; {args}'.format(desc=ex.args[0], args=', '.join(
@@ -400,7 +412,7 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings,
 
 
 
 
 def main():
 def main():
-    utils.run_synchronous("Qubes Global Settings", GlobalSettingsWindow)
+    utils.run_synchronous(GlobalSettingsWindow)
 
 
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":

+ 1347 - 764
qubesmanager/i18n/qubesmanager_en.ts

@@ -3,338 +3,654 @@
 <context>
 <context>
     <name>AboutDialog</name>
     <name>AboutDialog</name>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="68"/>
+        <location filename="../ui_about.py" line="71"/>
         <source>About</source>
         <source>About</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="69"/>
+        <location filename="../ui_about.py" line="72"/>
         <source>Qubes OS</source>
         <source>Qubes OS</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="70"/>
+        <location filename="../ui_about.py" line="73"/>
         <source>Qubes OS release</source>
         <source>Qubes OS release</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="71"/>
+        <location filename="../ui_about.py" line="74"/>
         <source>Release notes</source>
         <source>Release notes</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_about.py" line="72"/>
+        <location filename="../ui_about.py" line="76"/>
         <source>OK</source>
         <source>OK</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
+    <message>
+        <location filename="../ui_about.py" line="75"/>
+        <source>Version Information</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </context>
 <context>
 <context>
     <name>Backup</name>
     <name>Backup</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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;
         <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;
 &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; }
 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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>BackupVMsWindow</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
-    <name>BackupVMsWindow</name>
+    <name>BootDialog</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
     <name>DevListWidgetItem</name>
     <name>DevListWidgetItem</name>
     <message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="823"/>
+        <location filename="../settings.py" line="1092"/>
         <source>Service already on the list!</source>
         <source>Service already on the list!</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>Dialog</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
     <name>GlobalSettings</name>
     <name>GlobalSettings</name>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="139"/>
+        <location filename="../ui_globalsettingsdlg.py" line="167"/>
         <source>Qubes Global Settings</source>
         <source>Qubes Global Settings</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="140"/>
+        <location filename="../ui_globalsettingsdlg.py" line="168"/>
         <source>System defaults</source>
         <source>System defaults</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>ClockVM:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="143"/>
+        <location filename="../ui_globalsettingsdlg.py" line="172"/>
         <source>Default netVM:</source>
         <source>Default netVM:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="144"/>
+        <location filename="../ui_globalsettingsdlg.py" line="173"/>
         <source>Default template:</source>
         <source>Default template:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="145"/>
+        <location filename="../ui_globalsettingsdlg.py" line="175"/>
         <source>Default memory settings</source>
         <source>Default memory settings</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source> MiB</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="148"/>
+        <location filename="../ui_globalsettingsdlg.py" line="178"/>
         <source>dom0 memory boost:</source>
         <source>dom0 memory boost:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>Kernel</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="152"/>
+        <location filename="../ui_globalsettingsdlg.py" line="181"/>
         <source>Default kernel:</source>
         <source>Default kernel:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="153"/>
+        <location filename="../ui_globalsettingsdlg.py" line="182"/>
         <source>Updates</source>
         <source>Updates</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_globalsettingsdlg.py" line="154"/>
+        <location filename="../ui_globalsettingsdlg.py" line="188"/>
         <source>Check for dom0 updates</source>
         <source>Check for dom0 updates</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
     <name>GlobalSettingsWindow</name>
     <name>GlobalSettingsWindow</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
     <name>LogDialog</name>
     <name>LogDialog</name>
     <message>
     <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>(Showing only last %d bytes of file)
 </source>
 </source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_logdlg.py" line="72"/>
+        <location filename="../ui_logdlg.py" line="72"/>
         <source>Dialog</source>
         <source>Dialog</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>Copy Dom0 clipboard to Qubes clipboard</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_logdlg.py" line="74"/>
+        <location filename="../ui_logdlg.py" line="74"/>
         <source>Copy to Qubes clipboard</source>
         <source>Copy to Qubes clipboard</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </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>
 <context>
     <name>MultiSelectWidget</name>
     <name>MultiSelectWidget</name>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="91"/>
+        <location filename="../ui_multiselectwidget.py" line="91"/>
         <source>Form</source>
         <source>Form</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="92"/>
+        <location filename="../ui_multiselectwidget.py" line="92"/>
         <source>Available</source>
         <source>Available</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="93"/>
+        <location filename="../ui_multiselectwidget.py" line="93"/>
         <source>&gt;&gt;</source>
         <source>&gt;&gt;</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="94"/>
+        <location filename="../ui_multiselectwidget.py" line="94"/>
         <source>&gt;</source>
         <source>&gt;</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="95"/>
+        <location filename="../ui_multiselectwidget.py" line="95"/>
         <source>&lt;</source>
         <source>&lt;</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="96"/>
+        <location filename="../ui_multiselectwidget.py" line="96"/>
         <source>&lt;&lt;</source>
         <source>&lt;&lt;</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_multiselectwidget.py" line="97"/>
+        <location filename="../ui_multiselectwidget.py" line="97"/>
         <source>Selected</source>
         <source>Selected</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
@@ -342,1666 +658,1933 @@ p, li { white-space: pre-wrap; }
 <context>
 <context>
     <name>NewFwRuleDlg</name>
     <name>NewFwRuleDlg</name>
     <message>
     <message>
-        <location filename="../qubesmanager/firewall.py" line="95"/>
+        <location filename="../firewall.py" line="157"/>
         <source>Firewall rule</source>
         <source>Firewall rule</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>You need to fill service name/port for TCP/UDP rule</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="95"/>
+        <location filename="../ui_newfwruledlg.py" line="90"/>
         <source>New Address</source>
         <source>New Address</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="96"/>
+        <location filename="../ui_newfwruledlg.py" line="97"/>
         <source>Protocol</source>
         <source>Protocol</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>Address</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="99"/>
+        <location filename="../ui_newfwruledlg.py" line="96"/>
         <source>TCP</source>
         <source>TCP</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="100"/>
+        <location filename="../ui_newfwruledlg.py" line="91"/>
         <source>UDP</source>
         <source>UDP</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_newfwruledlg.py" line="101"/>
+        <location filename="../ui_newfwruledlg.py" line="94"/>
         <source> Any   </source>
         <source> Any   </source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </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>
 <context>
 <context>
     <name>NewVMDlg</name>
     <name>NewVMDlg</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
     <name>NewVmDlg</name>
     <name>NewVmDlg</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/create_new_vm.py" line="258"/>
+        <location filename="../create_new_vm.py" line="217"/>
         <source>ERROR: {0}</source>
         <source>ERROR: {0}</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
-    <name>QubesManagerFileWatcher</name>
+    <name>QubeManager</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
-</context>
-<context>
-    <name>QubesTrayIcon</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>RefreshAppsVMThread</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
     <name>ReleaseNotesDialog</name>
     <name>ReleaseNotesDialog</name>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_releasenotes.py" line="46"/>
+        <location filename="../ui_releasenotes.py" line="46"/>
         <source>Qubes Release Notes</source>
         <source>Qubes Release Notes</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </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>
 <context>
     <name>Restore</name>
     <name>Restore</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
-</context>
-<context>
-    <name>RestoreVMsWindow</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
-</context>
-<context>
-    <name>SettingsDialog</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>StatusItem</name>
+</context>
+<context>
+    <name>TemplateManager</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>TemplateManagerWindow</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>UpdateVMThread</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>VMBootFromDeviceWindow</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
     <name>VMSettingsWindow</name>
     <name>VMSettingsWindow</name>
     <message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="57"/>
+        <location filename="../settings.py" line="145"/>
         <source>Settings: {vm}</source>
         <source>Settings: {vm}</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>Error while changing settings for {0}!</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="134"/>
+        <location filename="../settings.py" line="266"/>
         <source>ERROR: {0}</source>
         <source>ERROR: {0}</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="160"/>
+        <location filename="../settings.py" line="296"/>
         <source>Error while saving changes: </source>
         <source>Error while saving changes: </source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="175"/>
+        <location filename="../settings.py" line="309"/>
         <source>Firewall tab:</source>
         <source>Firewall tab:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/settings.py" line="181"/>
+        <location filename="../settings.py" line="317"/>
         <source>Applications tab:</source>
         <source>Applications tab:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
-</context>
-<context>
-    <name>VmListItem</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <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>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
+</context>
+<context>
+    <name>VmManagerWindow</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="427"/>
+        <location filename="../ui_qubemanager.py" line="394"/>
         <source>Search:</source>
         <source>Search:</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="430"/>
+        <location filename="../ui_qubemanager.py" line="397"/>
         <source>Nowy wiersz</source>
         <source>Nowy wiersz</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="432"/>
+        <location filename="../ui_qubemanager.py" line="399"/>
         <source>Name</source>
         <source>Name</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="435"/>
+        <location filename="../ui_qubemanager.py" line="402"/>
         <source>State</source>
         <source>State</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="436"/>
+        <location filename="../ui_qubemanager.py" line="403"/>
         <source>Update info</source>
         <source>Update info</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="438"/>
+        <location filename="../ui_qubemanager.py" line="405"/>
         <source>Template</source>
         <source>Template</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="441"/>
+        <location filename="../ui_qubemanager.py" line="408"/>
         <source>NetVM</source>
         <source>NetVM</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="463"/>
+        <location filename="../ui_qubemanager.py" line="430"/>
         <source>&amp;System</source>
         <source>&amp;System</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="464"/>
+        <location filename="../ui_qubemanager.py" line="431"/>
         <source>&amp;View</source>
         <source>&amp;View</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="466"/>
+        <location filename="../ui_qubemanager.py" line="433"/>
         <source>&amp;Logs</source>
         <source>&amp;Logs</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>&amp;About</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="469"/>
+        <location filename="../ui_qubemanager.py" line="435"/>
         <source>toolBar</source>
         <source>toolBar</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>Add/remove app s&amp;hortcuts</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <source>Show graphs</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="493"/>
+        <location filename="../ui_qubemanager.py" line="455"/>
         <source>Show Graphs</source>
         <source>Show Graphs</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="494"/>
+        <location filename="../ui_qubemanager.py" line="456"/>
         <source>Options</source>
         <source>Options</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="495"/>
+        <location filename="../ui_qubemanager.py" line="457"/>
         <source>View</source>
         <source>View</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="507"/>
+        <location filename="../ui_qubemanager.py" line="468"/>
         <source>&amp;State</source>
         <source>&amp;State</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="510"/>
+        <location filename="../ui_qubemanager.py" line="471"/>
         <source>Set keyboard la&amp;yout</source>
         <source>Set keyboard la&amp;yout</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="512"/>
+        <location filename="../ui_qubemanager.py" line="473"/>
         <source>T&amp;ype</source>
         <source>T&amp;ype</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="514"/>
+        <location filename="../ui_qubemanager.py" line="475"/>
         <source>&amp;Label</source>
         <source>&amp;Label</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="515"/>
+        <location filename="../ui_qubemanager.py" line="476"/>
         <source>N&amp;ame</source>
         <source>N&amp;ame</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="516"/>
+        <location filename="../ui_qubemanager.py" line="477"/>
         <source>Show tool bar</source>
         <source>Show tool bar</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="517"/>
+        <location filename="../ui_qubemanager.py" line="478"/>
         <source>Show menu bar</source>
         <source>Show menu bar</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="518"/>
+        <location filename="../ui_qubemanager.py" line="479"/>
         <source>&amp;Qubes OS</source>
         <source>&amp;Qubes OS</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="519"/>
+        <location filename="../ui_qubemanager.py" line="480"/>
         <source>Si&amp;ze</source>
         <source>Si&amp;ze</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="529"/>
+        <location filename="../ui_qubemanager.py" line="490"/>
         <source>&amp;IP</source>
         <source>&amp;IP</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="530"/>
+        <location filename="../ui_qubemanager.py" line="491"/>
         <source>Include in &amp;backups</source>
         <source>Include in &amp;backups</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="531"/>
+        <location filename="../ui_qubemanager.py" line="492"/>
         <source>Last back&amp;up</source>
         <source>Last back&amp;up</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="532"/>
+        <location filename="../ui_qubemanager.py" line="493"/>
         <source>Search</source>
         <source>Search</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/ui_mainwindow.py" line="533"/>
+        <location filename="../ui_qubemanager.py" line="494"/>
         <source>Ctrl+F</source>
         <source>Ctrl+F</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </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>
 <context>
 <context>
     <name>VmShutdownMonitor</name>
     <name>VmShutdownMonitor</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/main.py" line="282"/>
+        <location filename="../qube_manager.py" line="238"/>
         <source>Kill it!</source>
         <source>Kill it!</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <message>
     <message>
-        <location filename="../qubesmanager/main.py" line="282"/>
+        <location filename="../qube_manager.py" line="240"/>
         <source>Wait another {0} seconds...</source>
         <source>Wait another {0} seconds...</source>
         <translation type="unfinished"></translation>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
-    <name>VmUpdateInfoItem</name>
+    <name>appname</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>
 <context>
 <context>
-    <name>dialog</name>
+    <name>exception</name>
+</context>
+<context>
+    <name>template-manager</name>
     <message>
     <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>
         <translation type="unfinished"></translation>
     </message>
     </message>
 </context>
 </context>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 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'):
             if not event or event.endswith(':netvm'):
                 self.netvm_widget.update()
                 self.netvm_widget.update()
             if not event or event.endswith(':internal'):
             if not event or event.endswith(':internal'):
+                # this is a feature, not a property; TODO: fix event handling
                 self.internal_widget.update()
                 self.internal_widget.update()
             if not event or event.endswith(':ip'):
             if not event or event.endswith(':ip'):
                 self.ip_widget.update()
                 self.ip_widget.update()
@@ -298,18 +299,18 @@ class UpdateVMThread(common_threads.QubesThread):
                 if stdout == b'changed=yes\n':
                 if stdout == b'changed=yes\n':
                     subprocess.call(
                     subprocess.call(
                         ['notify-send', '-i', 'dialog-information',
                         ['notify-send', '-i', 'dialog-information',
-                         'Debian DSA-4371 fix installed in {}'.format(
+                         self.tr('Debian DSA-4371 fix installed in {}').format(
                                 self.vm.name)])
                                 self.vm.name)])
                 elif stdout == b'changed=no\n':
                 elif stdout == b'changed=no\n':
                     pass
                     pass
                 else:
                 else:
                     raise exc.QubesException(
                     raise exc.QubesException(
-                            "Failed to apply DSA-4371 fix: {}".format(
+                            self.tr("Failed to apply DSA-4371 fix: {}").format(
                                 stderr.decode('ascii')))
                                 stderr.decode('ascii')))
                 self.vm.run_service("qubes.InstallUpdatesGUI",
                 self.vm.run_service("qubes.InstallUpdatesGUI",
                                     user="root", wait=False)
                                     user="root", wait=False)
         except (ChildProcessError, exc.QubesException) as ex:
         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
 # pylint: disable=too-few-public-methods
@@ -322,7 +323,7 @@ class RunCommandThread(common_threads.QubesThread):
         try:
         try:
             self.vm.run(self.command_to_run)
             self.vm.run(self.command_to_run)
         except (ChildProcessError, exc.QubesException) as ex:
         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):
 class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow):
@@ -519,6 +520,11 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow):
         # correctly initialized
         # correctly initialized
         self.table.selectRow(0)
         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
     def keyPressEvent(self, event):  # pylint: disable=invalid-name
         if event.key() == QtCore.Qt.Key_Escape:
         if event.key() == QtCore.Qt.Key_Escape:
             self.searchbox.clear()
             self.searchbox.clear()
@@ -536,18 +542,18 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow):
                     if thread.msg_is_success:
                     if thread.msg_is_success:
                         QtWidgets.QMessageBox.information(
                         QtWidgets.QMessageBox.information(
                             self,
                             self,
-                            self.tr(title),
-                            self.tr(msg))
+                            title,
+                            msg)
                     else:
                     else:
                         QtWidgets.QMessageBox.warning(
                         QtWidgets.QMessageBox.warning(
                             self,
                             self,
-                            self.tr(title),
-                            self.tr(msg))
+                            title,
+                            msg)
 
 
                 self.threads_list.remove(thread)
                 self.threads_list.remove(thread)
                 return
                 return
 
 
-        raise RuntimeError('No finished thread found')
+        raise RuntimeError(self.tr('No finished thread found'))
 
 
     def closeEvent(self, event):
     def closeEvent(self, event):
         # pylint: disable=invalid-name
         # pylint: disable=invalid-name
@@ -888,7 +894,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow):
                 "Cloning Qube..."), "", 0, 0)
                 "Cloning Qube..."), "", 0, 0)
         self.progress.setCancelButton(None)
         self.progress.setCancelButton(None)
         self.progress.setModal(True)
         self.progress.setModal(True)
-        self.progress.setWindowTitle("Cloning qube...")
+        self.progress.setWindowTitle(self.tr("Cloning qube..."))
         self.progress.show()
         self.progress.show()
 
 
         thread = common_threads.CloneVMThread(vm, clone_name)
         thread = common_threads.CloneVMThread(vm, clone_name)
@@ -1299,10 +1305,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QtWidgets.QMainWindow):
 
 
 
 
 def main():
 def main():
-    manager_utils.run_asynchronous(
-        "Qube Manager",
-        "qubes-manager",
-        VmManagerWindow)
+    manager_utils.run_asynchronous(VmManagerWindow)
 
 
 
 
 if __name__ == "__main__":
 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
 import os.path
 import os.path
 import logging
 import logging
@@ -110,6 +110,10 @@ class RestoreVMsWindow(ui_restoredlg.Ui_Restore, QtWidgets.QWizard):
 
 
         backup_utils.fill_appvms_list(self)
         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')
     @QtCore.pyqtSlot(name='on_select_path_button_clicked')
     def select_path_button_clicked(self):
     def select_path_button_clicked(self):
         backup_utils.select_path_button_clicked(self, True)
         backup_utils.select_path_button_clicked(self, True)
@@ -290,7 +294,7 @@ class RestoreVMsWindow(ui_restoredlg.Ui_Restore, QtWidgets.QWizard):
 
 
 
 
 def main():
 def main():
-    utils.run_synchronous("Qubes Restore VMs", RestoreVMsWindow)
+    utils.run_synchronous(RestoreVMsWindow)
 
 
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":

+ 19 - 18
qubesmanager/settings.py

@@ -79,9 +79,9 @@ class RenameVMThread(common_threads.QubesThread):
                                              self.vm.name) + list_text)
                                              self.vm.name) + list_text)
 
 
         except qubesadmin.exc.QubesException as ex:
         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
         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
 # pylint: disable=too-few-public-methods
@@ -112,7 +112,7 @@ class RefreshAppsVMThread(common_threads.QubesThread):
                 if not_running:
                 if not_running:
                     vm.shutdown()
                     vm.shutdown()
             except Exception as ex:  # pylint: disable=broad-except
             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
 # 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.clicked.connect(
                 self.refresh_apps_button_pressed)
                 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):
     def clear_threads(self):
         for thread in self.threads_list:
         for thread in self.threads_list:
             if thread.isFinished():
             if thread.isFinished():
@@ -233,8 +237,8 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog):
                     (title, msg) = thread.msg
                     (title, msg) = thread.msg
                     QtWidgets.QMessageBox.warning(
                     QtWidgets.QMessageBox.warning(
                         self,
                         self,
-                        self.tr(title),
-                        self.tr(msg))
+                        title,
+                        msg)
 
 
                 self.threads_list.remove(thread)
                 self.threads_list.remove(thread)
 
 
@@ -243,7 +247,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog):
 
 
                 return
                 return
 
 
-        raise RuntimeError('No finished thread found')
+        raise RuntimeError(self.tr('No finished thread found'))
 
 
     def keyPressEvent(self, event):  # pylint: disable=invalid-name
     def keyPressEvent(self, event):  # pylint: disable=invalid-name
         if event.key() == QtCore.Qt.Key_Enter \
         if event.key() == QtCore.Qt.Key_Enter \
@@ -278,16 +282,16 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog):
         try:
         try:
             ret_tmp = self.__apply_basic_tab__()
             ret_tmp = self.__apply_basic_tab__()
             if ret_tmp:
             if ret_tmp:
-                ret += ["Basic tab:"] + ret_tmp
+                ret += [self.tr("Basic tab:")] + ret_tmp
             ret_tmp = self.__apply_advanced_tab__()
             ret_tmp = self.__apply_advanced_tab__()
             if ret_tmp:
             if ret_tmp:
-                ret += ["Advanced tab:"] + ret_tmp
+                ret += [self.tr("Advanced tab:")] + ret_tmp
             ret_tmp = self.__apply_devices_tab__()
             ret_tmp = self.__apply_devices_tab__()
             if ret_tmp:
             if ret_tmp:
-                ret += ["Devices tab:"] + ret_tmp
+                ret += [self.tr("Devices tab:")] + ret_tmp
             ret_tmp = self.__apply_services_tab__()
             ret_tmp = self.__apply_services_tab__()
             if ret_tmp:
             if ret_tmp:
-                ret += ["Sevices tab:"] + ret_tmp
+                ret += [self.tr("Sevices tab:")] + ret_tmp
         except qubesadmin.exc.QubesException as qex:
         except qubesadmin.exc.QubesException as qex:
             ret.append(self.tr('Error while saving changes: ') + str(qex))
             ret.append(self.tr('Error while saving changes: ') + str(qex))
         except Exception as ex:  # pylint: disable=broad-except
         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)
             thread.finished.connect(self.clear_threads)
 
 
             self.progress = QtWidgets.QProgressDialog(
             self.progress = QtWidgets.QProgressDialog(
-                self.tr(
-                    "Renaming Qube..."), "", 0, 0)
+                self.tr("Renaming Qube..."), "", 0, 0)
             self.progress.setCancelButton(None)
             self.progress.setCancelButton(None)
             self.progress.setModal(True)
             self.progress.setModal(True)
             self.thread_closes = True
             self.thread_closes = True
@@ -644,8 +647,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog):
             self.threads_list.append(thread)
             self.threads_list.append(thread)
 
 
             self.progress = QtWidgets.QProgressDialog(
             self.progress = QtWidgets.QProgressDialog(
-                self.tr(
-                    "Cloning Qube..."), "", 0, 0)
+                self.tr("Cloning Qube..."), "", 0, 0)
             self.progress.setCancelButton(None)
             self.progress.setCancelButton(None)
             self.progress.setModal(True)
             self.progress.setModal(True)
             self.thread_closes = 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]
             domains_using = [vm.name for vm in self.vm.connected_vms]
             if domains_using:
             if domains_using:
                 self.provides_network_checkbox.setEnabled(False)
                 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 "
                     "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))
                     "\n".join(domains_using))
 
 
     def enable_seamless(self):
     def enable_seamless(self):
@@ -1218,8 +1220,7 @@ def main(args=None):
     args = parser.parse_args(args)
     args = parser.parse_args(args)
     vm = args.domains.pop()
     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__":
 if __name__ == "__main__":

+ 23 - 11
qubesmanager/table_widgets.py

@@ -295,15 +295,16 @@ class VMPropertyItem(QtWidgets.QTableWidgetItem):
         if self.empty_function(val):
         if self.empty_function(val):
             text = ""
             text = ""
         elif val is None:
         elif val is None:
-            text = "n/a"
+            text = QtCore.QCoreApplication.translate("QubeManager", "n/a")
         elif val is True:
         elif val is True:
-            text = "Yes"
+            text = QtCore.QCoreApplication.translate("QubeManager", "Yes")
         else:
         else:
             text = str(val)
             text = str(val)
 
 
         if self.check_default and hasattr(self.vm, self.property_name) and \
         if self.check_default and hasattr(self.vm, self.property_name) and \
                 self.vm.property_is_default(self.property_name):
                 self.vm.property_is_default(self.property_name):
-            text = 'default (' + text + ')'
+            text = QtCore.QCoreApplication.translate(
+                "QubeManager", 'default ({})').format(text)
         self.setText(text)
         self.setText(text)
 
 
     def __lt__(self, other):
     def __lt__(self, other):
@@ -338,7 +339,8 @@ class VmInternalItem(VMPropertyItem):
 
 
     def update(self):
     def update(self):
         internal = self.vm.features.get('internal', False)
         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
 # features man qvm-features
@@ -416,19 +418,28 @@ class VmUpdateInfoWidget(QtWidgets.QWidget):
         self.value = state
         self.value = state
         self.table_item.set_value(state)
         self.table_item.set_value(state)
         if state == "update":
         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"
             icon_path = ":/update-recommended.png"
-            tooltip_text = self.tr("Updates pending!")
+            tooltip_text = QtCore.QCoreApplication.translate("QubeManager",
+                                                             "Updates pending!")
         elif state == "outdated":
         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"
             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 "
                 "The qube must be restarted for its filesystem to reflect the "
                 "template's recent committed changes.")
                 "template's recent committed changes.")
         elif state == "to-be-outdated":
         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"
             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 "
                 "The Template must be stopped before changes from its "
                 "current session can be picked up by this qube.")
                 "current session can be picked up by this qube.")
         else:
         else:
@@ -466,7 +477,8 @@ class VmSizeOnDiskItem(QtWidgets.QTableWidgetItem):
 
 
     def update(self):
     def update(self):
         if self.vm.qid == 0:
         if self.vm.qid == 0:
-            self.setText("n/a")
+            self.setText(QtCore.QCoreApplication.translate("QubeManager",
+                                                           "n/a"))
         else:
         else:
             self.value = 10
             self.value = 10
             self.value = round(self.vm.get_disk_utilization()/(1024*1024), 2)
             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()
         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):
     def prepare_lists(self):
         self.templates = [vm.name for vm in self.qubes_app.domains
         self.templates = [vm.name for vm in self.qubes_app.domains
                           if vm.klass == 'TemplateVM']
                           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:
         for template in self.templates:
             self.change_all_combobox.addItem(template)
             self.change_all_combobox.addItem(template)
 
 
@@ -84,7 +88,8 @@ class TemplateManagerWindow(
             self.rows_in_table[vm.name] = row
             self.rows_in_table[vm.name] = row
             row_count += 1
             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()
         self.vm_list.resizeColumnsToContents()
 
 
     def initialize_table_events(self):
     def initialize_table_events(self):
@@ -258,7 +263,8 @@ class StatusItem(QtWidgets.QTableWidgetItem):
 
 
         if self.state:
         if self.state:
             self.setIcon(QtGui.QIcon.fromTheme('dialog-warning'))
             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:
         else:
             self.setIcon(QtGui.QIcon())
             self.setIcon(QtGui.QIcon())
             self.setToolTip("")
             self.setToolTip("")
@@ -331,7 +337,9 @@ class VMRow:
                              self.current_item)
                              self.current_item)
 
 
         # new template
         # 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)
         self.new_item = NewTemplateItem(self.vm, templates, table_widget)
 
 
         table_widget.setItem(row_no, columns.index('New template'),
         table_widget.setItem(row_no, columns.index('New template'),
@@ -378,9 +386,7 @@ class VMRow:
 
 
 
 
 def main():
 def main():
-    utils.run_asynchronous("Template Manager",
-                           "qubes-manager",
-                           TemplateManagerWindow)
+    utils.run_asynchronous(TemplateManagerWindow)
 
 
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":

+ 47 - 17
qubesmanager/utils.py

@@ -30,7 +30,7 @@ import sys
 import quamash
 import quamash
 from qubesadmin import events
 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
 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'
             default_string = str(default) if default is not None else 'none'
             if transform is not None:
             if transform is not None:
                 default_string = transform(default_string)
                 default_string = transform(default_string)
-            text = 'default ({})'.format(default_string)
+            text = QtCore.QCoreApplication.translate(
+                "ManagerUtils", 'default ({})').format(default_string)
         # N+1: explicit None
         # N+1: explicit None
         elif item is None:
         elif item is None:
-            text = '(none)'
+            text = QtCore.QCoreApplication.translate("ManagerUtils", '(none)')
         # 1..N: choices
         # 1..N: choices
         else:
         else:
             text = str(item)
             text = str(item)
@@ -107,7 +108,8 @@ def prepare_choice(widget, holder, propname, choice, default,
                 text = transform(text)
                 text = transform(text)
 
 
         if item == oldvalue:
         if item == oldvalue:
-            text += ' (current)'
+            text += QtCore.QCoreApplication.translate(
+                "ManagerUtils", ' (current)')
             idx = i
             idx = i
 
 
         widget.insertItem(i, text)
         widget.insertItem(i, text)
@@ -210,7 +212,8 @@ def get_path_from_vm(vm, service_name):
         assert '../' not in untrusted_path
         assert '../' not in untrusted_path
         assert '\0' not in untrusted_path
         assert '\0' not in untrusted_path
         return untrusted_path.strip()
         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):
 def format_dependencies_list(dependencies):
@@ -220,9 +223,11 @@ def format_dependencies_list(dependencies):
     list_text = ""
     list_text = ""
     for (holder, prop) in dependencies:
     for (holder, prop) in dependencies:
         if holder is None:
         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:
         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)
                 prop, holder.name)
 
 
     return list_text
     return list_text
@@ -256,22 +261,31 @@ def handle_exception(exc_type, exc_value, exc_traceback):
     msg_box = QtWidgets.QMessageBox()
     msg_box = QtWidgets.QMessageBox()
     msg_box.setDetailedText(strace)
     msg_box.setDetailedText(strace)
     msg_box.setIcon(QtWidgets.QMessageBox.Critical)
     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>"
                     "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_()
     msg_box.exec_()
 
 
 
 
-def run_asynchronous(app_name, icon_name, window_class):
+def run_asynchronous(window_class):
     qt_app = QtWidgets.QApplication(sys.argv)
     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.setOrganizationName("The Qubes Project")
     qt_app.setOrganizationDomain("http://qubes-os.org")
     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)
     qt_app.lastWindowClosed.connect(loop_shutdown)
 
 
     qubes_app = qubesadmin.Qubes()
     qubes_app = qubesadmin.Qubes()
@@ -281,6 +295,10 @@ def run_asynchronous(app_name, icon_name, window_class):
     dispatcher = events.EventsDispatcher(qubes_app)
     dispatcher = events.EventsDispatcher(qubes_app)
 
 
     window = window_class(qt_app, qubes_app, dispatcher)
     window = window_class(qt_app, qubes_app, dispatcher)
+
+    if hasattr(window, "setup_application"):
+        window.setup_application()
+
     window.show()
     window.show()
 
 
     try:
     try:
@@ -294,11 +312,20 @@ def run_asynchronous(app_name, icon_name, window_class):
         handle_exception(exc_type, exc_value, exc_traceback)
         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)
     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.setOrganizationName("The Qubes Project")
     qt_app.setOrganizationDomain("http://qubes-os.org")
     qt_app.setOrganizationDomain("http://qubes-os.org")
-    qt_app.setApplicationName(app_name)
 
 
     sys.excepthook = handle_exception
     sys.excepthook = handle_exception
 
 
@@ -306,6 +333,9 @@ def run_synchronous(app_name, window_class):
 
 
     window = window_class(qt_app, qubes_app)
     window = window_class(qt_app, qubes_app)
 
 
+    if hasattr(window, "setup_application"):
+        window.setup_application()
+
     window.show()
     window.show()
 
 
     qt_app.exec_()
     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/__pycache__
 %{python3_sitelib}/qubesmanager/__init__.py
 %{python3_sitelib}/qubesmanager/__init__.py
 %{python3_sitelib}/qubesmanager/clipboard.py
 %{python3_sitelib}/qubesmanager/clipboard.py
-%{python3_sitelib}/qubesmanager/block.py
 %{python3_sitelib}/qubesmanager/table_widgets.py
 %{python3_sitelib}/qubesmanager/table_widgets.py
 %{python3_sitelib}/qubesmanager/appmenu_select.py
 %{python3_sitelib}/qubesmanager/appmenu_select.py
 %{python3_sitelib}/qubesmanager/backup.py
 %{python3_sitelib}/qubesmanager/backup.py

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä