[node-patches] Change in ovirt-node[master]: i18n patch support language: english, chinese

boh.ricky at gmail.com boh.ricky at gmail.com
Tue Aug 20 14:37:00 UTC 2013


hai bo has uploaded a new change for review.

Change subject: i18n patch support language: english, chinese
......................................................................

i18n patch
support language: english, chinese

Change-Id: I7f7e44dc46069aecd00950279a3800d496b1c555
Signed-off-by: boh.ricky <boh.ricky at gmail.com>
---
M ovirt-node.spec.in
M recipe/common-minimizer.ks
M src/Makefile.am
M src/ovirt/node/installer/__main__.py
M src/ovirt/node/installer/core/boot_device_page.py
M src/ovirt/node/installer/core/installation_device_page.py
M src/ovirt/node/installer/core/keyboard_page.py
M src/ovirt/node/installer/core/password_page.py
M src/ovirt/node/installer/core/progress_page.py
M src/ovirt/node/installer/core/storage_vol_page.py
M src/ovirt/node/installer/core/upgrade_page.py
M src/ovirt/node/installer/core/welcome_page.py
A src/ovirt/node/locale/en_US/LC_MESSAGES/ovirt_node.mo
A src/ovirt/node/locale/ovirt_node.pot
A src/ovirt/node/locale/ovirt_node_cn.po
A src/ovirt/node/locale/ovirt_node_en.po
A src/ovirt/node/locale/zh_CN/LC_MESSAGES/ovirt_node.mo
M src/ovirt/node/setup/__main__.py
M src/ovirt/node/setup/core/diagnostics_page.py
M src/ovirt/node/setup/core/kdump_page.py
M src/ovirt/node/setup/core/keyboard_page.py
M src/ovirt/node/setup/core/logging_page.py
M src/ovirt/node/setup/core/monitoring_page.py
M src/ovirt/node/setup/core/network_page.py
M src/ovirt/node/setup/core/performance_page.py
M src/ovirt/node/setup/core/ping.py
M src/ovirt/node/setup/core/plugins_page.py
M src/ovirt/node/setup/core/remote_storage_page.py
M src/ovirt/node/setup/core/security_page.py
M src/ovirt/node/setup/core/status_page.py
M src/ovirt/node/setup/core/support_page.py
M src/ovirt/node/ui/__init__.py
32 files changed, 3,019 insertions(+), 279 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-node refs/changes/35/18335/1

diff --git a/ovirt-node.spec.in b/ovirt-node.spec.in
index dec41ef..fcb9f5c 100644
--- a/ovirt-node.spec.in
+++ b/ovirt-node.spec.in
@@ -612,6 +612,8 @@
 %{python_sitelib}/ovirt/__init__.py*
 %{python_sitelib}/ovirt/node/*.py*
 %{python_sitelib}/ovirt/node/ui/*.py*
+/usr/share/locale/zh_CN/LC_MESSAGES/*.mo
+/usr/share/locale/en_US/LC_MESSAGES/*.mo
 %{python_sitelib}/ovirt/node/utils/*.py*
 %{python_sitelib}/ovirt/node/tools/*.py*
 %{python_sitelib}/ovirt/node/config/*.py*
diff --git a/recipe/common-minimizer.ks b/recipe/common-minimizer.ks
index ff6b3db..58bfae3 100644
--- a/recipe/common-minimizer.ks
+++ b/recipe/common-minimizer.ks
@@ -250,6 +250,7 @@
 drop /usr/share/doc
 drop /usr/share/locale/
 keep /usr/share/locale/en_US
+keep /usr/share/locale/zh_CN
 drop /usr/share/man
 drop /usr/share/X11
 drop /usr/share/i18n
diff --git a/src/Makefile.am b/src/Makefile.am
index 194de0c..d6dff54 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -52,6 +52,8 @@
 pyovirtdir = $(pythondir)/ovirt
 pyovirt_nodedir = $(pyovirtdir)/node
 pyovirt_node_configdir = $(pyovirt_nodedir)/config
+ovirt_node_locale_cndir = /usr/share/locale/zh_CN/LC_MESSAGES
+ovirt_node_locale_endir = /usr/share/locale/en_US/LC_MESSAGES
 pyovirt_node_uidir = $(pyovirt_nodedir)/ui
 pyovirt_node_utilsdir = $(pyovirt_nodedir)/utils
 pyovirt_node_toolsdir = $(pyovirt_nodedir)/tools
@@ -81,6 +83,13 @@
   ovirt/node/app.py \
   ovirt/node/base.py
 
+dist_ovirt_node_locale_cn_DATA = \
+  ovirt/node/locale/zh_CN/LC_MESSAGES/ovirt_node.mo 
+
+dist_ovirt_node_locale_en_DATA = \
+  ovirt/node/locale/en_US/LC_MESSAGES/ovirt_node.mo
+
+
 pyovirt_node_config_PYTHON = \
   ovirt/node/config/__init__.py \
   ovirt/node/config/defaults.py \
diff --git a/src/ovirt/node/installer/__main__.py b/src/ovirt/node/installer/__main__.py
index b3a95be..9dbcd60 100644
--- a/src/ovirt/node/installer/__main__.py
+++ b/src/ovirt/node/installer/__main__.py
@@ -24,8 +24,11 @@
 """
 
 from ovirt.node import app, installer
+import gettext
 
 
 if __name__ == '__main__':
+    gettext.install('ovirt_node', '/usr/share/locale', unicode=True)
+
     app = app.Application(installer)
     app.run()
diff --git a/src/ovirt/node/installer/core/boot_device_page.py b/src/ovirt/node/installer/core/boot_device_page.py
index 13708ad..bb3a686 100644
--- a/src/ovirt/node/installer/core/boot_device_page.py
+++ b/src/ovirt/node/installer/core/boot_device_page.py
@@ -35,7 +35,7 @@
         self.storage_discovery.run()
 
     def name(self):
-        return "Boot Device"
+        return _("Boot Device")
 
     def rank(self):
         return 20
@@ -56,7 +56,7 @@
                 }
 
     def ui_content(self):
-        page_title = "Please select the disk to use for booting %s" % \
+        page_title = _("Please select the disk to use for booting %s") % \
                      self.application.product.PRODUCT_SHORT
 
         other_device = self._model.get("boot.device.custom", "")
@@ -66,17 +66,17 @@
 
         if devices:
             ws += [ui.Table("boot.device", "", " %6s  %11s  %5s" %
-                            ("Location", "Device Name", "Size"), devices),
-                   DeviceDetails("label.details", self, "(No device)")
+                            (_("Location"), _("Device Name"), _("Size")), devices),
+                   DeviceDetails("label.details", self, _("(No device)"))
                    ]
         else:
             ws += [ui.Label("boot.no_device",
-                            "No Valid Boot Devices Detected")]
+                            _("No Valid Boot Devices Detected"))]
 
         page = ui.Page("boot", ws)
-        page.buttons = [ui.QuitButton("button.quit", "Quit"),
-                        ui.Button("button.back", "Back"),
-                        ui.SaveButton("button.next", "Continue")]
+        page.buttons = [ui.QuitButton("button.quit", _("Quit")),
+                        ui.Button("button.back", _("Back")),
+                        ui.SaveButton("button.next", _("Continue"))]
 
         self.widgets.add(page)
         return page
@@ -177,17 +177,17 @@
         all_devices = self._plugin.storage_discovery.all_devices()
         device = all_devices[device_name]
 
-        lines = [("Device", device.name),
-                 ("Model", device.model),
-                 ("Bus Type", device.bus),
-                 ("Serial", device.serial),
-                 ("Size (GB)", device.size),
-                 ("Description", device.desc),
+        lines = [(_("Device"), device.name),
+                 (_("Model"), device.model),
+                 (_("Bus Type"), device.bus),
+                 (_("Serial"), device.serial),
+                 (_("Size (GB)"), device.size),
+                 (_("Description"), device.desc),
                  ]
 
         width = max([len(o[0]) for o in lines])
-        txt = "Disk Details\n"
-        txt += "\n".join(["%s: %s" % (("{0:%d}" % width).format(a), b)
+        txt = _("Disk Details\n").encode('utf8')
+        txt += "\n".join(["%s: %s" % (("{0:%d}" % width).format(a.encode('utf8')), b.encode('utf8'))
                           for a, b in lines])
         self.text(txt)
 
@@ -201,12 +201,12 @@
     """The dialog to input a custom root/boot device
     """
     def __init__(self, path, title, description):
-        title = "Custom Block Device"
+        title = _("Custom Block Device")
 
-        device_entry = ui.Entry("boot.device.custom", "Device path:")
+        device_entry = ui.Entry("boot.device.custom", _("Device path:"))
         children = [ui.Label("label[0]", description),
                     ui.Divider("divider[0]"),
                     device_entry]
         super(CustomDeviceDialog, self).__init__(path, title, children)
-        self.buttons = [ui.SaveButton("dialog.device.custom.save"),
-                        ui.CloseButton("dialog.device.custom.close", "Cancel")]
+        self.buttons = [ui.SaveButton("dialog.device.custom.save", _("Save")),
+                        ui.CloseButton("dialog.device.custom.close", _("Cancel"))]
diff --git a/src/ovirt/node/installer/core/installation_device_page.py b/src/ovirt/node/installer/core/installation_device_page.py
index f1c4d8d..f6cb87e 100644
--- a/src/ovirt/node/installer/core/installation_device_page.py
+++ b/src/ovirt/node/installer/core/installation_device_page.py
@@ -36,7 +36,7 @@
         self.storage_discovery.start()
 
     def name(self):
-        return "Data Device"
+        return _("Data Device")
 
     def rank(self):
         return 30
@@ -57,8 +57,7 @@
         return {"installation.device.current": has_selection}
 
     def ui_content(self):
-        page_title = "Please select the disk(s) to use for installation " \
-                     "of %s" % self.application.product.PRODUCT_SHORT
+        page_title = _("Please select the disk(s) to use for installation of %s") % self.application.product.PRODUCT_SHORT
 
         other_device = self._model.get("installation.device.custom", "")
         devices = self.storage_discovery.all_devices_for_ui_table(other_device)
@@ -68,19 +67,19 @@
         if devices:
             ws += [ui.Table("installation.device.current", "",
                             " %6s  %11s  %5s" %
-                            ("Location", "Device Name", "Size"), devices,
+                            (_("Location"), _("Device Name"), _("Size")), devices,
                             multi=True),
                    DeviceDetails("installation.device.details", self,
-                                 "(No device)")
+                                 _("(No device)"))
                    ]
         else:
             ws += [ui.Label("installation.no_device",
-                            "No Valid Install Devices Detected")]
+                            _("No Valid Install Devices Detected"))]
 
         page = ui.Page("installation", ws)
-        page.buttons = [ui.QuitButton("button.quit", "Quit"),
-                        ui.Button("button.back", "Back"),
-                        ui.SaveButton("button.next", "Continue")]
+        page.buttons = [ui.QuitButton("button.quit", _("Quit")),
+                        ui.Button("button.back", _("Back")),
+                        ui.SaveButton("button.next", _("Continue"))]
 
         self.widgets.add(page)
         return page
diff --git a/src/ovirt/node/installer/core/keyboard_page.py b/src/ovirt/node/installer/core/keyboard_page.py
index 3f6ddb9..ff35676 100644
--- a/src/ovirt/node/installer/core/keyboard_page.py
+++ b/src/ovirt/node/installer/core/keyboard_page.py
@@ -32,7 +32,7 @@
     _model = {}
 
     def name(self):
-        return "Keyboard"
+        return _("Keyboard")
 
     def rank(self):
         return 10
@@ -47,16 +47,16 @@
         kbd = system.Keyboard()
         c = kbd.get_current()
         self.logger.debug("Current layout: %s" % c)
-        ws = [ui.Header("header[0]", "Keyboard Layout Selection"),
-              ui.Table("keyboard.layout", "", "Available Keyboard Layouts",
+        ws = [ui.Header("header[0]", _("Keyboard Layout Selection")),
+              ui.Table("keyboard.layout", "", _("Available Keyboard Layouts"),
                        kbd.available_layouts(), c),
-              ui.Label("label[0]", "(Hit Enter to select a layout)")
+              ui.Label("label[0]", _("(Hit Enter to select a layout)"))
               ]
         self.widgets.add(ws)
         page = ui.Page("keyboard", ws)
-        page.buttons = [ui.QuitButton("button.quit", "Quit"),
-                        ui.Button("button.back", "Back"),
-                        ui.SaveButton("button.next", "Continue")]
+        page.buttons = [ui.QuitButton("button.quit", _("Quit")),
+                        ui.Button("button.back", _("Back")),
+                        ui.SaveButton("button.next", _("Continue"))]
         return page
 
     def on_change(self, changes):
diff --git a/src/ovirt/node/installer/core/password_page.py b/src/ovirt/node/installer/core/password_page.py
index 60ea3f8..33cb432 100644
--- a/src/ovirt/node/installer/core/password_page.py
+++ b/src/ovirt/node/installer/core/password_page.py
@@ -30,7 +30,7 @@
     _model = {}
 
     def name(self):
-        return "Console Password"
+        return _("Console Password")
 
     def rank(self):
         return 50
@@ -43,19 +43,19 @@
 
     def ui_content(self):
         ws = [ui.Header("header[0]",
-                        "Require a password for the admin user?"),
+                        _("Require a password for the admin user?")),
               ui.Divider("divider[0]"),
-              ui.PasswordEntry("admin.password", "Password:"),
+              ui.PasswordEntry("admin.password", _("Password:")),
               ui.PasswordEntry("admin.password_confirmation",
-                               "Confirm Password:"),
+                               _("Confirm Password:")),
               ui.Divider("divider[1]"),
               ui.Label("password.info", "")
               ]
         self.widgets.add(ws)
         page = ui.Page("password", ws)
-        page.buttons = [ui.QuitButton("button.quit", "Quit"),
-                        ui.Button("button.back", "Back"),
-                        ui.SaveButton("button.next", "Install")]
+        page.buttons = [ui.QuitButton("button.quit", _("Quit")),
+                        ui.Button("button.back", _("Back")),
+                        ui.SaveButton("button.next", _("Install"))]
         return page
 
     def on_change(self, changes):
diff --git a/src/ovirt/node/installer/core/progress_page.py b/src/ovirt/node/installer/core/progress_page.py
index d075748..25edfb8 100644
--- a/src/ovirt/node/installer/core/progress_page.py
+++ b/src/ovirt/node/installer/core/progress_page.py
@@ -37,7 +37,7 @@
         self._worker = InstallerThread(self)
 
     def name(self):
-        return "Installation Progress"
+        return _("Installation Progress")
 
     def rank(self):
         return 60
@@ -49,7 +49,7 @@
         return {}
 
     def ui_content(self):
-        method = "Installing"
+        method = _("Installing")
         product = self.application.product.PRODUCT_SHORT
         ws = [ui.Header("header[0]", "%s %s" % (method, product)),
               ui.Divider("divider[0]"),
@@ -57,7 +57,7 @@
               ui.Divider("divider[1]"),
               ui.Label("log", ""),
               ui.Divider("divider[2]"),
-              ui.Button("action.reboot", "Reboot")
+              ui.Button("action.reboot", _("Reboot"))
               ]
         self.widgets.add(ws)
         page = ui.Page("progress", ws)
@@ -190,7 +190,7 @@
         return config
 
     class UpdateDefaultsFromModels(utils.Transaction.Element):
-        title = "Writing configuration file"
+        title = _("Writing configuration file")
 
         def __init__(self, cfg):
             super(InstallerThread.UpdateDefaultsFromModels, self).__init__()
@@ -218,7 +218,7 @@
             # Everything done during prepare
 
     class PartitionAndFormat(utils.Transaction.Element):
-        title_tpl = "Partitioning and Creating File Systems on '%s'"
+        title_tpl = _("Partitioning and Creating File Systems on '%s'")
 
         def __init__(self, dst):
             self.dst = dst
@@ -235,7 +235,7 @@
                 raise RuntimeError("Failed to partition/format")
 
     class SetPassword(utils.Transaction.Element):
-        title = "Setting Admin Password"
+        title = _("Setting Admin Password")
 
         def __init__(self, admin_password):
             super(InstallerThread.SetPassword, self).__init__()
@@ -252,10 +252,10 @@
         def __init__(self, dst=None):
             self.dst = dst
             if dst:
-                self.title = "Installing Image and Bootloader " + \
-                    "Configuration to '%s'" % dst
+                self.title = _("Installing Image and Bootloader ") + \
+                    _("Configuration to '%s'") % dst
             else:
-                self.title = "Updating Image and Bootloader"
+                self.title = _("Updating Image and Bootloader")
             super(InstallerThread.InstallImageAndBootloader, self).__init__()
 
         def commit(self):
@@ -266,7 +266,7 @@
                 raise RuntimeError("Failed to set install bootloader")
 
     class SetKeyboardLayout(utils.Transaction.Element):
-        title_tpl = "Setting keyboard layout to '%s'"
+        title_tpl = _("Setting keyboard layout to '%s'")
 
         def __init__(self, kbd_layout):
             self.kbd_layout = kbd_layout
diff --git a/src/ovirt/node/installer/core/storage_vol_page.py b/src/ovirt/node/installer/core/storage_vol_page.py
index 718cb02..353ae97 100644
--- a/src/ovirt/node/installer/core/storage_vol_page.py
+++ b/src/ovirt/node/installer/core/storage_vol_page.py
@@ -29,7 +29,7 @@
     _model = {}
 
     def name(self):
-        return "Storage Sizes"
+        return _("Storage Sizes")
 
     def rank(self):
         return 40
@@ -58,26 +58,26 @@
                 }
 
     def ui_content(self):
-        ws = [ui.Header("header[0]", "Storage Volumes"),
-              ui.Label("label[0]", "Please enter the sizes for the " +
-                       "following partitions in MB"),
+        ws = [ui.Header("header[0]", _("Storage Volumes")),
+              ui.Label("label[0]", _("Please enter the sizes for the ") +
+                       _("following partitions in MB")),
               ui.Divider("divider[0]"),
-              ui.Entry("storage.efi_size", "UEFI/Bios:", enabled=False),
+              ui.Entry("storage.efi_size", _("UEFI/Bios:"), enabled=False),
               ui.Divider("divider[1]"),
-              ui.Entry("storage.root_size", "Root & RootBackup:",
+              ui.Entry("storage.root_size", _("Root & RootBackup:"),
                        enabled=False),
-              ui.Label("label[1]", "(2 partitions at 512MB each)"),
+              ui.Label("label[1]", _("(2 partitions at 512MB each)")),
               ui.Divider("divider[2]"),
-              ui.Entry("storage.swap_size", "Swap:"),
-              ui.Entry("storage.config_size", "Config:"),
-              ui.Entry("storage.logging_size", "Logging:"),
-              ui.Entry("storage.data_size", "Data:"),
+              ui.Entry("storage.swap_size", _("Swap:")),
+              ui.Entry("storage.config_size", _("Config:")),
+              ui.Entry("storage.logging_size", _("Logging:")),
+              ui.Entry("storage.data_size", _("Data:")),
               ]
         self.widgets.add(ws)
         page = ui.Page("storage", ws)
-        page.buttons = [ui.QuitButton("button.quit", "Quit"),
-                        ui.Button("button.back", "Back"),
-                        ui.SaveButton("button.next", "Next")]
+        page.buttons = [ui.QuitButton("button.quit", _("Quit")),
+                        ui.Button("button.back", _("Back")),
+                        ui.SaveButton("button.next", _("Next"))]
         return page
 
     def on_change(self, changes):
diff --git a/src/ovirt/node/installer/core/upgrade_page.py b/src/ovirt/node/installer/core/upgrade_page.py
index 8d900bc..ecdcb72 100644
--- a/src/ovirt/node/installer/core/upgrade_page.py
+++ b/src/ovirt/node/installer/core/upgrade_page.py
@@ -36,7 +36,7 @@
         "current admin password will be used."
 
     def name(self):
-        return "Upgrade Password"
+        return _("Upgrade Password")
 
     def rank(self):
         return 150
@@ -49,28 +49,28 @@
 
     def ui_content(self):
         ws = [ui.Header("header[0]",
-                        "Require a password for the admin user?"),
-              ui.Label("label[0]", "Please enter the current admin " +
-                       "password. You may also change the admin password " +
-                       "if required. If the new password fields are left" +
-                       "blank the password will remain the same."),
-              ui.Label("label[1]", "Password for the admin user"),
+                        _("Require a password for the admin user?")),
+              ui.Label("label[0]", _("Please enter the current admin ") +
+                       _("password. You may also change the admin password ") +
+                       _("if required. If the new password fields are left") +
+                       _("blank the password will remain the same.")),
+              ui.Label("label[1]", _("Password for the admin user")),
               ui.Divider("divider[0]"),
               ui.PasswordEntry("upgrade.current_password",
-                               "Current Password:"),
+                               _("Current Password:")),
               ui.Divider("divider[1]"),
-              ui.PasswordEntry("upgrade.password", "Password:"),
+              ui.PasswordEntry("upgrade.password", _("Password:")),
               ui.PasswordEntry("upgrade.password_confirmation",
-                               "Confirm Password:"),
+                               _("Confirm Password:")),
               ui.Divider("divider[2]"),
               ui.Label("current_password.info", ""),
               ui.Label("password.info", self.__no_new_password_msg)
               ]
         self.widgets.add(ws)
         page = ui.Page("password", ws)
-        page.buttons = [ui.QuitButton("button.quit", "Quit"),
-                        ui.Button("button.back", "Back"),
-                        ui.SaveButton("button.next", "Update")]
+        page.buttons = [ui.QuitButton("button.quit", _("Quit")),
+                        ui.Button("button.back", _("Back")),
+                        ui.SaveButton("button.next", _("Update"))]
         return page
 
     def on_change(self, changes):
diff --git a/src/ovirt/node/installer/core/welcome_page.py b/src/ovirt/node/installer/core/welcome_page.py
index ae4c939..b594e13 100644
--- a/src/ovirt/node/installer/core/welcome_page.py
+++ b/src/ovirt/node/installer/core/welcome_page.py
@@ -40,7 +40,7 @@
     _model = {}
 
     def name(self):
-        return "Welcome"
+        return _("Welcome")
 
     def rank(self):
         return 0
@@ -52,13 +52,13 @@
         return {}
 
     def ui_content(self):
-        ws = [ui.Header("header[0]", "Installation")]
+        ws = [ui.Header("header[0]", _("Installation"))]
         ws += self.___installation_options()
         ws += [ui.Divider("divider[0]")]
         ws += self.__additional_infos()
         self.widgets.add(ws)
         page = ui.Page("welcome", ws)
-        page.buttons = [ui.QuitButton("button.quit", "Quit")]
+        page.buttons = [ui.QuitButton("button.quit", _("Quit"))]
         return page
 
     def on_change(self, changes):
@@ -81,10 +81,10 @@
 
     def ___installation_options(self):
         if self.application.args.dry:
-            return [ui.Button("button.install", "Install (dry)"),
-                    ui.Button("button.upgrade", "Upgrade (dry)"),
-                    ui.Button("button.downgrade", "Downgrade (dry)"),
-                    ui.Button("button.reinstall", "Reinstall (dry)")]
+            return [ui.Button("button.install", _("Install (dry)")),
+                    ui.Button("button.upgrade", _("Upgrade (dry)")),
+                    ui.Button("button.downgrade", _("Downgrade (dry)")),
+                    ui.Button("button.reinstall", _("Reinstall (dry)"))]
 
         media = utils.system.InstallationMedia()
 
@@ -92,37 +92,37 @@
         has_root = os.path.exists("/dev/disk/by-label/ROOT")
 
         if has_hostvg and has_root:
-            return [ui.Label("Major version upgrades are unsupported, " +
-                             "uninstall existing version first")]
+            return [ui.Label(_("Major version upgrades are unsupported, ") +
+                             _("uninstall existing version first"))]
 
         if has_hostvg:
             try:
                 installed = utils.system.InstalledMedia()
                 if media > installed:
                     return [ui.Button("button.upgrade",
-                                      "Upgrade %s to %s" % (installed, media))]
+                                      _("Upgrade %s to %s") % (installed, media))]
                 elif media < installed:
                     return [ui.Button("button.downgrade",
-                                      "Downgrade %s to %s" % (installed,
+                                      _("Downgrade %s to %s") % (installed,
                                                               media))]
                 return [ui.Button("button.reinstall",
-                                  "Reinstall %s" % installed)]
+                                  _("Reinstall %s") % installed)]
             except:
                 self.logger.error("Unable to get version numbers for " +
                                   "upgrade, invalid installation or media")
                 return [ui.Label("lbl.failinstall",
-                                 "Invalid installation, please reboot from " +
-                                 "media and choose Reinstall")]
+                                 _("Invalid installation, please reboot from ") +
+                                 _("media and choose Reinstall"))]
 
-        return [ui.Button("button.install", "Install Hypervisor %s" % media)]
+        return [ui.Button("button.install", _("Install Hypervisor %s") % media)]
 
     def __additional_infos(self):
         ws = []
-        ws.append(ui.Label("welcome.virt", "Info: %s" %
+        ws.append(ui.Label("welcome.virt", _("Info: %s") %
                            virt.hardware_status()))
         if system.is_efi():
             ws.append(ui.Label("welcome.efi",
-                               "Info: Machine is booted in EFI mode"))
+                               _("Info: Machine is booted in EFI mode")))
         if self.application.args.dry:
-            ws.append(ui.Label("dry", "Info: DRY MODE"))
+            ws.append(ui.Label("dry", _("Info: DRY MODE")))
         return ws
diff --git a/src/ovirt/node/locale/en_US/LC_MESSAGES/ovirt_node.mo b/src/ovirt/node/locale/en_US/LC_MESSAGES/ovirt_node.mo
new file mode 100644
index 0000000..c3dbe0b
--- /dev/null
+++ b/src/ovirt/node/locale/en_US/LC_MESSAGES/ovirt_node.mo
Binary files differ
diff --git a/src/ovirt/node/locale/ovirt_node.pot b/src/ovirt/node/locale/ovirt_node.pot
new file mode 100644
index 0000000..0e11c12
--- /dev/null
+++ b/src/ovirt/node/locale/ovirt_node.pot
@@ -0,0 +1,908 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2013-08-19 16:04+CST\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: ENCODING\n"
+"Generated-By: pygettext.py 1.5\n"
+
+
+#: installer/core/boot_device_page.py:38
+msgid "Boot Device"
+msgstr ""
+
+#: installer/core/boot_device_page.py:59
+msgid "Please select the disk to use for booting %s"
+msgstr ""
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Device Name"
+msgstr ""
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Location"
+msgstr ""
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Size"
+msgstr ""
+
+#: installer/core/boot_device_page.py:70
+#: installer/core/installation_device_page.py:73
+msgid "(No device)"
+msgstr ""
+
+#: installer/core/boot_device_page.py:74
+msgid "No Valid Boot Devices Detected"
+msgstr ""
+
+#: installer/core/boot_device_page.py:77
+#: installer/core/installation_device_page.py:80
+#: installer/core/keyboard_page.py:57 installer/core/password_page.py:56
+#: installer/core/storage_vol_page.py:78 installer/core/upgrade_page.py:71
+#: installer/core/welcome_page.py:61
+msgid "Quit"
+msgstr ""
+
+#: installer/core/boot_device_page.py:78
+#: installer/core/installation_device_page.py:81
+#: installer/core/keyboard_page.py:58 installer/core/password_page.py:57
+#: installer/core/storage_vol_page.py:79 installer/core/upgrade_page.py:72
+msgid "Back"
+msgstr ""
+
+#: installer/core/boot_device_page.py:79
+#: installer/core/installation_device_page.py:82
+#: installer/core/keyboard_page.py:59
+msgid "Continue"
+msgstr ""
+
+#: installer/core/boot_device_page.py:180
+msgid "Device"
+msgstr ""
+
+#: installer/core/boot_device_page.py:181
+msgid "Model"
+msgstr ""
+
+#: installer/core/boot_device_page.py:182
+msgid "Bus Type"
+msgstr ""
+
+#: installer/core/boot_device_page.py:183
+msgid "Serial"
+msgstr ""
+
+#: installer/core/boot_device_page.py:184
+msgid "Size (GB)"
+msgstr ""
+
+#: installer/core/boot_device_page.py:185
+msgid "Description"
+msgstr ""
+
+#: installer/core/boot_device_page.py:189
+msgid ""
+"Disk Details\n"
+msgstr ""
+
+#: installer/core/boot_device_page.py:204
+msgid "Custom Block Device"
+msgstr ""
+
+#: installer/core/boot_device_page.py:206
+msgid "Device path:"
+msgstr ""
+
+#: installer/core/boot_device_page.py:211 setup/core/network_page.py:556
+#: ui/__init__.py:779 ui/__init__.py:799
+msgid "Save"
+msgstr ""
+
+#: installer/core/boot_device_page.py:212
+msgid "Cancel"
+msgstr ""
+
+#: installer/core/installation_device_page.py:39
+msgid "Data Device"
+msgstr ""
+
+#: installer/core/installation_device_page.py:60
+msgid "Please select the disk(s) to use for installation of %s"
+msgstr ""
+
+#: installer/core/installation_device_page.py:77
+msgid "No Valid Install Devices Detected"
+msgstr ""
+
+#: installer/core/keyboard_page.py:35 setup/core/keyboard_page.py:34
+msgid "Keyboard"
+msgstr ""
+
+#: installer/core/keyboard_page.py:50 setup/core/keyboard_page.py:55
+msgid "Keyboard Layout Selection"
+msgstr ""
+
+#: installer/core/keyboard_page.py:51 setup/core/keyboard_page.py:61
+msgid "Available Keyboard Layouts"
+msgstr ""
+
+#: installer/core/keyboard_page.py:53
+msgid "(Hit Enter to select a layout)"
+msgstr ""
+
+#: installer/core/password_page.py:33
+msgid "Console Password"
+msgstr ""
+
+#: installer/core/password_page.py:46 installer/core/upgrade_page.py:52
+msgid "Require a password for the admin user?"
+msgstr ""
+
+#: installer/core/password_page.py:48 installer/core/upgrade_page.py:62
+#: setup/core/security_page.py:65 setup/core/status_page.py:241
+msgid "Password:"
+msgstr ""
+
+#: installer/core/password_page.py:50 installer/core/upgrade_page.py:64
+msgid "Confirm Password:"
+msgstr ""
+
+#: installer/core/password_page.py:58
+msgid "Install"
+msgstr ""
+
+#: installer/core/progress_page.py:40
+msgid "Installation Progress"
+msgstr ""
+
+#: installer/core/progress_page.py:52
+msgid "Installing"
+msgstr ""
+
+#: installer/core/progress_page.py:60
+msgid "Reboot"
+msgstr ""
+
+#: installer/core/progress_page.py:193
+msgid "Writing configuration file"
+msgstr ""
+
+#: installer/core/progress_page.py:221
+msgid "Partitioning and Creating File Systems on '%s'"
+msgstr ""
+
+#: installer/core/progress_page.py:238
+msgid "Setting Admin Password"
+msgstr ""
+
+#: installer/core/progress_page.py:255
+msgid "Installing Image and Bootloader "
+msgstr ""
+
+#: installer/core/progress_page.py:256
+msgid "Configuration to '%s'"
+msgstr ""
+
+#: installer/core/progress_page.py:258
+msgid "Updating Image and Bootloader"
+msgstr ""
+
+#: installer/core/progress_page.py:269
+msgid "Setting keyboard layout to '%s'"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:32
+msgid "Storage Sizes"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:61
+msgid "Storage Volumes"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:62
+msgid "Please enter the sizes for the "
+msgstr ""
+
+#: installer/core/storage_vol_page.py:63
+msgid "following partitions in MB"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:65
+msgid "UEFI/Bios:"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:67
+msgid "Root & RootBackup:"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:69
+msgid "(2 partitions at 512MB each)"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:71
+msgid "Swap:"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:72
+msgid "Config:"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:73
+msgid "Logging:"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:74
+msgid "Data:"
+msgstr ""
+
+#: installer/core/storage_vol_page.py:80
+msgid "Next"
+msgstr ""
+
+#: installer/core/upgrade_page.py:39
+msgid "Upgrade Password"
+msgstr ""
+
+#: installer/core/upgrade_page.py:53
+msgid "Please enter the current admin "
+msgstr ""
+
+#: installer/core/upgrade_page.py:54
+msgid "password. You may also change the admin password "
+msgstr ""
+
+#: installer/core/upgrade_page.py:55
+msgid "if required. If the new password fields are left"
+msgstr ""
+
+#: installer/core/upgrade_page.py:56
+msgid "blank the password will remain the same."
+msgstr ""
+
+#: installer/core/upgrade_page.py:57 setup/core/security_page.py:64
+msgid "Password for the admin user"
+msgstr ""
+
+#: installer/core/upgrade_page.py:60
+msgid "Current Password:"
+msgstr ""
+
+#: installer/core/upgrade_page.py:73
+msgid "Update"
+msgstr ""
+
+#: installer/core/welcome_page.py:43
+msgid "Welcome"
+msgstr ""
+
+#: installer/core/welcome_page.py:55
+msgid "Installation"
+msgstr ""
+
+#: installer/core/welcome_page.py:84
+msgid "Install (dry)"
+msgstr ""
+
+#: installer/core/welcome_page.py:85
+msgid "Upgrade (dry)"
+msgstr ""
+
+#: installer/core/welcome_page.py:86
+msgid "Downgrade (dry)"
+msgstr ""
+
+#: installer/core/welcome_page.py:87
+msgid "Reinstall (dry)"
+msgstr ""
+
+#: installer/core/welcome_page.py:95
+msgid "Major version upgrades are unsupported, "
+msgstr ""
+
+#: installer/core/welcome_page.py:96
+msgid "uninstall existing version first"
+msgstr ""
+
+#: installer/core/welcome_page.py:103
+msgid "Upgrade %s to %s"
+msgstr ""
+
+#: installer/core/welcome_page.py:106
+msgid "Downgrade %s to %s"
+msgstr ""
+
+#: installer/core/welcome_page.py:109
+msgid "Reinstall %s"
+msgstr ""
+
+#: installer/core/welcome_page.py:114
+msgid "Invalid installation, please reboot from "
+msgstr ""
+
+#: installer/core/welcome_page.py:115
+msgid "media and choose Reinstall"
+msgstr ""
+
+#: installer/core/welcome_page.py:117
+msgid "Install Hypervisor %s"
+msgstr ""
+
+#: installer/core/welcome_page.py:121
+msgid "Info: %s"
+msgstr ""
+
+#: installer/core/welcome_page.py:125
+msgid "Info: Machine is booted in EFI mode"
+msgstr ""
+
+#: installer/core/welcome_page.py:127
+msgid "Info: DRY MODE"
+msgstr ""
+
+#: setup/core/diagnostics_page.py:33
+msgid "Diagnostics"
+msgstr ""
+
+#: setup/core/diagnostics_page.py:51
+msgid "Diagnostic Utilities"
+msgstr ""
+
+#: setup/core/diagnostics_page.py:52
+msgid "Select one of the tools below."
+msgstr ""
+
+#: setup/core/diagnostics_page.py:54
+msgid "Available diagnostics"
+msgstr ""
+
+#: setup/core/diagnostics_page.py:79
+msgid "Command Output"
+msgstr ""
+
+#: setup/core/kdump_page.py:42
+msgid "Kdump"
+msgstr ""
+
+#: setup/core/kdump_page.py:89
+msgid "Configure Kdump"
+msgstr ""
+
+#: setup/core/kdump_page.py:93
+msgid "network.notice"
+msgstr ""
+
+#: setup/core/kdump_page.py:94 setup/core/logging_page.py:78
+msgid "Networking is not configured, "
+msgstr ""
+
+#: setup/core/kdump_page.py:95
+msgid "please configure it before NFS "
+msgstr ""
+
+#: setup/core/kdump_page.py:96
+msgid "or SSH-based kdump"
+msgstr ""
+
+#: setup/core/kdump_page.py:98 setup/core/kdump_page.py:102
+msgid "Type"
+msgstr ""
+
+#: setup/core/kdump_page.py:104
+msgid "NFS Location "
+msgstr ""
+
+#: setup/core/kdump_page.py:105
+msgid "(example.com:/var/crash):"
+msgstr ""
+
+#: setup/core/kdump_page.py:108
+msgid "SSH Location "
+msgstr ""
+
+#: setup/core/kdump_page.py:109
+msgid "(root at example.com):"
+msgstr ""
+
+#: setup/core/kdump_page.py:147
+msgid "Updating kdump related configuration"
+msgstr ""
+
+#: setup/core/kdump_page.py:172
+msgid "An error occurred"
+msgstr ""
+
+#: setup/core/keyboard_page.py:56
+msgid "Choose the Keyboard Layout you would "
+msgstr ""
+
+#: setup/core/keyboard_page.py:57 setup/core/performance_page.py:55
+msgid "like to apply to this system."
+msgstr ""
+
+#: setup/core/keyboard_page.py:59
+msgid "Current Active "
+msgstr ""
+
+#: setup/core/keyboard_page.py:60
+msgid "Keyboard Layout:  "
+msgstr ""
+
+#: setup/core/keyboard_page.py:84
+msgid "Updating keyboard related configuration"
+msgstr ""
+
+#: setup/core/logging_page.py:34 setup/core/logging_page.py:68
+msgid "Logging"
+msgstr ""
+
+#: setup/core/logging_page.py:69
+msgid "Logrotate Max Log "
+msgstr ""
+
+#: setup/core/logging_page.py:70
+msgid "Size (KB):"
+msgstr ""
+
+#: setup/core/logging_page.py:79
+msgid "please configure it before rsyslog "
+msgstr ""
+
+#: setup/core/logging_page.py:80
+msgid "and/or netconsole"
+msgstr ""
+
+#: setup/core/logging_page.py:83
+msgid "RSyslog is an enhanced multi-"
+msgstr ""
+
+#: setup/core/logging_page.py:84
+msgid "threaded syslogd"
+msgstr ""
+
+#: setup/core/logging_page.py:85 setup/core/logging_page.py:93
+#: setup/core/monitoring_page.py:58
+msgid "Server Address:"
+msgstr ""
+
+#: setup/core/logging_page.py:87 setup/core/logging_page.py:95
+#: setup/core/monitoring_page.py:59
+msgid "Server Port:"
+msgstr ""
+
+#: setup/core/logging_page.py:91
+msgid "Netconsole service allows a remote sys"
+msgstr ""
+
+#: setup/core/logging_page.py:92
+msgid "log daemon to record printk() messages"
+msgstr ""
+
+#: setup/core/logging_page.py:115
+msgid "Updating logging related configuration"
+msgstr ""
+
+#: setup/core/monitoring_page.py:34
+msgid "Monitoring"
+msgstr ""
+
+#: setup/core/monitoring_page.py:53
+msgid "Monitoring Configuration"
+msgstr ""
+
+#: setup/core/monitoring_page.py:54
+msgid "Collectd gathers statistics "
+msgstr ""
+
+#: setup/core/monitoring_page.py:55
+msgid "about the system and can be used to find "
+msgstr ""
+
+#: setup/core/monitoring_page.py:56
+msgid "performance bottlenecks and predict future "
+msgstr ""
+
+#: setup/core/monitoring_page.py:57
+msgid "system load."
+msgstr ""
+
+#: setup/core/monitoring_page.py:79
+msgid "Updating monitoring configuration"
+msgstr ""
+
+#: setup/core/network_page.py:93
+msgid "Network"
+msgstr ""
+
+#: setup/core/network_page.py:164
+msgid "Remove %s (%s)"
+msgstr ""
+
+#: setup/core/network_page.py:165 setup/core/network_page.py:571
+msgid "Create Bond"
+msgstr ""
+
+#: setup/core/network_page.py:167
+msgid "System Identification"
+msgstr ""
+
+#: setup/core/network_page.py:168
+msgid "Hostname:"
+msgstr ""
+
+#: setup/core/network_page.py:170
+msgid "DNS Server 1:"
+msgstr ""
+
+#: setup/core/network_page.py:171
+msgid "DNS Server 2:"
+msgstr ""
+
+#: setup/core/network_page.py:173
+msgid "NTP Server 1:"
+msgstr ""
+
+#: setup/core/network_page.py:174
+msgid "NTP Server 2:"
+msgstr ""
+
+#: setup/core/network_page.py:179 setup/core/ping.py:74
+msgid "Ping"
+msgstr ""
+
+#: setup/core/network_page.py:250
+msgid "Network Interface Configuration"
+msgstr ""
+
+#: setup/core/network_page.py:486
+msgid "Driver: "
+msgstr ""
+
+#: setup/core/network_page.py:487
+msgid "Vendor: "
+msgstr ""
+
+#: setup/core/network_page.py:499
+msgid "IPv4 Settings"
+msgstr ""
+
+#: setup/core/network_page.py:502 setup/core/network_page.py:522
+msgid "Disabled"
+msgstr ""
+
+#: setup/core/network_page.py:503 setup/core/network_page.py:524
+msgid "DHCP"
+msgstr ""
+
+#: setup/core/network_page.py:504 setup/core/network_page.py:525
+msgid "Static"
+msgstr ""
+
+#: setup/core/network_page.py:509 setup/core/network_page.py:530
+msgid "IP Address: "
+msgstr ""
+
+#: setup/core/network_page.py:511
+msgid "  Netmask: "
+msgstr ""
+
+#: setup/core/network_page.py:514 setup/core/network_page.py:535
+msgid "Gateway: "
+msgstr ""
+
+#: setup/core/network_page.py:519
+msgid "IPv6 Settings"
+msgstr ""
+
+#: setup/core/network_page.py:523
+msgid "Auto"
+msgstr ""
+
+#: setup/core/network_page.py:532
+msgid "  Prefix Length: "
+msgstr ""
+
+#: setup/core/network_page.py:542
+msgid "VLAN ID: "
+msgstr ""
+
+#: setup/core/network_page.py:548
+msgid "Use Bridge: "
+msgstr ""
+
+#: setup/core/network_page.py:551
+msgid "Flash Lights to Identify"
+msgstr ""
+
+#: setup/core/network_page.py:557 ui/__init__.py:817 ui/__init__.py:827
+#: ui/__init__.py:842 ui/__init__.py:859
+msgid "Close"
+msgstr ""
+
+#: setup/core/network_page.py:566 setup/core/plugins_page.py:56
+msgid "Name:"
+msgstr ""
+
+#: setup/core/network_page.py:568
+msgid "Options:"
+msgstr ""
+
+#: setup/core/performance_page.py:34
+msgid "Performance"
+msgstr ""
+
+#: setup/core/performance_page.py:53
+msgid "tuned Configuration"
+msgstr ""
+
+#: setup/core/performance_page.py:54
+msgid "Choose the tuned profile you would "
+msgstr ""
+
+#: setup/core/performance_page.py:57
+msgid "Current Active Profile:  "
+msgstr ""
+
+#: setup/core/performance_page.py:58
+msgid "Available tuned Profiles"
+msgstr ""
+
+#: setup/core/ping.py:35
+msgid "Networking/Ping"
+msgstr ""
+
+#: setup/core/ping.py:70
+msgid "Ping a remote host"
+msgstr ""
+
+#: setup/core/ping.py:71
+msgid "Address:"
+msgstr ""
+
+#: setup/core/ping.py:72
+msgid "Count:"
+msgstr ""
+
+#: setup/core/ping.py:76
+msgid "Result:"
+msgstr ""
+
+#: setup/core/plugins_page.py:40 setup/core/plugins_page.py:74
+msgid "Plugins"
+msgstr ""
+
+#: setup/core/plugins_page.py:49
+msgid "Installed Plugins"
+msgstr ""
+
+#: setup/core/plugins_page.py:51
+msgid "Installed plugins:"
+msgstr ""
+
+#: setup/core/plugins_page.py:59
+msgid "Version:"
+msgstr ""
+
+#: setup/core/plugins_page.py:62
+msgid "Date installed:"
+msgstr ""
+
+#: setup/core/plugins_page.py:67
+msgid "RPM Diff"
+msgstr ""
+
+#: setup/core/plugins_page.py:69
+msgid "SRPM Diff"
+msgstr ""
+
+#: setup/core/plugins_page.py:71
+msgid "File Diff"
+msgstr ""
+
+#: setup/core/plugins_page.py:76
+msgid "There are no plugins currently installed"
+msgstr ""
+
+#: setup/core/remote_storage_page.py:35 setup/core/remote_storage_page.py:55
+msgid "Remote Storage"
+msgstr ""
+
+#: setup/core/remote_storage_page.py:56
+msgid "iSCSI Initiator Name:"
+msgstr ""
+
+#: setup/core/remote_storage_page.py:59
+msgid "NFSv4 Domain (example.redhat.com):"
+msgstr ""
+
+#: setup/core/remote_storage_page.py:79
+msgid "Updating remote storage configuration"
+msgstr ""
+
+#: setup/core/security_page.py:34
+msgid "Security"
+msgstr ""
+
+#: setup/core/security_page.py:59
+msgid "Remote Access"
+msgstr ""
+
+#: setup/core/security_page.py:60
+msgid "Enable SSH password authentication"
+msgstr ""
+
+#: setup/core/security_page.py:61
+msgid "Strong Random Number Generator"
+msgstr ""
+
+#: setup/core/security_page.py:62
+msgid "Disable AES-NI"
+msgstr ""
+
+#: setup/core/security_page.py:63
+msgid "Bytes Used:"
+msgstr ""
+
+#: setup/core/security_page.py:98
+msgid "Updating security configuration"
+msgstr ""
+
+#: setup/core/security_page.py:112
+msgid "Setting admin password"
+msgstr ""
+
+#: setup/core/status_page.py:43
+msgid "Status"
+msgstr ""
+
+#: setup/core/status_page.py:78
+msgid "Networking: "
+msgstr ""
+
+#: setup/core/status_page.py:82
+msgid "Lock"
+msgstr ""
+
+#: setup/core/status_page.py:83
+msgid "Log Off"
+msgstr ""
+
+#: setup/core/status_page.py:84
+msgid "Restart"
+msgstr ""
+
+#: setup/core/status_page.py:85
+msgid "Power Off"
+msgstr ""
+
+#: setup/core/status_page.py:88
+msgid "System Information"
+msgstr ""
+
+#: setup/core/status_page.py:90
+msgid "Status: "
+msgstr ""
+
+#: setup/core/status_page.py:96
+msgid "Logs: "
+msgstr ""
+
+#: setup/core/status_page.py:100
+msgid "Running VMs: "
+msgstr ""
+
+#: setup/core/status_page.py:103
+msgid "Press F8 for support menu"
+msgstr ""
+
+#: setup/core/status_page.py:107
+msgid "View Host Key"
+msgstr ""
+
+#: setup/core/status_page.py:109
+msgid "View CPU Details"
+msgstr ""
+
+#: setup/core/status_page.py:142
+msgid "The provided password was incorrect."
+msgstr ""
+
+#: setup/core/status_page.py:152
+msgid "Confirm System Restart"
+msgstr ""
+
+#: setup/core/status_page.py:154
+msgid ""
+"\n"
+"This will restart the system,"
+msgstr ""
+
+#: setup/core/status_page.py:155 setup/core/status_page.py:167
+msgid "proceed?"
+msgstr ""
+
+#: setup/core/status_page.py:164
+msgid "Confirm System Poweroff"
+msgstr ""
+
+#: setup/core/status_page.py:166
+msgid ""
+"\n"
+"This will shut down the system,"
+msgstr ""
+
+#: setup/core/status_page.py:175
+msgid "Host Key"
+msgstr ""
+
+#: setup/core/status_page.py:179
+msgid "CPU Details"
+msgstr ""
+
+#: setup/core/status_page.py:212
+msgid "RSA Host Key Fingerprint:"
+msgstr ""
+
+#: setup/core/status_page.py:218
+msgid "RSA Host Key:"
+msgstr ""
+
+#: setup/core/status_page.py:238
+msgid "Enter the admin password to unlock"
+msgstr ""
+
+#: setup/core/status_page.py:239
+msgid "Username: "
+msgstr ""
+
+#: setup/core/status_page.py:243
+msgid "Unlock"
+msgstr ""
+
+#: setup/core/support_page.py:38
+msgid "Support"
+msgstr ""
+
+#: setup/core/support_page.py:47
+msgid "Support Info"
+msgstr ""
+
+#: setup/core/support_page.py:48
+msgid "Select one of the logfiles below."
+msgstr ""
+
+#: setup/core/support_page.py:50
+msgid "Available Logfiles"
+msgstr ""
+
+#: setup/core/support_page.py:84
+msgid "Logfile"
+msgstr ""
+
+#: ui/__init__.py:780 ui/__init__.py:800
+msgid "Reset"
+msgstr ""
+
+#: ui/__init__.py:825
+msgid "Contents"
+msgstr ""
+
+#: ui/__init__.py:841
+msgid "OK"
+msgstr ""
+
+#: ui/__init__.py:851
+msgid "Transaction: %s"
+msgstr ""
+
diff --git a/src/ovirt/node/locale/ovirt_node_cn.po b/src/ovirt/node/locale/ovirt_node_cn.po
new file mode 100644
index 0000000..0e04930
--- /dev/null
+++ b/src/ovirt/node/locale/ovirt_node_cn.po
@@ -0,0 +1,910 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2013-08-19 16:04+CST\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: ENCODING\n"
+"Generated-By: pygettext.py 1.5\n"
+
+
+#: installer/core/boot_device_page.py:38
+msgid "Boot Device"
+msgstr "启动设备"
+
+#: installer/core/boot_device_page.py:59
+msgid "Please select the disk to use for booting %s"
+msgstr "请选择用于引导 %s 的磁盘"
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Device Name"
+msgstr "设备名称"
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Location"
+msgstr "位置"
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Size"
+msgstr "容量"
+
+#: installer/core/boot_device_page.py:70
+#: installer/core/installation_device_page.py:73
+msgid "(No device)"
+msgstr "(No device)"
+
+#: installer/core/boot_device_page.py:74
+msgid "No Valid Boot Devices Detected"
+msgstr "未发现可用的引导设备"
+
+#: installer/core/boot_device_page.py:77
+#: installer/core/installation_device_page.py:80
+#: installer/core/keyboard_page.py:57 installer/core/password_page.py:56
+#: installer/core/storage_vol_page.py:78 installer/core/upgrade_page.py:71
+#: installer/core/welcome_page.py:61
+msgid "Quit"
+msgstr "退出  "
+
+#: installer/core/boot_device_page.py:78
+#: installer/core/installation_device_page.py:81
+#: installer/core/keyboard_page.py:58 installer/core/password_page.py:57
+#: installer/core/storage_vol_page.py:79 installer/core/upgrade_page.py:72
+msgid "Back"
+msgstr "返回  "
+
+#: installer/core/boot_device_page.py:79
+#: installer/core/installation_device_page.py:82
+#: installer/core/keyboard_page.py:59
+msgid "Continue"
+msgstr "继续  "
+
+#: installer/core/boot_device_page.py:180
+msgid "Device"
+msgstr "设备"
+
+#: installer/core/boot_device_page.py:181
+msgid "Model"
+msgstr "型号"
+
+#: installer/core/boot_device_page.py:182
+msgid "Bus Type"
+msgstr "总线类型"
+
+#: installer/core/boot_device_page.py:183
+msgid "Serial"
+msgstr "串行"
+
+#: installer/core/boot_device_page.py:184
+msgid "Size (GB)"
+msgstr "容量(GB)"
+
+#: installer/core/boot_device_page.py:185
+msgid "Description"
+msgstr "描述"
+
+#: installer/core/boot_device_page.py:189
+msgid "Disk Details\n"
+msgstr "磁盘详细\n"
+
+#: installer/core/boot_device_page.py:204
+msgid "Custom Block Device"
+msgstr "可用块设备"
+
+#: installer/core/boot_device_page.py:206
+msgid "Device path:"
+msgstr "设备路径:"
+
+#: installer/core/boot_device_page.py:211 setup/core/network_page.py:556
+#: ui/__init__.py:779 ui/__init__.py:799
+msgid "Save"
+msgstr "保存  "
+
+#: installer/core/boot_device_page.py:212
+msgid "Cancel"
+msgstr "取消  "
+
+#: installer/core/installation_device_page.py:39
+msgid "Data Device"
+msgstr "数据设备"
+
+#: installer/core/installation_device_page.py:60
+msgid "Please select the disk(s) to use for installation of %s"
+msgstr "请选择磁盘用来安装%s"
+
+#: installer/core/installation_device_page.py:77
+msgid "No Valid Install Devices Detected"
+msgstr "未发现可用的安装设备"
+
+#: installer/core/keyboard_page.py:35 setup/core/keyboard_page.py:34
+msgid "Keyboard"
+msgstr "键盘"
+
+#: installer/core/keyboard_page.py:50 setup/core/keyboard_page.py:55
+msgid "Keyboard Layout Selection"
+msgstr "键盘类型选择"
+
+#: installer/core/keyboard_page.py:51 setup/core/keyboard_page.py:61
+msgid "Available Keyboard Layouts"
+msgstr "可用键盘类型"
+
+#: installer/core/keyboard_page.py:53
+msgid "(Hit Enter to select a layout)"
+msgstr "(点击Enter选择键盘类型)"
+
+#: installer/core/password_page.py:33
+msgid "Console Password"
+msgstr "控制台密码"
+
+#: installer/core/password_page.py:46 installer/core/upgrade_page.py:52
+msgid "Require a password for the admin user?"
+msgstr "是否设置admin用户密码?"
+
+#: installer/core/password_page.py:48 installer/core/upgrade_page.py:62
+#: setup/core/security_page.py:65 setup/core/status_page.py:241
+msgid "Password:"
+msgstr "密码:"
+
+#: installer/core/password_page.py:50 installer/core/upgrade_page.py:64
+msgid "Confirm Password:"
+msgstr "确认密码:"
+
+#: installer/core/password_page.py:58
+msgid "Install"
+msgstr "安装  "
+
+#: installer/core/progress_page.py:40
+msgid "Installation Progress"
+msgstr "安装过程"
+
+#: installer/core/progress_page.py:52
+msgid "Installing"
+msgstr "正在安装    "
+
+#: installer/core/progress_page.py:60
+msgid "Reboot"
+msgstr "重启  "
+
+#: installer/core/progress_page.py:193
+msgid "Writing configuration file"
+msgstr "写配置文件"
+
+#: installer/core/progress_page.py:221
+msgid "Partitioning and Creating File Systems on '%s'"
+msgstr "在'%s'上分区并创建文件系统"
+
+#: installer/core/progress_page.py:238
+msgid "Setting Admin Password"
+msgstr "设置Admin密码"
+
+#: installer/core/progress_page.py:255
+msgid "Installing Image and Bootloader "
+msgstr "安装Image和Bootloader"
+
+#: installer/core/progress_page.py:256
+msgid "Configuration to '%s'"
+msgstr "配置'%s'"
+
+#: installer/core/progress_page.py:258
+msgid "Updating Image and Bootloader"
+msgstr "更新Image和Bootloader"
+
+#: installer/core/progress_page.py:269
+msgid "Setting keyboard layout to '%s'"
+msgstr "设置键盘布局为'%s'"
+
+#: installer/core/storage_vol_page.py:32
+msgid "Storage Sizes"
+msgstr "存储容量"
+
+#: installer/core/storage_vol_page.py:61
+msgid "Storage Volumes"
+msgstr "存储容量"
+
+#: installer/core/storage_vol_page.py:62
+msgid "Please enter the sizes for the "
+msgstr "请输入分区容量(MB)"
+
+#: installer/core/storage_vol_page.py:63
+msgid "following partitions in MB"
+msgstr " "
+
+#: installer/core/storage_vol_page.py:65
+msgid "UEFI/Bios:"
+msgstr "UEFI/Bios:"
+
+#: installer/core/storage_vol_page.py:67
+msgid "Root & RootBackup:"
+msgstr "Root & RootBackup:"
+
+#: installer/core/storage_vol_page.py:69
+msgid "(2 partitions at 512MB each)"
+msgstr "(两个分区各512MB)"
+
+#: installer/core/storage_vol_page.py:71
+msgid "Swap:"
+msgstr "Swap:"
+
+#: installer/core/storage_vol_page.py:72
+msgid "Config:"
+msgstr "Config:"
+
+#: installer/core/storage_vol_page.py:73
+msgid "Logging:"
+msgstr "Logging:"
+
+#: installer/core/storage_vol_page.py:74
+msgid "Data:"
+msgstr "Data:"
+
+#: installer/core/storage_vol_page.py:80
+msgid "Next"
+msgstr "下一步   "
+
+#: installer/core/upgrade_page.py:39
+msgid "Upgrade Password"
+msgstr "更新密码"
+
+#: installer/core/upgrade_page.py:53
+msgid "Please enter the current admin "
+msgstr "请输入当前admin的密码。如果需要你也可以修改admin的密码。如果不输入的话,将使用原密码。"
+
+#: installer/core/upgrade_page.py:54
+msgid "password. You may also change the admin password "
+msgstr " "
+
+#: installer/core/upgrade_page.py:55
+msgid "if required. If the new password fields are left"
+msgstr " "
+
+#: installer/core/upgrade_page.py:56
+msgid "blank the password will remain the same."
+msgstr " "
+
+#: installer/core/upgrade_page.py:57 setup/core/security_page.py:64
+msgid "Password for the admin user"
+msgstr "admin用户的密码"
+
+#: installer/core/upgrade_page.py:60
+msgid "Current Password:"
+msgstr "当前密码:"
+
+#: installer/core/upgrade_page.py:73
+msgid "Update"
+msgstr "更新  "
+
+#: installer/core/welcome_page.py:43
+msgid "Welcome"
+msgstr "欢迎"
+
+#: installer/core/welcome_page.py:55
+msgid "Installation"
+msgstr "安装  "
+
+#: installer/core/welcome_page.py:84
+msgid "Install (dry)"
+msgstr "安装(dry)    "
+
+#: installer/core/welcome_page.py:85
+msgid "Upgrade (dry)"
+msgstr "更新(dry)    "
+
+#: installer/core/welcome_page.py:86
+msgid "Downgrade (dry)"
+msgstr "降级(dry)    "
+
+#: installer/core/welcome_page.py:87
+msgid "Reinstall (dry)"
+msgstr "重装(dry)    "
+
+#: installer/core/welcome_page.py:95
+msgid "Major version upgrades are unsupported, "
+msgstr "主版本不支持升级,请先删除现有系统"
+
+#: installer/core/welcome_page.py:96
+msgid "uninstall existing version first"
+msgstr " "
+
+#: installer/core/welcome_page.py:103
+msgid "Upgrade %s to %s"
+msgstr "更新 %s 到 %s"
+
+#: installer/core/welcome_page.py:106
+msgid "Downgrade %s to %s"
+msgstr "降级 %s 到 %s"
+
+#: installer/core/welcome_page.py:109
+msgid "Reinstall %s"
+msgstr "重装 %s"
+
+#: installer/core/welcome_page.py:114
+msgid "Invalid installation, please reboot from "
+msgstr "无效的安装,请重启并重新安装"
+
+#: installer/core/welcome_page.py:115
+msgid "media and choose Reinstall"
+msgstr " "
+
+#: installer/core/welcome_page.py:117
+msgid "Install Hypervisor %s"
+msgstr "安装Hypervisor %s"
+
+#: installer/core/welcome_page.py:121
+msgid "Info: %s"
+msgstr "信息: %s"
+
+#: installer/core/welcome_page.py:125
+msgid "Info: Machine is booted in EFI mode"
+msgstr "信息: 服务器使用EFI模式引导"
+
+#: installer/core/welcome_page.py:127
+msgid "Info: DRY MODE"
+msgstr "信息: DRY MODE"
+
+#: setup/core/diagnostics_page.py:33
+msgid "Diagnostics"
+msgstr "诊断"
+
+#: setup/core/diagnostics_page.py:51
+msgid "Diagnostic Utilities"
+msgstr "诊断工具"
+
+#: setup/core/diagnostics_page.py:52
+msgid "Select one of the tools below."
+msgstr "请选择如下工具之一"
+
+#: setup/core/diagnostics_page.py:54
+msgid "Available diagnostics"
+msgstr "可用诊断"
+
+#: setup/core/diagnostics_page.py:79
+msgid "Command Output"
+msgstr "命令输出"
+
+#: setup/core/kdump_page.py:42
+msgid "Kdump"
+msgstr "Kdump"
+
+#: setup/core/kdump_page.py:89
+msgid "Configure Kdump"
+msgstr "配置Kdump"
+
+#: setup/core/kdump_page.py:93
+msgid "network.notice"
+msgstr "network.notice"
+
+#: setup/core/kdump_page.py:94 setup/core/logging_page.py:78
+msgid "Networking is not configured, "
+msgstr "网络未配置,"
+
+#: setup/core/kdump_page.py:95
+msgid "please configure it before NFS "
+msgstr "请在配置NFS和基于SSH的Kdump前配置网络"
+
+#: setup/core/kdump_page.py:96
+msgid "or SSH-based kdump"
+msgstr " "
+
+#: setup/core/kdump_page.py:98 setup/core/kdump_page.py:102
+msgid "Type"
+msgstr "类型"
+
+#: setup/core/kdump_page.py:104
+msgid "NFS Location "
+msgstr "NFS位置"
+
+#: setup/core/kdump_page.py:105
+msgid "(example.com:/var/crash):"
+msgstr "(example.com:/var/crash):"
+
+#: setup/core/kdump_page.py:108
+msgid "SSH Location "
+msgstr "SSH 位置"
+
+#: setup/core/kdump_page.py:109
+msgid "(root at example.com):"
+msgstr "(root at example.com):"
+
+#: setup/core/kdump_page.py:147
+msgid "Updating kdump related configuration"
+msgstr "更新kdump相关配置"
+
+#: setup/core/kdump_page.py:172
+msgid "An error occurred"
+msgstr "发生一个错误"
+
+#: setup/core/keyboard_page.py:56
+msgid "Choose the Keyboard Layout you would "
+msgstr "请选择系统的键盘布局"
+
+#: setup/core/keyboard_page.py:57 setup/core/performance_page.py:55
+msgid "like to apply to this system."
+msgstr " "
+
+#: setup/core/keyboard_page.py:59
+msgid "Current Active "
+msgstr "当前设置键盘布局:"
+
+#: setup/core/keyboard_page.py:60
+msgid "Keyboard Layout:  "
+msgstr " "
+
+#: setup/core/keyboard_page.py:84
+msgid "Updating keyboard related configuration"
+msgstr "更新键盘相关配置"
+
+#: setup/core/logging_page.py:34 setup/core/logging_page.py:68
+msgid "Logging"
+msgstr "日志"
+
+#: setup/core/logging_page.py:69
+msgid "Logrotate Max Log "
+msgstr "循环日志最大"
+
+#: setup/core/logging_page.py:70
+msgid "Size (KB):"
+msgstr "容量(KB)"
+
+#: setup/core/logging_page.py:79
+msgid "please configure it before rsyslog "
+msgstr "请在配置rsyslog、netconsole前配置"
+
+#: setup/core/logging_page.py:80
+msgid "and/or netconsole"
+msgstr " "
+
+#: setup/core/logging_page.py:83
+msgid "RSyslog is an enhanced multi-"
+msgstr "RSyslog是加强的多线程syslogd"
+
+#: setup/core/logging_page.py:84
+msgid "threaded syslogd"
+msgstr " "
+
+#: setup/core/logging_page.py:85 setup/core/logging_page.py:93
+#: setup/core/monitoring_page.py:58
+msgid "Server Address:"
+msgstr "服务器地址:"
+
+#: setup/core/logging_page.py:87 setup/core/logging_page.py:95
+#: setup/core/monitoring_page.py:59
+msgid "Server Port:"
+msgstr "服务器端口:"
+
+#: setup/core/logging_page.py:91
+msgid "Netconsole service allows a remote sys"
+msgstr "Netconsole服务提供了记录printk()信息的远端syslog服务"
+
+#: setup/core/logging_page.py:92
+msgid "log daemon to record printk() messages"
+msgstr " "
+
+#: setup/core/logging_page.py:115
+msgid "Updating logging related configuration"
+msgstr "更新日志相关配置"
+
+#: setup/core/monitoring_page.py:34
+msgid "Monitoring"
+msgstr "监视"
+
+#: setup/core/monitoring_page.py:53
+msgid "Monitoring Configuration"
+msgstr "监视相关配置"
+
+#: setup/core/monitoring_page.py:54
+msgid "Collectd gathers statistics "
+msgstr "Collectd用于收集系统信息从而发现性能瓶颈并预测未来系统负荷"
+
+#: setup/core/monitoring_page.py:55
+msgid "about the system and can be used to find "
+msgstr " "
+
+#: setup/core/monitoring_page.py:56
+msgid "performance bottlenecks and predict future "
+msgstr " "
+
+#: setup/core/monitoring_page.py:57
+msgid "system load."
+msgstr " "
+
+#: setup/core/monitoring_page.py:79
+msgid "Updating monitoring configuration"
+msgstr "更新监控配置"
+
+#: setup/core/network_page.py:93
+msgid "Network"
+msgstr "网络"
+
+#: setup/core/network_page.py:164
+msgid "Remove %s (%s)"
+msgstr "删除%s (%s)"
+
+#: setup/core/network_page.py:165 setup/core/network_page.py:571
+msgid "Create Bond"
+msgstr "创建Bond  "
+
+#: setup/core/network_page.py:167
+msgid "System Identification"
+msgstr "系统识别"
+
+#: setup/core/network_page.py:168
+msgid "Hostname:"
+msgstr "主机名:"
+
+#: setup/core/network_page.py:170
+msgid "DNS Server 1:"
+msgstr "DNS服务1:"
+
+#: setup/core/network_page.py:171
+msgid "DNS Server 2:"
+msgstr "DNS服务2:"
+
+#: setup/core/network_page.py:173
+msgid "NTP Server 1:"
+msgstr "NTP服务1:"
+
+#: setup/core/network_page.py:174
+msgid "NTP Server 2:"
+msgstr "NTP服务2:"
+
+#: setup/core/network_page.py:179 setup/core/ping.py:74
+msgid "Ping"
+msgstr "Ping"
+
+#: setup/core/network_page.py:250
+msgid "Network Interface Configuration"
+msgstr "网络接口配置"
+
+#: setup/core/network_page.py:486
+msgid "Driver: "
+msgstr "驱动:"
+
+#: setup/core/network_page.py:487
+msgid "Vendor: "
+msgstr "厂商:"
+
+#: setup/core/network_page.py:499
+msgid "IPv4 Settings"
+msgstr "IPv4 设置"
+
+#: setup/core/network_page.py:502 setup/core/network_page.py:522
+msgid "Disabled"
+msgstr "停用"
+
+#: setup/core/network_page.py:503 setup/core/network_page.py:524
+msgid "DHCP"
+msgstr "DHCP"
+
+#: setup/core/network_page.py:504 setup/core/network_page.py:525
+msgid "Static"
+msgstr "静态"
+
+#: setup/core/network_page.py:509 setup/core/network_page.py:530
+msgid "IP Address: "
+msgstr "IP地址:"
+
+#: setup/core/network_page.py:511
+msgid "  Netmask: "
+msgstr "  子网掩码:"
+
+#: setup/core/network_page.py:514 setup/core/network_page.py:535
+msgid "Gateway: "
+msgstr "网关:"
+
+#: setup/core/network_page.py:519
+msgid "IPv6 Settings"
+msgstr "IPv6 设置"
+
+#: setup/core/network_page.py:523
+msgid "Auto"
+msgstr "自动"
+
+#: setup/core/network_page.py:532
+msgid "  Prefix Length: "
+msgstr "  前缀长度:"
+
+#: setup/core/network_page.py:542
+msgid "VLAN ID: "
+msgstr "VLAN ID"
+
+#: setup/core/network_page.py:548
+msgid "Use Bridge: "
+msgstr "使用桥:"
+
+#: setup/core/network_page.py:551
+msgid "Flash Lights to Identify"
+msgstr "闪灯确认    "
+
+#: setup/core/network_page.py:557 ui/__init__.py:817 ui/__init__.py:827
+#: ui/__init__.py:842 ui/__init__.py:859
+msgid "Close"
+msgstr "关闭  "
+
+#: setup/core/network_page.py:566 setup/core/plugins_page.py:56
+msgid "Name:"
+msgstr "名称:"
+
+#: setup/core/network_page.py:568
+msgid "Options:"
+msgstr "选项:"
+
+#: setup/core/performance_page.py:34
+msgid "Performance"
+msgstr "性能"
+
+#: setup/core/performance_page.py:53
+msgid "tuned Configuration"
+msgstr "调优配置"
+
+#: setup/core/performance_page.py:54
+msgid "Choose the tuned profile you would "
+msgstr "选择要使用的调优文件"
+
+#: setup/core/performance_page.py:57
+msgid "Current Active Profile:  "
+msgstr "当前使用的文件:"
+
+#: setup/core/performance_page.py:58
+msgid "Available tuned Profiles"
+msgstr "可用调优文件"
+
+#: setup/core/ping.py:35
+msgid "Networking/Ping"
+msgstr "网络/Ping"
+
+#: setup/core/ping.py:70
+msgid "Ping a remote host"
+msgstr "Ping远端主机"
+
+#: setup/core/ping.py:71
+msgid "Address:"
+msgstr "地址:"
+
+#: setup/core/ping.py:72
+msgid "Count:"
+msgstr "计数:"
+
+#: setup/core/ping.py:76
+msgid "Result:"
+msgstr "结果:"
+
+#: setup/core/plugins_page.py:40 setup/core/plugins_page.py:74
+msgid "Plugins"
+msgstr "插件"
+
+#: setup/core/plugins_page.py:49
+msgid "Installed Plugins"
+msgstr "安装插件"
+
+#: setup/core/plugins_page.py:51
+msgid "Installed plugins:"
+msgstr "安装插件:"
+
+#: setup/core/plugins_page.py:59
+msgid "Version:"
+msgstr "版本:"
+
+#: setup/core/plugins_page.py:62
+msgid "Date installed:"
+msgstr "安装日期:"
+
+#: setup/core/plugins_page.py:67
+msgid "RPM Diff"
+msgstr "RPM Diff"
+
+#: setup/core/plugins_page.py:69
+msgid "SRPM Diff"
+msgstr "SRPM Diff"
+
+#: setup/core/plugins_page.py:71
+msgid "File Diff"
+msgstr "File Diff"
+
+#: setup/core/plugins_page.py:76
+msgid "There are no plugins currently installed"
+msgstr "未安装任何插件"
+
+#: setup/core/remote_storage_page.py:35 setup/core/remote_storage_page.py:55
+msgid "Remote Storage"
+msgstr "远端存储"
+
+#: setup/core/remote_storage_page.py:56
+msgid "iSCSI Initiator Name:"
+msgstr "iSCSI启动器名称:"
+
+#: setup/core/remote_storage_page.py:59
+msgid "NFSv4 Domain (example.redhat.com):"
+msgstr "NFSv4 Domain (example.redhat.com):"
+
+#: setup/core/remote_storage_page.py:79
+msgid "Updating remote storage configuration"
+msgstr "更新远端存储配置"
+
+#: setup/core/security_page.py:34
+msgid "Security"
+msgstr "安全"
+
+#: setup/core/security_page.py:59
+msgid "Remote Access"
+msgstr "远端接入"
+
+#: setup/core/security_page.py:60
+msgid "Enable SSH password authentication"
+msgstr "启用SSH密码认证"
+
+#: setup/core/security_page.py:61
+msgid "Strong Random Number Generator"
+msgstr "强随机数生成器"
+
+#: setup/core/security_page.py:62
+msgid "Disable AES-NI"
+msgstr "停用AES-NI"
+
+#: setup/core/security_page.py:63
+msgid "Bytes Used:"
+msgstr "使用字节数:"
+
+#: setup/core/security_page.py:98
+msgid "Updating security configuration"
+msgstr "更新安全配置"
+
+#: setup/core/security_page.py:112
+msgid "Setting admin password"
+msgstr "设置admin密码"
+
+#: setup/core/status_page.py:43
+msgid "Status"
+msgstr "状态"
+
+#: setup/core/status_page.py:78
+msgid "Networking: "
+msgstr "网络:"
+
+#: setup/core/status_page.py:82
+msgid "Lock"
+msgstr "锁定  "
+
+#: setup/core/status_page.py:83
+msgid "Log Off"
+msgstr "登出  "
+
+#: setup/core/status_page.py:84
+msgid "Restart"
+msgstr "重启  "
+
+#: setup/core/status_page.py:85
+msgid "Power Off"
+msgstr "关闭  "
+
+#: setup/core/status_page.py:88
+msgid "System Information"
+msgstr "系统信息"
+
+#: setup/core/status_page.py:90
+msgid "Status: "
+msgstr "状态:"
+
+#: setup/core/status_page.py:96
+msgid "Logs: "
+msgstr "日志:"
+
+#: setup/core/status_page.py:100
+msgid "Running VMs: "
+msgstr "运行的虚拟机:"
+
+#: setup/core/status_page.py:103
+msgid "Press F8 for support menu"
+msgstr "按F8寻求帮助"
+
+#: setup/core/status_page.py:107
+msgid "View Host Key"
+msgstr "查看Host Key  "
+
+#: setup/core/status_page.py:109
+msgid "View CPU Details"
+msgstr "查看CPU详细    "
+
+#: setup/core/status_page.py:142
+msgid "The provided password was incorrect."
+msgstr "所提供的密码不正确"
+
+#: setup/core/status_page.py:152
+msgid "Confirm System Restart"
+msgstr "确认系统重启"
+
+#: setup/core/status_page.py:154
+msgid "\nThis will restart the system,"
+msgstr "\n该操作将重启系统,"
+
+#: setup/core/status_page.py:155 setup/core/status_page.py:167
+msgid "proceed?"
+msgstr "是否确定?"
+
+#: setup/core/status_page.py:126
+msgid "There are %s Virtual Machines running."
+msgstr "%s个虚拟机正在运行。"
+
+#: setup/core/status_page.py:164
+msgid "Confirm System Poweroff"
+msgstr "确认关闭系统"
+
+#: setup/core/status_page.py:166
+msgid "\nThis will shut down the system,"
+msgstr "\n该操作将关闭系统,"
+
+#: setup/core/status_page.py:175
+msgid "Host Key"
+msgstr "Host Key"
+
+#: setup/core/status_page.py:179
+msgid "CPU Details"
+msgstr "CPU详细"
+
+#: setup/core/status_page.py:212
+msgid "RSA Host Key Fingerprint:"
+msgstr "RSA Host Key指纹:"
+
+#: setup/core/status_page.py:218
+msgid "RSA Host Key:"
+msgstr "RSA Host Key:"
+
+#: setup/core/status_page.py:238
+msgid "Enter the admin password to unlock"
+msgstr "输入admin密码解锁"
+
+#: setup/core/status_page.py:239
+msgid "Username: "
+msgstr "用户名:"
+
+#: setup/core/status_page.py:243
+msgid "Unlock"
+msgstr "解锁  "
+
+#: setup/core/support_page.py:38
+msgid "Support"
+msgstr "支持"
+
+#: setup/core/support_page.py:47
+msgid "Support Info"
+msgstr "支持信息"
+
+#: setup/core/support_page.py:48
+msgid "Select one of the logfiles below."
+msgstr "选择下列日志文件之一。"
+
+#: setup/core/support_page.py:50
+msgid "Available Logfiles"
+msgstr "可用日志文件"
+
+#: setup/core/support_page.py:84
+msgid "Logfile"
+msgstr "日志文件"
+
+#: ui/__init__.py:780 ui/__init__.py:800
+msgid "Reset"
+msgstr "重置  "
+
+#: ui/__init__.py:825
+msgid "Contents"
+msgstr "内容"
+
+#: ui/__init__.py:841
+msgid "OK"
+msgstr "确定  "
+
+#: ui/__init__.py:851
+msgid "Transaction: %s"
+msgstr "事务:%s"
+
+#: setup/core/status_page.py:130
+msgid "This screen is locked."
+msgstr "该屏幕已经被锁定"
diff --git a/src/ovirt/node/locale/ovirt_node_en.po b/src/ovirt/node/locale/ovirt_node_en.po
new file mode 100644
index 0000000..f4e6ce0
--- /dev/null
+++ b/src/ovirt/node/locale/ovirt_node_en.po
@@ -0,0 +1,906 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2013-08-19 16:04+CST\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: ENCODING\n"
+"Generated-By: pygettext.py 1.5\n"
+
+
+#: installer/core/boot_device_page.py:38
+msgid "Boot Device"
+msgstr "Boot Device"
+
+#: installer/core/boot_device_page.py:59
+msgid "Please select the disk to use for booting %s"
+msgstr "Please select the disk to use for booting %s"
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Device Name"
+msgstr "Device Name"
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Location"
+msgstr "Location"
+
+#: installer/core/boot_device_page.py:69
+#: installer/core/installation_device_page.py:70
+msgid "Size"
+msgstr "Size"
+
+#: installer/core/boot_device_page.py:70
+#: installer/core/installation_device_page.py:73
+msgid "(No device)"
+msgstr "(No device)"
+
+#: installer/core/boot_device_page.py:74
+msgid "No Valid Boot Devices Detected"
+msgstr "No Valid Boot Devices Detected"
+
+#: installer/core/boot_device_page.py:77
+#: installer/core/installation_device_page.py:80
+#: installer/core/keyboard_page.py:57 installer/core/password_page.py:56
+#: installer/core/storage_vol_page.py:78 installer/core/upgrade_page.py:71
+#: installer/core/welcome_page.py:61
+msgid "Quit"
+msgstr "Quit"
+
+#: installer/core/boot_device_page.py:78
+#: installer/core/installation_device_page.py:81
+#: installer/core/keyboard_page.py:58 installer/core/password_page.py:57
+#: installer/core/storage_vol_page.py:79 installer/core/upgrade_page.py:72
+msgid "Back"
+msgstr "Back"
+
+#: installer/core/boot_device_page.py:79
+#: installer/core/installation_device_page.py:82
+#: installer/core/keyboard_page.py:59
+msgid "Continue"
+msgstr "Continue"
+
+#: installer/core/boot_device_page.py:180
+msgid "Device"
+msgstr "Device"
+
+#: installer/core/boot_device_page.py:181
+msgid "Model"
+msgstr "Model"
+
+#: installer/core/boot_device_page.py:182
+msgid "Bus Type"
+msgstr "Bus Type"
+
+#: installer/core/boot_device_page.py:183
+msgid "Serial"
+msgstr "Serial"
+
+#: installer/core/boot_device_page.py:184
+msgid "Size (GB)"
+msgstr "Size (GB)"
+
+#: installer/core/boot_device_page.py:185
+msgid "Description"
+msgstr "Description"
+
+#: installer/core/boot_device_page.py:189
+msgid "Disk Details\n"
+msgstr "Disk Details\n"
+
+#: installer/core/boot_device_page.py:204
+msgid "Custom Block Device"
+msgstr "Custom Block Device"
+
+#: installer/core/boot_device_page.py:206
+msgid "Device path:"
+msgstr "Device path:"
+
+#: installer/core/boot_device_page.py:211 setup/core/network_page.py:556
+#: ui/__init__.py:779 ui/__init__.py:799
+msgid "Save"
+msgstr "Save"
+
+#: installer/core/boot_device_page.py:212
+msgid "Cancel"
+msgstr "Cancel"
+
+#: installer/core/installation_device_page.py:39
+msgid "Data Device"
+msgstr "Data Device"
+
+#: installer/core/installation_device_page.py:60
+msgid "Please select the disk(s) to use for installation of %s"
+msgstr "Please select the disk(s) to use for installation of %s"
+
+#: installer/core/installation_device_page.py:77
+msgid "No Valid Install Devices Detected"
+msgstr "No Valid Install Devices Detected"
+
+#: installer/core/keyboard_page.py:35 setup/core/keyboard_page.py:34
+msgid "Keyboard"
+msgstr "Keyboard"
+
+#: installer/core/keyboard_page.py:50 setup/core/keyboard_page.py:55
+msgid "Keyboard Layout Selection"
+msgstr "Keyboard Layout Selection"
+
+#: installer/core/keyboard_page.py:51 setup/core/keyboard_page.py:61
+msgid "Available Keyboard Layouts"
+msgstr "Available Keyboard Layouts"
+
+#: installer/core/keyboard_page.py:53
+msgid "(Hit Enter to select a layout)"
+msgstr "(Hit Enter to select a layout)"
+
+#: installer/core/password_page.py:33
+msgid "Console Password"
+msgstr "Console Password"
+
+#: installer/core/password_page.py:46 installer/core/upgrade_page.py:52
+msgid "Require a password for the admin user?"
+msgstr "Require a password for the admin user?"
+
+#: installer/core/password_page.py:48 installer/core/upgrade_page.py:62
+#: setup/core/security_page.py:65 setup/core/status_page.py:241
+msgid "Password:"
+msgstr "Password:"
+
+#: installer/core/password_page.py:50 installer/core/upgrade_page.py:64
+msgid "Confirm Password:"
+msgstr "Confirm Password:"
+
+#: installer/core/password_page.py:58
+msgid "Install"
+msgstr "Install"
+
+#: installer/core/progress_page.py:40
+msgid "Installation Progress"
+msgstr "Installation Progress"
+
+#: installer/core/progress_page.py:52
+msgid "Installing"
+msgstr "Installing"
+
+#: installer/core/progress_page.py:60
+msgid "Reboot"
+msgstr "Reboot"
+
+#: installer/core/progress_page.py:193
+msgid "Writing configuration file"
+msgstr "Writing configuration file"
+
+#: installer/core/progress_page.py:221
+msgid "Partitioning and Creating File Systems on '%s'"
+msgstr "Partitioning and Creating File Systems on '%s'"
+
+#: installer/core/progress_page.py:238
+msgid "Setting Admin Password"
+msgstr "Setting Admin Password"
+
+#: installer/core/progress_page.py:255
+msgid "Installing Image and Bootloader "
+msgstr "Installing Image and Bootloader "
+
+#: installer/core/progress_page.py:256
+msgid "Configuration to '%s'"
+msgstr "Configuration to '%s'"
+
+#: installer/core/progress_page.py:258
+msgid "Updating Image and Bootloader"
+msgstr "Updating Image and Bootloader"
+
+#: installer/core/progress_page.py:269
+msgid "Setting keyboard layout to '%s'"
+msgstr "Setting keyboard layout to '%s'"
+
+#: installer/core/storage_vol_page.py:32
+msgid "Storage Sizes"
+msgstr "Storage Sizes"
+
+#: installer/core/storage_vol_page.py:61
+msgid "Storage Volumes"
+msgstr "Storage Volumes"
+
+#: installer/core/storage_vol_page.py:62
+msgid "Please enter the sizes for the "
+msgstr "Please enter the sizes for the "
+
+#: installer/core/storage_vol_page.py:63
+msgid "following partitions in MB"
+msgstr "following partitions in MB"
+
+#: installer/core/storage_vol_page.py:65
+msgid "UEFI/Bios:"
+msgstr "UEFI/Bios:"
+
+#: installer/core/storage_vol_page.py:67
+msgid "Root & RootBackup:"
+msgstr "Root & RootBackup:"
+
+#: installer/core/storage_vol_page.py:69
+msgid "(2 partitions at 512MB each)"
+msgstr "(2 partitions at 512MB each)"
+
+#: installer/core/storage_vol_page.py:71
+msgid "Swap:"
+msgstr "Swap:"
+
+#: installer/core/storage_vol_page.py:72
+msgid "Config:"
+msgstr "Config:"
+
+#: installer/core/storage_vol_page.py:73
+msgid "Logging:"
+msgstr "Logging:"
+
+#: installer/core/storage_vol_page.py:74
+msgid "Data:"
+msgstr "Data:"
+
+#: installer/core/storage_vol_page.py:80
+msgid "Next"
+msgstr "Next"
+
+#: installer/core/upgrade_page.py:39
+msgid "Upgrade Password"
+msgstr "Upgrade Password"
+
+#: installer/core/upgrade_page.py:53
+msgid "Please enter the current admin "
+msgstr "Please enter the current admin "
+
+#: installer/core/upgrade_page.py:54
+msgid "password. You may also change the admin password "
+msgstr "password. You may also change the admin password "
+
+#: installer/core/upgrade_page.py:55
+msgid "if required. If the new password fields are left"
+msgstr "if required. If the new password fields are left"
+
+#: installer/core/upgrade_page.py:56
+msgid "blank the password will remain the same."
+msgstr "blank the password will remain the same."
+
+#: installer/core/upgrade_page.py:57 setup/core/security_page.py:64
+msgid "Password for the admin user"
+msgstr "Password for the admin user"
+
+#: installer/core/upgrade_page.py:60
+msgid "Current Password:"
+msgstr "Current Password:"
+
+#: installer/core/upgrade_page.py:73
+msgid "Update"
+msgstr "Update"
+
+#: installer/core/welcome_page.py:43
+msgid "Welcome"
+msgstr "Welcome"
+
+#: installer/core/welcome_page.py:55
+msgid "Installation"
+msgstr "Installation"
+
+#: installer/core/welcome_page.py:84
+msgid "Install (dry)"
+msgstr "Install (dry)"
+
+#: installer/core/welcome_page.py:85
+msgid "Upgrade (dry)"
+msgstr "Upgrade (dry)"
+
+#: installer/core/welcome_page.py:86
+msgid "Downgrade (dry)"
+msgstr "Downgrade (dry)"
+
+#: installer/core/welcome_page.py:87
+msgid "Reinstall (dry)"
+msgstr "Reinstall (dry)"
+
+#: installer/core/welcome_page.py:95
+msgid "Major version upgrades are unsupported, "
+msgstr "Major version upgrades are unsupported, "
+
+#: installer/core/welcome_page.py:96
+msgid "uninstall existing version first"
+msgstr "uninstall existing version first"
+
+#: installer/core/welcome_page.py:103
+msgid "Upgrade %s to %s"
+msgstr "Upgrade %s to %s"
+
+#: installer/core/welcome_page.py:106
+msgid "Downgrade %s to %s"
+msgstr "Downgrade %s to %s"
+
+#: installer/core/welcome_page.py:109
+msgid "Reinstall %s"
+msgstr "Reinstall %s"
+
+#: installer/core/welcome_page.py:114
+msgid "Invalid installation, please reboot from "
+msgstr "Invalid installation, please reboot from "
+
+#: installer/core/welcome_page.py:115
+msgid "media and choose Reinstall"
+msgstr "media and choose Reinstall"
+
+#: installer/core/welcome_page.py:117
+msgid "Install Hypervisor %s"
+msgstr "Install Hypervisor %s"
+
+#: installer/core/welcome_page.py:121
+msgid "Info: %s"
+msgstr "Info: %s"
+
+#: installer/core/welcome_page.py:125
+msgid "Info: Machine is booted in EFI mode"
+msgstr "Info: Machine is booted in EFI mode"
+
+#: installer/core/welcome_page.py:127
+msgid "Info: DRY MODE"
+msgstr "Info: DRY MODE"
+
+#: setup/core/diagnostics_page.py:33
+msgid "Diagnostics"
+msgstr "Diagnostics"
+
+#: setup/core/diagnostics_page.py:51
+msgid "Diagnostic Utilities"
+msgstr "Diagnostic Utilities"
+
+#: setup/core/diagnostics_page.py:52
+msgid "Select one of the tools below."
+msgstr "Select one of the tools below."
+
+#: setup/core/diagnostics_page.py:54
+msgid "Available diagnostics"
+msgstr "Available diagnostics"
+
+#: setup/core/diagnostics_page.py:79
+msgid "Command Output"
+msgstr "Command Output"
+
+#: setup/core/kdump_page.py:42
+msgid "Kdump"
+msgstr "Kdump"
+
+#: setup/core/kdump_page.py:89
+msgid "Configure Kdump"
+msgstr "Configure Kdump"
+
+#: setup/core/kdump_page.py:93
+msgid "network.notice"
+msgstr "network.notice"
+
+#: setup/core/kdump_page.py:94 setup/core/logging_page.py:78
+msgid "Networking is not configured, "
+msgstr "Networking is not configured, "
+
+#: setup/core/kdump_page.py:95
+msgid "please configure it before NFS "
+msgstr "please configure it before NFS "
+
+#: setup/core/kdump_page.py:96
+msgid "or SSH-based kdump"
+msgstr "or SSH-based kdump"
+
+#: setup/core/kdump_page.py:98 setup/core/kdump_page.py:102
+msgid "Type"
+msgstr "Type"
+
+#: setup/core/kdump_page.py:104
+msgid "NFS Location "
+msgstr "NFS Location "
+
+#: setup/core/kdump_page.py:105
+msgid "(example.com:/var/crash):"
+msgstr "(example.com:/var/crash):"
+
+#: setup/core/kdump_page.py:108
+msgid "SSH Location "
+msgstr "SSH Location "
+
+#: setup/core/kdump_page.py:109
+msgid "(root at example.com):"
+msgstr "(root at example.com):"
+
+#: setup/core/kdump_page.py:147
+msgid "Updating kdump related configuration"
+msgstr "Updating kdump related configuration"
+
+#: setup/core/kdump_page.py:172
+msgid "An error occurred"
+msgstr "An error occurred"
+
+#: setup/core/keyboard_page.py:56
+msgid "Choose the Keyboard Layout you would "
+msgstr "Choose the Keyboard Layout you would "
+
+#: setup/core/keyboard_page.py:57 setup/core/performance_page.py:55
+msgid "like to apply to this system."
+msgstr "like to apply to this system."
+
+#: setup/core/keyboard_page.py:59
+msgid "Current Active "
+msgstr "Current Active "
+
+#: setup/core/keyboard_page.py:60
+msgid "Keyboard Layout:  "
+msgstr "Keyboard Layout:  "
+
+#: setup/core/keyboard_page.py:84
+msgid "Updating keyboard related configuration"
+msgstr "Updating keyboard related configuration"
+
+#: setup/core/logging_page.py:34 setup/core/logging_page.py:68
+msgid "Logging"
+msgstr "Logging"
+
+#: setup/core/logging_page.py:69
+msgid "Logrotate Max Log "
+msgstr "Logrotate Max Log "
+
+#: setup/core/logging_page.py:70
+msgid "Size (KB):"
+msgstr "Size (KB):"
+
+#: setup/core/logging_page.py:79
+msgid "please configure it before rsyslog "
+msgstr "please configure it before rsyslog "
+
+#: setup/core/logging_page.py:80
+msgid "and/or netconsole"
+msgstr "and/or netconsole"
+
+#: setup/core/logging_page.py:83
+msgid "RSyslog is an enhanced multi-"
+msgstr "RSyslog is an enhanced multi-"
+
+#: setup/core/logging_page.py:84
+msgid "threaded syslogd"
+msgstr "threaded syslogd"
+
+#: setup/core/logging_page.py:85 setup/core/logging_page.py:93
+#: setup/core/monitoring_page.py:58
+msgid "Server Address:"
+msgstr "Server Address:"
+
+#: setup/core/logging_page.py:87 setup/core/logging_page.py:95
+#: setup/core/monitoring_page.py:59
+msgid "Server Port:"
+msgstr "Server Port:"
+
+#: setup/core/logging_page.py:91
+msgid "Netconsole service allows a remote sys"
+msgstr "Netconsole service allows a remote sys"
+
+#: setup/core/logging_page.py:92
+msgid "log daemon to record printk() messages"
+msgstr "log daemon to record printk() messages"
+
+#: setup/core/logging_page.py:115
+msgid "Updating logging related configuration"
+msgstr "Updating logging related configuration"
+
+#: setup/core/monitoring_page.py:34
+msgid "Monitoring"
+msgstr "Monitoring"
+
+#: setup/core/monitoring_page.py:53
+msgid "Monitoring Configuration"
+msgstr "Monitoring Configuration"
+
+#: setup/core/monitoring_page.py:54
+msgid "Collectd gathers statistics "
+msgstr "Collectd gathers statistics "
+
+#: setup/core/monitoring_page.py:55
+msgid "about the system and can be used to find "
+msgstr "about the system and can be used to find "
+
+#: setup/core/monitoring_page.py:56
+msgid "performance bottlenecks and predict future "
+msgstr "performance bottlenecks and predict future "
+
+#: setup/core/monitoring_page.py:57
+msgid "system load."
+msgstr "system load."
+
+#: setup/core/monitoring_page.py:79
+msgid "Updating monitoring configuration"
+msgstr "Updating monitoring configuration"
+
+#: setup/core/network_page.py:93
+msgid "Network"
+msgstr "Network"
+
+#: setup/core/network_page.py:164
+msgid "Remove %s (%s)"
+msgstr "Remove %s (%s)"
+
+#: setup/core/network_page.py:165 setup/core/network_page.py:571
+msgid "Create Bond"
+msgstr "Create Bond"
+
+#: setup/core/network_page.py:167
+msgid "System Identification"
+msgstr "System Identification"
+
+#: setup/core/network_page.py:168
+msgid "Hostname:"
+msgstr "Hostname:"
+
+#: setup/core/network_page.py:170
+msgid "DNS Server 1:"
+msgstr "DNS Server 1:"
+
+#: setup/core/network_page.py:171
+msgid "DNS Server 2:"
+msgstr "DNS Server 2:"
+
+#: setup/core/network_page.py:173
+msgid "NTP Server 1:"
+msgstr "NTP Server 1:"
+
+#: setup/core/network_page.py:174
+msgid "NTP Server 2:"
+msgstr "NTP Server 2:"
+
+#: setup/core/network_page.py:179 setup/core/ping.py:74
+msgid "Ping"
+msgstr "Ping"
+
+#: setup/core/network_page.py:250
+msgid "Network Interface Configuration"
+msgstr "Network Interface Configuration"
+
+#: setup/core/network_page.py:486
+msgid "Driver: "
+msgstr "Driver: "
+
+#: setup/core/network_page.py:487
+msgid "Vendor: "
+msgstr "Vendor: "
+
+#: setup/core/network_page.py:499
+msgid "IPv4 Settings"
+msgstr "IPv4 Settings"
+
+#: setup/core/network_page.py:502 setup/core/network_page.py:522
+msgid "Disabled"
+msgstr "Disabled"
+
+#: setup/core/network_page.py:503 setup/core/network_page.py:524
+msgid "DHCP"
+msgstr "DHCP"
+
+#: setup/core/network_page.py:504 setup/core/network_page.py:525
+msgid "Static"
+msgstr "Static"
+
+#: setup/core/network_page.py:509 setup/core/network_page.py:530
+msgid "IP Address: "
+msgstr "IP Address: "
+
+#: setup/core/network_page.py:511
+msgid "  Netmask: "
+msgstr "  Netmask: "
+
+#: setup/core/network_page.py:514 setup/core/network_page.py:535
+msgid "Gateway: "
+msgstr "Gateway: "
+
+#: setup/core/network_page.py:519
+msgid "IPv6 Settings"
+msgstr "IPv6 Settings"
+
+#: setup/core/network_page.py:523
+msgid "Auto"
+msgstr "Auto"
+
+#: setup/core/network_page.py:532
+msgid "  Prefix Length: "
+msgstr "  Prefix Length: "
+
+#: setup/core/network_page.py:542
+msgid "VLAN ID: "
+msgstr "VLAN ID: "
+
+#: setup/core/network_page.py:548
+msgid "Use Bridge: "
+msgstr "Use Bridge: "
+
+#: setup/core/network_page.py:551
+msgid "Flash Lights to Identify"
+msgstr "Flash Lights to Identify"
+
+#: setup/core/network_page.py:557 ui/__init__.py:817 ui/__init__.py:827
+#: ui/__init__.py:842 ui/__init__.py:859
+msgid "Close"
+msgstr "Close"
+
+#: setup/core/network_page.py:566 setup/core/plugins_page.py:56
+msgid "Name:"
+msgstr "Name:"
+
+#: setup/core/network_page.py:568
+msgid "Options:"
+msgstr "Options:"
+
+#: setup/core/performance_page.py:34
+msgid "Performance"
+msgstr "Performance"
+
+#: setup/core/performance_page.py:53
+msgid "tuned Configuration"
+msgstr "tuned Configuration"
+
+#: setup/core/performance_page.py:54
+msgid "Choose the tuned profile you would "
+msgstr "Choose the tuned profile you would "
+
+#: setup/core/performance_page.py:57
+msgid "Current Active Profile:  "
+msgstr "Current Active Profile:  "
+
+#: setup/core/performance_page.py:58
+msgid "Available tuned Profiles"
+msgstr "Available tuned Profiles"
+
+#: setup/core/ping.py:35
+msgid "Networking/Ping"
+msgstr "Networking/Ping"
+
+#: setup/core/ping.py:70
+msgid "Ping a remote host"
+msgstr "Ping a remote host"
+
+#: setup/core/ping.py:71
+msgid "Address:"
+msgstr "Address:"
+
+#: setup/core/ping.py:72
+msgid "Count:"
+msgstr "Count:"
+
+#: setup/core/ping.py:76
+msgid "Result:"
+msgstr "Result:"
+
+#: setup/core/plugins_page.py:40 setup/core/plugins_page.py:74
+msgid "Plugins"
+msgstr "Plugins"
+
+#: setup/core/plugins_page.py:49
+msgid "Installed Plugins"
+msgstr "Installed Plugins"
+
+#: setup/core/plugins_page.py:51
+msgid "Installed plugins:"
+msgstr "Installed plugins:"
+
+#: setup/core/plugins_page.py:59
+msgid "Version:"
+msgstr "Version:"
+
+#: setup/core/plugins_page.py:62
+msgid "Date installed:"
+msgstr "Date installed:"
+
+#: setup/core/plugins_page.py:67
+msgid "RPM Diff"
+msgstr "RPM Diff"
+
+#: setup/core/plugins_page.py:69
+msgid "SRPM Diff"
+msgstr "SRPM Diff"
+
+#: setup/core/plugins_page.py:71
+msgid "File Diff"
+msgstr "File Diff"
+
+#: setup/core/plugins_page.py:76
+msgid "There are no plugins currently installed"
+msgstr "There are no plugins currently installed"
+
+#: setup/core/remote_storage_page.py:35 setup/core/remote_storage_page.py:55
+msgid "Remote Storage"
+msgstr "Remote Storage"
+
+#: setup/core/remote_storage_page.py:56
+msgid "iSCSI Initiator Name:"
+msgstr "iSCSI Initiator Name:"
+
+#: setup/core/remote_storage_page.py:59
+msgid "NFSv4 Domain (example.redhat.com):"
+msgstr "NFSv4 Domain (example.redhat.com):"
+
+#: setup/core/remote_storage_page.py:79
+msgid "Updating remote storage configuration"
+msgstr "Updating remote storage configuration"
+
+#: setup/core/security_page.py:34
+msgid "Security"
+msgstr "Security"
+
+#: setup/core/security_page.py:59
+msgid "Remote Access"
+msgstr "Remote Access"
+
+#: setup/core/security_page.py:60
+msgid "Enable SSH password authentication"
+msgstr "Enable SSH password authentication"
+
+#: setup/core/security_page.py:61
+msgid "Strong Random Number Generator"
+msgstr "Strong Random Number Generator"
+
+#: setup/core/security_page.py:62
+msgid "Disable AES-NI"
+msgstr "Disable AES-NI"
+
+#: setup/core/security_page.py:63
+msgid "Bytes Used:"
+msgstr "Bytes Used:"
+
+#: setup/core/security_page.py:98
+msgid "Updating security configuration"
+msgstr "Updating security configuration"
+
+#: setup/core/security_page.py:112
+msgid "Setting admin password"
+msgstr "Setting admin password"
+
+#: setup/core/status_page.py:43
+msgid "Status"
+msgstr "Status"
+
+#: setup/core/status_page.py:78
+msgid "Networking: "
+msgstr "Networking: "
+
+#: setup/core/status_page.py:82
+msgid "Lock"
+msgstr "Lock"
+
+#: setup/core/status_page.py:83
+msgid "Log Off"
+msgstr "Log Off"
+
+#: setup/core/status_page.py:84
+msgid "Restart"
+msgstr "Restart"
+
+#: setup/core/status_page.py:85
+msgid "Power Off"
+msgstr "Power Off"
+
+#: setup/core/status_page.py:88
+msgid "System Information"
+msgstr "System Information"
+
+#: setup/core/status_page.py:90
+msgid "Status: "
+msgstr "Status: "
+
+#: setup/core/status_page.py:96
+msgid "Logs: "
+msgstr "Logs: "
+
+#: setup/core/status_page.py:100
+msgid "Running VMs: "
+msgstr "Running VMs: "
+
+#: setup/core/status_page.py:103
+msgid "Press F8 for support menu"
+msgstr "Press F8 for support menu"
+
+#: setup/core/status_page.py:107
+msgid "View Host Key"
+msgstr "View Host Key"
+
+#: setup/core/status_page.py:109
+msgid "View CPU Details"
+msgstr "View CPU Details"
+
+#: setup/core/status_page.py:142
+msgid "The provided password was incorrect."
+msgstr "The provided password was incorrect."
+
+#: setup/core/status_page.py:152
+msgid "Confirm System Restart"
+msgstr "Confirm System Restart"
+
+#: setup/core/status_page.py:154
+msgid "This will restart the system,"
+msgstr "This will restart the system,"
+
+#: setup/core/status_page.py:155 setup/core/status_page.py:167
+msgid "proceed?"
+msgstr "proceed?"
+
+#: setup/core/status_page.py:164
+msgid "Confirm System Poweroff"
+msgstr "Confirm System Poweroff"
+
+#: setup/core/status_page.py:166
+msgid "This will shut down the system,"
+msgstr "This will shut down the system,"
+
+#: setup/core/status_page.py:175
+msgid "Host Key"
+msgstr "Host Key"
+
+#: setup/core/status_page.py:179
+msgid "CPU Details"
+msgstr "CPU Details"
+
+#: setup/core/status_page.py:212
+msgid "RSA Host Key Fingerprint:"
+msgstr "RSA Host Key Fingerprint:"
+
+#: setup/core/status_page.py:218
+msgid "RSA Host Key:"
+msgstr "RSA Host Key:"
+
+#: setup/core/status_page.py:238
+msgid "Enter the admin password to unlock"
+msgstr "Enter the admin password to unlock"
+
+#: setup/core/status_page.py:239
+msgid "Username: "
+msgstr "Username: "
+
+#: setup/core/status_page.py:243
+msgid "Unlock"
+msgstr "Unlock"
+
+#: setup/core/support_page.py:38
+msgid "Support"
+msgstr "Support"
+
+#: setup/core/support_page.py:47
+msgid "Support Info"
+msgstr "Support Info"
+
+#: setup/core/support_page.py:48
+msgid "Select one of the logfiles below."
+msgstr "Select one of the logfiles below."
+
+#: setup/core/support_page.py:50
+msgid "Available Logfiles"
+msgstr "Available Logfiles"
+
+#: setup/core/support_page.py:84
+msgid "Logfile"
+msgstr "Logfile"
+
+#: ui/__init__.py:780 ui/__init__.py:800
+msgid "Reset"
+msgstr "Reset"
+
+#: ui/__init__.py:825
+msgid "Contents"
+msgstr "Contents"
+
+#: ui/__init__.py:841
+msgid "OK"
+msgstr "OK"
+
+#: ui/__init__.py:851
+msgid "Transaction: %s"
+msgstr "Transaction: %s"
+
+#: setup/core/status_page.py:130
+msgid "This screen is locked."
+msgstr ""
diff --git a/src/ovirt/node/locale/zh_CN/LC_MESSAGES/ovirt_node.mo b/src/ovirt/node/locale/zh_CN/LC_MESSAGES/ovirt_node.mo
new file mode 100644
index 0000000..f39d405
--- /dev/null
+++ b/src/ovirt/node/locale/zh_CN/LC_MESSAGES/ovirt_node.mo
Binary files differ
diff --git a/src/ovirt/node/setup/__main__.py b/src/ovirt/node/setup/__main__.py
index 59eff4f..0088378 100644
--- a/src/ovirt/node/setup/__main__.py
+++ b/src/ovirt/node/setup/__main__.py
@@ -24,8 +24,10 @@
 """
 
 from ovirt.node import app, setup
-
+import gettext
 
 if __name__ == '__main__':
+    gettext.install('ovirt_node', '/usr/share/locale', unicode=True)
+
     app = app.Application(setup)
     app.run()
diff --git a/src/ovirt/node/setup/core/diagnostics_page.py b/src/ovirt/node/setup/core/diagnostics_page.py
index a3508ef..eb34923 100644
--- a/src/ovirt/node/setup/core/diagnostics_page.py
+++ b/src/ovirt/node/setup/core/diagnostics_page.py
@@ -30,7 +30,7 @@
 class Plugin(plugins.NodePlugin):
 
     def name(self):
-        return "Diagnostics"
+        return _("Diagnostics")
 
     def rank(self):
         return 95
@@ -48,10 +48,10 @@
         """Describes the UI this plugin requires
         This is an ordered list of (path, widget) tuples.
         """
-        ws = [ui.Header("diagnostic._header", "Diagnostic Utilities"),
-              ui.Label("diagnostic.info", "Select one of the tools below."),
+        ws = [ui.Header("diagnostic._header", _("Diagnostic Utilities")),
+              ui.Label("diagnostic.info", _("Select one of the tools below.")),
               ui.Divider("diagnostic.divider"),
-              ui.Table("diagnostic.tools", "", "Available diagnostics",
+              ui.Table("diagnostic.tools", "", _("Available diagnostics"),
                        self.__diagnostics(), height=min(
                            len(self.__diagnostics()), 4)),
               ]
@@ -76,8 +76,8 @@
                 contents = process.check_output(cmd,
                                                 stderr=process.STDOUT,
                                                 shell=True)
-                return ui.TextViewDialog("output.dialog", "Command Output",
-                                         contents)
+                return ui.TextViewDialog("output.dialog", _("Command Output").encode('utf8'),
+                                         contents.encode('utf8'))
 
     def __diagnostics(self):
         return [("multipath", "multipath -ll"),
diff --git a/src/ovirt/node/setup/core/kdump_page.py b/src/ovirt/node/setup/core/kdump_page.py
index 5887cd4..1e2d0ab 100644
--- a/src/ovirt/node/setup/core/kdump_page.py
+++ b/src/ovirt/node/setup/core/kdump_page.py
@@ -39,7 +39,7 @@
     _types = []
 
     def name(self):
-        return "Kdump"
+        return _("Kdump")
 
     def rank(self):
         return 60
@@ -86,27 +86,27 @@
         else:
             net_is_configured = NodeNetwork().is_configured()
 
-        ws = [ui.Header("kdump._header", "Configure Kdump")]
+        ws = [ui.Header("kdump._header", _("Configure Kdump"))]
 
         if not net_is_configured:
             self._types = self._types_local
-            ws.extend([ui.Notice("network.notice",
-                                 "Networking is not configured, " +
-                                 "please configure it before NFS " +
-                                 "or SSH-based kdump"),
+            ws.extend([ui.Notice(_("network.notice"),
+                                 _("Networking is not configured, ") +
+                                 _("please configure it before NFS ") +
+                                 _("or SSH-based kdump")),
                        ui.Divider("notice.divider")])
-            ws.extend([ui.Options("kdump.type", "Type", self._types)])
+            ws.extend([ui.Options("kdump.type", _("Type"), self._types)])
 
         else:
             self._types = self._types_local + self._types_remote
-            ws.extend([ui.Options("kdump.type", "Type", self._types)])
+            ws.extend([ui.Options("kdump.type", _("Type"), self._types)])
             ws.extend([ui.Divider("divider[0]"),
-                       ui.Entry("kdump.nfs_location", "NFS Location " +
-                                "(example.com:/var/crash):",
+                       ui.Entry("kdump.nfs_location", _("NFS Location ") +
+                                _("(example.com:/var/crash):"),
                                 align_vertical=True),
                        ui.Divider("divider[1]"),
-                       ui.Entry("kdump.ssh_location", "SSH Location " +
-                                "(root at example.com):",
+                       ui.Entry("kdump.ssh_location", _("SSH Location ") +
+                                _("(root at example.com):"),
                                 align_vertical=True),
                        ])
         page = ui.Page("page", ws)
@@ -144,7 +144,7 @@
 
         kdump_keys = ["kdump.type", "kdump.ssh_location", "kdump.nfs_location"]
 
-        txs = utils.Transaction("Updating kdump related configuration")
+        txs = utils.Transaction(_("Updating kdump related configuration"))
 
         if changes.contains_any(kdump_keys):
             model = defaults.KDump()
@@ -169,4 +169,4 @@
                 console.wait_for_keypress()
         except Exception as e:
             self.logger.exception("Exception while configuring kdump")
-            return InfoDialog("dialog.info", "An error occurred", e.message)
+            return InfoDialog("dialog.info", _("An error occurred"), e.message)
diff --git a/src/ovirt/node/setup/core/keyboard_page.py b/src/ovirt/node/setup/core/keyboard_page.py
index 22e8ba9..bf36818 100644
--- a/src/ovirt/node/setup/core/keyboard_page.py
+++ b/src/ovirt/node/setup/core/keyboard_page.py
@@ -31,7 +31,7 @@
     _model = None
 
     def name(self):
-        return "Keyboard"
+        return _("Keyboard")
 
     def rank(self):
         return 30
@@ -52,18 +52,18 @@
         This is an ordered list of (path, widget) tuples.
         """
         kbd = utils.system.Keyboard()
-        ws = [ui.Header("header", "Keyboard Layout Selection"),
-              ui.Label("label", "Choose the Keyboard Layout you would " +
-                       "like to apply to this system."),
+        ws = [ui.Header("header", _("Keyboard Layout Selection")),
+              ui.Label("label", _("Choose the Keyboard Layout you would ") +
+                       _("like to apply to this system.")),
               ui.Divider("divider[0]"),
-              ui.KeywordLabel("keyboard.layout_name", "Current Active " +
-                              "Keyboard Layout:  "),
-              ui.Table("keyboard.layout", "", "Available Keyboard Layouts",
+              ui.KeywordLabel("keyboard.layout_name", _("Current Active ").encode('utf8') +
+                              _("Keyboard Layout:  ").encode('utf8')),
+              ui.Table("keyboard.layout", "", _("Available Keyboard Layouts"),
                        kbd.available_layouts(), kbd.get_current()),
               ]
 
         page = ui.Page("page", ws)
-        page.buttons = [ui.SaveButton("page.save")]
+        page.buttons = [ui.SaveButton("page.save", _("Save"))]
         self.widgets.add(page)
         return page
 
@@ -81,7 +81,7 @@
 
         layout_keys = ["keyboard.layout"]
 
-        txs = utils.Transaction("Updating keyboard related configuration")
+        txs = utils.Transaction(_("Updating keyboard related configuration"))
 
         if changes.contains_any(layout_keys):
             model = defaults.Keyboard()
diff --git a/src/ovirt/node/setup/core/logging_page.py b/src/ovirt/node/setup/core/logging_page.py
index 270cd18..53033e5 100644
--- a/src/ovirt/node/setup/core/logging_page.py
+++ b/src/ovirt/node/setup/core/logging_page.py
@@ -31,7 +31,7 @@
     _model = None
 
     def name(self):
-        return "Logging"
+        return _("Logging")
 
     def rank(self):
         return 50
@@ -65,9 +65,9 @@
 
     def ui_content(self):
 
-        ws = [ui.Header("header[0]", "Logging"),
-              ui.Entry("logrotate.max_size", "Logrotate Max Log " +
-                       "Size (KB):"),
+        ws = [ui.Header("header[0]", _("Logging")),
+              ui.Entry("logrotate.max_size", _("Logrotate Max Log ") +
+                       _("Size (KB):")),
               ui.Divider("divider[0]")
               ]
 
@@ -75,24 +75,24 @@
 
         if not net_is_configured:
             ws.extend([ui.Notice("network.notice",
-                                 "Networking is not configured, " +
-                                 "please configure it before rsyslog " +
-                                 "and/or netconsole"),
+                                 _("Networking is not configured, ") +
+                                 _("please configure it before rsyslog ") +
+                                 _("and/or netconsole")),
                        ui.Divider("notice.divider")])
 
-        ws.extend([ui.Label("rsyslog.header", "RSyslog is an enhanced multi-" +
-                            "threaded syslogd"),
-                   ui.Entry("rsyslog.address", "Server Address:",
+        ws.extend([ui.Label("rsyslog.header", _("RSyslog is an enhanced multi-") +
+                            _("threaded syslogd")),
+                   ui.Entry("rsyslog.address", _("Server Address:"),
                             enabled=net_is_configured),
-                   ui.Entry("rsyslog.port", "Server Port:",
+                   ui.Entry("rsyslog.port", _("Server Port:"),
                             enabled=net_is_configured),
                    ui.Divider("divider[1]"),
                    ui.Label("netconsole.label",
-                            "Netconsole service allows a remote sys" +
-                            "log daemon to record printk() messages"),
-                   ui.Entry("netconsole.address", "Server Address:",
+                            _("Netconsole service allows a remote sys") +
+                            _("log daemon to record printk() messages")),
+                   ui.Entry("netconsole.address", _("Server Address:"),
                             enabled=net_is_configured),
-                   ui.Entry("netconsole.port", "Server Port:",
+                   ui.Entry("netconsole.port", _("Server Port:"),
                             enabled=net_is_configured)
                    ])
 
@@ -112,7 +112,7 @@
         self.logger.debug("Changes: %s" % changes)
         self.logger.debug("Effective Model: %s" % effective_model)
 
-        txs = utils.Transaction("Updating logging related configuration")
+        txs = utils.Transaction(_("Updating logging related configuration"))
 
         # If any logrotate key changed ...
         logrotate_keys = ["logrotate.max_size"]
diff --git a/src/ovirt/node/setup/core/monitoring_page.py b/src/ovirt/node/setup/core/monitoring_page.py
index 0912af0..30fa1af 100644
--- a/src/ovirt/node/setup/core/monitoring_page.py
+++ b/src/ovirt/node/setup/core/monitoring_page.py
@@ -31,7 +31,7 @@
     _model = None
 
     def name(self):
-        return "Monitoring"
+        return _("Monitoring")
 
     def rank(self):
         return 90
@@ -50,13 +50,13 @@
                 }
 
     def ui_content(self):
-        ws = [ui.Header("header[0]", "Monitoring Configuration"),
-              ui.Label("label", "Collectd gathers statistics " +
-                       "about the system and can be used to find " +
-                       "performance bottlenecks and predict future " +
-                       "system load."),
-              ui.Entry("collectd.address", "Server Address:"),
-              ui.Entry("collectd.port", "Server Port:"),
+        ws = [ui.Header("header[0]", _("Monitoring Configuration")),
+              ui.Label("label", _("Collectd gathers statistics ") +
+                       _("about the system and can be used to find ") +
+                       _("performance bottlenecks and predict future ") +
+                       _("system load.")),
+              ui.Entry("collectd.address", _("Server Address:")),
+              ui.Entry("collectd.port", _("Server Port:")),
               ]
         page = ui.Page("page", ws)
         self.widgets.add(page)
@@ -76,7 +76,7 @@
 
         collectd_keys = ["collectd.address", "collectd.port"]
 
-        txs = utils.Transaction("Updating monitoring configuration")
+        txs = utils.Transaction(_("Updating monitoring configuration"))
 
         if changes.contains_any(collectd_keys):
             model = defaults.Collectd()
diff --git a/src/ovirt/node/setup/core/network_page.py b/src/ovirt/node/setup/core/network_page.py
index 98f3e2a..eda2da3 100644
--- a/src/ovirt/node/setup/core/network_page.py
+++ b/src/ovirt/node/setup/core/network_page.py
@@ -90,7 +90,7 @@
             "bond.options"])
 
     def name(self):
-        return "Network"
+        return _("Network")
 
     def rank(self):
         return 10
@@ -161,22 +161,22 @@
         mbond = defaults.NicBonding().retrieve()
         bond_status = ", ".join(mbond["slaves"]
                                 or [])
-        bond_lbl = "Remove %s (%s)" % (mbond["name"], bond_status) \
-            if bond_status else "Create Bond"
+        bond_lbl = _("Remove %s (%s)") % (mbond["name"], bond_status) \
+            if bond_status else _("Create Bond")
 
-        ws = [ui.Header("header[0]", "System Identification"),
-              ui.Entry("hostname", "Hostname:"),
+        ws = [ui.Header("header[0]", _("System Identification")),
+              ui.Entry("hostname", _("Hostname:")),
               ui.Divider("divider[0]"),
-              ui.Entry("dns[0]", "DNS Server 1:"),
-              ui.Entry("dns[1]", "DNS Server 2:"),
+              ui.Entry("dns[0]", _("DNS Server 1:")),
+              ui.Entry("dns[1]", _("DNS Server 2:")),
               ui.Divider("divider[1]"),
-              ui.Entry("ntp[0]", "NTP Server 1:"),
-              ui.Entry("ntp[1]", "NTP Server 2:"),
+              ui.Entry("ntp[0]", _("NTP Server 1:")),
+              ui.Entry("ntp[1]", _("NTP Server 2:")),
               ui.Divider("divider[2]"),
               NicTable("nics", height=3),
 
               ui.Row("row[0]",
-                     [ui.Button("button.ping", "Ping"),
+                     [ui.Button("button.ping", _("Ping")),
                       ui.Button("button.toggle_bond", bond_lbl)
                       ])
               ]
@@ -247,7 +247,7 @@
         self.logger.debug("Effective Model: %s" % effective_model)
 
         # This object will contain all transaction elements to be executed
-        txs = utils.Transaction("Network Interface Configuration")
+        txs = utils.Transaction(_("Network Interface Configuration"))
 
         # Special case: A NIC was selected, display that dialog!
         if "nics" in changes and len(changes) == 1:
@@ -483,8 +483,8 @@
 
         padd = lambda l: l.ljust(12)
         ws = [ui.Row("dialog.nic._row[0]",
-                     [ui.KeywordLabel("dialog.nic.driver", padd("Driver: ")),
-                      ui.KeywordLabel("dialog.nic.vendor", padd("Vendor: ")),
+                     [ui.KeywordLabel("dialog.nic.driver", padd(_("Driver: "))),
+                      ui.KeywordLabel("dialog.nic.vendor", padd(_("Vendor: "))),
                       ]),
 
               ui.Row("dialog.nic._row[2]",
@@ -496,65 +496,65 @@
 
               ui.Divider("dialog.nic._divider[0]"),
 
-              ui.Label("dialog.nic.ipv4._header", "IPv4 Settings"),
+              ui.Label("dialog.nic.ipv4._header", _("IPv4 Settings")),
 
               ui.Options("dialog.nic.ipv4.bootproto",
-                         "Bootprotocol: ", [("none", "Disabled"),
-                                            ("dhcp", "DHCP"),
-                                            ("static", "Static")
+                         "Bootprotocol: ", [("none", _("Disabled")),
+                                            ("dhcp", _("DHCP")),
+                                            ("static", _("Static"))
                                             ]),
 
               ui.Row("dialog.nic._row[4]",
                      [ui.Entry("dialog.nic.ipv4.address",
-                               padd("IP Address: ")),
+                               padd(_("IP Address: "))),
                       ui.Entry("dialog.nic.ipv4.netmask",
-                               padd("  Netmask: "))]),
+                               padd(_("  Netmask: ")))]),
               ui.Row("dialog.nic._row[5]",
                      [ui.Entry("dialog.nic.ipv4.gateway",
-                               padd("Gateway: ")),
+                               padd(_("Gateway: "))),
                       ui.Label("dummy[0]", "")]),
 
               ui.Divider("dialog.nic._divider[1]"),
 
-              ui.Label("dialog.nic.ipv6._header", "IPv6 Settings"),
+              ui.Label("dialog.nic.ipv6._header", _("IPv6 Settings")),
 
               ui.Options("dialog.nic.ipv6.bootproto",
-                         "Bootprotocol: ", [("none", "Disabled"),
-                                            ("auto", "Auto"),
-                                            ("dhcp", "DHCP"),
-                                            ("static", "Static")
+                         "Bootprotocol: ", [("none", _("Disabled")),
+                                            ("auto", _("Auto")),
+                                            ("dhcp", _("DHCP")),
+                                            ("static", _("Static"))
                                             ]),
 
               ui.Row("dialog.nic._row[6]",
                      [ui.Entry("dialog.nic.ipv6.address",
-                               padd("IP Address: ")),
+                               padd(_("IP Address: "))),
                       ui.Entry("dialog.nic.ipv6.netmask",
-                               padd("  Prefix Length: "))]),
+                               padd(_("  Prefix Length: ")))]),
               ui.Row("dialog.nic._row[7]",
                      [ui.Entry("dialog.nic.ipv6.gateway",
-                               padd("Gateway: ")),
+                               padd(_("Gateway: "))),
                       ui.Label("dummy[1]", "")]),
 
               ui.Divider("dialog.nic._divider[2]"),
 
               ui.Row("dialog.nic._row[8]",
                      [ui.Entry("dialog.nic.vlanid",
-                               padd("VLAN ID: ")),
+                               padd(_("VLAN ID: "))),
                       ui.Label("dummy[2]", "")]),
 
               ui.Divider("dialog.nic._divider[3]"),
 
               ui.Checkbox("dialog.nic.layout_bridged",
-                          "Use Bridge: "),
+                          _("Use Bridge: ")),
 
               ui.Divider("dialog.nic._divider[4]"),
-              ui.Button("dialog.nic.identify", "Flash Lights to Identify"),
+              ui.Button("dialog.nic.identify", _("Flash Lights to Identify")),
               ]
 
         self.plugin.widgets.add(ws)
         self.children = ws
-        self.buttons = [ui.SaveButton("dialog.nic.save", "Save"),
-                        ui.CloseButton("dialog.nic.close", "Close")
+        self.buttons = [ui.SaveButton("dialog.nic.save", _("Save")),
+                        ui.CloseButton("dialog.nic.close", _("Close"))
                         ]
         self.plugin._nic_details_group.enabled(False)
         self.plugin.widgets["dialog.nic.vlanid"].enabled(True)
@@ -563,9 +563,9 @@
 
 class CreateBondDialog(ui.Dialog):
     def __init__(self, path):
-        widgets = [ui.Entry("bond.name", "Name:"),
+        widgets = [ui.Entry("bond.name", _("Name:")),
                    ui.Divider("bond.divider[0]"),
-                   ui.Entry("bond.options", "Options:"),
+                   ui.Entry("bond.options", _("Options:")),
                    ui.Divider("bond.divider[1]"),
                    NicTable("bond.slaves", multi=True)]
-        super(CreateBondDialog, self).__init__(path, "Create Bond", widgets)
+        super(CreateBondDialog, self).__init__(path, _("Create Bond"), widgets)
diff --git a/src/ovirt/node/setup/core/performance_page.py b/src/ovirt/node/setup/core/performance_page.py
index 888b3b2..8cd3b38 100644
--- a/src/ovirt/node/setup/core/performance_page.py
+++ b/src/ovirt/node/setup/core/performance_page.py
@@ -31,7 +31,7 @@
     _model = None
 
     def name(self):
-        return "Performance"
+        return _("Performance")
 
     def rank(self):
         return 100
@@ -50,16 +50,16 @@
         profiles = [(profile, profile) for profile in
                     tuned.get_available_profiles()]
 
-        ws = [ui.Header("header", "tuned Configuration"),
-              ui.Label("label", "Choose the tuned profile you would " +
-                       "like to apply to this system."),
+        ws = [ui.Header("header", _("tuned Configuration")),
+              ui.Label("label", _("Choose the tuned profile you would ") +
+                       _("like to apply to this system.")),
               ui.Divider("divider[0]"),
-              ui.KeywordLabel("tuned.profile", "Current Active Profile:  "),
-              ui.Table("tuned.profile", "", "Available tuned Profiles",
+              ui.KeywordLabel("tuned.profile", _("Current Active Profile:  ")),
+              ui.Table("tuned.profile", "", _("Available tuned Profiles"),
                        profiles),
               ]
         page = ui.Page("page", ws)
-        page.buttons = [ui.SaveButton("page.save")]
+        page.buttons = [ui.SaveButton("page.save", _("Save"))]
         self.widgets.add(page)
         return page
 
diff --git a/src/ovirt/node/setup/core/ping.py b/src/ovirt/node/setup/core/ping.py
index 90cb297..7b01a0c 100644
--- a/src/ovirt/node/setup/core/ping.py
+++ b/src/ovirt/node/setup/core/ping.py
@@ -32,7 +32,7 @@
     _model = None
 
     def name(self):
-        return "Networking/Ping"
+        return _("Networking/Ping")
 
     def rank(self):
         return 999
@@ -67,13 +67,13 @@
         """Describes the UI this plugin requires
         This is an ordered list of (path, widget) tuples.
         """
-        ws = [ui.Header("ping.header", "Ping a remote host"),
-              ui.Entry("ping.address", "Address:"),
-              ui.Entry("ping.count", "Count:"),
+        ws = [ui.Header("ping.header", _("Ping a remote host")),
+              ui.Entry("ping.address", _("Address:")),
+              ui.Entry("ping.count", _("Count:")),
               ui.Divider("divider[1]"),
-              ui.SaveButton("ping.do_ping", "Ping"),
+              ui.SaveButton("ping.do_ping", _("Ping")),
               ui.Divider("divider[2]"),
-              ui.Label("ping.result", "Result:"),
+              ui.Label("ping.result", _("Result:")),
               ]
 
         page = ui.Page("page", ws)
diff --git a/src/ovirt/node/setup/core/plugins_page.py b/src/ovirt/node/setup/core/plugins_page.py
index f43cf84..a8d2fdb 100644
--- a/src/ovirt/node/setup/core/plugins_page.py
+++ b/src/ovirt/node/setup/core/plugins_page.py
@@ -37,7 +37,7 @@
         self._model = {}
 
     def name(self):
-        return "Plugins"
+        return _("Plugins")
 
     def rank(self):
         return 300
@@ -46,34 +46,34 @@
         all_plugins = self.__list_of_plugins()
         if all_plugins:
             selected_plugin = all_plugins[0][0]
-            ws = [ui.Header("header[0]", "Installed Plugins"),
+            ws = [ui.Header("header[0]", _("Installed Plugins")),
 
-                  ui.Table("plugins.installed", "", "Installed plugins:",
+                  ui.Table("plugins.installed", "", _("Installed plugins:"),
                            all_plugins, selected_plugin),
 
                   ui.Divider("divider[0]"),
 
-                  ui.Row("row[0]", [ui.Label("label[0]", "Name:"),
+                  ui.Row("row[0]", [ui.Label("label[0]", _("Name:")),
                                     ui.Label("plugin.name", "")]),
 
-                  ui.Row("row[1]", [ui.Label("label[0]", "Version:"),
+                  ui.Row("row[1]", [ui.Label("label[0]", _("Version:")),
                                     ui.Label("plugin.version", "")]),
 
-                  ui.Row("row[2]", [ui.Label("label[0]", "Date installed:"),
+                  ui.Row("row[2]", [ui.Label("label[0]", _("Date installed:")),
                                     ui.Label("plugin.createdat", "")]),
 
                   ui.Divider("divider[1]"),
 
-                  ui.Row("row[3]", [ui.SaveButton("button.drpm", "RPM Diff"),
+                  ui.Row("row[3]", [ui.SaveButton("button.drpm", _("RPM Diff")),
                                     ui.SaveButton("button.dsrpm",
-                                                  "SRPM Diff"),
+                                                  _("SRPM Diff")),
                                     ui.SaveButton("button.dfile",
-                                                  "File Diff")])
+                                                  _("File Diff"))])
                   ]
         else:
-            ws = [ui.Header("header[0]", "Plugins"),
-                  ui.Label("label[0]", "There are no plugins currently " +
-                           "installed")]
+            ws = [ui.Header("header[0]", _("Plugins")),
+                  ui.Label("label[0]", 
+                      _("There are no plugins currently installed"))]
 
         page = ui.Page("page", ws)
         page.buttons = []
diff --git a/src/ovirt/node/setup/core/remote_storage_page.py b/src/ovirt/node/setup/core/remote_storage_page.py
index 810efc5..fbb9964 100644
--- a/src/ovirt/node/setup/core/remote_storage_page.py
+++ b/src/ovirt/node/setup/core/remote_storage_page.py
@@ -32,7 +32,7 @@
     _model = None
 
     def name(self):
-        return "Remote Storage"
+        return _("Remote Storage")
 
     def rank(self):
         return 70
@@ -52,11 +52,11 @@
                 }
 
     def ui_content(self):
-        ws = [ui.Header("header", "Remote Storage"),
-              ui.Entry("iscsi.initiator_name", "iSCSI Initiator Name:",
+        ws = [ui.Header("header", _("Remote Storage")),
+              ui.Entry("iscsi.initiator_name", _("iSCSI Initiator Name:"),
                        align_vertical=True),
               ui.Divider("divider[0]"),
-              ui.Entry("nfsv4.domain", "NFSv4 Domain (example.redhat.com):",
+              ui.Entry("nfsv4.domain", _("NFSv4 Domain (example.redhat.com):"),
                        align_vertical=True),
               ]
 
@@ -76,7 +76,7 @@
         self.logger.debug("Changes: %s" % changes)
         self.logger.debug("Effective Model: %s" % effective_model)
 
-        txs = utils.Transaction("Updating remote storage configuration")
+        txs = utils.Transaction(_("Updating remote storage configuration"))
 
         iscsi_keys = ["iscsi.initiator_name"]
         if changes.contains_any(iscsi_keys):
diff --git a/src/ovirt/node/setup/core/security_page.py b/src/ovirt/node/setup/core/security_page.py
index e81d689..e5cc38e 100644
--- a/src/ovirt/node/setup/core/security_page.py
+++ b/src/ovirt/node/setup/core/security_page.py
@@ -31,7 +31,7 @@
     _model = {}
 
     def name(self):
-        return "Security"
+        return _("Security")
 
     def rank(self):
         return 20
@@ -56,13 +56,13 @@
                 }
 
     def ui_content(self):
-        ws = [ui.Header("header[0]", "Remote Access"),
-              ui.Checkbox("ssh.pwauth", "Enable SSH password authentication"),
-              ui.Header("header[1]", "Strong Random Number Generator"),
-              ui.Checkbox("strongrng.disable_aesni", "Disable AES-NI"),
-              ui.Entry("strongrng.num_bytes", "Bytes Used:"),
-              ui.Header("header[2]", "Password for the admin user"),
-              ui.ConfirmedEntry("passwd.admin.password", "Password:", True)
+        ws = [ui.Header("header[0]", _("Remote Access")),
+              ui.Checkbox("ssh.pwauth", _("Enable SSH password authentication")),
+              ui.Header("header[1]", _("Strong Random Number Generator")),
+              ui.Checkbox("strongrng.disable_aesni", _("Disable AES-NI")),
+              ui.Entry("strongrng.num_bytes", _("Bytes Used:")),
+              ui.Header("header[2]", _("Password for the admin user")),
+              ui.ConfirmedEntry("passwd.admin.password", _("Password:"), True)
               ]
 
         page = ui.Page("page", ws)
@@ -95,7 +95,7 @@
         ssh_keys = ["ssh.pwauth", "strongrng.num_bytes",
                     "strongrng.disable_aesni"]
 
-        txs = utils.Transaction("Updating security configuration")
+        txs = utils.Transaction(_("Updating security configuration"))
 
         if changes.contains_any(ssh_keys):
             model = defaults.SSH()
@@ -109,7 +109,7 @@
             # Create a custom transaction element, because the password
             # is not handled/saved in the defaults file
             class SetAdminPasswd(utils.Transaction.Element):
-                title = "Setting admin password"
+                title = _("Setting admin password")
 
                 def commit(self):
                     self.logger.debug("Setting admin password.")
diff --git a/src/ovirt/node/setup/core/status_page.py b/src/ovirt/node/setup/core/status_page.py
index 2fdef7a..89d02bd 100644
--- a/src/ovirt/node/setup/core/status_page.py
+++ b/src/ovirt/node/setup/core/status_page.py
@@ -40,7 +40,7 @@
     _model = None
 
     def name(self):
-        return "Status"
+        return _("Status")
 
     def rank(self):
         return 0
@@ -75,38 +75,38 @@
 
         # Network related widgets, appearing in one row
         network_widgets = [ui.KeywordLabel("networking",
-                                           aligned("Networking: ")),
+                                           aligned(_("Networking: "))),
                            ui.Label("networking.bridge", ""),
                            ]
 
-        action_widgets = [ui.Button("action.lock", "Lock"),
-                          ui.Button("action.logoff", "Log Off"),
-                          ui.Button("action.restart", "Restart"),
-                          ui.Button("action.poweroff", "Power Off")
+        action_widgets = [ui.Button("action.lock", _("Lock")),
+                          ui.Button("action.logoff", _("Log Off")),
+                          ui.Button("action.restart", _("Restart")),
+                          ui.Button("action.poweroff", _("Power Off"))
                           ]
 
-        widgets = [ui.Header("header[0]", "System Information"),
+        widgets = [ui.Header("header[0]", _("System Information")),
 
-                   ui.KeywordLabel("status", aligned("Status: ")),
+                   ui.KeywordLabel("status", aligned(_("Status: "))),
                    ui.Divider("divider[0]"),
 
                    ui.Row("row[0]", network_widgets),
                    ui.Divider("divider[1]"),
 
-                   ui.KeywordLabel("logs", aligned("Logs: ")),
+                   ui.KeywordLabel("logs", aligned(_("Logs: "))),
                    ui.Divider("divider[2]"),
 
                    ui.KeywordLabel("libvirt.num_guests",
-                                   aligned("Running VMs: ")),
+                                   aligned(_("Running VMs: "))),
                    ui.Divider("divider[3]"),
 
-                   ui.Label("support.hint", "Press F8 for support menu"),
+                   ui.Label("support.hint", _("Press F8 for support menu")),
                    ui.Divider("divider[4]"),
 
                    ui.Row("row[1]",
-                          [ui.Button("action.hostkey", "View Host Key"),
+                          [ui.Button("action.hostkey", _("View Host Key")),
                            ui.Button("action.cpu_details",
-                                     "View CPU Details"),
+                                     _("View CPU Details")),
                            ]),
 
                    ui.Row("row[2]", action_widgets),
@@ -123,11 +123,11 @@
 
     def on_merge(self, changes):
         # Handle button presses
-        number_of_vm = "There are %s Virtual Machines running." \
+        number_of_vm = _("There are %s Virtual Machines running.") \
             % (virt.number_of_domains())
         if "action.lock" in changes:
             self.logger.info("Locking screen")
-            self._lock_dialog = LockDialog()
+            self._lock_dialog = LockDialog(title=_("This screen is locked."))
             self.application.ui.hotkeys_enabled(False)
             self.widgets.add(self._lock_dialog)
             return self._lock_dialog
@@ -139,7 +139,7 @@
                 self._lock_dialog.close()
                 self.application.ui.hotkeys_enabled(True)
             else:
-                self.application.notice("The provided password was incorrect.")
+                self.application.notice(_("The provided password was incorrect."))
                 self.widgets["password"].text("")
 
         elif "action.logoff" in changes:
@@ -149,10 +149,10 @@
         elif "action.restart" in changes:
             self.logger.info("Restarting")
             return ui.ConfirmationDialog("confirm.reboot",
-                                         "Confirm System Restart",
-                                         number_of_vm +
-                                         "\nThis will restart the system,"
-                                         "proceed?")
+                                         _("Confirm System Restart").encode('utf8'),
+                                         number_of_vm.encode('utf8') +
+                                         _("\nThis will restart the system,").encode('utf8')+
+                                         _("proceed?").encode('utf8'))
 
         elif "confirm.reboot.yes" in changes:
             self.logger.info("Confirm Restarting")
@@ -161,10 +161,10 @@
         elif "action.poweroff" in changes:
             self.logger.info("Shutting down")
             return ui.ConfirmationDialog("confirm.shutdown",
-                                         "Confirm System Poweroff",
-                                         number_of_vm +
-                                         "\nThis will shut down the system,"
-                                         "proceed?")
+                                         _("Confirm System Poweroff").encode('utf8'),
+                                         number_of_vm.encode('utf8') +
+                                         _("\nThis will shut down the system,").encode('utf8')+
+                                         _("proceed?").encode('utf8'))
 
         elif "confirm.shutdown.yes" in changes:
             self.logger.info("Confirm Shutting down")
@@ -172,11 +172,11 @@
 
         elif "action.hostkey" in changes:
             self.logger.info("Showing hostkey")
-            return HostkeyDialog("dialog.hostkey", "Host Key")
+            return HostkeyDialog("dialog.hostkey", _("Host Key"))
 
         elif "action.cpu_details" in changes:
             self.logger.info("Showing CPU details")
-            return CPUFeaturesDialog("dialog.cpu_details", "CPU Details")
+            return CPUFeaturesDialog("dialog.cpu_details", _("CPU Details"))
 
         elif "_save" in changes:
             self.widgets["dialog.hostkey"].close()
@@ -209,13 +209,13 @@
         ssh = security.Ssh()
         fp, hk = ssh.get_hostkey()
         self.children = [ui.Label("hostkey.label[0]",
-                                  "RSA Host Key Fingerprint:"),
+                                  _("RSA Host Key Fingerprint:")),
                          ui.Label("hostkey.fp", fp),
 
                          ui.Divider("hostkey.divider[0]"),
 
                          ui.Label("hostkey.label[1]",
-                                  "RSA Host Key:"),
+                                  _("RSA Host Key:")),
                          ui.Label("hostkey", "\n".join(textwrap.wrap(hk, 64))),
                          ]
         self.buttons = [ui.CloseButton("dialog.close")]
@@ -226,7 +226,7 @@
     """
     def __init__(self, path, title):
         msg = utils.system.cpu_details()
-        super(CPUFeaturesDialog, self).__init__(path, title, msg)
+        super(CPUFeaturesDialog, self).__init__(path, title.encode('utf8'), msg.encode('utf8'))
 
 
 class LockDialog(ui.Dialog):
@@ -235,10 +235,10 @@
     def __init__(self, path="lock.dialog", title="This screen is locked."):
         super(LockDialog, self).__init__(path, title, [])
         self.children = [ui.Header("lock.label[0]",
-                                   "Enter the admin password to unlock"),
-                         ui.KeywordLabel("username", "Username: ",
+                                   _("Enter the admin password to unlock")),
+                         ui.KeywordLabel("username", _("Username: "),
                                          os.getlogin()),
-                         ui.PasswordEntry("password", "Password:")
+                         ui.PasswordEntry("password", _("Password:"))
                          ]
-        self.buttons = [ui.Button("action.unlock", "Unlock")]
+        self.buttons = [ui.Button("action.unlock", _("Unlock"))]
         self.escape_key = None
diff --git a/src/ovirt/node/setup/core/support_page.py b/src/ovirt/node/setup/core/support_page.py
index 6bf5071..d838cec 100644
--- a/src/ovirt/node/setup/core/support_page.py
+++ b/src/ovirt/node/setup/core/support_page.py
@@ -35,7 +35,7 @@
         super(Plugin, self).__init__(application)
 
     def name(self):
-        return "Support"
+        return _("Support")
 
     def rank(self):
         return 999
@@ -44,10 +44,10 @@
         return False
 
     def ui_content(self):
-        ws = [ui.Header("header[0]", "Support Info"),
-              ui.Label("support.info", "Select one of the logfiles below."),
+        ws = [ui.Header("header[0]", _("Support Info")),
+              ui.Label("support.info", _("Select one of the logfiles below.")),
               ui.Divider("divider[0]"),
-              ui.Table("support.logfile", "", "Available Logfiles",
+              ui.Table("support.logfile", "", _("Available Logfiles"),
                        self.__debugfiles_to_offer()),
               ]
 
@@ -81,7 +81,7 @@
             if cmd:
                 contents = process.check_output(cmd, shell=True,
                                                 stderr=process.STDOUT)
-                return ui.TextViewDialog("output.dialog", "Logfile",
+                return ui.TextViewDialog("output.dialog", _("Logfile"),
                                          contents)
 
     def __debugfiles_to_offer(self):
diff --git a/src/ovirt/node/ui/__init__.py b/src/ovirt/node/ui/__init__.py
index b607b56..4234fb7 100644
--- a/src/ovirt/node/ui/__init__.py
+++ b/src/ovirt/node/ui/__init__.py
@@ -776,8 +776,8 @@
 
     def __init__(self, path, children, title=None):
         super(Page, self).__init__(path, children, title)
-        self.buttons = self.buttons or [SaveButton("%s.save" % path),
-                                        ResetButton("%s.reset" % path)
+        self.buttons = self.buttons or [SaveButton("%s.save" % path, _("Save")),
+                                        ResetButton("%s.reset" % path, _("Reset"))
                                         ]
 
     def elements(self):
@@ -796,8 +796,8 @@
 
     def __init__(self, path, title, children):
         super(Dialog, self).__init__(path, children, title)
-        self.buttons = [SaveButton("%s.save" % path),
-                        CloseButton("%s.close" % path)
+        self.buttons = [SaveButton("%s.save" % path, _("Save")),
+                        CloseButton("%s.close" % path, _("Reset"))
                         ]
         self.on_close_change = self.new_signal()
         self.close(False)
@@ -814,7 +814,7 @@
     def __init__(self, path, title, text, buttons=None):
         super(InfoDialog, self).__init__(path, title, [])
         self.children = [Label(path + ".label", text)]
-        self.buttons = buttons or [CloseButton(path + ".close")]
+        self.buttons = buttons or [CloseButton(path + ".close", _("Close"))]
 
 
 class TextViewDialog(Dialog):
@@ -822,9 +822,9 @@
     """
     def __init__(self, path, title, contents, height=16):
         super(TextViewDialog, self).__init__(path, title, [])
-        self.children = [Table("contents", "", "Contents",
+        self.children = [Table("contents", "", _("Contents"),
                                contents, height=height)]
-        self.buttons = [CloseButton("dialog.close")]
+        self.buttons = [CloseButton("dialog.close", _("Close"))]
 
 
 class ConfirmationDialog(InfoDialog):
@@ -838,8 +838,8 @@
                          ]
         if not buttons:
             # Default: OK and Close
-            self.buttons = [Button(path + ".yes", "OK"),
-                            CloseButton(path + ".close")]
+            self.buttons = [Button(path + ".yes", _("OK")),
+                            CloseButton(path + ".close", _("Close"))]
 
 
 class TransactionProgressDialog(Dialog):
@@ -848,15 +848,15 @@
 
     def __init__(self, path, transaction, plugin, initial_text=""):
         self.transaction = transaction
-        title = "Transaction: %s" % self.transaction.title
+        title = _("Transaction: %s") % self.transaction.title
         self._progress_label = Label("dialog.progress", initial_text)
         super(TransactionProgressDialog, self).__init__(path,
-                                                        title,
+                                                        title.encode('utf8'),
                                                         [self._progress_label])
         self.texts = [initial_text, ""]
         self.plugin = plugin
 
-        self._close_button = CloseButton("button.close")
+        self._close_button = CloseButton("button.close", _("Close"))
         self.buttons = [self._close_button]
 
     def add_update(self, txt):


-- 
To view, visit http://gerrit.ovirt.org/18335
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7f7e44dc46069aecd00950279a3800d496b1c555
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-node
Gerrit-Branch: master
Gerrit-Owner: hai bo <boh.ricky at gmail.com>



More information about the node-patches mailing list