summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/source/topics/customizing.rst59
-rw-r--r--horizon/locale/ca/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/cs/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/de/LC_MESSAGES/djangojs.po57
-rw-r--r--horizon/locale/en/LC_MESSAGES/djangojs.po43
-rw-r--r--horizon/locale/en_AU/LC_MESSAGES/djangojs.po55
-rw-r--r--horizon/locale/en_GB/LC_MESSAGES/djangojs.po57
-rw-r--r--horizon/locale/es/LC_MESSAGES/djangojs.po55
-rw-r--r--horizon/locale/fi_FI/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/fr/LC_MESSAGES/djangojs.po55
-rw-r--r--horizon/locale/he/LC_MESSAGES/djangojs.po45
-rw-r--r--horizon/locale/hi/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/id/LC_MESSAGES/djangojs.po47
-rw-r--r--horizon/locale/ja/LC_MESSAGES/djangojs.po57
-rw-r--r--horizon/locale/ka_GE/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/ko_KR/LC_MESSAGES/djangojs.po57
-rw-r--r--horizon/locale/nl_NL/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/pa_IN/LC_MESSAGES/djangojs.po55
-rw-r--r--horizon/locale/pl_PL/LC_MESSAGES/django.po42
-rw-r--r--horizon/locale/pl_PL/LC_MESSAGES/djangojs.po210
-rw-r--r--horizon/locale/pt/LC_MESSAGES/djangojs.po47
-rw-r--r--horizon/locale/pt_BR/LC_MESSAGES/djangojs.po55
-rw-r--r--horizon/locale/ru/LC_MESSAGES/django.po18
-rw-r--r--horizon/locale/ru/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/sr/LC_MESSAGES/djangojs.po49
-rw-r--r--horizon/locale/te_IN/LC_MESSAGES/djangojs.po45
-rw-r--r--horizon/locale/tr_TR/LC_MESSAGES/djangojs.po45
-rw-r--r--horizon/locale/zh_CN/LC_MESSAGES/djangojs.po55
-rw-r--r--horizon/locale/zh_TW/LC_MESSAGES/djangojs.po57
-rw-r--r--horizon/static/angular/action-list/action-list.spec.js46
-rw-r--r--horizon/static/angular/help-panel/help-panel.spec.js13
-rw-r--r--horizon/static/angular/modal/modal-wait-spinner.spec.js5
-rw-r--r--horizon/static/angular/modal/modal.spec.js1
-rw-r--r--horizon/static/angular/table/table.scss2
-rw-r--r--horizon/static/angular/table/table.spec.js13
-rw-r--r--horizon/static/angular/wizard/wizard.scss53
-rw-r--r--horizon/static/angular/wizard/wizard.spec.js19
-rw-r--r--horizon/static/horizon/js/angular/filters/filters.js14
-rw-r--r--horizon/static/horizon/js/angular/services/hz.api.config.js271
-rw-r--r--horizon/static/horizon/js/angular/services/hz.api.config.spec.js253
-rw-r--r--horizon/static/horizon/js/angular/services/hz.api.nova.js6
-rw-r--r--horizon/static/horizon/js/angular/services/hz.api.service.spec.js4
-rw-r--r--horizon/test/jasmine/jasmine_tests.py2
-rw-r--r--openstack_dashboard/api/rest/config.py25
-rw-r--r--openstack_dashboard/dashboards/identity/projects/tests.py250
-rw-r--r--openstack_dashboard/dashboards/identity/projects/workflows.py55
-rw-r--r--openstack_dashboard/dashboards/project/data_processing/jobs/workflows/launch.py10
-rw-r--r--openstack_dashboard/dashboards/project/images/images/tables.py9
-rw-r--r--openstack_dashboard/dashboards/project/instances/tests.py50
-rw-r--r--openstack_dashboard/dashboards/project/instances/views.py9
-rw-r--r--openstack_dashboard/local/local_settings.py.example21
-rw-r--r--openstack_dashboard/locale/cs/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/de/LC_MESSAGES/django.po59
-rw-r--r--openstack_dashboard/locale/en/LC_MESSAGES/django.po55
-rw-r--r--openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po59
-rw-r--r--openstack_dashboard/locale/es/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/fr/LC_MESSAGES/django.po59
-rw-r--r--openstack_dashboard/locale/hi/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/ja/LC_MESSAGES/django.po59
-rw-r--r--openstack_dashboard/locale/kn/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po61
-rw-r--r--openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po103
-rw-r--r--openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po388
-rw-r--r--openstack_dashboard/locale/ru/LC_MESSAGES/django.po69
-rw-r--r--openstack_dashboard/locale/sr/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po57
-rw-r--r--openstack_dashboard/management/commands/apache_vhost.conf.template8
-rw-r--r--openstack_dashboard/management/commands/make_web_conf.py43
-rw-r--r--openstack_dashboard/static/dashboard/cloud-services/cloud-services.js107
-rw-r--r--openstack_dashboard/static/dashboard/cloud-services/cloud-services.spec.js95
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.html2
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.spec.js67
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/create-keypair.html34
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/import-keypair.html50
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/keypair-details.html2
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.html138
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.js321
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.scss15
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.spec.js132
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/keypair/new-keypair.html31
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/source/source.html54
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/source/source.js11
-rw-r--r--openstack_dashboard/static/dashboard/launch-instance/source/source.scss63
-rw-r--r--openstack_dashboard/static/dashboard/scss/_mixins.scss2
-rw-r--r--openstack_dashboard/test/api_tests/config_rest_tests.py8
-rw-r--r--openstack_dashboard/test/settings.py6
89 files changed, 3537 insertions, 1816 deletions
diff --git a/doc/source/topics/customizing.rst b/doc/source/topics/customizing.rst
index dbf39e9a0..2865ef840 100644
--- a/doc/source/topics/customizing.rst
+++ b/doc/source/topics/customizing.rst
@@ -2,33 +2,60 @@
Customizing Horizon
===================
-Changing the Site Title
-=======================
+Themes
+======
-The OpenStack Dashboard Site Title branding (i.e. "**OpenStack** Dashboard")
-can be overwritten by adding the attribute ``SITE_BRANDING``
-to ``local_settings.py`` with the value being the desired name.
+As of the Kilo release, styling for the OpenStack Dashboard can be altered
+through the use of a theme. A theme is a directory containing a
+``_variables.scss`` file to override the color codes used throughout the SCSS
+and a ``_styles.scss`` file with additional styles to load after dashboard
+styles have loaded.
-The file ``local_settings.py`` can be found at the Horizon directory path of
-``openstack_dashboard/local/local_settings.py``.
+To use a custom theme, set ``CUSTOM_THEME_PATH`` in ``local_settings.py`` to
+the directory location for the theme (e.g., ``"static/themes/blue"``). The
+path can either be relative to the ``openstack_dashboard`` directory or an
+absolute path to an accessible location on the file system. The default
+``CUSTOM_THEME_PATH`` is ``static/themes/default``.
+
+Both the Dashboard custom variables and Bootstrap variables can be overridden.
+For a full list of the Dashboard SCSS variables that can be changed, see the
+variables file at ``openstack_dashboard/static/dashboard/scss/_variables.scss``.
Changing the Logo
-=================
+-----------------
There are currently two places where the OpenStack logo is pulled in
-through ``horizon.less``. The first is shown at the login screen and the other
-on top of the menu bar::
+through the stylesheets. The first is shown at the login screen and the other
+on top of the menu bar. To override the logo place your logo in your themes
+directory and set the image to use in ``_styles.scss``. For example::
#splash .login {
- background: url(/static/dashboard/img/logo-splash.png) no-repeat center 35px;
+ background-image: url(/static/themes/THEME/logo-splash.png);
+ }
- h1.brand a {
- background: url(/static/dashboard/img/logo.png) top left no-repeat;
+ .topbar {
+ h1.brand a {
+ background-image: url(/static/themes/THEME/logo.png);
+ }
+ }
-To override the OpenStack Logo image, replace the image at the directory path
-``openstack_dashboard/static/dashboard/img/logo.png``.
+``THEME`` should be replaced by the name of your theme directory.
+The dimensions should be ``width: 216px, height: 35px`` for a drop in
+replacement.
-The dimensions should be ``width: 216px, height: 35px``.
+Prior to the Kilo release the images files inside of Horizon needed to be
+replaced by your images files or the Horizon stylesheets needed to be altered
+to point to the location of your image.
+
+Changing the Site Title
+=======================
+
+The OpenStack Dashboard Site Title branding (i.e. "**OpenStack** Dashboard")
+can be overwritten by adding the attribute ``SITE_BRANDING``
+to ``local_settings.py`` with the value being the desired name.
+
+The file ``local_settings.py`` can be found at the Horizon directory path of
+``openstack_dashboard/local/local_settings.py``.
Changing the Brand Link
=======================
diff --git a/horizon/locale/ca/LC_MESSAGES/djangojs.po b/horizon/locale/ca/LC_MESSAGES/djangojs.po
index 773d7f1ba..a67d2fc44 100644
--- a/horizon/locale/ca/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/ca/LC_MESSAGES/djangojs.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Catalan (http://www.transifex.com/projects/p/horizon/language/ca/)\n"
"MIME-Version: 1.0\n"
@@ -197,24 +197,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -393,47 +398,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/cs/LC_MESSAGES/djangojs.po b/horizon/locale/cs/LC_MESSAGES/djangojs.po
index b87fd83aa..aee1eb56c 100644
--- a/horizon/locale/cs/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/cs/LC_MESSAGES/djangojs.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Czech (http://www.transifex.com/projects/p/horizon/language/cs/)\n"
"MIME-Version: 1.0\n"
@@ -198,24 +198,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -395,47 +400,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr "Nelze získat pár klíÄů."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Nelze získat zóny dostupnosti."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Nelze získat konfigurace."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/de/LC_MESSAGES/djangojs.po b/horizon/locale/de/LC_MESSAGES/djangojs.po
index 3737de274..fb904d3c9 100644
--- a/horizon/locale/de/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/de/LC_MESSAGES/djangojs.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 12:53+0000\n"
-"Last-Translator: Robert Simai\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: German (http://www.transifex.com/projects/p/horizon/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -199,25 +199,30 @@ msgstr "Nein"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "Bytes"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -395,47 +400,51 @@ msgstr "Ports können nicht abgerufen werden."
msgid "Unable to retrieve keypairs."
msgstr "Schlüsselpaare können nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Das Schlüsselpaar kann nicht erstellt werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Verfügbarkeitszonen können nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Begrenzungen können nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Der Server kann nicht erstellt werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Server kann nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Erweiterungen können nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Varianten können nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Variante kann nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Extraspezifikationen zur Variante können nicht abgerufen werden."
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Nicht aktivierte Erweiterung: %(extension)s"
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Liste der Nova-Erweiterungen kann nicht abgerufen werden."
diff --git a/horizon/locale/en/LC_MESSAGES/djangojs.po b/horizon/locale/en/LC_MESSAGES/djangojs.po
index 6041d1bad..f46f20baa 100644
--- a/horizon/locale/en/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/en/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-07 01:16-0500\n"
+"POT-Creation-Date: 2015-04-10 01:17-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -197,24 +197,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
+#, c-format
+msgid "%s GB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
+#, c-format
+msgid "%s MB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -393,47 +398,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/en_AU/LC_MESSAGES/djangojs.po b/horizon/locale/en_AU/LC_MESSAGES/djangojs.po
index 2e4fd92c3..3a34d0880 100644
--- a/horizon/locale/en_AU/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/en_AU/LC_MESSAGES/djangojs.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (Australia) (http://www.transifex.com/projects/p/horizon/language/en_AU/)\n"
"MIME-Version: 1.0\n"
@@ -198,25 +198,30 @@ msgstr "No"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "bytes"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -394,47 +399,51 @@ msgstr "Unable to retrieve ports."
msgid "Unable to retrieve keypairs."
msgstr "Unable to retrieve keypairs."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Unable to create the keypair."
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Unable to retrieve availability zones."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Unable to retrieve limits."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Unable to create the server."
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Unable to retrieve server."
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Unable to retrieve extensions."
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Unable to retrieve flavors."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Unable to retrieve flavor."
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Unable to retrieve flavor extra specs."
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/en_GB/LC_MESSAGES/djangojs.po b/horizon/locale/en_GB/LC_MESSAGES/djangojs.po
index af0587b22..2a7d9f60d 100644
--- a/horizon/locale/en_GB/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/en_GB/LC_MESSAGES/djangojs.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-05 15:01+0000\n"
-"Last-Translator: Rob Cresswell <robert.cresswell@outlook.com>\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/horizon/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -199,25 +199,30 @@ msgstr "No"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "bytes"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -395,47 +400,51 @@ msgstr "Unable to retrieve ports."
msgid "Unable to retrieve keypairs."
msgstr "Unable to retrieve keypairs."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Unable to create the keypair."
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Unable to retrieve availability zones."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Unable to retrieve limits."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Unable to create the server."
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Unable to retrieve server."
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Unable to retrieve extensions."
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Unable to retrieve flavours."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Unable to retrieve flavour."
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Unable to retrieve flavour extra specs."
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "Extension is not enabled: %(extension)s"
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Cannot get nova extension list."
diff --git a/horizon/locale/es/LC_MESSAGES/djangojs.po b/horizon/locale/es/LC_MESSAGES/djangojs.po
index 3195c5723..d65f567c2 100644
--- a/horizon/locale/es/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/es/LC_MESSAGES/djangojs.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/horizon/language/es/)\n"
"MIME-Version: 1.0\n"
@@ -200,25 +200,30 @@ msgstr "No"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "bytes"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -396,47 +401,51 @@ msgstr "No ha sido posible obtener los puertos."
msgid "Unable to retrieve keypairs."
msgstr "No ha sido posible obtener los pares de claves."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "No ha sido posible crear el par de claves."
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "No ha sido posible obtener las zonas de disponibilidad."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "No ha sido posible obtener los límites."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "No ha sido posible crear el servidor."
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "No ha sido posible obtener el servidor."
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "No ha sido posible obtener las extensiones."
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "No ha sido posible obtener los sabores."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "No ha sido posible obtener el sabor."
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "No ha sido posible obtener las especificaciones extra del sabor."
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/fi_FI/LC_MESSAGES/djangojs.po b/horizon/locale/fi_FI/LC_MESSAGES/djangojs.po
index 5898a109c..579df39f1 100644
--- a/horizon/locale/fi_FI/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/fi_FI/LC_MESSAGES/djangojs.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/horizon/language/fi_FI/)\n"
"MIME-Version: 1.0\n"
@@ -198,24 +198,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -394,47 +399,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr "Ei voida hakea avainpareja. "
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/fr/LC_MESSAGES/djangojs.po b/horizon/locale/fr/LC_MESSAGES/djangojs.po
index d8f778afb..8e1d55643 100644
--- a/horizon/locale/fr/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/fr/LC_MESSAGES/djangojs.po
@@ -16,8 +16,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: French (http://www.transifex.com/projects/p/horizon/language/fr/)\n"
"MIME-Version: 1.0\n"
@@ -206,25 +206,30 @@ msgstr "Non"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "Go"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "Mo"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "To"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "Ko"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "octets"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -402,47 +407,51 @@ msgstr "Impossible de récupérer les ports."
msgid "Unable to retrieve keypairs."
msgstr "Impossible de récupérer les paires de clés."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Impossible de créer la paire de clés"
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Impossible de récupérer les zones de disponibilité."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Impossible de récupérer les limites."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Impossible de créer le serveur."
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "Impossible de récupérer le serveur."
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "Impossible d'obtenir les extensions."
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Impossible de récupérer les gabarits."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Impossible de récupérer le gabarit."
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Impossible de récupérer les paramètres suppl. de gabarits."
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/he/LC_MESSAGES/djangojs.po b/horizon/locale/he/LC_MESSAGES/djangojs.po
index 1b70fafad..5dc1b2f3a 100644
--- a/horizon/locale/he/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/he/LC_MESSAGES/djangojs.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Hebrew (http://www.transifex.com/projects/p/horizon/language/he/)\n"
"MIME-Version: 1.0\n"
@@ -197,24 +197,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
+#, c-format
+msgid "%s GB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
+#, c-format
+msgid "%s MB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -393,47 +398,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/hi/LC_MESSAGES/djangojs.po b/horizon/locale/hi/LC_MESSAGES/djangojs.po
index 0f4f2418d..2c0a776ab 100644
--- a/horizon/locale/hi/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/hi/LC_MESSAGES/djangojs.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Hindi (http://www.transifex.com/projects/p/horizon/language/hi/)\n"
"MIME-Version: 1.0\n"
@@ -198,24 +198,29 @@ msgstr "नहीं"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "मे.बा."
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -394,47 +399,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "उपलबà¥à¤§à¤¤à¤¾ कà¥à¤·à¥‡à¤¤à¥à¤°à¥‹à¤‚ को पà¥à¤¨à¤ƒ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में असमरà¥à¤¥."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "फà¥à¤²à¥‡à¤µà¤° को पà¥à¤¨à¤ƒ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में असमरà¥à¤¥."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/id/LC_MESSAGES/djangojs.po b/horizon/locale/id/LC_MESSAGES/djangojs.po
index 4b160a592..16d8b9bd1 100644
--- a/horizon/locale/id/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/id/LC_MESSAGES/djangojs.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Indonesian (http://www.transifex.com/projects/p/horizon/language/id/)\n"
"MIME-Version: 1.0\n"
@@ -197,24 +197,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
+#, c-format
+msgid "%s MB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -392,47 +397,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/ja/LC_MESSAGES/djangojs.po b/horizon/locale/ja/LC_MESSAGES/djangojs.po
index a7443d753..79b234639 100644
--- a/horizon/locale/ja/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/ja/LC_MESSAGES/djangojs.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 21:41+0000\n"
-"Last-Translator: myamamot <myamamot@redhat.com>\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/horizon/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -201,25 +201,30 @@ msgstr "ã„ã„ãˆ"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "B"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -396,47 +401,51 @@ msgstr "ãƒãƒ¼ãƒˆã‚’å–å¾—ã§ãã¾ã›ã‚“。"
msgid "Unable to retrieve keypairs."
msgstr "キーペアã®ä¸€è¦§ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "キーペアをå–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "アベイラビリティーゾーンをå–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "上é™ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "サーãƒãƒ¼ã‚’作æˆã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "サーãƒãƒ¼ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "拡張機能をå–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "フレーãƒãƒ¼ã®ä¸€è¦§ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "フレーãƒãƒ¼ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "フレーãƒãƒ¼ã®è¿½åŠ ã‚¹ãƒšãƒƒã‚¯ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "拡張機能 %(extension)s ãŒæœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "nova ã®æ‹¡å¼µæ©Ÿèƒ½ä¸€è¦§ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
diff --git a/horizon/locale/ka_GE/LC_MESSAGES/djangojs.po b/horizon/locale/ka_GE/LC_MESSAGES/djangojs.po
index b1b8a1e5f..033060cdc 100644
--- a/horizon/locale/ka_GE/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/ka_GE/LC_MESSAGES/djangojs.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/horizon/language/ka_GE/)\n"
"MIME-Version: 1.0\n"
@@ -198,24 +198,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "გბ"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "მბ"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -393,47 +398,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/ko_KR/LC_MESSAGES/djangojs.po b/horizon/locale/ko_KR/LC_MESSAGES/djangojs.po
index ed90f7381..65cbd37ad 100644
--- a/horizon/locale/ko_KR/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/ko_KR/LC_MESSAGES/djangojs.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 17:12+0000\n"
-"Last-Translator: Sungjin Kang <potopro@gmail.com>\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/horizon/language/ko_KR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -200,25 +200,30 @@ msgstr "아니오"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "bytes"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -395,47 +400,51 @@ msgstr "í¬íŠ¸ë¥¼ 검색하지 못했습니다"
msgid "Unable to retrieve keypairs."
msgstr "Keypair를 ì°¾ì„ ìˆ˜ 없습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Keypair를 ìƒì„±í•˜ì§€ 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "가용성 ì¡´ì— ëŒ€í•œ 정보를 찾지 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "ì œí•œì„ ì°¾ì§€ 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "서버를 ìƒì„±í•˜ì§€ 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "서버를 찾지 못했습니다"
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "í™•ìž¥ì„ ì°¾ì§€ 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Flavor를 찾지 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "Flavor를 찾지 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "Flavor 확장 ìŠ¤íŒ©ì„ ì°¾ì§€ 못했습니다."
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "í™•ìž¥ì„ í™œì„±í™”í•˜ì§€ 못 했습니다: %(extension)s"
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "Nova 확장 목ë¡ì„ 가져올 수 없습니다."
diff --git a/horizon/locale/nl_NL/LC_MESSAGES/djangojs.po b/horizon/locale/nl_NL/LC_MESSAGES/djangojs.po
index db29da75c..e52072555 100644
--- a/horizon/locale/nl_NL/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/nl_NL/LC_MESSAGES/djangojs.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/horizon/language/nl_NL/)\n"
"MIME-Version: 1.0\n"
@@ -198,24 +198,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -394,47 +399,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr "Niet in staat om de sleutelparen op te halen."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Niet in staat om de beschikbaarheidszones op te halen."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Niet in staat om de smaken op te halen."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/pa_IN/LC_MESSAGES/djangojs.po b/horizon/locale/pa_IN/LC_MESSAGES/djangojs.po
index 93b2745c5..ecfe8107d 100644
--- a/horizon/locale/pa_IN/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/pa_IN/LC_MESSAGES/djangojs.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Panjabi (Punjabi) (India) (http://www.transifex.com/projects/p/horizon/language/pa_IN/)\n"
"MIME-Version: 1.0\n"
@@ -198,25 +198,30 @@ msgstr "ਨਹੀਂ"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "ਬਾਈਟਾਂ"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -394,47 +399,51 @@ msgstr "ਪੋਰਟਾਂ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤà
msgid "Unable to retrieve keypairs."
msgstr "ਚਾਬੀ-ਜੋੜੀਆਂ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "ਚਾਬੀ-ਜੋੜੀ ਨੂੰ ਬਣਾਉਣ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "ਜ਼ੋਨਾਂ ਦੀ ਉਪਲਬੱਧਤਾ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "ਹੱਦਾਂ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "ਸਰਵਰ ਬਣਾਉਣ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "ਸਰਵਰ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "à¨à¨•à¨¸à¨Ÿà©ˆà¨‚ਸ਼ਨਾਂ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "ਮਹਿਕਾਂ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "ਮਹਿਕ-ਕਿਸਮ (ਫਲੇਵਰ) ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "ਮਹਿਕ-ਕਿਸਮ (ਫਲੇਵਰ) ਵਾਧੂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੀ ਮà©à©œ ਪà©à¨°à¨¾à¨ªà¨¤à©€ ਕਰਨ ਤੋਂ ਅਸਮਰੱਥ।"
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/pl_PL/LC_MESSAGES/django.po b/horizon/locale/pl_PL/LC_MESSAGES/django.po
index 39655d974..f02b847ee 100644
--- a/horizon/locale/pl_PL/LC_MESSAGES/django.po
+++ b/horizon/locale/pl_PL/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:07-0500\n"
-"PO-Revision-Date: 2015-04-01 02:20+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-08 18:15+0000\n"
+"Last-Translator: Åukasz JernaÅ› <deejay1@srem.org>\n"
"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/horizon/language/pl_PL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -94,7 +94,7 @@ msgstr "Filtr"
#: tables/actions.py:645
msgid "This action cannot be undone."
-msgstr ""
+msgstr "Tej czynności nie można cofnąć."
#: tables/actions.py:767
#, python-format
@@ -188,7 +188,7 @@ msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
-msgstr ""
+msgstr "\nJeśli nie wiadomo, którego sposobu uwierzytelniania użyć, należy skontaktować się z administratorem."
#: templates/auth/_login.html:5
msgid "Log In"
@@ -211,7 +211,7 @@ msgstr "Wpisz siÄ™"
#: templates/auth/_login.html:46
msgid "Connect"
-msgstr ""
+msgstr "Połącz"
#: templates/auth/login.html:4
msgid "Login"
@@ -304,7 +304,7 @@ msgstr "PÅ‚ywajÄ…ce adresy IP"
#: templates/horizon/common/_limit_summary.html:29
#, python-format
msgid "Allocated <span> %(used)s </span> of <span> %(available)s </span>"
-msgstr ""
+msgstr "Przydzielono <span> %(used)s </span> z <span> %(available)s </span>"
#: templates/horizon/common/_limit_summary.html:35
msgid "Security Groups"
@@ -327,17 +327,17 @@ msgstr "Zapisz"
#, python-format
msgid "Displaying %(nav_items)s item"
msgid_plural "Displaying %(nav_items)s items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyświetlanie %(nav_items)s pozycję"
+msgstr[1] "Wyświetlanie %(nav_items)s pozycji"
+msgstr[2] "Wyświetlanie %(nav_items)s pozycji"
#: templates/horizon/common/_resource_browser.html:11
#, python-format
msgid "Displaying %(content_items)s item"
msgid_plural "Displaying %(content_items)s items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyświetlanie %(content_items)s pozycji"
+msgstr[1] "Wyświetlanie %(content_items)s pozycji"
+msgstr[2] "Wyświetlanie %(content_items)s pozycji"
#: templates/horizon/common/_usage_summary.html:3
msgid "Usage Summary"
@@ -345,7 +345,7 @@ msgstr "Podsumowanie wykorzystania"
#: templates/horizon/common/_usage_summary.html:7
msgid "Select a period of time to query its usage:"
-msgstr ""
+msgstr "Wybierz okres za który nalezy wyświetlić wykorzystanie:"
#: templates/horizon/common/_usage_summary.html:9
#, python-format
@@ -367,23 +367,23 @@ msgstr "Data powinna być podana w formacie YYYY-mm-dd."
#: templates/horizon/common/_usage_summary.html:20
msgid "Active Instances:"
-msgstr ""
+msgstr "Aktywne instancje:"
#: templates/horizon/common/_usage_summary.html:21
msgid "Active RAM:"
-msgstr ""
+msgstr "Aktywna pamięć RAM:"
#: templates/horizon/common/_usage_summary.html:22
msgid "This Period's VCPU-Hours:"
-msgstr ""
+msgstr "VCPU-godziny w tym okresie:"
#: templates/horizon/common/_usage_summary.html:23
msgid "This Period's GB-Hours:"
-msgstr ""
+msgstr "GB-godziny w tym okresie:"
#: templates/horizon/common/_usage_summary.html:24
msgid "This Period's RAM-Hours:"
-msgstr ""
+msgstr "RAM-godziny w tym okresie:"
#: templates/horizon/common/_workflow.html:40
msgid "Back"
@@ -460,7 +460,7 @@ msgstr[2] "Sprzedano pieski"
#: test/tests/views.py:59
msgid "Fake"
-msgstr ""
+msgstr "Fałszywe"
#: utils/filters.py:49
msgid "Never"
@@ -484,7 +484,7 @@ msgstr "Numer portu musi być liczbą całkowitą"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
-msgstr ""
+msgstr "Ciąg może zawierać wyłącznie drukowalne znaki ASCII."
#: workflows/base.py:71
msgid "Processing..."
diff --git a/horizon/locale/pl_PL/LC_MESSAGES/djangojs.po b/horizon/locale/pl_PL/LC_MESSAGES/djangojs.po
index 17ddd60a3..f87242169 100644
--- a/horizon/locale/pl_PL/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/pl_PL/LC_MESSAGES/djangojs.po
@@ -3,12 +3,13 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Åukasz JernaÅ› <deejay1@srem.org>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/horizon/language/pl_PL/)\n"
"MIME-Version: 1.0\n"
@@ -21,11 +22,11 @@ msgstr ""
msgid ""
"The action cannot be performed. The contents of this row have errors or are "
"missing information."
-msgstr ""
+msgstr "Nie można wykonać czynności. Zawartość tego wiersza zawiera błędy lub brakujące dane."
#: static/angular/metadata-display/metadata-display.js:33
msgid "Detail Information"
-msgstr ""
+msgstr "Szczegółowe informacje"
#: static/angular/metadata-tree/metadata-tree.js:35
msgid ""
@@ -33,39 +34,39 @@ msgid ""
"the right column. In the left columns there are metadata definitions from "
"the Glance Metadata Catalog. Use the \"Other\" option to add metadata with "
"the key of your choice."
-msgstr ""
+msgstr "Można podać metadane zasobów przesuwajÄ…c pozycje z lewej kolumny do prawej. W lewej kolumnie znajdujÄ… siÄ™ definicje metadanych z Katalogu Metadanych Glance. Można podać metadane z wÅ‚asnym kluczem, po wybraniu opcji „Inneâ€."
#: static/angular/metadata-tree/metadata-tree.js:36
msgid "Min"
-msgstr ""
+msgstr "Min."
#: static/angular/metadata-tree/metadata-tree.js:37
msgid "Max"
-msgstr ""
+msgstr "Maks."
#: static/angular/metadata-tree/metadata-tree.js:38
msgid "Min length"
-msgstr ""
+msgstr "Min. długość"
#: static/angular/metadata-tree/metadata-tree.js:39
msgid "Max length"
-msgstr ""
+msgstr "Maks. długość"
#: static/angular/metadata-tree/metadata-tree.js:40
msgid "Pattern mismatch"
-msgstr ""
+msgstr "Szablon siÄ™ nie zgadza"
#: static/angular/metadata-tree/metadata-tree.js:41
msgid "Integer required"
-msgstr ""
+msgstr "Wymagana liczba całkowita"
#: static/angular/metadata-tree/metadata-tree.js:42
msgid "Decimal required"
-msgstr ""
+msgstr "Wymagana liczba dziesiętna"
#: static/angular/metadata-tree/metadata-tree.js:43
msgid "Required"
-msgstr ""
+msgstr "Wymagane"
#: static/angular/metadata-tree/metadata-tree.js:44
msgid "Duplicate keys are not allowed"
@@ -87,7 +88,7 @@ msgstr "IstniejÄ…ce metadane"
#: static/angular/metadata-tree/metadata-tree.js:48
msgid "Custom"
-msgstr ""
+msgstr "WÅ‚asne"
#: static/angular/metadata-tree/metadata-tree.js:49
msgid "No available metadata"
@@ -108,7 +109,7 @@ msgstr "Anuluj"
#: static/angular/transfer-table/transfer-table.js:39
msgid "Allocated"
-msgstr ""
+msgstr "Przydzielono"
#: static/angular/transfer-table/transfer-table.js:40
msgid "Available"
@@ -116,43 +117,43 @@ msgstr "Dostępne"
#: static/angular/transfer-table/transfer-table.js:41
msgid "Select one"
-msgstr ""
+msgstr "Wybierz jedno"
#: static/angular/transfer-table/transfer-table.js:42
msgid "Select an item from Available items below"
-msgstr ""
+msgstr "Należy wybrać pozycję z listy dostępnych pozycji poniżej"
#: static/angular/transfer-table/transfer-table.js:43
msgid "No available items"
-msgstr ""
+msgstr "Brak dostępnych pozycji"
#: static/angular/transfer-table/transfer-table.js:44
msgid "Expand to see allocated items"
-msgstr ""
+msgstr "Rozszerz, aby zobaczyć przydzielone pozycje"
#: static/angular/transfer-table/transfer-table.js:45
msgid "Expand to see available items"
-msgstr ""
+msgstr "Rozszerz, aby zobaczyć dostepne pozycje"
#: static/angular/transfer-table/transfer-table.js:46
msgid "Click to show or hide"
-msgstr ""
+msgstr "Kliknij by pokazać lub ukryć"
#: static/angular/transfer-table/transfer-table.js:47
msgid "Re-order items using drag and drop"
-msgstr ""
+msgstr "Zmień kolejność pozycji poprzez przesuwanie i upuszczanie"
#: static/angular/transfer-table/transfer-table.js:48
msgid "Click to see more details"
-msgstr ""
+msgstr "Kliknij, aby wyświetlić szczegóły"
#: static/angular/transfer-table/transfer-table.js:100
msgid "Found %(found)s of %(total)s"
-msgstr ""
+msgstr "Znaleziono %(found)s z %(total)s"
#: static/angular/transfer-table/transfer-table.js:166
msgid "Click here to expand the row and view the errors."
-msgstr ""
+msgstr "Kliknij tutaj, aby rozszerzyć wiersz i wyświetlić błędy."
#: static/angular/wizard/wizard.js:12
msgid "Back"
@@ -164,28 +165,28 @@ msgstr "Następny"
#: static/angular/wizard/wizard.js:14
msgid "Finish"
-msgstr ""
+msgstr "Zakończ"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Connecting"
-msgstr ""
+msgstr "ÅÄ…czenie"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Open"
-msgstr ""
+msgstr "Otwórz"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closing"
-msgstr ""
+msgstr "Zamykanie"
#: static/horizon/js/angular/directives/serialConsole.js:23
msgid "Closed"
-msgstr ""
+msgstr "Zamknięto"
#: static/horizon/js/angular/directives/serialConsole.js:85
#, c-format
msgid "Status: %s"
-msgstr ""
+msgstr "Stan: %s"
#: static/horizon/js/angular/filters/filters.js:37
msgid "Yes"
@@ -197,24 +198,29 @@ msgstr "Nie"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -222,13 +228,13 @@ msgstr ""
#, c-format
msgid "Displaying %s item"
msgid_plural "Displaying %s items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyświetlanie %s pozycji"
+msgstr[1] "Wyświetlanie %s pozycji"
+msgstr[2] "Wyświetlanie %s pozycji"
#: static/horizon/js/angular/services/hz.api.cinder.js:47
msgid "Unable to retrieve volumes."
-msgstr ""
+msgstr "Nie można pobrać wolumenów."
#: static/horizon/js/angular/services/hz.api.cinder.js:74
msgid "Unable to retrieve volume snapshots."
@@ -236,11 +242,11 @@ msgstr "Nie można pobrać migawek wolumenów."
#: static/horizon/js/angular/services/hz.api.config.js:42
msgid "Unable to retrieve user configuration."
-msgstr ""
+msgstr "Nie można pobrać ustawień użytkownika."
#: static/horizon/js/angular/services/hz.api.config.js:61
msgid "Unable to retrieve admin configuration."
-msgstr ""
+msgstr "Nie można pobrać ustawień administratora."
#: static/horizon/js/angular/services/hz.api.glance.js:38
msgid "Unable to retrieve image."
@@ -252,123 +258,123 @@ msgstr "Nie można pobrać obrazów"
#: static/horizon/js/angular/services/hz.api.glance.js:144
msgid "Unable to retrieve namespaces."
-msgstr ""
+msgstr "Nie można pobrać przestrzeni nazw."
#: static/horizon/js/angular/services/hz.api.keystone.js:24
msgid "Unable to retrieve users"
-msgstr ""
+msgstr "Nie można pobrać użytkowników"
#: static/horizon/js/angular/services/hz.api.keystone.js:31
msgid "Unable to create the user."
-msgstr ""
+msgstr "Nie można utworzyć użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:38
msgid "Unable to delete the users."
-msgstr ""
+msgstr "Nie mozna usunąć użytkowników."
#: static/horizon/js/angular/services/hz.api.keystone.js:73
msgid "Unable to retrieve the current user session."
-msgstr ""
+msgstr "Nie można pobrać bieżącej sesji użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:80
msgid "Unable to retrieve the user"
-msgstr ""
+msgstr "Nie można pobrać użytkownika"
#: static/horizon/js/angular/services/hz.api.keystone.js:88
msgid "Unable to edit the user."
-msgstr ""
+msgstr "Nie można edytować użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:95
msgid "Unable to delete the user."
-msgstr ""
+msgstr "Nie można usunąć użytkownika."
#: static/horizon/js/angular/services/hz.api.keystone.js:103
msgid "Unable to retrieve role"
-msgstr ""
+msgstr "Nie można pobrać roli"
#: static/horizon/js/angular/services/hz.api.keystone.js:110
msgid "Unable to create the role."
-msgstr ""
+msgstr "Nie można utworzyć roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:117
msgid "Unable to delete the roles."
-msgstr ""
+msgstr "Nie mozna usunąć ról."
#: static/horizon/js/angular/services/hz.api.keystone.js:124
msgid "Unable to retrieve the role"
-msgstr ""
+msgstr "Nie można pobrać roli"
#: static/horizon/js/angular/services/hz.api.keystone.js:132
msgid "Unable to edit the role."
-msgstr ""
+msgstr "Nie można edytować roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:139
msgid "Unable to delete the role."
-msgstr ""
+msgstr "Nie można usunąć roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:147
msgid "Unable to retrieve domains"
-msgstr ""
+msgstr "Nie można pobrać domen"
#: static/horizon/js/angular/services/hz.api.keystone.js:154
msgid "Unable to create the domain."
-msgstr ""
+msgstr "Nie można utworzyć domeny."
#: static/horizon/js/angular/services/hz.api.keystone.js:161
msgid "Unable to delete the domains."
-msgstr ""
+msgstr "Nie można usunąć domen."
#: static/horizon/js/angular/services/hz.api.keystone.js:168
msgid "Unable to retrieve the domain"
-msgstr ""
+msgstr "Nie można pobrać domeny"
#: static/horizon/js/angular/services/hz.api.keystone.js:176
msgid "Unable to edit the domain."
-msgstr ""
+msgstr "Nie można edytować domeny."
#: static/horizon/js/angular/services/hz.api.keystone.js:183
msgid "Unable to delete the domain."
-msgstr ""
+msgstr "Nie można usunąć domeny."
#: static/horizon/js/angular/services/hz.api.keystone.js:192
msgid "Unable to retrieve projects"
-msgstr ""
+msgstr "Nie można pobrać projektów"
#: static/horizon/js/angular/services/hz.api.keystone.js:199
msgid "Unable to create the project."
-msgstr ""
+msgstr "Nie można utworzyć projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:206
msgid "Unable to delete the projects."
-msgstr ""
+msgstr "Nie można usunąć projektów."
#: static/horizon/js/angular/services/hz.api.keystone.js:213
msgid "Unable to retrieve the project"
-msgstr ""
+msgstr "Nie można pobrać projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:221
msgid "Unable to edit the project."
-msgstr ""
+msgstr "Nie można edytować projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:228
msgid "Unable to delete the project."
-msgstr ""
+msgstr "Nie można usunąć projektu."
#: static/horizon/js/angular/services/hz.api.keystone.js:236
msgid "Unable to grant the role."
-msgstr ""
+msgstr "Nie można nadać roli."
#: static/horizon/js/angular/services/hz.api.keystone.js:250
msgid "Unable to fetch the service catalog."
-msgstr ""
+msgstr "Nie można pobrać katalogu usług."
#: static/horizon/js/angular/services/hz.api.keystone.js:385
msgid "Service type is not enabled: %(desiredType)s"
-msgstr ""
+msgstr "Typ usługi nie jest włączony: %(desiredType)s"
#: static/horizon/js/angular/services/hz.api.keystone.js:392
msgid "Cannot get service catalog from keystone."
-msgstr ""
+msgstr "Nie można pobrać katalogu usług z keystone."
#: static/horizon/js/angular/services/hz.api.neutron.js:39
msgid "Unable to retrieve networks."
@@ -376,71 +382,75 @@ msgstr "Nie można pobrać sieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:88
msgid "Unable to create the network."
-msgstr ""
+msgstr "Nie można utworzyć sieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:108
msgid "Unable to retrieve subnets."
-msgstr ""
+msgstr "Nie można pobrać podsieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:172
msgid "Unable to create the subnet."
-msgstr ""
+msgstr "Nie można utworzyć podsieci."
#: static/horizon/js/angular/services/hz.api.neutron.js:192
msgid "Unable to retrieve ports."
-msgstr ""
+msgstr "Nie można pobrać portów."
#: static/horizon/js/angular/services/hz.api.nova.js:40
msgid "Unable to retrieve keypairs."
msgstr "Nie można pobrać par kluczy."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
-msgid "Unable to create the keypair."
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:64
+msgid "Unable to create the keypair."
+msgstr "Nie można utworzyć pary kluczy."
+
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Nie można pobrać stref dostępności."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
-msgstr ""
+msgstr "Nie można pobrać ograniczeń."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
-msgstr ""
+msgstr "Nie można utworzyć serwera."
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
-msgstr ""
+msgstr "Nie można pobrać serwera."
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
-msgstr ""
+msgstr "Nie można pobrać rozszerzeń."
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Nie można pobrać odmian."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
-msgstr ""
+msgstr "Nie można pobrać odmiany."
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
-msgstr ""
+msgstr "Nie można pobrać dodatkowych danych odmiany."
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
-msgstr ""
+msgstr "Rozszerzenie nie jest włączone: %(extension)s"
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
-msgstr ""
+msgstr "Nie można pobrać listy rozszerzeń novy."
#: static/horizon/js/angular/services/hz.api.policy.js:65
msgid "Policy check failed."
-msgstr ""
+msgstr "Sprawdzenie polityki się nie powiodło."
#: static/horizon/js/angular/services/hz.api.security-group.js:64
msgid "Unable to retrieve security groups."
@@ -590,7 +600,7 @@ msgstr "Potwierdź %s"
#: static/horizon/js/horizon.tables.js:204
msgid "Please confirm your selection. "
-msgstr ""
+msgstr "Należy potwierdzić wybór."
#: static/horizon/js/horizon.tables_inline_edit.js:88
#: static/horizon/js/horizon.tables_inline_edit.js:151
diff --git a/horizon/locale/pt/LC_MESSAGES/djangojs.po b/horizon/locale/pt/LC_MESSAGES/djangojs.po
index 0f329db9e..687d03b13 100644
--- a/horizon/locale/pt/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/pt/LC_MESSAGES/djangojs.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Portuguese (http://www.transifex.com/projects/p/horizon/language/pt/)\n"
"MIME-Version: 1.0\n"
@@ -197,24 +197,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
+#, c-format
+msgid "%s MB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -393,47 +398,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/pt_BR/LC_MESSAGES/djangojs.po b/horizon/locale/pt_BR/LC_MESSAGES/djangojs.po
index 6259c6caa..d59e50f49 100644
--- a/horizon/locale/pt_BR/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/pt_BR/LC_MESSAGES/djangojs.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/horizon/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -200,25 +200,30 @@ msgstr "Não"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "Bytes"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -396,47 +401,51 @@ msgstr "Não foi possível obter lista de portas."
msgid "Unable to retrieve keypairs."
msgstr "Não é possível recuperar pares de chaves."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "Não foi possível criar o par de chaves."
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Não é possível recuperar todas zonas de disponibilidade."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "Não foi possível obter informações de limite."
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "Não foi possível criar a instância"
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Não foi possível recuperar flavors."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/ru/LC_MESSAGES/django.po b/horizon/locale/ru/LC_MESSAGES/django.po
index bfe3b9d4e..c332b608d 100644
--- a/horizon/locale/ru/LC_MESSAGES/django.po
+++ b/horizon/locale/ru/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:07-0500\n"
-"PO-Revision-Date: 2015-04-01 22:52+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
+"Last-Translator: Ilya Alekseyev <ilyaalekseyev@acm.org>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/horizon/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -188,7 +188,7 @@ msgid ""
"\n"
" If you are not sure which authentication method to use, contact your administrator.\n"
" "
-msgstr ""
+msgstr "\n ЕÑли вы не уверены какой метод аутентификации выбрать, ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ ÑиÑтемным админиÑтратором.\n "
#: templates/auth/_login.html:5
msgid "Log In"
@@ -211,7 +211,7 @@ msgstr "Вход"
#: templates/auth/_login.html:46
msgid "Connect"
-msgstr ""
+msgstr "Подключение"
#: templates/auth/login.html:4
msgid "Login"
@@ -291,11 +291,11 @@ msgstr "ИÑпользовано <span> %(used)s </span> из <span> %(available
#: templates/horizon/common/_limit_summary.html:14
msgid "VCPUs"
-msgstr "ВЦПУ"
+msgstr "VCPU"
#: templates/horizon/common/_limit_summary.html:21
msgid "RAM"
-msgstr "ОЗУ"
+msgstr "RAM"
#: templates/horizon/common/_limit_summary.html:28
msgid "Floating IPs"
@@ -460,7 +460,7 @@ msgstr[2] "Sold Puppies"
#: test/tests/views.py:59
msgid "Fake"
-msgstr ""
+msgstr "Fake"
#: utils/filters.py:49
msgid "Never"
@@ -484,7 +484,7 @@ msgstr "Ðомер порта должен быть целым чиÑлом"
#: utils/validators.py:59
msgid "The string may only contain ASCII printable characters."
-msgstr ""
+msgstr "Строка может Ñодержать только печатные ASCII Ñимволы."
#: workflows/base.py:71
msgid "Processing..."
diff --git a/horizon/locale/ru/LC_MESSAGES/djangojs.po b/horizon/locale/ru/LC_MESSAGES/djangojs.po
index 26b591ca8..063bd4d4a 100644
--- a/horizon/locale/ru/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/ru/LC_MESSAGES/djangojs.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/horizon/language/ru/)\n"
"MIME-Version: 1.0\n"
@@ -199,24 +199,29 @@ msgstr "Ðет"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "ГБ"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "МБ"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -396,47 +401,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr "Ðевозможно получить ключевые пары."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Ðе удалоÑÑŒ получить зоны доÑтупноÑти."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Ðе удалоÑÑŒ получить Ñхемы."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/sr/LC_MESSAGES/djangojs.po b/horizon/locale/sr/LC_MESSAGES/djangojs.po
index 5c510a4a6..9b0b64d32 100644
--- a/horizon/locale/sr/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/sr/LC_MESSAGES/djangojs.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Serbian (http://www.transifex.com/projects/p/horizon/language/sr/)\n"
"MIME-Version: 1.0\n"
@@ -197,24 +197,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -394,47 +399,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr "Nemoguće je dobiti parove kljuÄeva."
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "Nemoguće je dobiti zone dostupnosti."
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "Nemoguće je dobiti arome."
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/te_IN/LC_MESSAGES/djangojs.po b/horizon/locale/te_IN/LC_MESSAGES/djangojs.po
index 7ccfefd9c..7d487fc30 100644
--- a/horizon/locale/te_IN/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/te_IN/LC_MESSAGES/djangojs.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/horizon/language/te_IN/)\n"
"MIME-Version: 1.0\n"
@@ -197,24 +197,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
+#, c-format
+msgid "%s GB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
+#, c-format
+msgid "%s MB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -393,47 +398,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/tr_TR/LC_MESSAGES/djangojs.po b/horizon/locale/tr_TR/LC_MESSAGES/djangojs.po
index d08f2f0ed..16c2ea5dd 100644
--- a/horizon/locale/tr_TR/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/tr_TR/LC_MESSAGES/djangojs.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/horizon/language/tr_TR/)\n"
"MIME-Version: 1.0\n"
@@ -199,24 +199,29 @@ msgstr ""
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
+#, c-format
+msgid "%s GB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
+#, c-format
+msgid "%s MB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
+#, c-format
+msgid "%s TB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
+#, c-format
+msgid "%s KB"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
+#, c-format
+msgid "%s bytes"
msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
@@ -394,47 +399,51 @@ msgstr ""
msgid "Unable to retrieve keypairs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/zh_CN/LC_MESSAGES/djangojs.po b/horizon/locale/zh_CN/LC_MESSAGES/djangojs.po
index 2c1aea355..a14fab451 100644
--- a/horizon/locale/zh_CN/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/zh_CN/LC_MESSAGES/djangojs.po
@@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-04 04:00+0000\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/horizon/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
@@ -203,25 +203,30 @@ msgstr "ä¸"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "字节数"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -398,47 +403,51 @@ msgstr "无法获å–端å£"
msgid "Unable to retrieve keypairs."
msgstr "无法获å–密钥对"
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "无法创建密匙对"
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "无法获å–å¯ç”¨åŸŸã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "无法获å–ç•Œé™"
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "无法创建æœåŠ¡å™¨"
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "无法获å–æœåŠ¡å™¨"
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "无法获å–扩展"
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "无法获å–云主机类型列表。"
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "无法获å–云主机类型"
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "无法获å–云主机类型特别设定"
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr ""
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr ""
diff --git a/horizon/locale/zh_TW/LC_MESSAGES/djangojs.po b/horizon/locale/zh_TW/LC_MESSAGES/djangojs.po
index 65439b53d..5f17e92d3 100644
--- a/horizon/locale/zh_TW/LC_MESSAGES/djangojs.po
+++ b/horizon/locale/zh_TW/LC_MESSAGES/djangojs.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 02:11+0000\n"
-"Last-Translator: Zhang Xiaowei <zero00072@gmail.com>\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-10 03:30+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/horizon/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -200,25 +200,30 @@ msgstr "å¦"
#: static/horizon/js/angular/filters/filters.js:53
#: static/horizon/js/angular/filters/filters.js:140
-msgid "GB"
-msgstr "GB"
+#, c-format
+msgid "%s GB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:70
#: static/horizon/js/angular/filters/filters.js:142
-msgid "MB"
-msgstr "MB"
+#, c-format
+msgid "%s MB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:138
-msgid "TB"
-msgstr "TB"
+#, c-format
+msgid "%s TB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:144
-msgid "KB"
-msgstr "KB"
+#, c-format
+msgid "%s KB"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:146
-msgid "bytes"
-msgstr "ä½å…ƒçµ„"
+#, c-format
+msgid "%s bytes"
+msgstr ""
#: static/horizon/js/angular/filters/filters.js:163
#: static/horizon/js/horizon.tables.js:393
@@ -395,47 +400,51 @@ msgstr "無法ç²å¾—接å£ã€‚"
msgid "Unable to retrieve keypairs."
msgstr "無法ç²å¾—密鑰å°ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:61
+#: static/horizon/js/angular/services/hz.api.nova.js:62
+msgid "Unable to import the keypair."
+msgstr ""
+
+#: static/horizon/js/angular/services/hz.api.nova.js:64
msgid "Unable to create the keypair."
msgstr "無法新增密鑰å°ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:79
+#: static/horizon/js/angular/services/hz.api.nova.js:83
msgid "Unable to retrieve availability zones."
msgstr "無法ç²å¾—å¯ç”¨å€åŸŸã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:117
+#: static/horizon/js/angular/services/hz.api.nova.js:121
msgid "Unable to retrieve limits."
msgstr "無法ç²å¾—é™åˆ¶ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:144
+#: static/horizon/js/angular/services/hz.api.nova.js:148
msgid "Unable to create the server."
msgstr "無法新增伺æœå™¨ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:158
+#: static/horizon/js/angular/services/hz.api.nova.js:162
msgid "Unable to retrieve server."
msgstr "無法ç²å¾—伺æœå™¨ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:188
+#: static/horizon/js/angular/services/hz.api.nova.js:192
msgid "Unable to retrieve extensions."
msgstr "無法ç²å¾—擴充套件。"
-#: static/horizon/js/angular/services/hz.api.nova.js:233
+#: static/horizon/js/angular/services/hz.api.nova.js:237
msgid "Unable to retrieve flavors."
msgstr "無法ç²å¾—虛擬硬體樣æ¿ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:251
+#: static/horizon/js/angular/services/hz.api.nova.js:255
msgid "Unable to retrieve flavor."
msgstr "無法ç²å¾—虛擬硬體樣æ¿ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:265
+#: static/horizon/js/angular/services/hz.api.nova.js:269
msgid "Unable to retrieve flavor extra specs."
msgstr "無法ç²å¾—虛擬硬體樣æ¿é¡å¤–è¦æ ¼ã€‚"
-#: static/horizon/js/angular/services/hz.api.nova.js:307
+#: static/horizon/js/angular/services/hz.api.nova.js:311
msgid "Extension is not enabled: %(extension)s"
msgstr "未啟用擴充套件:%(extension)s"
-#: static/horizon/js/angular/services/hz.api.nova.js:314
+#: static/horizon/js/angular/services/hz.api.nova.js:318
msgid "Cannot get nova extension list."
msgstr "ä¸èƒ½ç²å¾— Nova 擴充套件列表。"
diff --git a/horizon/static/angular/action-list/action-list.spec.js b/horizon/static/angular/action-list/action-list.spec.js
index cc3cd30eb..22ea2b29a 100644
--- a/horizon/static/angular/action-list/action-list.spec.js
+++ b/horizon/static/angular/action-list/action-list.spec.js
@@ -30,16 +30,17 @@
$scope.item = 'test';
- var markup = '<action-list dropdown>' +
- ' <action button-type="single-button">Actions</action>' +
- ' <menu>' +
- ' <action button-type="menu-item" callback="clickMe" item="item">' +
- ' Edit' +
- ' </action>' +
- ' <action button-type="menu-item" callback="clickMe" item="item">' +
- ' Delete' +
- ' </action>' +
- ' </menu>' +
+ var markup =
+ '<action-list dropdown>' +
+ ' <action button-type="single-button">Actions</action>' +
+ ' <menu>' +
+ ' <action button-type="menu-item" callback="clickMe" item="item">' +
+ ' Edit' +
+ ' </action>' +
+ ' <action button-type="menu-item" callback="clickMe" item="item">' +
+ ' Delete' +
+ ' </action>' +
+ ' </menu>' +
'</action-list>';
$element = angular.element(markup);
@@ -85,18 +86,19 @@
$scope.item = 'test';
- var markup = '<action-list dropdown>' +
- ' <action button-type="split-button" callback="clickMe" item="item">' +
- ' View' +
- ' </action>' +
- ' <menu>' +
- ' <action button-type="menu-item" callback="clickMe" item="item">' +
- ' Edit' +
- ' </action>' +
- ' <action button-type="menu-item" callback="clickMe" item="item">' +
- ' Delete' +
- ' </action>' +
- ' </menu>' +
+ var markup =
+ '<action-list dropdown>' +
+ ' <action button-type="split-button" callback="clickMe" item="item">' +
+ ' View' +
+ ' </action>' +
+ ' <menu>' +
+ ' <action button-type="menu-item" callback="clickMe" item="item">' +
+ ' Edit' +
+ ' </action>' +
+ ' <action button-type="menu-item" callback="clickMe" item="item">' +
+ ' Delete' +
+ ' </action>' +
+ ' </menu>' +
'</action-list>';
$element = angular.element(markup);
diff --git a/horizon/static/angular/help-panel/help-panel.spec.js b/horizon/static/angular/help-panel/help-panel.spec.js
index b024f1b99..c6cec4315 100644
--- a/horizon/static/angular/help-panel/help-panel.spec.js
+++ b/horizon/static/angular/help-panel/help-panel.spec.js
@@ -2,14 +2,15 @@
'use strict';
describe('hz.widget.help-panel module', function() {
- it('should have been defined".', function () {
+ it('should have been defined', function () {
expect(angular.module('hz.widget.help-panel')).toBeDefined();
});
});
describe('help-panel directive', function () {
var $compile,
- $scope;
+ $scope,
+ element;
beforeEach(module('templates'));
beforeEach(module('hz'));
@@ -18,30 +19,26 @@ describe('help-panel directive', function () {
beforeEach(inject(function ($injector) {
$scope = $injector.get('$rootScope').$new();
$compile = $injector.get('$compile');
+ element = $compile('<help-panel>Help</help-panel>')($scope);
+ $scope.$digest();
}));
it('should be compiled', function () {
- var element = $compile('<help-panel>Help</help-panel>')($scope);
- $scope.$digest();
expect(element.html().trim()).not.toBe('Help');
expect(element.text().trim()).toBe('Help');
});
it('should be closed by default', function () {
- var element = $compile('<help-panel>Help</help-panel>')($scope);
- $scope.$digest();
expect(element[0].querySelector('.help-panel').className).toBe('help-panel');
});
it('should add "open" to class name if $scope.openHelp===true', function () {
- var element = $compile('<help-panel>Help</help-panel>')($scope);
$scope.openHelp = true;
$scope.$digest();
expect(element[0].querySelector('.help-panel').className).toBe('help-panel open');
});
it('should remove "open" from class name if $scope.openHelp===false', function () {
- var element = $compile('<help-panel>Help</help-panel>')($scope);
$scope.openHelp = true;
$scope.$digest();
$scope.openHelp = false;
diff --git a/horizon/static/angular/modal/modal-wait-spinner.spec.js b/horizon/static/angular/modal/modal-wait-spinner.spec.js
index 363495923..f8d5b48c4 100644
--- a/horizon/static/angular/modal/modal-wait-spinner.spec.js
+++ b/horizon/static/angular/modal/modal-wait-spinner.spec.js
@@ -22,11 +22,8 @@
beforeEach(module('hz.widget.modal-wait-spinner'));
- beforeEach(inject(function(modalWaitSpinnerService) {
+ beforeEach(inject(function(modalWaitSpinnerService, $modal) {
service = modalWaitSpinnerService;
- }));
-
- beforeEach(inject(function($modal) {
modal = $modal;
}));
diff --git a/horizon/static/angular/modal/modal.spec.js b/horizon/static/angular/modal/modal.spec.js
index 46e842c21..7f40c4a01 100644
--- a/horizon/static/angular/modal/modal.spec.js
+++ b/horizon/static/angular/modal/modal.spec.js
@@ -18,7 +18,6 @@
describe('hz.widget.modal module', function() {
- //beforeEach(module('ui.bootstrap'));
beforeEach(module('hz.widget.modal'));
describe('simpleModalCtrl', function() {
diff --git a/horizon/static/angular/table/table.scss b/horizon/static/angular/table/table.scss
index 3fef60536..61f2c9df3 100644
--- a/horizon/static/angular/table/table.scss
+++ b/horizon/static/angular/table/table.scss
@@ -59,7 +59,7 @@ $em-per-priority: floor($table-col-avg-width / $font-size-base) * 3;
}
input[type="text"] {
- @include search-placeholder {
+ @include input-placeholder {
font-weight: normal;
color: $placeholder-text-color;
}
diff --git a/horizon/static/angular/table/table.spec.js b/horizon/static/angular/table/table.spec.js
index f384b4bb4..92b214fc5 100644
--- a/horizon/static/angular/table/table.spec.js
+++ b/horizon/static/angular/table/table.spec.js
@@ -3,7 +3,7 @@
'use strict';
describe('hz.widget.table module', function() {
- it('should have been defined".', function () {
+ it('should have been defined', function () {
expect(angular.module('hz.widget.table')).toBeDefined();
});
});
@@ -94,9 +94,14 @@
});
describe('hzSelect directive', function() {
+ var checkboxes;
+
+ beforeEach(function() {
+ checkboxes = $element.find('input[hz-select]');
+ });
it('should have numSelected === 1 when first checkbox is clicked', function() {
- var checkbox = $element.find('input[hz-select]').first();
+ var checkbox = checkboxes.first();
checkbox[0].checked = true;
checkbox.triggerHandler('click');
@@ -104,7 +109,7 @@
});
it('should have numSelected === 0 when first checkbox is clicked, then unclicked', function() {
- var checkbox = $element.find('input[hz-select]').first();
+ var checkbox = checkboxes.first();
checkbox[0].checked = true;
checkbox.triggerHandler('click');
@@ -117,7 +122,6 @@
});
it('should have numSelected === 3 and select-all checked when all rows selected', function() {
- var checkboxes = $element.find('input[hz-select]');
angular.forEach(checkboxes, function(checkbox) {
checkbox.checked = true;
angular.element(checkbox).triggerHandler('click');
@@ -128,7 +132,6 @@
});
it('should have select-all unchecked when all rows selected, then one deselected', function() {
- var checkboxes = $element.find('input[hz-select]');
angular.forEach(checkboxes, function(checkbox) {
checkbox.checked = true;
angular.element(checkbox).triggerHandler('click');
diff --git a/horizon/static/angular/wizard/wizard.scss b/horizon/static/angular/wizard/wizard.scss
index 67df2de4b..516e6ac05 100644
--- a/horizon/static/angular/wizard/wizard.scss
+++ b/horizon/static/angular/wizard/wizard.scss
@@ -297,3 +297,56 @@
margin-top: 3px;
}
}
+
+.form-control {
+ @include input-placeholder {
+ font-weight: normal;
+ color: $placeholder-text-color;
+ }
+}
+
+.form-group .required label:after {
+ content: " *";
+ color: red;
+}
+
+.btn-toggle {
+ color: #333;
+ background-color: #fff;
+ border-color: #adadad;
+
+ &:hover,
+ &:focus,
+ &:active {
+ background-color: #ebebeb;
+ }
+
+ &.active {
+ background-color: #0077b3;
+ border-color: #006699;
+ color: #fff !important;
+ }
+
+ &.disabled.active,
+ &[disabled].active {
+ background-color: rgba(0, 119, 179, 0.65);
+ border-color: rgba(0, 102, 153, 0.65);
+ color: #fff;
+ }
+
+ &.disabled,
+ &.disabled:hover,
+ &.disabled:focus,
+ &.disabled:active,
+ &[disabled]:hover,
+ &[disabled]:focus,
+ &[disabled]:active,
+ fieldset[disabled] &:hover,
+ fieldset[disabled] &:focus,
+ fieldset[disabled] &:active,
+ fieldset[disabled] &.active {
+ background-color: #fafafa;
+ border-color: #ccc;
+ color: #999;
+ }
+}
diff --git a/horizon/static/angular/wizard/wizard.spec.js b/horizon/static/angular/wizard/wizard.spec.js
index 04ecd78b8..9ba2f0927 100644
--- a/horizon/static/angular/wizard/wizard.spec.js
+++ b/horizon/static/angular/wizard/wizard.spec.js
@@ -2,14 +2,15 @@
'use strict';
describe('hz.widget.wizard module', function () {
- it('should have been defined".', function () {
+ it('should have been defined', function () {
expect(angular.module('hz.widget.wizard')).toBeDefined();
});
});
describe('wizard directive', function () {
var $compile,
- $scope;
+ $scope,
+ element;
beforeEach(module('templates'));
beforeEach(module('hz'));
@@ -18,6 +19,7 @@ describe('wizard directive', function () {
beforeEach(inject(function ($injector) {
$scope = $injector.get('$rootScope').$new();
$compile = $injector.get('$compile');
+ element = $compile('<wizard></wizard>')($scope);
}));
it('should be compiled', function () {
@@ -27,7 +29,6 @@ describe('wizard directive', function () {
});
it('should have empty title by default', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {};
$scope.$digest();
expect(element[0].querySelector('.title').textContent).toBe('');
@@ -35,7 +36,6 @@ describe('wizard directive', function () {
it('should have title if it is specified by workflow', function () {
var titleText = 'Some title';
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {};
$scope.workflow.title = titleText;
$scope.$digest();
@@ -43,14 +43,12 @@ describe('wizard directive', function () {
});
it('should have no steps if no steps defined', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {};
$scope.$digest();
expect(element[0].querySelectorAll('.step').length).toBe(0);
});
it('should have 3 steps if 3 steps defined', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {
steps: [ {}, {}, {} ]
};
@@ -59,14 +57,12 @@ describe('wizard directive', function () {
});
it('should have no nav items if no steps defined', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {};
$scope.$digest();
expect(element[0].querySelectorAll('.nav-item').length).toBe(0);
});
it('should have 3 nav items if 3 steps defined', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {
steps: [ {}, {}, {} ]
};
@@ -75,7 +71,6 @@ describe('wizard directive', function () {
});
it('should navigate correctly', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {
steps: [ {}, {}, {} ]
};
@@ -111,7 +106,6 @@ describe('wizard directive', function () {
});
it('should not show back button in step 1/3', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {
steps: [{}, {}, {}]
};
@@ -121,7 +115,6 @@ describe('wizard directive', function () {
});
it('should show both back and next button in step 2/3', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {
steps: [{}, {}, {}]
};
@@ -133,7 +126,6 @@ describe('wizard directive', function () {
});
it('should not show next button in step 3/3', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.workflow = {
steps: [{}, {}, {}]
};
@@ -145,7 +137,6 @@ describe('wizard directive', function () {
});
it('should have finish button disabled if wizardForm is invalid', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.wizardForm = { };
$scope.$digest();
$scope.wizardForm.$invalid = true;
@@ -154,7 +145,6 @@ describe('wizard directive', function () {
});
it('should have finish button enabled if wizardForm is valid', function () {
- var element = $compile('<wizard></wizard>')($scope);
$scope.wizardForm = { };
$scope.$digest();
$scope.wizardForm.$invalid = false;
@@ -164,7 +154,6 @@ describe('wizard directive', function () {
it('should show error message after calling method showError', function () {
var errorMessage = 'some error message';
- var element = $compile('<wizard></wizard>')($scope);
$scope.$digest();
$scope.showError(errorMessage);
$scope.$digest();
diff --git a/horizon/static/horizon/js/angular/filters/filters.js b/horizon/static/horizon/js/angular/filters/filters.js
index e127c3b45..3159f0b49 100644
--- a/horizon/static/horizon/js/angular/filters/filters.js
+++ b/horizon/static/horizon/js/angular/filters/filters.js
@@ -50,7 +50,7 @@
if (isNaN(input) || null === input) {
return '';
} else {
- return input.toString() + " " + gettext("GB");
+ return interpolate(gettext("%s GB"), [input.toString()]);
}
};
})
@@ -67,7 +67,7 @@
if (isNaN(input) || null === input) {
return '';
} else {
- return input.toString() + " " + gettext("MB");
+ return interpolate(gettext("%s MB"), [input.toString()]);
}
};
})
@@ -135,15 +135,15 @@
if (isNaN(input) || null === input || input < 0) {
return '';
} else if (input >= tb) {
- return Number(input/tb).toFixed(2) + " " + gettext("TB");
+ return interpolate(gettext("%s TB"), [Number(input/tb).toFixed(2)]);
} else if (input >= gb) {
- return Number(input/gb).toFixed(2) + " " + gettext("GB");
+ return interpolate(gettext("%s GB"), [Number(input/gb).toFixed(2)]);
} else if (input >= mb) {
- return Number(input/mb).toFixed(2) + " " + gettext("MB");
+ return interpolate(gettext("%s MB"), [Number(input/mb).toFixed(2)]);
} else if (input >= kb) {
- return Number(input/kb).toFixed(2) + " " + gettext("KB");
+ return interpolate(gettext("%s KB"), [Number(input/kb).toFixed(2)]);
} else {
- return Math.floor(input) + " " + gettext("bytes");
+ return interpolate(gettext("%s bytes"), [Math.floor(input)]);
}
};
})
diff --git a/horizon/static/horizon/js/angular/services/hz.api.config.js b/horizon/static/horizon/js/angular/services/hz.api.config.js
index 09a710669..e7315ef7a 100644
--- a/horizon/static/horizon/js/angular/services/hz.api.config.js
+++ b/horizon/static/horizon/js/angular/services/hz.api.config.js
@@ -1,18 +1,19 @@
/*
-Copyright 2015, Rackspace, US, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
+ * Copyright 2015 IBM Corp
+ * (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
(function () {
'use strict';
@@ -61,10 +62,252 @@ limitations under the License.
horizon.alert('error', gettext('Unable to retrieve admin configuration.'));
});
};
+
}
// Register it with the API module so that anybody using the
// API module will have access to the Config APIs.
angular.module('hz.api')
.service('configAPI', ['apiService', ConfigAPI]);
+
+ /**
+ * @ngdoc service
+ * @name hz.api.settingsService
+ * @description
+ * Provides utilities to the cached settings data. This helps
+ * with asynchronous data loading.
+ *
+ * The cache in current horizon (Kilo non-single page app) only has a
+ * lifetime of the current page. The cache is reloaded every time you change
+ * panels. It also happens when you change the region selector at the top
+ * of the page, and when you log back in.
+ *
+ * So, at least for now, this seems to be a reliable way that will
+ * make only a single request to get user information for a
+ * particular page or modal. Making this a service allows it to be injected
+ * and used transparently where needed without making every single use of it
+ * pass it through as an argument.
+ */
+ function settingsService($q, apiService) {
+
+ var service = {};
+
+ /**
+ * @name hz.api.configAPI.getSettings
+ * @description
+ * Gets all the allowed settings
+ *
+ * Returns an object with settings.
+ */
+ service.getSettings = function (suppressError) {
+
+ function onError() {
+ var message = gettext('Unable to retrieve settings.');
+ if (!suppressError && horizon.alert) {
+ horizon.alert('error', message);
+ }
+
+ return message;
+ }
+
+ // The below ensures that errors are handled like other
+ // service errors (for better or worse), but when successful
+ // unwraps the success result data for direct consumption.
+ return apiService.get('/api/settings/', {cache: true})
+ .error(onError)
+ .then(function (response) {
+ return response.data;
+ });
+ };
+
+ /**
+ * @name hz.api.settingsService.getSetting
+ * @description
+ * This retrieves a specific setting.
+ *
+ * If the setting isn't found, it will return undefined unless a default
+ * is specified. In that case, the default will be returned.
+ *
+ * @param {string} setting The path to the setting to get.
+ *
+ * local_settings.py allows you to create settings such as:
+ *
+ * OPENSTACK_HYPERVISOR_FEATURES = {
+ * 'can_set_mount_point': True,
+ * 'can_set_password': False,
+ * }
+ *
+ * To access a specific setting, use a simplified path where a . (dot)
+ * separates elements in the path. So in the above example, the paths
+ * would be:
+ *
+ * OPENSTACK_HYPERVISOR_FEATURES.can_set_mount_point
+ * OPENSTACK_HYPERVISOR_FEATURES.can_set_password
+ *
+ * @param {object=} defaultSetting If the requested setting does not exist,
+ * the defaultSetting will be returned. This is optional.
+ *
+ * @example
+ *
+ * Using the OPENSTACK_HYPERVISOR_FEATURES mentioned above, the following
+ * would call doSomething and pass the setting value into doSomething.
+ *
+ ```js
+ settingsService.getSetting('OPENSTACK_HYPERVISOR_FEATURES.can_set_mount_point')
+ .then(doSomething);
+ ```
+ */
+ service.getSetting = function (path, defaultSetting) {
+ var deferred = $q.defer(),
+ pathElements = path.split("."),
+ settingAtRequestedPath;
+
+ function onSettingsLoaded(settings) {
+ // This recursively traverses the object hierarchy until either all the
+ // path elements are traversed or until the next element in the path
+ // does not have the requested child object.
+ settingAtRequestedPath = pathElements.reduce(
+ function (setting, nextPathElement) {
+ return setting ? setting[nextPathElement] : undefined;
+ }, settings);
+
+ if (typeof settingAtRequestedPath === "undefined" &&
+ (typeof defaultSetting !== "undefined")) {
+ settingAtRequestedPath = defaultSetting;
+ }
+
+ deferred.resolve(settingAtRequestedPath);
+ }
+
+ function onSettingsFailure(message) {
+ deferred.reject(message);
+ }
+
+ service.getSettings()
+ .then(onSettingsLoaded, onSettingsFailure);
+
+ return deferred.promise;
+ };
+
+ /**
+ * @name hz.api.settingsService.ifEnabled
+ * @description
+ * Checks if the desired setting is enabled. This returns a promise.
+ * If the setting is enabled, the promise will be resolved.
+ * If it is not enabled, the promise will be rejected. Use it like you
+ * would normal promises.
+ *
+ * @param {string} setting The path to the setting to check.
+ * local_settings.py allows you to create settings such as:
+ *
+ * OPENSTACK_HYPERVISOR_FEATURES = {
+ * 'can_set_mount_point': True,
+ * 'can_set_password': False,
+ * }
+ *
+ * To access a specific setting, use a simplified path where a . (dot)
+ * separates elements in the path. So in the above example, the paths
+ * would be:
+ *
+ * OPENSTACK_HYPERVISOR_FEATURES.can_set_mount_point
+ * OPENSTACK_HYPERVISOR_FEATURES.can_set_password
+ *
+ * @param (object=} expected Used to determine if the setting is
+ * enabled. The actual setting will be evaluated against the expected
+ * value using angular.equals(). If they are equal, then it will be
+ * considered enabled. This is optional and defaults to True.
+ *
+ * @param {object=} defaultSetting If the requested setting does not exist,
+ * the defaultSetting will be used for evaluation. This is optional. If
+ * not specified and the setting is not specified, then the setting will
+ * not be considered to be enabled.
+ *
+ * @example
+ * Simple true / false example:
+ *
+ * Using the OPENSTACK_HYPERVISOR_FEATURES mentioned above, the following
+ * would call the "setMountPoint" function only if
+ * OPENSTACK_HYPERVISOR_FEATURES.can_set_mount_point is set to true.
+ *
+ ```js
+ settingsService.ifEnabled('OPENSTACK_HYPERVISOR_FEATURES.can_set_mount_point')
+ .then(setMountPoint);
+ ```
+ *
+ * Evaluating other types of settings:
+ *
+ * local_settings.py allows you optionally set the enabled OpenStack
+ * Service API versions with the following setting:
+ *
+ * OPENSTACK_API_VERSIONS = {
+ * "data-processing": 1.1,
+ * "identity": 3,
+ * "volume": 2,
+ * }
+ *
+ * The above is a nested object structure. The simplified path to the
+ * volume service version is OPENSTACK_API_VERSIONS.volume
+ *
+ * It is not uncommon for different OpenStack deployments to have
+ * different versions of the service enabled for various reasons.
+ *
+ * So, now, assume that if version 2 of the volume service (Cinder) is
+ * enabled that you want to do something. If it isn't, then you will do
+ * something else.
+ *
+ * Assume doSomethingIfVersion2 is a function you want to call if version 2
+ * is enabled.
+ *
+ * Assume doSomethingElse is a function that does something else if
+ * version 2 is not enabled (optional)
+ *
+ ```js
+ settingsService.ifEnabled('OPENSTACK_API_VERSIONS.volume', 2)
+ .then(doSomethingIfVersion2, doSomethingElse);
+ ```
+ *
+ * Now assume that if nothing is set in local_settings, that you want to
+ * treat the result as if version 1 is enabled (default when nothing set).
+ *
+ ```js
+ settingsService.ifEnabled('OPENSTACK_API_VERSIONS.volume', 2, 1)
+ .then(doSomethingIfVersion2, doSomethingElse);
+ ```
+ */
+ service.ifEnabled = function (setting, expected, defaultSetting) {
+ var deferred = $q.defer();
+
+ // If expected is not defined, we default to expecting the setting
+ // to be 'true' in order for it to be considered enabled.
+ expected = (typeof expected === "undefined") ? true : expected;
+
+ function onSettingLoaded(setting) {
+ if (angular.equals(expected, setting)) {
+ deferred.resolve();
+ } else {
+ deferred.reject(interpolate(
+ gettext('Setting is not enabled: %(setting)s'),
+ {setting: setting},
+ true));
+ }
+
+ deferred.resolve(setting);
+ }
+
+ function onSettingFailure(message) {
+ deferred.reject(message);
+ }
+
+ service.getSetting(setting, defaultSetting)
+ .then(onSettingLoaded, onSettingFailure);
+
+ return deferred.promise;
+ };
+
+ return service;
+ }
+
+ angular.module('hz.api')
+ .factory('settingsService', ['$q', 'apiService', settingsService]);
+
}());
diff --git a/horizon/static/horizon/js/angular/services/hz.api.config.spec.js b/horizon/static/horizon/js/angular/services/hz.api.config.spec.js
new file mode 100644
index 000000000..7a4397668
--- /dev/null
+++ b/horizon/static/horizon/js/angular/services/hz.api.config.spec.js
@@ -0,0 +1,253 @@
+/*
+ * (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*global angular,describe,it,expect,inject,module,beforeEach,afterEach*/
+(function () {
+ 'use strict';
+
+ describe('settingsService', function () {
+ var settingsService,
+ $httpBackend,
+ responseMockOpts = {succeed: true},
+ testData = {
+ isTrue: true,
+ isFalse: false,
+ versions: {one: 1, two: 2},
+ deep: {nest: { foo: 'bar' } },
+ isNull: null
+ };
+
+ beforeEach(module('hz.api'));
+ beforeEach(inject(function (_$httpBackend_, _settingsService_) {
+ responseMockOpts.succeed = true;
+ settingsService = _settingsService_;
+ $httpBackend = _$httpBackend_;
+ $httpBackend.whenGET('/api/settings/').respond(
+ function () {
+ return responseMockOpts.succeed ?
+ [200, testData, {}] : [500, 'Fail', {}];
+ });
+ $httpBackend.expectGET('/api/settings/');
+ }));
+
+ afterEach(function () {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+ describe('getSettings', function () {
+
+ it('should return all settings', function () {
+ settingsService.getSettings().then(
+ function (actual) {
+ expect(actual).toEqual(testData);
+ }
+ );
+ $httpBackend.flush();
+ });
+
+ it('should fail when error response', function () {
+ responseMockOpts.succeed = false;
+ settingsService.getSettings().then(
+ function (actual) {
+ fail('Should not have succeeded: ' + angular.toJson(actual));
+ },
+ function (actual) {
+ expect(actual).toBeDefined();
+ }
+ );
+ $httpBackend.flush();
+ });
+
+ });
+
+ describe('getSetting', function () {
+
+ it('nested deep object is found', function () {
+ settingsService.getSetting('deep.nest.foo')
+ .then(function (actual) {
+ expect(actual).toEqual('bar');
+ });
+ $httpBackend.flush();
+ });
+
+ it("is undefined when doesn't exist", function () {
+ settingsService.getSetting('will.not.exist')
+ .then(function (actual) {
+ expect(actual).toBeUndefined();
+ });
+ $httpBackend.flush();
+ });
+
+ it("default is returned when doesn't exist", function () {
+ var actual;
+ settingsService.getSetting('will.not.exist', 'hello')
+ .then(function (actual) {
+ expect(actual).toEqual('hello');
+ });
+ $httpBackend.flush();
+ });
+
+ it('should return true', function () {
+ settingsService.getSetting('isTrue')
+ .then(function (actual) {
+ expect(actual).toEqual(true);
+ });
+ $httpBackend.flush();
+ });
+
+ it('should fail when error response', function () {
+ responseMockOpts.succeed = false;
+ settingsService.getSetting('isTrue').then(
+ function (actual) {
+ fail('Should not have succeeded: ' + angular.toJson(actual));
+ },
+ function (actual) {
+ expect(actual).toBeDefined();
+ }
+ );
+ $httpBackend.flush();
+ });
+
+ });
+
+ describe('ifEnabled', function () {
+
+ var expectedResult = {};
+
+ var enabled = function () {
+ expectedResult.enabled = true;
+ };
+
+ var notEnabled = function () {
+ expectedResult.enabled = false;
+ };
+
+ beforeEach(inject(function () {
+ expectedResult = {enabled: null};
+ }));
+
+ function meetsExpectations(expected) {
+ $httpBackend.flush();
+ expect(expectedResult.enabled).toBe(expected);
+ }
+
+ it('should fail when error response', function () {
+ responseMockOpts.succeed = false;
+ settingsService.ifEnabled('isTrue').then(
+ function (actual) {
+ fail('Should not have succeeded: ' + angular.toJson(actual));
+ },
+ function (actual) {
+ expect(actual).toBeDefined();
+ }
+ );
+ $httpBackend.flush();
+ });
+
+ it('boolean is enabled when true', function () {
+ settingsService.ifEnabled('isTrue').then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('boolean is enabled when true expected', function () {
+ settingsService.ifEnabled('isTrue', true).then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('boolean is not enabled when false expected', function () {
+ settingsService.ifEnabled('isTrue', false).then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('boolean is not enabled when false', function () {
+ settingsService.ifEnabled('isFalse').then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('boolean is enabled when false expected', function () {
+ settingsService.ifEnabled('isFalse', false).then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('nested object is enabled when expected', function () {
+ settingsService.ifEnabled('versions.one', 1).then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('nested object is not enabled', function () {
+ settingsService.ifEnabled('versions.two', 1).then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('nested object is not enabled when not found', function () {
+ settingsService.ifEnabled('no-exist.two', 1).then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('nested deep object is enabled when expected', function () {
+ settingsService.ifEnabled('deep.nest.foo', 'bar').then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('nested deep object is not enabled when not expected', function () {
+ settingsService.ifEnabled('deep.nest.foo', 'wrong').then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('null is not enabled', function () {
+ settingsService.ifEnabled('isNull').then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('null is enabled when expected', function () {
+ settingsService.ifEnabled('isNull', null).then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('true is enabled when not found and true default', function () {
+ settingsService.ifEnabled('nonExistent', true, true).then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('true is not enabled when not found and false default', function () {
+ settingsService.ifEnabled('nonExistent', true, false).then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('true is not enabled when not found and no default', function () {
+ settingsService.ifEnabled('nonExistent', true).then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+
+ it('false is enabled when not found and expected w/ default', function () {
+ settingsService.ifEnabled('nonExistent', false, false).then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('bar is enabled when expected not found and bar default', function () {
+ settingsService.ifEnabled('nonExistent', 'bar', 'bar').then(enabled, notEnabled);
+ meetsExpectations(true);
+ });
+
+ it('bar is not enabled when expected not found and not default', function () {
+ settingsService.ifEnabled('nonExistent', 'bar', 'foo').then(enabled, notEnabled);
+ meetsExpectations(false);
+ });
+ });
+
+ });
+
+})();
diff --git a/horizon/static/horizon/js/angular/services/hz.api.nova.js b/horizon/static/horizon/js/angular/services/hz.api.nova.js
index 66ef95803..47d9c7608 100644
--- a/horizon/static/horizon/js/angular/services/hz.api.nova.js
+++ b/horizon/static/horizon/js/angular/services/hz.api.nova.js
@@ -58,7 +58,11 @@ limitations under the License.
this.createKeypair = function(newKeypair) {
return apiService.post('/api/nova/keypairs/', newKeypair)
.error(function () {
- horizon.alert('error', gettext('Unable to create the keypair.'));
+ if (angular.isDefined(newKeypair.public_key)) {
+ horizon.alert('error', gettext('Unable to import the keypair.'));
+ } else {
+ horizon.alert('error', gettext('Unable to create the keypair.'));
+ }
});
};
diff --git a/horizon/static/horizon/js/angular/services/hz.api.service.spec.js b/horizon/static/horizon/js/angular/services/hz.api.service.spec.js
index 9b0c7ebbe..aaff6532b 100644
--- a/horizon/static/horizon/js/angular/services/hz.api.service.spec.js
+++ b/horizon/static/horizon/js/angular/services/hz.api.service.spec.js
@@ -3,7 +3,7 @@
'use strict';
describe('hz.api.service module', function() {
- it('should have been defined".', function () {
+ it('should have been defined', function () {
expect(angular.module('hz.api.service')).toBeDefined();
});
});
@@ -15,8 +15,6 @@
beforeEach(inject(function ($injector, apiService) {
api = apiService;
$httpBackend = $injector.get('$httpBackend');
-
-
}));
afterEach(function() {
diff --git a/horizon/test/jasmine/jasmine_tests.py b/horizon/test/jasmine/jasmine_tests.py
index 01f41a2ce..fd6511564 100644
--- a/horizon/test/jasmine/jasmine_tests.py
+++ b/horizon/test/jasmine/jasmine_tests.py
@@ -22,6 +22,7 @@ class ServicesTests(test.JasmineTests):
'horizon/js/angular/services/horizon.utils.js',
'horizon/js/angular/hz.api.module.js',
'horizon/js/angular/services/hz.api.service.js',
+ 'horizon/js/angular/services/hz.api.config.js',
'angular/widget.module.js',
'angular/action-list/action-list.js',
'angular/action-list/button-tooltip.js',
@@ -47,6 +48,7 @@ class ServicesTests(test.JasmineTests):
]
specs = [
'horizon/js/angular/services/hz.api.service.spec.js',
+ 'horizon/js/angular/services/hz.api.config.spec.js',
'horizon/tests/jasmine/utils.spec.js',
'angular/action-list/action-list.spec.js',
'angular/bind-scope/bind-scope.spec.js',
diff --git a/openstack_dashboard/api/rest/config.py b/openstack_dashboard/api/rest/config.py
index c84d9bef7..b28e4a33c 100644
--- a/openstack_dashboard/api/rest/config.py
+++ b/openstack_dashboard/api/rest/config.py
@@ -1,4 +1,5 @@
# Copyright 2015 IBM Corp.
+# Copyright 2015, Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -12,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from django.conf import settings
from django.views import generic
from horizon import conf
@@ -25,6 +27,14 @@ admin_configs = ['ajax_queue_limit', 'ajax_poll_interval',
'user_home', 'help_url',
'password_autocomplete', 'disable_password_reveal']
+# settings that we allow to be retrieved via REST API
+# these settings are available to the client and are not secured.
+# *** THEY SHOULD BE TREATED WITH EXTREME CAUTION ***
+settings_required = getattr(settings, 'REST_API_REQUIRED_SETTINGS', [])
+settings_additional = getattr(settings, 'REST_API_ADDITIONAL_SETTINGS', [])
+
+settings_allowed = settings_required + settings_additional
+
# properties we know are user config
# this is a white list of keys under HORIZON_CONFIG in settings.pys
# that we want to pass onto client
@@ -70,3 +80,18 @@ class AdminConfigs(generic.View):
for key in admin_configs:
config[key] = conf.HORIZON_CONFIG.get(key, None)
return config
+
+
+@urls.register
+class Settings(generic.View):
+ """API for retrieving settings.
+
+ This API returns read-only settings values.
+ This configuration object can be fetched as needed.
+ Examples of settings: OPENSTACK_HYPERVISOR_FEATURES
+ """
+ url_regex = r'settings/$'
+
+ @rest_utils.ajax()
+ def get(self, request):
+ return {k: getattr(settings, k, None) for k in settings_allowed}
diff --git a/openstack_dashboard/dashboards/identity/projects/tests.py b/openstack_dashboard/dashboards/identity/projects/tests.py
index e57cd8e4b..a860a6312 100644
--- a/openstack_dashboard/dashboards/identity/projects/tests.py
+++ b/openstack_dashboard/dashboards/identity/projects/tests.py
@@ -46,8 +46,8 @@ from socket import timeout as socket_timeout # noqa
INDEX_URL = reverse('horizon:identity:projects:index')
-USER_ROLE_PREFIX = workflows.PROJECT_GROUP_MEMBER_SLUG + "_role_"
-GROUP_ROLE_PREFIX = workflows.PROJECT_USER_MEMBER_SLUG + "_role_"
+USER_ROLE_PREFIX = workflows.PROJECT_USER_MEMBER_SLUG + "_role_"
+GROUP_ROLE_PREFIX = workflows.PROJECT_GROUP_MEMBER_SLUG + "_role_"
PROJECT_DETAIL_URL = reverse('horizon:identity:projects:detail', args=[1])
@@ -762,6 +762,83 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
project_scope = {'project': {'id': project_id}}
return self.role_assignments.filter(scope=project_scope)
+ def _check_role_list(self, keystone_api_version, role_assignments, groups,
+ proj_users, roles, workflow_data):
+ if keystone_api_version >= 3:
+ # admin role with attempt to remove current admin, results in
+ # warning message
+ workflow_data[USER_ROLE_PREFIX + "1"] = ['3']
+
+ # member role
+ workflow_data[USER_ROLE_PREFIX + "2"] = ['1', '3']
+
+ # admin role
+ workflow_data[GROUP_ROLE_PREFIX + "1"] = ['2', '3']
+
+ # member role
+ workflow_data[GROUP_ROLE_PREFIX + "2"] = ['1', '2', '3']
+ api.keystone.role_assignments_list(IsA(http.HttpRequest),
+ project=self.tenant.id) \
+ .AndReturn(role_assignments)
+ # Give user 1 role 2
+ api.keystone.add_tenant_user_role(IsA(http.HttpRequest),
+ project=self.tenant.id,
+ user='1',
+ role='2',)
+ # remove role 2 from user 2
+ api.keystone.remove_tenant_user_role(IsA(http.HttpRequest),
+ project=self.tenant.id,
+ user='2',
+ role='2')
+
+ # Give user 3 role 1
+ api.keystone.add_tenant_user_role(IsA(http.HttpRequest),
+ project=self.tenant.id,
+ user='3',
+ role='1',)
+ api.keystone.group_list(IsA(http.HttpRequest),
+ domain=self.domain.id,
+ project=self.tenant.id) \
+ .AndReturn(groups)
+ api.keystone.roles_for_group(IsA(http.HttpRequest),
+ group='1',
+ project=self.tenant.id) \
+ .AndReturn(roles)
+ api.keystone.remove_group_role(IsA(http.HttpRequest),
+ project=self.tenant.id,
+ group='1',
+ role='1')
+ api.keystone.roles_for_group(IsA(http.HttpRequest),
+ group='2',
+ project=self.tenant.id) \
+ .AndReturn(roles)
+ api.keystone.roles_for_group(IsA(http.HttpRequest),
+ group='3',
+ project=self.tenant.id) \
+ .AndReturn(roles)
+ else:
+ api.keystone.user_list(IsA(http.HttpRequest),
+ project=self.tenant.id) \
+ .AndReturn(proj_users)
+
+ # admin user - try to remove all roles on current project, warning
+ api.keystone.roles_for_user(IsA(http.HttpRequest), '1',
+ self.tenant.id).AndReturn(roles)
+
+ # member user 1 - has role 1, will remove it
+ api.keystone.roles_for_user(IsA(http.HttpRequest), '2',
+ self.tenant.id).AndReturn((roles[1],))
+
+ # member user 3 - has role 2
+ api.keystone.roles_for_user(IsA(http.HttpRequest), '3',
+ self.tenant.id).AndReturn((roles[0],))
+ # add role 2
+ api.keystone.add_tenant_user_role(IsA(http.HttpRequest),
+ project=self.tenant.id,
+ user='3',
+ role='2')\
+ .AndRaise(self.exceptions.keystone)
+
@test.create_stubs({api.keystone: ('get_default_role',
'roles_for_user',
'tenant_get',
@@ -879,7 +956,6 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
users = self._get_all_users(domain_id)
proj_users = self._get_proj_users(project.id)
groups = self._get_all_groups(domain_id)
- proj_groups = self._get_proj_groups(project.id)
roles = self.roles.list()
role_assignments = self._get_proj_role_assignment(project.id)
quota_usages = self.quota_usages.first()
@@ -952,91 +1028,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
**updated_project) \
.AndReturn(project)
- api.keystone.user_list(IsA(http.HttpRequest),
- project=self.tenant.id).AndReturn(proj_users)
-
- # admin user - try to remove all roles on current project, warning
- api.keystone.roles_for_user(IsA(http.HttpRequest), '1',
- self.tenant.id) \
- .AndReturn(roles)
-
- # member user 1 - has role 1, will remove it
- api.keystone.roles_for_user(IsA(http.HttpRequest), '2',
- self.tenant.id) \
- .AndReturn((roles[0],))
- # remove role 1
- api.keystone.remove_tenant_user_role(IsA(http.HttpRequest),
- project=self.tenant.id,
- user='2',
- role='1')
- # add role 2
- api.keystone.add_tenant_user_role(IsA(http.HttpRequest),
- project=self.tenant.id,
- user='2',
- role='2')
-
- # member user 3 - has role 2
- api.keystone.roles_for_user(IsA(http.HttpRequest), '3',
- self.tenant.id) \
- .AndReturn((roles[1],))
- # remove role 2
- api.keystone.remove_tenant_user_role(IsA(http.HttpRequest),
- project=self.tenant.id,
- user='3',
- role='2')
- # add role 1
- api.keystone.add_tenant_user_role(IsA(http.HttpRequest),
- project=self.tenant.id,
- user='3',
- role='1')
-
- # Group assignments
- api.keystone.group_list(IsA(http.HttpRequest),
- domain=domain_id,
- project=self.tenant.id).AndReturn(proj_groups)
-
- # admin group - try to remove all roles on current project
- api.keystone.roles_for_group(IsA(http.HttpRequest),
- group='1',
- project=self.tenant.id) \
- .AndReturn(roles)
- for role in roles:
- api.keystone.remove_group_role(IsA(http.HttpRequest),
- role=role.id,
- group='1',
- project=self.tenant.id)
-
- # member group 1 - has role 1, will remove it
- api.keystone.roles_for_group(IsA(http.HttpRequest),
- group='2',
- project=self.tenant.id) \
- .AndReturn((roles[0],))
- # remove role 1
- api.keystone.remove_group_role(IsA(http.HttpRequest),
- role='1',
- group='2',
- project=self.tenant.id)
- # add role 2
- api.keystone.add_group_role(IsA(http.HttpRequest),
- role='2',
- group='2',
- project=self.tenant.id)
-
- # member group 3 - has role 2
- api.keystone.roles_for_group(IsA(http.HttpRequest),
- group='3',
- project=self.tenant.id) \
- .AndReturn((roles[1],))
- # remove role 2
- api.keystone.remove_group_role(IsA(http.HttpRequest),
- role='2',
- group='3',
- project=self.tenant.id)
- # add role 1
- api.keystone.add_group_role(IsA(http.HttpRequest),
- role='1',
- group='3',
- project=self.tenant.id)
+ self._check_role_list(keystone_api_version, role_assignments, groups,
+ proj_users, roles, workflow_data)
quotas.tenant_quota_usages(IsA(http.HttpRequest), tenant_id=project.id) \
.AndReturn(quota_usages)
@@ -1253,7 +1246,6 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
users = self._get_all_users(domain_id)
proj_users = self._get_proj_users(project.id)
groups = self._get_all_groups(domain_id)
- proj_groups = self._get_proj_groups(project.id)
roles = self.roles.list()
role_assignments = self._get_proj_role_assignment(project.id)
quota_usages = self.quota_usages.first()
@@ -1323,57 +1315,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
**updated_project) \
.AndReturn(project)
- api.keystone.user_list(IsA(http.HttpRequest),
- project=self.tenant.id).AndReturn(proj_users)
-
- # admin user - try to remove all roles on current project, warning
- api.keystone.roles_for_user(IsA(http.HttpRequest), '1',
- self.tenant.id) \
- .AndReturn(roles)
-
- # member user 1 - has role 1, will remove it
- api.keystone.roles_for_user(IsA(http.HttpRequest), '2',
- self.tenant.id) \
- .AndReturn((roles[1],))
-
- # member user 3 - has role 2
- api.keystone.roles_for_user(IsA(http.HttpRequest), '3',
- self.tenant.id) \
- .AndReturn((roles[0],))
- # add role 2
- api.keystone.add_tenant_user_role(IsA(http.HttpRequest),
- project=self.tenant.id,
- user='3',
- role='2')
-
- # Group assignment
- api.keystone.group_list(IsA(http.HttpRequest),
- domain=domain_id,
- project=self.tenant.id).AndReturn(proj_groups)
-
- # admin group 1- try to remove all roles on current project
- api.keystone.roles_for_group(IsA(http.HttpRequest),
- group='1',
- project=self.tenant.id) \
- .AndReturn(roles)
-
- # member group 1 - has no change
- api.keystone.roles_for_group(IsA(http.HttpRequest),
- group='2',
- project=self.tenant.id) \
- .AndReturn((roles[1],))
-
- # member group 3 - has role 1
- api.keystone.roles_for_group(IsA(http.HttpRequest),
- group='3',
- project=self.tenant.id) \
- .AndReturn((roles[0],))
-
- # add role 2
- api.keystone.add_group_role(IsA(http.HttpRequest),
- role='2',
- group='3',
- project=self.tenant.id)
+ self._check_role_list(keystone_api_version, role_assignments, groups,
+ proj_users, roles, workflow_data)
quotas.tenant_quota_usages(IsA(http.HttpRequest), tenant_id=project.id) \
.AndReturn(quota_usages)
@@ -1400,7 +1343,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
res = self.client.post(url, workflow_data)
self.assertNoFormErrors(res)
- self.assertMessageCount(error=2, warning=0)
+ self.assertMessageCount(error=2, warning=1)
self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({api.keystone: ('tenant_get',
@@ -1500,27 +1443,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
**updated_project) \
.AndReturn(project)
- api.keystone.user_list(IsA(http.HttpRequest),
- project=self.tenant.id).AndReturn(proj_users)
-
- # admin user - try to remove all roles on current project, warning
- api.keystone.roles_for_user(IsA(http.HttpRequest), '1',
- self.tenant.id).AndReturn(roles)
-
- # member user 1 - has role 1, will remove it
- api.keystone.roles_for_user(IsA(http.HttpRequest), '2',
- self.tenant.id).AndReturn((roles[1],))
-
- # member user 3 - has role 2
- api.keystone.roles_for_user(IsA(http.HttpRequest), '3',
- self.tenant.id).AndReturn((roles[0],))
- # add role 2
- api.keystone.add_tenant_user_role(IsA(http.HttpRequest),
- project=self.tenant.id,
- user='3',
- role='2')\
- .AndRaise(self.exceptions.keystone)
-
+ self._check_role_list(keystone_api_version, role_assignments, groups,
+ proj_users, roles, workflow_data)
self.mox.ReplayAll()
# submit form data
@@ -1536,7 +1460,7 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
res = self.client.post(url, workflow_data)
self.assertNoFormErrors(res)
- self.assertMessageCount(error=2, warning=0)
+ self.assertMessageCount(error=2, warning=1)
self.assertRedirectsNoFollow(res, INDEX_URL)
# django 1.7 and later does not handle the thrown keystoneclient
diff --git a/openstack_dashboard/dashboards/identity/projects/workflows.py b/openstack_dashboard/dashboards/identity/projects/workflows.py
index e0e59d836..3b0ff6841 100644
--- a/openstack_dashboard/dashboards/identity/projects/workflows.py
+++ b/openstack_dashboard/dashboards/identity/projects/workflows.py
@@ -609,48 +609,49 @@ class UpdateProject(workflows.Workflow):
exceptions.handle(request, ignore=True)
return
- def _add_roles_to_users(self, request, data, project_id, user,
- current_roles, available_roles):
+ def _add_roles_to_users(self, request, data, project_id, user_id,
+ role_ids, available_roles):
member_step = self.get_step(PROJECT_USER_MEMBER_SLUG)
- current_role_ids = [role.id for role in current_roles]
+ current_role_ids = list(role_ids)
for role in available_roles:
field_name = member_step.get_member_field_name(role.id)
# Check if the user is in the list of users with this role.
- if user.id in data[field_name]:
+ if user_id in data[field_name]:
# Add it if necessary
if role.id not in current_role_ids:
# user role has changed
api.keystone.add_tenant_user_role(
request,
project=project_id,
- user=user.id,
+ user=user_id,
role=role.id)
else:
# User role is unchanged, so remove it from the
# remaining roles list to avoid removing it later.
index = current_role_ids.index(role.id)
current_role_ids.pop(index)
-
return current_role_ids
- def _remove_roles_from_user(self, request, project_id, user,
+ def _remove_roles_from_user(self, request, project_id, user_id,
current_role_ids):
for id_to_delete in current_role_ids:
api.keystone.remove_tenant_user_role(
request,
project=project_id,
- user=user.id,
+ user=user_id,
role=id_to_delete)
- def _is_removing_self_admin_role(self, request, project_id, user,
- current_roles, current_role_ids):
- is_current_user = user.id == request.user.id
+ def _is_removing_self_admin_role(self, request, project_id, user_id,
+ available_roles, current_role_ids):
+ is_current_user = user_id == request.user.id
is_current_project = project_id == request.user.tenant_id
- admin_roles = [role for role in current_roles
- if role.name.lower() == 'admin']
+ available_admin_role_ids = [role.id for role in available_roles
+ if role.name.lower() == 'admin']
+ admin_roles = [role for role in current_role_ids
+ if role in available_admin_role_ids]
if len(admin_roles):
- removing_admin = any([role.id in current_role_ids
+ removing_admin = any([role in current_role_ids
for role in admin_roles])
else:
removing_admin = False
@@ -677,25 +678,25 @@ class UpdateProject(workflows.Workflow):
available_roles = self._get_available_roles(request)
# Get the users currently associated with this project so we
# can diff against it.
- project_members = api.keystone.user_list(request,
- project=project_id)
- users_to_modify = len(project_members)
+ users_roles = api.keystone.get_project_users_roles(
+ request, project=project_id)
+ users_to_modify = len(users_roles)
- for user in project_members:
+ for user_id in users_roles.keys():
# Check if there have been any changes in the roles of
# Existing project members.
- current_roles = api.keystone.roles_for_user(
- self.request, user.id, project_id)
- current_role_ids = self._add_roles_to_users(
- request, data, project_id, user,
- current_roles, available_roles)
+ current_role_ids = list(users_roles[user_id])
+ modified_role_ids = self._add_roles_to_users(
+ request, data, project_id, user_id,
+ current_role_ids, available_roles)
# Prevent admins from doing stupid things to themselves.
removing_admin = self._is_removing_self_admin_role(
- request, project_id, user, current_roles, current_role_ids)
+ request, project_id, user_id, available_roles,
+ modified_role_ids)
# Otherwise go through and revoke any removed roles.
if not removing_admin:
- self._remove_roles_from_user(request, project_id, user,
- current_role_ids)
+ self._remove_roles_from_user(request, project_id, user_id,
+ modified_role_ids)
users_to_modify -= 1
# Grant new roles on the project.
@@ -707,7 +708,7 @@ class UpdateProject(workflows.Workflow):
users_added = 0
field_name = member_step.get_member_field_name(role.id)
for user_id in data[field_name]:
- if not filter(lambda x: user_id == x.id, project_members):
+ if user_id not in users_roles:
api.keystone.add_tenant_user_role(request,
project=project_id,
user=user_id,
diff --git a/openstack_dashboard/dashboards/project/data_processing/jobs/workflows/launch.py b/openstack_dashboard/dashboards/project/data_processing/jobs/workflows/launch.py
index 70c2350e1..3523834fa 100644
--- a/openstack_dashboard/dashboards/project/data_processing/jobs/workflows/launch.py
+++ b/openstack_dashboard/dashboards/project/data_processing/jobs/workflows/launch.py
@@ -39,12 +39,14 @@ class JobExecutionGeneralConfigAction(workflows.Action):
job_input = forms.DynamicChoiceField(
label=_("Input"),
initial=(None, "None"),
- add_item_link=DATA_SOURCE_CREATE_URL)
+ add_item_link=DATA_SOURCE_CREATE_URL,
+ required=False)
job_output = forms.DynamicChoiceField(
label=_("Output"),
initial=(None, "None"),
- add_item_link=DATA_SOURCE_CREATE_URL)
+ add_item_link=DATA_SOURCE_CREATE_URL,
+ required=False)
def __init__(self, request, *args, **kwargs):
super(JobExecutionGeneralConfigAction, self).__init__(request,
@@ -238,7 +240,7 @@ class JobExecutionGeneralConfig(workflows.Step):
def contribute(self, data, context):
for k, v in data.items():
if k in ["job_input", "job_output"]:
- context["job_general_" + k] = None if v == "None" else v
+ context["job_general_" + k] = None if (v in [None, ""]) else v
else:
context["job_general_" + k] = v
@@ -251,7 +253,7 @@ class JobExecutionExistingGeneralConfig(workflows.Step):
def contribute(self, data, context):
for k, v in data.items():
if k in ["job_input", "job_output"]:
- context["job_general_" + k] = None if v == "None" else v
+ context["job_general_" + k] = None if (v in [None, ""]) else v
else:
context["job_general_" + k] = v
diff --git a/openstack_dashboard/dashboards/project/images/images/tables.py b/openstack_dashboard/dashboards/project/images/images/tables.py
index cfdf73f00..53742e636 100644
--- a/openstack_dashboard/dashboards/project/images/images/tables.py
+++ b/openstack_dashboard/dashboards/project/images/images/tables.py
@@ -220,8 +220,13 @@ def get_format(image):
format = getattr(image, "disk_format", "")
# The "container_format" attribute can actually be set to None,
# which will raise an error if you call upper() on it.
- if format is not None:
- return format.upper()
+ if not format:
+ return format
+ # Most image formats are untranslated acronyms, but raw is a word
+ # and should be translated
+ if format == "raw":
+ return pgettext_lazy("Image format for display in table", u"Raw")
+ return format.upper()
class UpdateRow(tables.Row):
diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py
index a5fe31955..ca9adc4ba 100644
--- a/openstack_dashboard/dashboards/project/instances/tests.py
+++ b/openstack_dashboard/dashboards/project/instances/tests.py
@@ -18,7 +18,6 @@
import json
import sys
-import uuid
from django.conf import settings
from django.core.urlresolvers import reverse
@@ -162,55 +161,6 @@ class InstanceTests(helpers.TestCase):
self.assertItemsEqual(instances, self.servers.list())
@helpers.create_stubs({
- api.nova: ('flavor_list', 'server_list', 'flavor_get',
- 'tenant_absolute_limits', 'extension_supported',),
- api.glance: ('image_list_detailed',),
- api.network: ('floating_ip_simple_associate_supported',
- 'floating_ip_supported',
- 'servers_update_addresses',),
- })
- def test_index_flavor_get_exception(self):
- servers = self.servers.list()
- flavors = self.flavors.list()
- api.nova.extension_supported('AdminActions',
- IsA(http.HttpRequest)) \
- .MultipleTimes().AndReturn(True)
- # UUIDs generated using indexes are unlikely to match
- # any of existing flavor ids and are guaranteed to be deterministic.
- for i, server in enumerate(servers):
- server.flavor['id'] = str(uuid.UUID(int=i))
-
- search_opts = {'marker': None, 'paginate': True}
- api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \
- .AndReturn([servers, False])
- api.network.servers_update_addresses(IsA(http.HttpRequest), servers)
- api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
- api.glance.image_list_detailed(IgnoreArg()) \
- .AndReturn((self.images.list(), False, False))
- for server in servers:
- api.nova.flavor_get(IsA(http.HttpRequest), server.flavor["id"]). \
- AndRaise(self.exceptions.nova)
- api.nova.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True) \
- .MultipleTimes().AndReturn(self.limits['absolute'])
- api.network.floating_ip_supported(IsA(http.HttpRequest)) \
- .MultipleTimes().AndReturn(True)
- api.network.floating_ip_simple_associate_supported(
- IsA(http.HttpRequest)).MultipleTimes().AndReturn(True)
-
- self.mox.ReplayAll()
-
- res = self.client.get(INDEX_URL)
-
- instances = res.context['instances_table'].data
-
- self.assertTemplateUsed(res, 'project/instances/index.html')
- # Since error messages produced for each instance are identical,
- # there will be only one error message for all instances
- # (messages de-duplication)
- self.assertMessageCount(res, error=1)
- self.assertItemsEqual(instances, self.servers.list())
-
- @helpers.create_stubs({
api.nova: ('flavor_list', 'server_list', 'tenant_absolute_limits',
'extension_supported',),
api.glance: ('image_list_detailed',),
diff --git a/openstack_dashboard/dashboards/project/instances/views.py b/openstack_dashboard/dashboards/project/instances/views.py
index 8e0ee0f8a..674e201ec 100644
--- a/openstack_dashboard/dashboards/project/instances/views.py
+++ b/openstack_dashboard/dashboards/project/instances/views.py
@@ -19,6 +19,8 @@
"""
Views for managing instances.
"""
+import logging
+
from django.core.urlresolvers import reverse
from django.core.urlresolvers import reverse_lazy
from django import http
@@ -48,6 +50,8 @@ from openstack_dashboard.dashboards.project.instances \
from openstack_dashboard.dashboards.project.instances \
import workflows as project_workflows
+LOG = logging.getLogger(__name__)
+
class IndexView(tables.DataTableView):
table_class = project_tables.InstancesTable
@@ -119,8 +123,9 @@ class IndexView(tables.DataTableView):
instance.full_flavor = api.nova.flavor_get(
self.request, flavor_id)
except Exception:
- msg = _('Unable to retrieve instance size information.')
- exceptions.handle(self.request, msg)
+ msg = ('Unable to retrieve flavor "%s" for instance "%s".'
+ % (flavor_id, instance.id))
+ LOG.info(msg)
return instances
def get_filters(self, filters):
diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example
index 16c60af0a..2f8f33b02 100644
--- a/openstack_dashboard/local/local_settings.py.example
+++ b/openstack_dashboard/local/local_settings.py.example
@@ -614,3 +614,24 @@ SECURITY_GROUP_RULES = {
# auth_token middleware are using. Allowed values are the
# algorithms supported by Python's hashlib library.
#OPENSTACK_TOKEN_HASH_ALGORITHM = 'md5'
+
+# AngularJS requires some settings to be made available to
+# the client side. Some settings are required by in-tree / built-in horizon
+# features. These settings must be added to REST_API_REQUIRED_SETTINGS in the
+# form of ['SETTING_1','SETTING_2'], etc.
+#
+# You may remove settings from this list for security purposes, but do so at
+# the risk of breaking a built-in horizon feature. These settings are required
+# for horizon to function properly. Only remove them if you know what you
+# are doing. These settings may in the future be moved to be defined within
+# the enabled panel configuration.
+# You should not add settings to this list for out of tree extensions.
+# See: https://wiki.openstack.org/wiki/Horizon/RESTAPI
+REST_API_REQUIRED_SETTINGS = ['OPENSTACK_HYPERVISOR_FEATURES']
+
+# Additional settings can be made available to the client side for
+# extensibility by specifying them in REST_API_ADDITIONAL_SETTINGS
+# !! Please use extreme caution as the settings are transferred via HTTP/S
+# and are not encrypted on the browser. This is an experimental API and
+# may be deprecated in the future without notice.
+#REST_API_ADDITIONAL_SETTINGS = []
diff --git a/openstack_dashboard/locale/cs/LC_MESSAGES/django.po b/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
index f6eeed455..5d65eda64 100644
--- a/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 09:45+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Czech (http://www.transifex.com/projects/p/horizon/language/cs/)\n"
"MIME-Version: 1.0\n"
@@ -1405,7 +1405,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Veřejné"
@@ -1743,7 +1743,7 @@ msgstr "Zóna"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1819,7 +1819,7 @@ msgstr "Název hostitele"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1948,7 +1948,7 @@ msgstr "Nelze aktualizovat popisná data obrazu."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1979,7 +1979,7 @@ msgstr "Max. velikost (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2291,7 +2291,7 @@ msgstr "IP adresa"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2388,7 +2388,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Chráněno"
@@ -5434,32 +5434,32 @@ msgstr "Projekt \"%s\" změněn."
msgid "Unable to modify project \"%s\"."
msgstr "Nelze změnit projekt \"%s\"."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "Nemůžete si odstranit svá správcovská oprávnÄ›ní v projektu, do kterého jste nyní pÅ™ihlášeni. Prosím pÅ™ejdÄ›te do jiného projektu se stejnými oprávnÄ›ními, nebo odstraňte roli správce ruÄnÄ› pomocí příkazového řádku."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", aktualizovat skupiny projektu"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Nelze zmÄ›nit %(users_to_modify)s Älenů projektu%(group_msg)s a aktualizovat kvóty projektu,"
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Nelze zmÄ›nit %s Älenů projektu, aktualizovat skupiny projektu a kvóty projektu."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10609,7 +10609,7 @@ msgstr "Místní obraz pro nahrání."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Formátovat"
@@ -10731,36 +10731,51 @@ msgstr "Vytvořit svazek"
msgid "Shared with Me"
msgstr "Sdíleno se mnou"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Prosté"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Aktivní"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Smazáno"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Obraz"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Snímek"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Nelze získat obraz."
diff --git a/openstack_dashboard/locale/de/LC_MESSAGES/django.po b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
index 74420c756..ddee36c93 100644
--- a/openstack_dashboard/locale/de/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
@@ -15,9 +15,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 14:52+0000\n"
-"Last-Translator: Robert Simai\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: German (http://www.transifex.com/projects/p/horizon/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1409,7 +1409,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Öffentlich"
@@ -1743,7 +1743,7 @@ msgstr "Zone"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1819,7 +1819,7 @@ msgstr "Hostname"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1948,7 +1948,7 @@ msgstr "Abbild-Metadaten können nicht verändert werden."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1979,7 +1979,7 @@ msgstr "Max. Größe (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2289,7 +2289,7 @@ msgstr "IP-Adresse"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2386,7 +2386,7 @@ msgstr "JSON-formatierter Inhalt des Namensraumes."
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Geschützt"
@@ -5404,32 +5404,32 @@ msgstr "Projekt \"%s\" geändert."
msgid "Unable to modify project \"%s\"."
msgstr "Projekt \"%s\" kann nicht geändert werden."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "Sie können Ihre Administrator-Rechte nicht aus einem Projekt zurückziehen, in das Sie eingeloggt sind. Bitte wechseln Sie zuerst zu einem anderen Projekt mit Administrator-Rechten oder entfernen Sie die Administrator Rolle durch das Kommandozeilen-Interface (CLI)."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", Projektgruppen aktualisieren"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "%(users_to_modify)s Projektmitglieder %(group_msg)s und Projektkontingente konnten nicht aktualisiert werden."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "%s Projektmitglieder, Projektgruppen und Projektkontingente konnten nicht aktualisiert werden."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10528,7 +10528,7 @@ msgstr "Ein lokales Abbild zum hochladen."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Abbildformat"
@@ -10648,36 +10648,51 @@ msgstr "Datenträger erstellen"
msgid "Shared with Me"
msgstr "Mit mir geteilt"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Aktiv"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "Speichern"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "In Warteschlange"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "Geplantes Löschen"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "Getötet"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Gelöscht"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Abbild"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Schattenkopie"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Abbild kann nicht abgerufen werden."
diff --git a/openstack_dashboard/locale/en/LC_MESSAGES/django.po b/openstack_dashboard/locale/en/LC_MESSAGES/django.po
index 0b3d00a69..cc5b7cfec 100644
--- a/openstack_dashboard/locale/en/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-07 01:17-0500\n"
+"POT-Creation-Date: 2015-04-09 02:13-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1401,7 +1401,7 @@ msgstr ""
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr ""
@@ -1738,7 +1738,7 @@ msgstr ""
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1814,7 +1814,7 @@ msgstr ""
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1943,7 +1943,7 @@ msgstr ""
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1974,7 +1974,7 @@ msgstr ""
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2284,7 +2284,7 @@ msgstr ""
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2381,7 +2381,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr ""
@@ -5414,32 +5414,32 @@ msgstr ""
msgid "Unable to modify project \"%s\"."
msgstr ""
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr ""
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ""
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update "
"project quotas."
msgstr ""
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr ""
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10563,7 +10563,7 @@ msgstr ""
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr ""
@@ -10683,36 +10683,51 @@ msgstr ""
msgid "Shared with Me"
msgstr ""
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr ""
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr ""
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr ""
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr ""
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr ""
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr ""
diff --git a/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
index 0805dbbca..0b6b65b40 100644
--- a/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-08 23:13+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (Australia) (http://www.transifex.com/projects/p/horizon/language/en_AU/)\n"
"MIME-Version: 1.0\n"
@@ -1402,7 +1402,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Public"
@@ -1736,7 +1736,7 @@ msgstr "Zone"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1812,7 +1812,7 @@ msgstr "Hostname"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1941,7 +1941,7 @@ msgstr "Unable to update the image metadata."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1972,7 +1972,7 @@ msgstr "Max. Size (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2282,7 +2282,7 @@ msgstr "IP Address"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2379,7 +2379,7 @@ msgstr "The JSON formatted contents of a namespace."
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Protected"
@@ -5397,32 +5397,32 @@ msgstr "Modified project \"%s\"."
msgid "Unable to modify project \"%s\"."
msgstr "Unable to modify project \"%s\"."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "You cannot revoke your administrative privileges from the project you are currently logged into. Please switch to another project with administrative privileges or remove the administrative role manually via the CLI."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", update project groups"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Failed to modify %(users_to_modify)s project members%(group_msg)s and update project quotas."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Failed to modify %s project members, update project groups and update project quotas."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10521,7 +10521,7 @@ msgstr "A local image to upload."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Format"
@@ -10641,36 +10641,51 @@ msgstr "Create Volume"
msgid "Shared with Me"
msgstr "Shared with Me"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Active"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "Saving"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "Queued"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "Pending Delete"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "Killed"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Deleted"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Image"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Snapshot"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Unable to retrieve image."
diff --git a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
index 654c7caaf..877806aaf 100644
--- a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
-"Last-Translator: Rob Cresswell <robert.cresswell@outlook.com>\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-08 23:13+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/horizon/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1403,7 +1403,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Public"
@@ -1737,7 +1737,7 @@ msgstr "Zone"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1813,7 +1813,7 @@ msgstr "Hostname"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1942,7 +1942,7 @@ msgstr "Unable to update the image metadata."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1973,7 +1973,7 @@ msgstr "Max. Size (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2283,7 +2283,7 @@ msgstr "IP Address"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2380,7 +2380,7 @@ msgstr "The JSON formatted contents of a namespace."
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Protected"
@@ -5398,32 +5398,32 @@ msgstr "Modified project \"%s\"."
msgid "Unable to modify project \"%s\"."
msgstr "Unable to modify project \"%s\"."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "You cannot revoke your administrative privileges from the project you are currently logged into. Please switch to another project with administrative privileges or remove the administrative role manually via the CLI."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", update project groups"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Failed to modify %(users_to_modify)s project members%(group_msg)s and update project quotas."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Failed to modify %s project members, update project groups and update project quotas."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10522,7 +10522,7 @@ msgstr "A local image to upload."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Format"
@@ -10642,36 +10642,51 @@ msgstr "Create Volume"
msgid "Shared with Me"
msgstr "Shared with Me"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Active"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "Saving"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "Queued"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "Pending Delete"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "Killed"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Deleted"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Image"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Snapshot"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Unable to retrieve image."
diff --git a/openstack_dashboard/locale/es/LC_MESSAGES/django.po b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
index da3082865..3451c9090 100644
--- a/openstack_dashboard/locale/es/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/horizon/language/es/)\n"
"MIME-Version: 1.0\n"
@@ -1406,7 +1406,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Público"
@@ -1740,7 +1740,7 @@ msgstr "Zona"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1816,7 +1816,7 @@ msgstr "Nombre del host"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1945,7 +1945,7 @@ msgstr "No ha sido posible actualizar los medatados de la imagen."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1976,7 +1976,7 @@ msgstr "Tamaño máx. (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2286,7 +2286,7 @@ msgstr "Dirección IP"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2383,7 +2383,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Protegido"
@@ -5401,32 +5401,32 @@ msgstr "Proyecto \"%s\" modificado."
msgid "Unable to modify project \"%s\"."
msgstr "No ha sido posible modificar el proyecto \"%s\"."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "No puede revocar sus privilegios de administrador del proyecto en el que actualmente inició sesión. Muévase a otro proyecto con privilegios de administración o elimine el rol de administración manualmente desde la línea de comandos."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", actualizar grupos del proyecto"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Ha habido un fallo al modificar %(users_to_modify)s miembros del proyecto %(group_msg)s y actualizar las cuotas del proyecto."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Ha habido un fallo al modificar %s miembros del proyecto, actualizar los grupos del proyecto y actualizar las cuotas del proyecto."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10525,7 +10525,7 @@ msgstr "Disco local a cargar."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Formato"
@@ -10645,36 +10645,51 @@ msgstr "Crear volumen"
msgid "Shared with Me"
msgstr "Compartido conmigo"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Activo"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "Guardando"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Eliminado"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Imagen"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Instantánea"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "No ha sido posible obtener la imagen."
diff --git a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
index c64fb56b8..d26937e22 100644
--- a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
@@ -20,9 +20,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 21:12+0000\n"
-"Last-Translator: JF Taltavull <jftalta@gmail.com>\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: French (http://www.transifex.com/projects/p/horizon/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1414,7 +1414,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Publique"
@@ -1748,7 +1748,7 @@ msgstr "Zone"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1824,7 +1824,7 @@ msgstr "Nom d'Hôte"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1953,7 +1953,7 @@ msgstr "Incapable de mettre à jour l'image des métadonnées."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1984,7 +1984,7 @@ msgstr "Taille maximale (Mo)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2294,7 +2294,7 @@ msgstr "Adresse IP"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2391,7 +2391,7 @@ msgstr "Le contenu JSON formaté d'un espace de nom."
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Protégée"
@@ -5409,32 +5409,32 @@ msgstr "Projet \"%s\" modifié."
msgid "Unable to modify project \"%s\"."
msgstr "Impossible de modifier le projet \"%s\"."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "Vous ne pouvez pas révoquer vos droits administrateur du projet auquel vous êtes actuellement connecté. Merci de basculer sur un autre projet avec des droits administrateur ou supprimez manuellement le rôle administrateur en utilisant les lignes de commandes (CLI). "
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", mise à jour des groupes du projet"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Echec de la modification des membres %(users_to_modify)s %(group_msg)s et de la mise à jour des quotas du projet."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Echec de la modification des membres du projet %s, de la mise à jour des groupes et des quotas du projet."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10533,7 +10533,7 @@ msgstr "Une image locale à télécharger."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Format"
@@ -10653,36 +10653,51 @@ msgstr "Créer le volume"
msgid "Shared with Me"
msgstr "Partagées avec Moi"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Active"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "Enregistrement"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "En attente"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "Suppression de Mise en attente"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "Supprimé par force"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Supprimée"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Image"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Instantané"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Impossible de récupérer l'image."
diff --git a/openstack_dashboard/locale/hi/LC_MESSAGES/django.po b/openstack_dashboard/locale/hi/LC_MESSAGES/django.po
index ab4700b5d..d9afeca83 100644
--- a/openstack_dashboard/locale/hi/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/hi/LC_MESSAGES/django.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-08 23:13+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Hindi (http://www.transifex.com/projects/p/horizon/language/hi/)\n"
"MIME-Version: 1.0\n"
@@ -1403,7 +1403,7 @@ msgstr "आईडी"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "सारà¥à¤µà¤œà¤¨à¤¿à¤•"
@@ -1737,7 +1737,7 @@ msgstr "कà¥à¤·à¥‡à¤¤à¥à¤°"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1813,7 +1813,7 @@ msgstr "होसà¥à¤Ÿà¤¨à¤¾à¤®"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1942,7 +1942,7 @@ msgstr "बिंब मेटाडेटा अपडेट करने मà¥
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1973,7 +1973,7 @@ msgstr "अधिकतम आकार (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2283,7 +2283,7 @@ msgstr "IP पता"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2380,7 +2380,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "सà¥à¤°à¤•à¥à¤·à¤¿à¤¤"
@@ -5398,32 +5398,32 @@ msgstr "परिवरà¥à¤¤à¤¿à¤¤ परियोजना \"%s\"."
msgid "Unable to modify project \"%s\"."
msgstr " \"%s\" परियोजना को संशोधित करने में असमरà¥à¤¥."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "आप वरà¥à¤¤à¤®à¤¾à¤¨ में लॉग इन कर रहे हैं परियोजना से अपने पà¥à¤°à¤¶à¤¾à¤¸à¤¨à¤¿à¤• विशेषाधिकारों को रदà¥à¤¦ नहीं कर सकते हैं. पà¥à¤°à¤¶à¤¾à¤¸à¤¨à¤¿à¤• विशेषाधिकारों के साथ à¤à¤• अनà¥à¤¯ परियोजना के लिठसà¥à¤µà¤¿à¤š या सीà¤à¤²à¤†à¤ˆ के माधà¥à¤¯à¤® से मैनà¥à¤¯à¥à¤…ल रूप से पà¥à¤°à¤¶à¤¾à¤¸à¤¨à¤¿à¤• भूमिका निकाल दें."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", परियोजना समूहों का अदà¥à¤¯à¤¤à¤¨ करें"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "परियोजना के %(users_to_modify)s सदसà¥à¤¯à¥‹à¤‚ %(group_msg)s और अदà¥à¤¯à¤¤à¤¨ परियोजना कोटा संशोधित करने में विफल."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr " %s परियोजना के सदसà¥à¤¯à¥‹à¤‚, अदà¥à¤¯à¤¤à¤¨ परियोजना समूहों और अदà¥à¤¯à¤¤à¤¨ परियोजना कोटा संशोधित करने में विफल."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10522,7 +10522,7 @@ msgstr "अपलोड करने के लिठसà¥à¤¥à¤¾à¤¨à¥€à¤¯ बà
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "पà¥à¤°à¤¾à¤°à¥‚प"
@@ -10642,36 +10642,51 @@ msgstr "वॉलà¥à¤¯à¥‚म बनाà¤à¤"
msgid "Shared with Me"
msgstr "मेरे साथ साà¤à¤¾"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "कचà¥à¤šà¤¾"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "सकà¥à¤°à¤¿à¤¯"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "मिटाया"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "बिंब"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "सà¥à¤¨à¥‡à¤ªà¤¶à¥‰à¤Ÿ"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "बिंब को पà¥à¤¨à¤ƒ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने में असमरà¥à¤¥."
diff --git a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
index 934b83351..71c9d0210 100644
--- a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 21:41+0000\n"
-"Last-Translator: myamamot <myamamot@redhat.com>\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/horizon/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1401,7 +1401,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "パブリック"
@@ -1731,7 +1731,7 @@ msgstr "ゾーン"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1807,7 +1807,7 @@ msgstr "ホストå"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1936,7 +1936,7 @@ msgstr "イメージメタデータを更新ã§ãã¾ã›ã‚“。"
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1967,7 +1967,7 @@ msgstr "最大サイズ (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2275,7 +2275,7 @@ msgstr "IP アドレス"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2372,7 +2372,7 @@ msgstr "JSON å½¢å¼ã§æ›¸ã‹ã‚ŒãŸåå‰ç©ºé–“ã®å†…容"
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "ä¿è­·"
@@ -5362,32 +5362,32 @@ msgstr "プロジェクト \"%s\" を変更ã—ã¾ã—ãŸã€‚"
msgid "Unable to modify project \"%s\"."
msgstr "プロジェクト \"%s\" を変更ã§ãã¾ã›ã‚“。"
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "ç¾åœ¨ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„るプロジェクトã‹ã‚‰è‡ªåˆ†ã®ç®¡ç†æ¨©é™ã‚’削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。管ç†æ¨©é™ã‚’æŒã¤åˆ¥ã®ãƒ—ロジェクトã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã‹ã€CLI を使ã£ã¦æ‰‹å‹•ã§ç®¡ç†æ¨©é™ã‚’削除ã—ã¦ãã ã•ã„。"
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr "ã€ãƒ—ロジェクトグループã®æ›´æ–°"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "%(users_to_modify)s 個ã®ãƒ—ロジェクトメンãƒãƒ¼å¤‰æ›´%(group_msg)sã€ãƒ—ロジェクトã®ã‚¯ã‚©ãƒ¼ã‚¿æ›´æ–°ã®æ“作ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "%s 個ã®ãƒ—ロジェクトメンãƒãƒ¼å¤‰æ›´ã€ãƒ—ロジェクトグループ更新ã€ãƒ—ロジェクトã®ã‚¯ã‚©ãƒ¼ã‚¿æ›´æ–°ã®æ“作ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10435,7 +10435,7 @@ msgstr "手元ã«ã‚るアップロードã™ã‚‹ã‚¤ãƒ¡ãƒ¼ã‚¸"
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "å½¢å¼"
@@ -10553,36 +10553,51 @@ msgstr "ボリュームã®ä½œæˆ"
msgid "Shared with Me"
msgstr "自分ã¨å…±æœ‰"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "稼åƒä¸­"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "ä¿å­˜ä¸­"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "処ç†å¾…ã¡"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "削除待ã¡"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "中止"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "削除"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "イメージ"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "スナップショット"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "イメージ情報をå–å¾—ã§ãã¾ã›ã‚“。"
diff --git a/openstack_dashboard/locale/kn/LC_MESSAGES/django.po b/openstack_dashboard/locale/kn/LC_MESSAGES/django.po
index 3da3d285f..fd478faf6 100644
--- a/openstack_dashboard/locale/kn/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/kn/LC_MESSAGES/django.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-08 23:13+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Kannada (http://www.transifex.com/projects/p/horizon/language/kn/)\n"
"MIME-Version: 1.0\n"
@@ -1398,7 +1398,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "ಸಾರà³à²µà²œà²¨à²¿à²•"
@@ -1728,7 +1728,7 @@ msgstr "ವಲಯ"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1804,7 +1804,7 @@ msgstr "ಆತಿಥೇಯದ ಹೆಸರà³"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1933,7 +1933,7 @@ msgstr "ಮೆಟಾಡೇಟ ಚಿತà³à²°à²¿à²•à³†à²¯à²¨à³à²¨à³ ಅಪà³â
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1964,7 +1964,7 @@ msgstr "ಗರಿಷà³à²Ÿ ಗಾತà³à²° (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2272,7 +2272,7 @@ msgstr "IP ವಿಳಾಸ"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2369,7 +2369,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "ಸಂರಕà³à²·à²¿à²¤"
@@ -5359,32 +5359,32 @@ msgstr "ಮಾರà³à²ªà²¡à²¿à²¸à²²à²¾à²¦ ಪರಿಯೋಜನೆ \"%s\"."
msgid "Unable to modify project \"%s\"."
msgstr "ಪರಿಯೋಜನೆ \"%s\" ಅನà³à²¨à³ ಮಾರà³à²ªà²¡à²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "ನೀವೠಪà³à²°à²¸à²•à³à²¤ ಲಾಗಿನೠಆದಂತಹ ಪರಿಯೋಜನೆಯಿಂದ ವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²• ಅಧಿಕಾರಗಳನà³à²¨à³ ರದà³à²¦à³à²—ೊಳಿಸಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²². ದಯವಿಟà³à²Ÿà³ ವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²• ಅಧಿಕಾರಗಳಿಂದ ಇನà³à²¨à³Šà²‚ದೠಪರಿಯೋಜನೆಗೆ ಬದಲಾಯಿಸಿ ಅಥವ CLI ಬಳಸಿಕೊಂಡೠವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²• ಪಾತà³à²°à²µà²¨à³à²¨à³ ಕೈಯಾರೆ ತೆಗೆದà³à²¹à²¾à²•à²¿."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", ಪರಿಯೋಜನೆ ಗà³à²‚ಪà³à²—ಳನà³à²¨à³ ಅಪà³â€Œà²¡à³‡à²Ÿà³ ಮಾಡಿ"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "%(users_to_modify)s ಪರಿಯೋಜನೆಯ ಅಂಗಗಳನà³à²¨à³ %(group_msg)s ಮಾರà³à²ªà²¡à²¿à²¸à²²à³ ಮತà³à²¤à³ ಪರಿಯೋಜನೆಯ ಕೋಟಾಗಳನà³à²¨à³ ಅಪà³â€Œà²¡à³‡à²Ÿà³â€Œ ಮಾಡಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "%s ಪರಿಯೋಜನೆಯ ಅಂಗಗಳನà³à²¨à³ ಮಾರà³à²ªà²¡à²¿à²¸à²²à³, ಪರಿಯೋಜನೆ ಗà³à²‚ಪà³à²—ಳನà³à²¨à³ ಅಪà³â€Œà²¡à³‡à²Ÿà³â€Œ ಮಾಡಲೠಮತà³à²¤à³ ಪರಿಯೋಜನೆಯ ಕೋಟಾಗಳನà³à²¨à³ ಅಪà³â€Œà²¡à³‡à²Ÿà³â€Œ ಮಾಡಲೠವಿಫಲಗೊಂಡಿದೆ."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10432,7 +10432,7 @@ msgstr "ಅಪà³â€Œà²²à³‹à²¡à³ ಮಾಡಬೇಕಿರà³à²µ ಒಂದೠಸ
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "ವಿನà³à²¯à²¾à²¸"
@@ -10550,36 +10550,51 @@ msgstr "ಪರಿಮಾಣಯನà³à²¨à³ ರಚಿಸಿ"
msgid "Shared with Me"
msgstr "ನನà³à²¨à³Šà²‚ದಿಗೆ ಹಂಚಲಾಗಿದೆ"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "ಕಚà³à²›à²¾"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "ಸಕà³à²°à²¿à²¯"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "ಅಳಿಸಲಾದ"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "ಚಿತà³à²°à²¿à²•à³†"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "ಸà³à²¨à³à²¯à²¾à²ªà³â€Œà²¶à²¾à²Ÿà³â€Œ"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "ಚಿತà³à²°à²¿à²•à³†à²¯à²¨à³à²¨à³ ಹಿಂಪಡೆಯಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²."
diff --git a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
index 85aec721a..5ad247a7d 100644
--- a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
@@ -14,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 16:41+0000\n"
-"Last-Translator: Sungjin Kang <potopro@gmail.com>\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/horizon/language/ko_KR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1404,7 +1404,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "공용"
@@ -1734,7 +1734,7 @@ msgstr "ì˜ì—­"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1810,7 +1810,7 @@ msgstr "호스트 ì´ë¦„"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1939,7 +1939,7 @@ msgstr "ì´ë¯¸ì§€ 메타ë°ì´í„°ë¥¼ ì—…ë°ì´íŠ¸í•  수 없습니다."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1970,7 +1970,7 @@ msgstr "최대 í¬ê¸° (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2278,7 +2278,7 @@ msgstr "IP 주소"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2375,7 +2375,7 @@ msgstr "JSON í¬ë§·í™”ëœ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ ë‚´ìš©"
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "보호ë¨"
@@ -5365,32 +5365,32 @@ msgstr "프로ì íŠ¸ \"%s\" 수정하였습니다."
msgid "Unable to modify project \"%s\"."
msgstr "프로ì íŠ¸ \"%s\"를 수정할 수 없습니다."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "현재 로그ì¸ëœ 사용ìžë¡œëŠ” 프로ì íŠ¸ì—ì„œ 관리 ê¶Œí•œì„ ë¬´íš¨í•  수 없습니다. ê´€ë¦¬ìž ê¶Œí•œì´ ìžˆëŠ” 다른 프로ì íŠ¸ë¡œ ì „í™˜ì„ í•˜ê±°ë‚˜, CLI를 통해 수ë™ìœ¼ë¡œ ê´€ë¦¬ìž roleì„ ì œê±°í•˜ì‹­ì‹œì˜¤."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", 프로ì íŠ¸ 그룹 ì—…ë°ì´íŠ¸"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "%(users_to_modify)s 프로ì íŠ¸ 멤버 수정하고 %(group_msg)s , 프로ì íŠ¸ quota를 ì—…ë°ì´íŠ¸í•˜ëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤"
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "%s 프로ì íŠ¸ 멤버를 수정하고, 프로ì íŠ¸ 그룹과 프로ì íŠ¸ quota를 ì—…ë°ì´íŠ¸í•˜ëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10438,7 +10438,7 @@ msgstr "업로드할 로컬 ì´ë¯¸ì§€."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "í¬ë©§"
@@ -10479,7 +10479,7 @@ msgstr "ë°ì´í„° 복사"
msgid ""
"Specify this option to copy image data to the image service. If unspecified,"
" image data will be used in its current location."
-msgstr ""
+msgstr "ì´ë¯¸ì§€ 서비스ì—ì„œ ì´ë¯¸ì§€ ë°ì´í„°ë¥¼ 복사하려면 ì´ ì˜µì…˜ì„ ì§€ì •í•´ì•¼í•©ë‹ˆë‹¤. 만약 지정하지 않으면, ì´ë¯¸ì§€ ë°ì´í„°ëŠ” 현재 위치ì—ì„œ 사용ë©ë‹ˆë‹¤."
#: dashboards/project/images/images/forms.py:148
msgid "A image or external image location must be specified."
@@ -10556,36 +10556,51 @@ msgstr "볼륨 ìƒì„±"
msgid "Shared with Me"
msgstr "나ì—게 공유ë¨"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Active"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "Saving"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "Queued"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "Pending Delete"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "Killed"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Deleted"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "ì´ë¯¸ì§€"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "스냅샷"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "ì´ë¯¸ì§€ë¥¼ 찾지 못 했습니다."
diff --git a/openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.po b/openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.po
index 2be5999a3..302247c8d 100644
--- a/openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/horizon/language/nl_NL/)\n"
"MIME-Version: 1.0\n"
@@ -1402,7 +1402,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Publiek"
@@ -1736,7 +1736,7 @@ msgstr "Zone"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1812,7 +1812,7 @@ msgstr "Gastheer naam"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1941,7 +1941,7 @@ msgstr ""
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1972,7 +1972,7 @@ msgstr "Max. grootte (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2282,7 +2282,7 @@ msgstr "IP Adres"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2379,7 +2379,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Beschermd"
@@ -5397,32 +5397,32 @@ msgstr "Project \"%s\" is aangepast."
msgid "Unable to modify project \"%s\"."
msgstr "Niet in staat om het project \"%s\" aan te passen."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "U kunt uw beheerrechten niet intrekken van een project waarin u op dit moment bent aangemeld. Wisselt u alstublieft naar een ander project met beheerrechten of verwijder de beheerrol via de CLI."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", projectgroepen bijwerken"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Het aanpassen van %(users_to_modify)s projectleden %(group_msg)s en bijwerken van projectquota's is mislukt."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Het aanpassen van %s projectleden, bijwerken van projectgroepen en bijwerken van projectquota's is mislukt."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10521,7 +10521,7 @@ msgstr "Een lokale afbeelding om te uploaden."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Formaat"
@@ -10641,36 +10641,51 @@ msgstr "Creëer volume"
msgid "Shared with Me"
msgstr "Gedeeld met mij"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Ruw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr ""
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Verwijderd"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Afbeelding"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Momentopname"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Niet in staat om de afbeelding op te halen."
diff --git a/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po b/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
index 71c7e936a..baf09f0ee 100644
--- a/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-08 23:13+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/horizon/language/pl_PL/)\n"
"MIME-Version: 1.0\n"
@@ -20,7 +20,7 @@ msgstr ""
#: api/ceilometer.py:743
msgid "Unable to retrieve Ceilometer meter list."
-msgstr ""
+msgstr "Nie można pobrać listy metryk Ceilometer."
#: api/ceilometer.py:931
msgid "Existence of instance"
@@ -1406,7 +1406,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Publiczny"
@@ -1744,7 +1744,7 @@ msgstr "Strefa"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1820,7 +1820,7 @@ msgstr "Nazwa hosta"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1949,7 +1949,7 @@ msgstr "Nie można zaktualizować metadanych obrazu."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1980,7 +1980,7 @@ msgstr "Maks. rozmiar (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2292,7 +2292,7 @@ msgstr "Adres IP"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2389,7 +2389,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Chroniony"
@@ -5435,32 +5435,32 @@ msgstr "Zmodyfikowano projekt „%sâ€."
msgid "Unable to modify project \"%s\"."
msgstr "Nie można zmodyfikować projektu „%sâ€."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "Nie można odwołać administracyjnych praw dostępu w projekcie, do którego jest się obecnie zalogowanym. Należy przełączyć się na innych projekt z uprawnieniami administracyjnymi lub ręcznie usunąć rolę administracyjną używając linii poleceń."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", zaktualizować grup projektów"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Nie można zmodyfikować %(users_to_modify)s członków projektu%(group_msg)s i zaktualizować limitów projektu."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Nie można zmodyfikować %s członków projektu, zaktualizować grup projektów oraz limitów projektu."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10610,7 +10610,7 @@ msgstr "Lokalny obraz do wysłania."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Format"
@@ -10732,36 +10732,51 @@ msgstr "Utwórz wolumen"
msgid "Shared with Me"
msgstr "Współdzielone ze mną"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Nieprzetworzone"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Aktywny"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Usunięto"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Obraz"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Migawka"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Nie można pobrać obrazu."
@@ -13271,7 +13286,7 @@ msgstr "Budowanie"
#: dashboards/project/networks/ports/views.py:39
#: dashboards/project/networks/templates/networks/ports/detail.html:3
msgid "Port Details"
-msgstr ""
+msgstr "Szczegóły portu"
#: dashboards/project/networks/ports/views.py:54
#: dashboards/project/routers/ports/tabs.py:35
@@ -13445,19 +13460,19 @@ msgstr "Sieć dostawcy"
#: dashboards/project/networks/templates/networks/_detail_overview.html:25
msgid "Network Type:"
-msgstr ""
+msgstr "Typ sieci:"
#: dashboards/project/networks/templates/networks/_detail_overview.html:26
msgid "Physical Network:"
-msgstr ""
+msgstr "Sieć fizyczna:"
#: dashboards/project/networks/templates/networks/_detail_overview.html:27
msgid "Segmentation ID:"
-msgstr ""
+msgstr "ID segmentacji:"
#: dashboards/project/networks/templates/networks/create.html:9
msgid "&laquo;&nbsp;Back"
-msgstr ""
+msgstr "&laquo;&nbsp;Wstecz"
#: dashboards/project/networks/templates/networks/create.html:10
msgid "Next&nbsp;&raquo;"
@@ -13465,7 +13480,7 @@ msgstr "Następne&nbsp;&raquo;"
#: dashboards/project/networks/templates/networks/detail.html:3
msgid "Network Details"
-msgstr ""
+msgstr "Szczegóły sieci"
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:4
msgid "Subnet Overview"
@@ -13980,16 +13995,16 @@ msgstr "Nie można ustawić bramki."
#: dashboards/project/routers/tables.py:40
msgid "Delete Router"
msgid_plural "Delete Routers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń router"
+msgstr[1] "Usuń routery"
+msgstr[2] "Usuń routery"
#: dashboards/project/routers/tables.py:48
msgid "Deleted Router"
msgid_plural "Deleted Routers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto router"
+msgstr[1] "Usunięto routery"
+msgstr[2] "Usunięto routery"
#: dashboards/project/routers/tables.py:67
#: dashboards/project/routers/tables.py:75
@@ -14062,7 +14077,7 @@ msgstr ""
#: dashboards/project/routers/templates/routers/_detail_overview.html:46
msgid "SNAT"
-msgstr ""
+msgstr "SNAT"
#: dashboards/project/routers/templates/routers/_update.html:6
msgid "You may update the editable properties of your router here."
@@ -14123,15 +14138,15 @@ msgstr "Konfliktująca reguła"
#: dashboards/project/routers/templates/routers/extensions/routerrules/grid.html:99
msgid "Source:"
-msgstr ""
+msgstr "Źródło:"
#: dashboards/project/routers/templates/routers/extensions/routerrules/grid.html:100
msgid "Destination:"
-msgstr ""
+msgstr "Cel:"
#: dashboards/project/routers/templates/routers/extensions/routerrules/grid.html:101
msgid "Action:"
-msgstr ""
+msgstr "Czynność:"
#: dashboards/project/routers/templates/routers/extensions/routerrules/grid.html:123
msgid ""
@@ -14375,15 +14390,15 @@ msgstr "Stosy"
#: dashboards/project/stacks/resource_types/tables.py:26
msgid "AWS compatible"
-msgstr ""
+msgstr "Kompatybilne z AWS"
#: dashboards/project/stacks/resource_types/tables.py:34
msgid "Implementation"
-msgstr ""
+msgstr "Implementacja"
#: dashboards/project/stacks/resource_types/tables.py:36
msgid "Component"
-msgstr ""
+msgstr "Komponent"
#: dashboards/project/stacks/resource_types/tables.py:38
#: dashboards/project/stacks/tables.py:312
@@ -14393,11 +14408,11 @@ msgstr "Zasób"
#: dashboards/project/stacks/resource_types/templates/stacks.resource_types/_details.html:4
msgid "Resource Type"
-msgstr ""
+msgstr "Typ zasobu"
#: dashboards/project/stacks/resource_types/templates/stacks.resource_types/_details.html:12
msgid "Attributes"
-msgstr ""
+msgstr "Atrybuty"
#: dashboards/project/stacks/resource_types/templates/stacks.resource_types/_details.html:18
msgid "Properties"
@@ -15623,7 +15638,7 @@ msgstr ""
#: dashboards/project/volumes/volumes/tables.py:277
msgid "This action cannot be undone."
-msgstr ""
+msgstr "Tej czynności nie można cofnąć."
#: dashboards/project/volumes/volumes/tables.py:288
#, python-format
diff --git a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
index d826797f9..b7e5944a8 100644
--- a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
@@ -6,14 +6,15 @@
# Gabriel Wainer, 2015
# Luís Eduardo Tenório Silva <eduardovansilva@gmail.com>, 2015
# maurosr <maurosmrodrigues@gmail.com>, 2014-2015
+# Remulo Carvalho <remulo@gmail.com>, 2015
# Rodrigo Felix de Almeida <rodrigofelixdealmeida@gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
+"POT-Creation-Date: 2015-04-09 22:29-0500\n"
+"PO-Revision-Date: 2015-04-09 22:51+0000\n"
+"Last-Translator: Remulo Carvalho <remulo@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/horizon/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,7 +28,7 @@ msgstr ""
#: api/ceilometer.py:931
msgid "Existence of instance"
-msgstr ""
+msgstr "Instância Já existe"
#: api/ceilometer.py:935
msgid "Existence of instance <type> (openstack types)"
@@ -133,7 +134,7 @@ msgstr "Duração do tipo de instância %s (openstack flavor)"
#: api/ceilometer.py:1067
msgid "Existence of network"
-msgstr ""
+msgstr "Rede já existe"
#: api/ceilometer.py:1071
msgid "Creation requests for this network"
@@ -145,7 +146,7 @@ msgstr "Atualizar requisições para esta rede"
#: api/ceilometer.py:1079
msgid "Existence of subnet"
-msgstr ""
+msgstr "Sub-rede já existe!"
#: api/ceilometer.py:1083
msgid "Creation requests for this subnet"
@@ -157,7 +158,7 @@ msgstr "Atualizar requisições para esta sub-rede"
#: api/ceilometer.py:1091
msgid "Existence of port"
-msgstr ""
+msgstr "Porta já existente!"
#: api/ceilometer.py:1095
msgid "Creation requests for this port"
@@ -169,7 +170,7 @@ msgstr "Requisições de atualização para esta porta"
#: api/ceilometer.py:1103
msgid "Existence of router"
-msgstr ""
+msgstr "Rota já existe"
#: api/ceilometer.py:1107
msgid "Creation requests for this router"
@@ -201,15 +202,15 @@ msgstr "Tamanho da imagem enviada"
#: api/ceilometer.py:1148
msgid "Number of image updates"
-msgstr ""
+msgstr "Número de atualizações na imagem"
#: api/ceilometer.py:1152
msgid "Number of image uploads"
-msgstr ""
+msgstr "Numero de envios da imagem"
#: api/ceilometer.py:1156
msgid "Number of image deletions"
-msgstr ""
+msgstr "Numero de imagens detetadas"
#: api/ceilometer.py:1160
msgid "Image is downloaded"
@@ -221,7 +222,7 @@ msgstr "Imagem está servida"
#: api/ceilometer.py:1181
msgid "Existence of volume"
-msgstr ""
+msgstr "Volume já existe!"
#: api/ceilometer.py:1185
msgid "Size of volume"
@@ -261,15 +262,15 @@ msgstr "Consumo de energia"
#: api/ceilometer.py:1260
msgid "System Current Power"
-msgstr ""
+msgstr "Energia atual do sistema"
#: api/ceilometer.py:1264
msgid "Fan RPM"
-msgstr ""
+msgstr "Rotações por minutos da ventoinha"
#: api/ceilometer.py:1268
msgid "Sensor Temperature Reading"
-msgstr ""
+msgstr "Leitura do sensor de temperatura"
#: api/ceilometer.py:1272
msgid "Sensor Current Reading"
@@ -277,7 +278,7 @@ msgstr "Leitura atual do sensor"
#: api/ceilometer.py:1276
msgid "Sensor Voltage Reading"
-msgstr ""
+msgstr "Leitura do Sensor de Voltagem"
#: api/ceilometer.py:1280
msgid "System Inlet Temperature Reading"
@@ -349,7 +350,7 @@ msgstr ""
#: api/lbaas.py:191
msgid "Unable to get pool detail."
-msgstr ""
+msgstr "Não foi possível obter os detalhes do pool."
#: api/lbaas.py:203
#, python-format
@@ -1405,7 +1406,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Público"
@@ -1639,7 +1640,7 @@ msgstr "Migração em tempo real"
#: dashboards/admin/hypervisors/compute/forms.py:109
msgid "Cold Migrate"
-msgstr ""
+msgstr "Migração a frio"
#: dashboards/admin/hypervisors/compute/forms.py:120
#: dashboards/admin/hypervisors/compute/forms.py:127
@@ -1656,12 +1657,12 @@ msgstr "Migração de Bloco"
#: dashboards/admin/hypervisors/compute/forms.py:159
#, python-format
msgid "Starting to migrate host: %(current)s"
-msgstr ""
+msgstr "Iniciando a migração do host: %(current)s"
#: dashboards/admin/hypervisors/compute/forms.py:164
#, python-format
msgid "Failed to migrate host \"%s\"."
-msgstr ""
+msgstr "Falha ao migrar o host \"%s\"."
#: dashboards/admin/hypervisors/compute/tables.py:26
#: dashboards/admin/hypervisors/compute/views.py:30
@@ -1739,7 +1740,7 @@ msgstr "Zona"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1815,7 +1816,7 @@ msgstr "Nome do host"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1944,7 +1945,7 @@ msgstr "Não é possível atualizar os metadados da imagem."
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1975,7 +1976,7 @@ msgstr "Tamanho Max. (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2134,15 +2135,15 @@ msgstr "Agentes de Rede"
#: dashboards/admin/info/tables.py:208
msgid "Engine Id"
-msgstr ""
+msgstr "Identificador do Motor"
#: dashboards/admin/info/tables.py:210
msgid "Topic"
-msgstr ""
+msgstr "Topico"
#: dashboards/admin/info/tables.py:225
msgid "Orchestration Services"
-msgstr ""
+msgstr "Serviços de orquestração"
#: dashboards/admin/info/tabs.py:74
msgid "Unable to get cinder services list."
@@ -2204,7 +2205,7 @@ msgstr "A migração em tempo real da instância para o host falhou \"%s\"."
#: dashboards/admin/instances/tables.py:37
msgid "Migrating instances may cause some unrecoverable results."
-msgstr ""
+msgstr "Migrando Instâncias pode causar alguns resultados irrecuperáveis."
#: dashboards/admin/instances/tables.py:42
msgid "Migrate Instance"
@@ -2225,7 +2226,7 @@ msgstr "Migração em tempo real da instância"
#: dashboards/admin/instances/tables.py:94
msgid "Project ="
-msgstr ""
+msgstr "Projeto ="
#: dashboards/admin/instances/tables.py:95
msgid "Host ="
@@ -2285,7 +2286,7 @@ msgstr "Endereço IP"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2356,7 +2357,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/forms.py:46
#: dashboards/admin/metadata_defs/forms.py:50
msgid "Metadata Definition File"
-msgstr ""
+msgstr "Arquivo de Definição de Metadados"
#: dashboards/admin/metadata_defs/forms.py:41
#: dashboards/project/instances/workflows/create_instance.py:611
@@ -2382,7 +2383,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Protegido"
@@ -2424,7 +2425,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/index.html:3
#: dashboards/admin/metadata_defs/views.py:40
msgid "Metadata Definitions"
-msgstr ""
+msgstr "Definição de Metadados"
#: dashboards/admin/metadata_defs/tables.py:30
#: dashboards/admin/metadata_defs/templates/metadata_defs/_create.html:9
@@ -2541,7 +2542,7 @@ msgstr "Descrição"
#: dashboards/project/stacks/resource_types/templates/stacks.resource_types/index.html:3
#: dashboards/project/stacks/resource_types/views.py:33
msgid "Resource Types"
-msgstr ""
+msgstr "Tipo de recusos"
#: dashboards/admin/metadata_defs/tables.py:165
msgid "Namespaces"
@@ -2559,7 +2560,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/tabs.py:45
msgid "Contents"
-msgstr ""
+msgstr "Conteúdos"
#: dashboards/admin/metadata_defs/tabs.py:57
msgid "Unable to retrieve namespace contents."
@@ -2581,7 +2582,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_contents.html:4
msgid "Undefined"
-msgstr ""
+msgstr "Indefinido"
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:7
#: dashboards/admin/volumes/templates/volumes/volume_types/_volume_encryption_type_detail.html:8
@@ -2674,7 +2675,7 @@ msgstr ""
#: dashboards/admin/volumes/templates/volumes/snapshots/_detail_overview.html:35
#: dashboards/project/access_and_security/templates/access_and_security/keypairs/detail.html:18
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:82
-#: dashboards/project/data_processing/jobs/workflows/launch.py:407
+#: dashboards/project/data_processing/jobs/workflows/launch.py:409
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:402
#: dashboards/project/database_backups/tables.py:165
#: dashboards/project/database_backups/templates/database_backups/details.html:32
@@ -2727,7 +2728,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:39
msgid "Prefix: "
-msgstr ""
+msgstr "Prefixo:"
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:42
msgid "Properties Target: "
@@ -2754,7 +2755,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/resource_types.html:15
msgid "Available Types"
-msgstr ""
+msgstr "Tipos disponíveis"
#: dashboards/admin/metadata_defs/templates/metadata_defs/resource_types.html:19
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_fields_help.html:3
@@ -2790,7 +2791,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/views.py:76
msgid "Error getting metadata definitions."
-msgstr ""
+msgstr "Erro recuperando definições de metadados."
#: dashboards/admin/metadata_defs/views.py:93
msgid "Namespace Details: {{ namespace.namespace }}"
@@ -2893,7 +2894,7 @@ msgstr "Valor (Médio)"
#: dashboards/admin/metering/tables.py:49
#: dashboards/admin/metering/views.py:107
msgid "Unit"
-msgstr ""
+msgstr "Unidade"
#: dashboards/admin/metering/tables.py:56
msgid "Daily Usage Report"
@@ -2937,7 +2938,7 @@ msgstr "Kwapi"
#: dashboards/admin/metering/tabs.py:69 dashboards/admin/metering/views.py:131
msgid "IPMI"
-msgstr ""
+msgstr "IPMI"
#: dashboards/admin/metering/tabs.py:82 dashboards/admin/metering/views.py:70
#: dashboards/admin/metering/views.py:142
@@ -3694,11 +3695,11 @@ msgstr "ID do Projeto"
#: dashboards/admin/networks/templates/networks/ports/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:15
msgid "MAC Address"
-msgstr ""
+msgstr "Endereço MAC"
#: dashboards/admin/networks/templates/networks/ports/_detail_overview.html:23
msgid "On"
-msgstr ""
+msgstr "Ligado"
#: dashboards/admin/networks/templates/networks/ports/_detail_overview.html:25
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:25
@@ -3730,7 +3731,7 @@ msgstr ""
#: dashboards/admin/networks/templates/networks/ports/_detail_overview.html:52
msgid "Profile"
-msgstr ""
+msgstr "Perfil"
#: dashboards/admin/networks/templates/networks/ports/_detail_overview.html:54
msgid "VIF Type"
@@ -3743,7 +3744,7 @@ msgstr ""
#: dashboards/admin/networks/templates/networks/ports/_detail_overview.html:69
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:51
msgid "VNIC Type"
-msgstr ""
+msgstr "Tipo de VNIC"
#: dashboards/admin/networks/templates/networks/ports/_update.html:6
#: dashboards/project/networks/templates/networks/ports/_update.html:6
@@ -4173,11 +4174,11 @@ msgstr "Cifra"
#: dashboards/admin/volumes/volume_types/forms.py:36
#: dashboards/project/volumes/templates/volumes/volumes/_encryption_detail_overview.html:19
msgid "Key Size (bits)"
-msgstr ""
+msgstr "Tamanho da chave (bits)"
#: dashboards/admin/volumes/templates/volumes/volume_types/_volume_encryption_type_detail.html:25
msgid "Volume Type is Unencrypted."
-msgstr ""
+msgstr "Volume do tipo não Encriptado."
#: dashboards/admin/volumes/templates/volumes/volume_types/associate_qos_spec.html:3
msgid "Associate QoS Spec"
@@ -4318,7 +4319,7 @@ msgstr "Detalhes do Volume"
#: dashboards/admin/volumes/volumes/tables.py:33
#: dashboards/admin/volumes/volumes/views.py:47
msgid "Manage Volume"
-msgstr ""
+msgstr "Gerenciar Volume"
#: dashboards/admin/volumes/templates/volumes/volumes/unmanage_volume.html:3
#: dashboards/admin/volumes/volumes/tables.py:43
@@ -4390,7 +4391,7 @@ msgstr[1] "Especificações Extras Excluídas"
#: dashboards/project/data_processing/data_sources/workflows/create.py:95
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create.html:25
#: dashboards/project/data_processing/jobs/workflows/create.py:156
-#: dashboards/project/data_processing/jobs/workflows/launch.py:406
+#: dashboards/project/data_processing/jobs/workflows/launch.py:408
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:257
#: dashboards/project/networks/subnets/workflows.py:57
#: dashboards/project/networks/workflows.py:342
@@ -4431,11 +4432,11 @@ msgstr "Não é possível recuperar detalhes do tipo de volume com especificaçÃ
#: dashboards/admin/volumes/volume_types/forms.py:52
#, python-format
msgid "Successfully created encryption for volume type: %s"
-msgstr ""
+msgstr "Criptografia criada com sucesso para o tipo de volume: %s"
#: dashboards/admin/volumes/volume_types/forms.py:58
msgid "Unable to create encrypted volume type."
-msgstr ""
+msgstr "Não é possível criar o tipo de volume criptografado."
#: dashboards/admin/volumes/volume_types/forms.py:64
msgid "QoS Spec to be associated"
@@ -4553,7 +4554,7 @@ msgstr[1] "Tipos de Volume Excluídos"
#: dashboards/admin/volumes/volume_types/tables.py:73
msgid "Create Encryption"
-msgstr ""
+msgstr "Criar Encriptação"
#: dashboards/admin/volumes/volume_types/tables.py:94
msgid "Delete Encryption"
@@ -4671,7 +4672,7 @@ msgstr "Metadados inseridos em um formato inválido. Insira os metadados em pare
#: dashboards/admin/volumes/volumes/forms.py:48
msgid "Identifier"
-msgstr ""
+msgstr "Identificador"
#: dashboards/admin/volumes/volumes/forms.py:49
msgid "Name or other identifier for existing volume"
@@ -4679,7 +4680,7 @@ msgstr ""
#: dashboards/admin/volumes/volumes/forms.py:51
msgid "Identifier Type"
-msgstr ""
+msgstr "Tipo de Identificador"
#: dashboards/admin/volumes/volumes/forms.py:52
msgid "Type of backend device identifier provided"
@@ -4693,7 +4694,7 @@ msgstr ""
#: dashboards/admin/volumes/volumes/forms.py:62
msgid "Volume name to be assigned"
-msgstr ""
+msgstr "Nome do volume a ser atribuído"
#: dashboards/admin/volumes/volumes/forms.py:69
msgid "Comma-separated key=value pairs"
@@ -4725,7 +4726,7 @@ msgstr ""
#: dashboards/admin/volumes/volumes/forms.py:133
msgid "Unable to manage volume."
-msgstr ""
+msgstr "Não é possível gerenciar o volume."
#: dashboards/admin/volumes/volumes/forms.py:159
#, python-format
@@ -4782,11 +4783,11 @@ msgstr ""
#: dashboards/admin/volumes/volumes/views.py:49
msgid "Manage"
-msgstr ""
+msgstr "Gerenciar"
#: dashboards/admin/volumes/volumes/views.py:53
msgid "Manage a Volume"
-msgstr ""
+msgstr "Gerenciar um Volume"
#: dashboards/admin/volumes/volumes/views.py:63
msgid "Confirm Unmanage Volume"
@@ -4822,7 +4823,7 @@ msgstr "Domínios"
#: dashboards/identity/groups/tables.py:91
#: dashboards/identity/projects/tables.py:54
msgid "Manage Members"
-msgstr ""
+msgstr "Gerenciar Membros"
#: dashboards/identity/domains/tables.py:55
#: dashboards/identity/projects/tables.py:70
@@ -5127,7 +5128,7 @@ msgstr "ID de Usuário"
#: dashboards/identity/groups/tables.py:200
msgid "False"
-msgstr ""
+msgstr "Falso"
#: dashboards/identity/groups/tables.py:206
msgid "Group Members"
@@ -5254,11 +5255,11 @@ msgstr "Este nome já foi definido."
#: dashboards/identity/projects/templates/projects/_detail_overview.html:3
msgid "Project Overview"
-msgstr ""
+msgstr "Visão do projeto"
#: dashboards/identity/projects/templates/projects/detail.html:3
msgid "Project Details"
-msgstr ""
+msgstr "Detalhes do Projeto"
#: dashboards/identity/projects/templates/projects/usage.html:3
msgid "Project Usage Overview"
@@ -5384,7 +5385,7 @@ msgstr "Não foi possível setar cotas do projeto."
#: dashboards/identity/projects/workflows.py:535
msgid "You cannot disable your current project"
-msgstr ""
+msgstr "Você não pode desabilitar o projeto corente"
#: dashboards/identity/projects/workflows.py:552
msgid "Edit the project details."
@@ -5400,32 +5401,32 @@ msgstr "Projeto \"%s\" modificado."
msgid "Unable to modify project \"%s\"."
msgstr "Não foi possível modificar o projeto \"%s\"."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "Você não pode revogar seus privilégios administrativos do projeto que está atualmente logado. Por favor troque para outro projeto com privilégios administrativos ou remova o papel administrativo via linha de comando."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", atualiza grupos de projeto"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Falha ao modificar %(users_to_modify)s membros de projeto s%(group_msg)s e atualizar cotas de projeto."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Falha ao modificar %s membros de projeto, atualizar grupos de projeto e atualizar cotas de projeto."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -5570,19 +5571,19 @@ msgstr "Senha de Administrador"
#: dashboards/identity/users/forms.py:249
msgid "The admin password is incorrect."
-msgstr ""
+msgstr "A senha do administrador está incorreta."
#: dashboards/identity/users/forms.py:258
msgid "Password changed. Please log in to continue."
-msgstr ""
+msgstr "Senha alterada. Por favor efetue login para continuar."
#: dashboards/identity/users/forms.py:261
msgid "User password has been updated successfully."
-msgstr ""
+msgstr "A senha do usuário foi atualizado com sucesso."
#: dashboards/identity/users/forms.py:264
msgid "Unable to update the user password."
-msgstr ""
+msgstr "Não é possível atualizar a senha do usuário."
#: dashboards/identity/users/panel.py:27
#: dashboards/identity/users/tables.py:246
@@ -5666,7 +5667,7 @@ msgstr "Cria um novo usuário e define as propriedades relaciondas incluindo o P
#: dashboards/identity/users/templates/users/_detail_overview.html:3
msgid "User Overview"
-msgstr ""
+msgstr "Visão do usuário"
#: dashboards/identity/users/templates/users/_update.html:6
msgid "Edit the user's details, including the Primary Project."
@@ -5674,7 +5675,7 @@ msgstr ""
#: dashboards/identity/users/templates/users/detail.html:3
msgid "User Details"
-msgstr ""
+msgstr "Detalhes do usuário"
#: dashboards/identity/users/templates/users/update.html:3
#: dashboards/identity/users/views.py:76 dashboards/identity/users/views.py:79
@@ -5701,7 +5702,7 @@ msgstr ""
#: dashboards/identity/users/views.py:195
msgid "Unable to retrieve user details."
-msgstr ""
+msgstr "Não foi possível obter os detalhes do usuário."
#: dashboards/project/access_and_security/api_access/tables.py:33
#: dashboards/project/access_and_security/api_access/tables.py:34
@@ -5878,7 +5879,7 @@ msgstr "Instância"
msgid ""
"Select the IP address you wish to associate with the selected instance or "
"port."
-msgstr ""
+msgstr "Selecione o endereço IP que você deseja associar com a instância ou porta selecionada."
#: dashboards/project/access_and_security/floating_ips/workflows.py:47
msgid "Port to be associated"
@@ -6007,7 +6008,7 @@ msgstr "Impressão Digital"
#: dashboards/project/access_and_security/keypairs/views.py:73
#: dashboards/project/access_and_security/templates/access_and_security/keypairs/detail.html:4
msgid "Key Pair Details"
-msgstr ""
+msgstr "Detalhes do Par de Chaves"
#: dashboards/project/access_and_security/keypairs/views.py:82
#, python-format
@@ -6302,11 +6303,11 @@ msgstr "Qualquer"
#: dashboards/project/access_and_security/security_groups/tables.py:274
msgid "Remote IP Prefix"
-msgstr ""
+msgstr "Prefixo do endereço IP Remoto"
#: dashboards/project/access_and_security/security_groups/tables.py:276
msgid "Remote Security Group"
-msgstr ""
+msgstr "Grupo de Segurança Remoto"
#: dashboards/project/access_and_security/security_groups/views.py:43
msgid ""
@@ -7145,7 +7146,7 @@ msgstr "Modelo não especificado"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:37
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:133
msgid "Proxy Gateway"
-msgstr ""
+msgstr "Proxy Gateway"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:29
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
@@ -7224,7 +7225,7 @@ msgid "Unable to fetch plugin list."
msgstr "Não foi possível obter lista de plugin"
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:53
-#: dashboards/project/data_processing/jobs/workflows/launch.py:354
+#: dashboards/project/data_processing/jobs/workflows/launch.py:356
msgid "Plugin name"
msgstr "Nome do Plugin"
@@ -7241,7 +7242,7 @@ msgid "Next"
msgstr "Próximo"
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:83
-#: dashboards/project/data_processing/jobs/workflows/launch.py:408
+#: dashboards/project/data_processing/jobs/workflows/launch.py:410
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:403
msgid "Could not create"
msgstr "Não foi possível criar"
@@ -7308,7 +7309,7 @@ msgstr "Não foi possível atualizar a linha"
#: dashboards/project/data_processing/clusters/tables.py:136
#: dashboards/project/data_processing/clusters/views.py:80
#: dashboards/project/data_processing/clusters/workflows/create.py:201
-#: dashboards/project/data_processing/jobs/workflows/launch.py:312
+#: dashboards/project/data_processing/jobs/workflows/launch.py:314
msgid "Configure Cluster"
msgstr "Configurar Cluster"
@@ -7416,7 +7417,7 @@ msgid "Unable to fetch cluster list"
msgstr "Não foi possível obter a lista de cluster"
#: dashboards/project/data_processing/clusters/workflows/create.py:46
-#: dashboards/project/data_processing/jobs/workflows/launch.py:394
+#: dashboards/project/data_processing/jobs/workflows/launch.py:396
msgid "Select plugin and hadoop version for cluster"
msgstr "Escolha um plugin e versão do Hadoop para clusters"
@@ -7453,8 +7454,8 @@ msgid "No Templates Available"
msgstr "Nenhum Modelo Disponível"
#: dashboards/project/data_processing/clusters/workflows/create.py:220
-#: dashboards/project/data_processing/jobs/workflows/launch.py:331
-#: dashboards/project/data_processing/jobs/workflows/launch.py:416
+#: dashboards/project/data_processing/jobs/workflows/launch.py:333
+#: dashboards/project/data_processing/jobs/workflows/launch.py:418
#: dashboards/project/databases/workflows/create_instance.py:335
#: dashboards/project/images/images/tables.py:62
#: dashboards/project/instances/workflows/create_instance.py:820
@@ -7737,7 +7738,7 @@ msgid "Data Source Details"
msgstr "Detalhes do Data Source"
#: dashboards/project/data_processing/data_sources/views.py:46
-#: dashboards/project/data_processing/jobs/workflows/launch.py:75
+#: dashboards/project/data_processing/jobs/workflows/launch.py:77
msgid "Unable to fetch data sources."
msgstr "Não foi possível obter Data Sources."
@@ -7926,22 +7927,22 @@ msgid "Jobs"
msgstr "Trabalhos"
#: dashboards/project/data_processing/job_executions/tables.py:38
-#: dashboards/project/data_processing/jobs/workflows/launch.py:56
-#: dashboards/project/data_processing/jobs/workflows/launch.py:97
-#: dashboards/project/data_processing/jobs/workflows/launch.py:122
+#: dashboards/project/data_processing/jobs/workflows/launch.py:58
+#: dashboards/project/data_processing/jobs/workflows/launch.py:99
+#: dashboards/project/data_processing/jobs/workflows/launch.py:124
msgid "Job"
msgstr "Trabalho"
#: dashboards/project/data_processing/job_executions/tables.py:39
#: dashboards/project/data_processing/job_executions/tables.py:198
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:16
-#: dashboards/project/data_processing/jobs/workflows/launch.py:104
+#: dashboards/project/data_processing/jobs/workflows/launch.py:106
msgid "Cluster"
msgstr "Cluster"
#: dashboards/project/data_processing/job_executions/tables.py:45
msgid "Job Guide"
-msgstr ""
+msgstr "Guia de tarefa"
#: dashboards/project/data_processing/job_executions/tables.py:53
msgid "Delete Job"
@@ -7961,9 +7962,9 @@ msgstr[1] "Jobs Excluídos"
#: dashboards/project/data_processing/jobs/views.py:83
#: dashboards/project/data_processing/jobs/views.py:104
#: dashboards/project/data_processing/jobs/views.py:117
-#: dashboards/project/data_processing/jobs/workflows/launch.py:330
-#: dashboards/project/data_processing/jobs/workflows/launch.py:405
-#: dashboards/project/data_processing/jobs/workflows/launch.py:415
+#: dashboards/project/data_processing/jobs/workflows/launch.py:332
+#: dashboards/project/data_processing/jobs/workflows/launch.py:407
+#: dashboards/project/data_processing/jobs/workflows/launch.py:417
msgid "Launch Job"
msgid_plural "Launch Jobs"
msgstr[0] "Disparar Job"
@@ -8003,7 +8004,7 @@ msgstr "Não disponível"
#: dashboards/project/data_processing/job_executions/tables.py:176
msgctxt "Current status of a Job"
msgid "Done with Error"
-msgstr ""
+msgstr "Finalizado com erro"
#: dashboards/project/data_processing/job_executions/tables.py:178
msgctxt "Current status of a Job"
@@ -8013,18 +8014,18 @@ msgstr "Falhou"
#: dashboards/project/data_processing/job_executions/tables.py:180
msgctxt "Current status of a Job"
msgid "Killed"
-msgstr ""
+msgstr "Morto"
#: dashboards/project/data_processing/job_executions/tables.py:182
msgctxt "Current status of a Job"
msgid "Succeeded"
-msgstr ""
+msgstr "Bem sucedido"
#: dashboards/project/data_processing/job_executions/tables.py:193
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:10
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_details.html:3
msgid "Job Template"
-msgstr ""
+msgstr "Modelo de Tarefa"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:3
msgid "Job Overview"
@@ -8098,7 +8099,7 @@ msgstr "Detalhes da execução do Job"
#: dashboards/project/data_processing/jobs/tables.py:111
#: dashboards/project/data_processing/jobs/views.py:41
msgid "Job Templates"
-msgstr ""
+msgstr "Modelos de Tarefa"
#: dashboards/project/data_processing/jobs/tables.py:36
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/create.html:3
@@ -8106,7 +8107,7 @@ msgstr ""
#: dashboards/project/data_processing/jobs/workflows/create.py:124
#: dashboards/project/data_processing/jobs/workflows/create.py:155
msgid "Create Job Template"
-msgstr ""
+msgstr "Criar um modelo de tarefa"
#: dashboards/project/data_processing/jobs/tables.py:46
msgid "Delete Job Template"
@@ -8263,7 +8264,7 @@ msgid "Chosen Libraries"
msgstr "Bibliotecas escolhidas"
#: dashboards/project/data_processing/jobs/views.py:53
-#: dashboards/project/data_processing/jobs/workflows/launch.py:89
+#: dashboards/project/data_processing/jobs/workflows/launch.py:91
msgid "Unable to fetch jobs."
msgstr "Não foi possível obter jobs"
@@ -8310,69 +8311,69 @@ msgstr ""
msgid "Input"
msgstr "Input"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:45
+#: dashboards/project/data_processing/jobs/workflows/launch.py:46
msgid "Output"
msgstr "Output"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:114
+#: dashboards/project/data_processing/jobs/workflows/launch.py:116
msgid "Unable to fetch clusters."
msgstr "Não foi possível obter clusters."
-#: dashboards/project/data_processing/jobs/workflows/launch.py:154
+#: dashboards/project/data_processing/jobs/workflows/launch.py:156
msgid "Main Class"
msgstr "Classe principal"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:157
+#: dashboards/project/data_processing/jobs/workflows/launch.py:159
msgid "Java Opts"
msgstr "Java Opts"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:160
+#: dashboards/project/data_processing/jobs/workflows/launch.py:162
msgid "Mapper"
msgstr "Mapeador"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:162
+#: dashboards/project/data_processing/jobs/workflows/launch.py:164
msgid "Reducer"
msgstr "Redutor"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:230
+#: dashboards/project/data_processing/jobs/workflows/launch.py:232
msgid "Configure"
msgstr "Configurar"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:308
+#: dashboards/project/data_processing/jobs/workflows/launch.py:310
msgid "Persist cluster after job exit"
msgstr "Persistir cluster após sair do job"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:332
-#: dashboards/project/data_processing/jobs/workflows/launch.py:417
+#: dashboards/project/data_processing/jobs/workflows/launch.py:334
+#: dashboards/project/data_processing/jobs/workflows/launch.py:419
msgid "Job launched"
msgstr "Job iniciado"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:333
-#: dashboards/project/data_processing/jobs/workflows/launch.py:418
+#: dashboards/project/data_processing/jobs/workflows/launch.py:335
+#: dashboards/project/data_processing/jobs/workflows/launch.py:420
msgid "Could not launch job"
msgstr "Não foi possível iniciar o trabalho"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:359
+#: dashboards/project/data_processing/jobs/workflows/launch.py:361
msgid "Job configs"
msgstr "Job configurações"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:363
+#: dashboards/project/data_processing/jobs/workflows/launch.py:365
msgid "Job args"
msgstr "Job Argumentos"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:367
+#: dashboards/project/data_processing/jobs/workflows/launch.py:369
msgid "Job params"
msgstr "Job parâmetros"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:373
+#: dashboards/project/data_processing/jobs/workflows/launch.py:375
msgid "Job Execution ID"
msgstr "ID de execução do JOB"
-#: dashboards/project/data_processing/jobs/workflows/launch.py:449
+#: dashboards/project/data_processing/jobs/workflows/launch.py:451
msgid "Unable to create new cluster for job."
msgstr "Não é possível criar novo cluster para o JOB."
-#: dashboards/project/data_processing/jobs/workflows/launch.py:462
+#: dashboards/project/data_processing/jobs/workflows/launch.py:464
msgid "Unable to launch job."
msgstr "Não é possível iniciar o job."
@@ -8649,7 +8650,7 @@ msgstr ""
#: dashboards/project/data_processing/wizard/panel.py:22
msgid "Guides"
-msgstr ""
+msgstr "Guias"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/_job_type_select.html:13
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/job_type_select.html:3
@@ -8660,7 +8661,7 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/_job_type_select.html:28
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/_plugin_select.html:28
msgid "Select"
-msgstr ""
+msgstr "Selecionar"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/_job_type_select_help.html:3
msgid ""
@@ -8674,7 +8675,7 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/plugin_select.html:3
#: dashboards/project/data_processing/wizard/views.py:90
msgid "Choose plugin and version"
-msgstr ""
+msgstr "Escolha o Plugin e a versão"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/_plugin_select_help.html:3
msgid ""
@@ -8697,7 +8698,7 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/cluster_guide.html:23
msgid "Choose plugin"
-msgstr ""
+msgstr "Escolha o Plugin"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/cluster_guide.html:24
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/cluster_guide.html:60
@@ -8708,15 +8709,15 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/cluster_guide.html:27
msgid "Plugin:"
-msgstr ""
+msgstr "Plugin:"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/cluster_guide.html:29
msgid "Version:"
-msgstr ""
+msgstr "Versão:"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/cluster_guide.html:34
msgid "No plugin chosen"
-msgstr ""
+msgstr "Nenhum Plugin escolhido"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/cluster_guide.html:43
msgid ""
@@ -8818,15 +8819,15 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:21
msgid "Select type"
-msgstr ""
+msgstr "Selecione o tipo"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:24
msgid "Current type:"
-msgstr ""
+msgstr "Tipo atual:"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:31
msgid "No type chosen"
-msgstr ""
+msgstr "Nenhum tipo escolhido"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:42
msgid ""
@@ -8840,7 +8841,7 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:52
msgid "Create a data source"
-msgstr ""
+msgstr "Criar um data source"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:61
msgid ""
@@ -8858,7 +8859,7 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:73
msgid "Job template:"
-msgstr ""
+msgstr "Modelo de tarefa:"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:80
msgid "No job template created"
@@ -8877,7 +8878,7 @@ msgstr ""
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:99
msgid "Launch job"
-msgstr ""
+msgstr "Disparar tarefa"
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:108
#: dashboards/project/data_processing/wizard/templates/data_processing.wizard/jobex_guide.html:110
@@ -8966,7 +8967,7 @@ msgstr "Falhou"
#: dashboards/project/database_backups/tables.py:45
msgctxt "Current status of a Database Backup"
msgid "New"
-msgstr ""
+msgstr "Novo"
#: dashboards/project/database_backups/tables.py:47
msgctxt "Current status of a Database Backup"
@@ -9352,7 +9353,7 @@ msgstr "Backup"
#: dashboards/project/databases/tables.py:311
msgctxt "Current status of a Database Instance"
msgid "Shutdown"
-msgstr ""
+msgstr "Desligar"
#: dashboards/project/databases/tables.py:313
msgctxt "Current status of a Database Instance"
@@ -9362,7 +9363,7 @@ msgstr "Erro"
#: dashboards/project/databases/tables.py:316
msgctxt "Current status of a Database Instance"
msgid "Restart Required"
-msgstr ""
+msgstr "Reinicio Solicitado"
#: dashboards/project/databases/tables.py:330
#: dashboards/project/databases/templates/databases/_detail_overview.html:32
@@ -9408,15 +9409,15 @@ msgstr "Visão geral da Instância"
#: dashboards/project/databases/templates/databases/_detail_overview.html:47
msgid "Replication"
-msgstr ""
+msgstr "Replicação"
#: dashboards/project/databases/templates/databases/_detail_overview.html:51
msgid "Is a Replica Of"
-msgstr ""
+msgstr "É uma réplica do"
#: dashboards/project/databases/templates/databases/_detail_overview.html:59
msgid "Replicas"
-msgstr ""
+msgstr "Replicas"
#: dashboards/project/databases/templates/databases/_detail_overview_cassandra.html:6
#: dashboards/project/databases/templates/databases/_detail_overview_couchbase.html:6
@@ -9669,7 +9670,7 @@ msgstr ""
#: dashboards/project/databases/workflows/create_instance.py:230
msgid "Choose initial state."
-msgstr ""
+msgstr "escolha o estado inicial"
#: dashboards/project/databases/workflows/create_instance.py:233
msgid "Restore from Backup"
@@ -9700,7 +9701,7 @@ msgstr ""
#: dashboards/project/databases/workflows/create_instance.py:259
msgid "Advanced"
-msgstr ""
+msgstr "Avançado"
#: dashboards/project/databases/workflows/create_instance.py:271
msgid "Select backup"
@@ -9708,7 +9709,7 @@ msgstr "Selecionar Backup"
#: dashboards/project/databases/workflows/create_instance.py:285
msgid "Select instance"
-msgstr ""
+msgstr "Selecione uma instância"
#: dashboards/project/databases/workflows/create_instance.py:302
msgid "Unable to find backup!"
@@ -10043,11 +10044,11 @@ msgstr "Editar Firewall"
#: dashboards/project/firewalls/tables.py:199
msgid "Add Router"
-msgstr ""
+msgstr "Adicionar Roteador "
#: dashboards/project/firewalls/tables.py:222
msgid "Remove Router"
-msgstr ""
+msgstr "Remover Roteaor"
#: dashboards/project/firewalls/tables.py:261
msgctxt "Action Name of a Firewall Rule"
@@ -10116,22 +10117,22 @@ msgstr "Criado"
#: dashboards/project/firewalls/tables.py:325
msgctxt "Current status of a Firewall"
msgid "Pending Create"
-msgstr ""
+msgstr "Aguardando a Criação"
#: dashboards/project/firewalls/tables.py:327
msgctxt "Current status of a Firewall"
msgid "Pending Update"
-msgstr ""
+msgstr "Aguardando a Atualização"
#: dashboards/project/firewalls/tables.py:329
msgctxt "Current status of a Firewall"
msgid "Pending Delete"
-msgstr ""
+msgstr "Aguardando a Exclusão"
#: dashboards/project/firewalls/tables.py:331
msgctxt "Current status of a Firewall"
msgid "Inactive"
-msgstr ""
+msgstr "Inativo"
#: dashboards/project/firewalls/tables.py:334
msgctxt "Admin state of a Firewall"
@@ -10145,7 +10146,7 @@ msgstr ""
#: dashboards/project/firewalls/tables.py:345
msgid "Associated Routers"
-msgstr ""
+msgstr "Roteadores Relacionados"
#: dashboards/project/firewalls/tables.py:369
#, python-format
@@ -10257,11 +10258,11 @@ msgstr ""
#: dashboards/project/firewalls/templates/firewalls/_update_routers.html:8
msgid "Selected Routers"
-msgstr ""
+msgstr "Roteadores Selecionados"
#: dashboards/project/firewalls/templates/firewalls/_update_routers.html:11
msgid "Available Routers"
-msgstr ""
+msgstr "Roteadores disponíveis"
#: dashboards/project/firewalls/templates/firewalls/_update_rule_help.html:3
msgid ""
@@ -10295,7 +10296,7 @@ msgstr "Você pode atualizar detalhes da regra aqui."
#: dashboards/project/firewalls/views.py:368
#: dashboards/project/firewalls/views.py:371
msgid "Add Router to Firewall"
-msgstr ""
+msgstr "Adicionar Roteador ao Firewall"
#: dashboards/project/firewalls/templates/firewalls/addfirewall.html:3
#: dashboards/project/firewalls/views.py:107
@@ -10321,7 +10322,7 @@ msgstr "Inserir regra para a Política"
#: dashboards/project/firewalls/views.py:376
#: dashboards/project/firewalls/views.py:379
msgid "Remove Router from Firewall"
-msgstr ""
+msgstr "Remover Roteador do Firewall"
#: dashboards/project/firewalls/templates/firewalls/remove_rule_from_policy.html:3
#: dashboards/project/firewalls/views.py:295
@@ -10524,7 +10525,7 @@ msgstr "Uma imagem local para enviar."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Formato"
@@ -10582,7 +10583,7 @@ msgstr "Sua imagem %s está na fila para criação."
#: dashboards/project/images/images/forms.py:195
msgid "Unable to create new image"
-msgstr ""
+msgstr "Não foi possível criar a nova imagem"
#: dashboards/project/images/images/forms.py:199
#, python-format
@@ -10628,7 +10629,7 @@ msgstr[1] "Imagens Excluídas"
#: dashboards/project/images/images/tables.py:129
msgid "Edit Image"
-msgstr ""
+msgstr "Editar imagem"
#: dashboards/project/images/images/tables.py:146
#: dashboards/project/volumes/snapshots/tables.py:93
@@ -10644,36 +10645,51 @@ msgstr "Criar Volume"
msgid "Shared with Me"
msgstr "Compartilhado Comigo"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Ativo"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
-msgstr ""
+msgstr "Aguardando a Exclusão"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
-msgstr ""
+msgstr "Morto"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Excluído"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Imagem"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Snapshot"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Não foi possível recuperar a imagem."
@@ -11294,12 +11310,12 @@ msgstr "Reiniciar"
#: dashboards/project/instances/tables.py:931
msgctxt "Task status of an Instance"
msgid "Reboot Pending"
-msgstr ""
+msgstr "Reinicio Pendente"
#: dashboards/project/instances/tables.py:933
msgctxt "Task status of an Instance"
msgid "Reboot Started"
-msgstr ""
+msgstr "Reinicio Iniciado"
#: dashboards/project/instances/tables.py:935
msgctxt "Task status of an Instance"
@@ -11556,7 +11572,7 @@ msgstr "Visualizar log completo"
#: dashboards/project/instances/templates/instances/_detail_overview.html:20
msgid "Time Since Created"
-msgstr ""
+msgstr "Tempo Desde Criado"
#: dashboards/project/instances/templates/instances/_detail_overview.html:29
msgid "Fault"
@@ -11736,7 +11752,7 @@ msgstr "Não há redes disponíveis"
#: dashboards/project/instances/utils.py:103
msgid "Select Network"
-msgstr ""
+msgstr "Selecione a Rede"
#: dashboards/project/instances/utils.py:123
msgid "Unable to retrieve key pairs."
@@ -12060,7 +12076,7 @@ msgstr "Pós-Criação"
#: dashboards/project/instances/workflows/create_instance.py:610
msgid "Select Script Source"
-msgstr ""
+msgstr "Selecione a Origem do Script"
#: dashboards/project/instances/workflows/create_instance.py:615
msgid "Customization Script Source"
@@ -12477,22 +12493,22 @@ msgstr "Criado"
#: dashboards/project/loadbalancers/tables.py:304
msgctxt "Current status of a Pool"
msgid "Pending Create"
-msgstr ""
+msgstr "Aguardando a Criação"
#: dashboards/project/loadbalancers/tables.py:306
msgctxt "Current status of a Pool"
msgid "Pending Update"
-msgstr ""
+msgstr "Aguardando a Atualização"
#: dashboards/project/loadbalancers/tables.py:308
msgctxt "Current status of a Pool"
msgid "Pending Delete"
-msgstr ""
+msgstr "Aguardando a Exclusão"
#: dashboards/project/loadbalancers/tables.py:310
msgctxt "Current status of a Pool"
msgid "Inactive"
-msgstr ""
+msgstr "Inativo"
#: dashboards/project/loadbalancers/tables.py:321
#: dashboards/project/loadbalancers/templates/loadbalancers/_pool_details.html:29
@@ -13205,7 +13221,7 @@ msgstr "Não foi possível obter detalhes da sub-rede"
#: dashboards/project/networks/templates/networks/subnets/detail.html:3
#: dashboards/project/networks/workflows.py:255
msgid "Subnet Details"
-msgstr ""
+msgstr "Detalhes da Sub rede"
#: dashboards/project/networks/subnets/views.py:112
msgid "Unable to retrieve subnet details."
@@ -13939,7 +13955,7 @@ msgstr ""
#: dashboards/project/routers/templates/routers/_detail_overview.html:46
msgid "SNAT"
-msgstr ""
+msgstr "SNAT"
#: dashboards/project/routers/templates/routers/_update.html:6
msgid "You may update the editable properties of your router here."
@@ -14252,15 +14268,15 @@ msgstr "Stacks"
#: dashboards/project/stacks/resource_types/tables.py:26
msgid "AWS compatible"
-msgstr ""
+msgstr "Compativel com AWS"
#: dashboards/project/stacks/resource_types/tables.py:34
msgid "Implementation"
-msgstr ""
+msgstr "Implementação"
#: dashboards/project/stacks/resource_types/tables.py:36
msgid "Component"
-msgstr ""
+msgstr "Componente"
#: dashboards/project/stacks/resource_types/tables.py:38
#: dashboards/project/stacks/tables.py:312
@@ -14270,7 +14286,7 @@ msgstr "Recurso"
#: dashboards/project/stacks/resource_types/templates/stacks.resource_types/_details.html:4
msgid "Resource Type"
-msgstr ""
+msgstr "Tipo de Recurso"
#: dashboards/project/stacks/resource_types/templates/stacks.resource_types/_details.html:12
msgid "Attributes"
@@ -15350,7 +15366,7 @@ msgstr ""
#: dashboards/project/volumes/volumes/forms.py:558
#: dashboards/project/volumes/volumes/forms.py:586
msgid "Authorization Key"
-msgstr ""
+msgstr "Chave de autorização"
#: dashboards/project/volumes/volumes/forms.py:566
#, python-format
@@ -16059,22 +16075,22 @@ msgstr "Criado"
#: dashboards/project/vpn/tables.py:276
msgctxt "Current status of a VPN Service"
msgid "Pending Create"
-msgstr ""
+msgstr "Aguardando a Criação"
#: dashboards/project/vpn/tables.py:278
msgctxt "Current status of a VPN Service"
msgid "Pending Update"
-msgstr ""
+msgstr "Aguardando a Atualização"
#: dashboards/project/vpn/tables.py:280
msgctxt "Current status of a VPN Service"
msgid "Pending Delete"
-msgstr ""
+msgstr "Aguardando a Exclusão"
#: dashboards/project/vpn/tables.py:282
msgctxt "Current status of a VPN Service"
msgid "Inactive"
-msgstr ""
+msgstr "Inativo"
#: dashboards/project/vpn/tables.py:298 dashboards/project/vpn/tabs.py:46
msgid "VPN Services"
diff --git a/openstack_dashboard/locale/ru/LC_MESSAGES/django.po b/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
index db4fed867..8f19df8d6 100644
--- a/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
-"Last-Translator: Ainur Shakirov <ainur.shakirov.tt@gmail.com>\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
+"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/horizon/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1409,7 +1409,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Публичный"
@@ -1623,12 +1623,12 @@ msgstr "Причина"
#: dashboards/admin/hypervisors/compute/forms.py:86
#, python-format
msgid "Disabled compute service for host: %s."
-msgstr ""
+msgstr "Служба вычиÑлений запрещена Ð´Ð»Ñ Ñ…Ð¾Ñта: %s."
#: dashboards/admin/hypervisors/compute/forms.py:91
#, python-format
msgid "Failed to disable compute service for host: %s."
-msgstr ""
+msgstr "Ðе удалоÑÑŒ запретить Ñлужбу вычиÑлений Ð´Ð»Ñ Ñ…Ð¾Ñта: %s."
#: dashboards/admin/hypervisors/compute/forms.py:106
msgid "Running Instance Migration Type"
@@ -1643,7 +1643,7 @@ msgstr "Ð–Ð¸Ð²Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ"
#: dashboards/admin/hypervisors/compute/forms.py:109
msgid "Cold Migrate"
-msgstr ""
+msgstr "Ð¥Ð¾Ð»Ð¾Ð´Ð½Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ"
#: dashboards/admin/hypervisors/compute/forms.py:120
#: dashboards/admin/hypervisors/compute/forms.py:127
@@ -1660,12 +1660,12 @@ msgstr "Ð‘Ð»Ð¾Ñ‡Ð½Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ"
#: dashboards/admin/hypervisors/compute/forms.py:159
#, python-format
msgid "Starting to migrate host: %(current)s"
-msgstr ""
+msgstr "ЗапуÑк миграции хоÑта: %(current)s"
#: dashboards/admin/hypervisors/compute/forms.py:164
#, python-format
msgid "Failed to migrate host \"%s\"."
-msgstr ""
+msgstr "Ðе удалоÑÑŒ мигрировать хоÑÑ‚ \"%s\"."
#: dashboards/admin/hypervisors/compute/tables.py:26
#: dashboards/admin/hypervisors/compute/views.py:30
@@ -1747,7 +1747,7 @@ msgstr "Зона"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1823,7 +1823,7 @@ msgstr "Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð°"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1952,7 +1952,7 @@ msgstr "Ðевозможно обновить метаданные образа"
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1983,7 +1983,7 @@ msgstr "МакÑимальный размер (МБ)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2295,7 +2295,7 @@ msgstr "IP-адреÑ"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2392,7 +2392,7 @@ msgstr ""
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Защищенный"
@@ -5438,32 +5438,32 @@ msgstr "Проект «%s» изменён."
msgid "Unable to modify project \"%s\"."
msgstr "Ðе удалоÑÑŒ изменить проект «%s»."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "Ð’Ñ‹ не можете удалить админиÑтративные привилегии, будучи в данном проекте. ПереключитеÑÑŒ в другой проект Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтративными привилегиÑми или удалите роль админиÑтратора Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ интерфейÑа командной Ñтроки."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", обновление групп проекта"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "Ðе удалоÑÑŒ изменить пользователей %(users_to_modify)s в проекте %(group_msg)s и обновить квоты проекта."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "Ðе удалоÑÑŒ изменить пользователей %s в проекте, обновить группы и квоты проекта."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10613,7 +10613,7 @@ msgstr "Локальный образ Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Формат"
@@ -10735,36 +10735,51 @@ msgstr "Создать диÑк"
msgid "Shared with Me"
msgstr "Ð’ ÑовмеÑтном доÑтупе"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "Ðктивный"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Удалено"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "образ"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Ñнимок"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Ðевозможно получить образ."
diff --git a/openstack_dashboard/locale/sr/LC_MESSAGES/django.po b/openstack_dashboard/locale/sr/LC_MESSAGES/django.po
index 27cefb92b..3358f5b1b 100644
--- a/openstack_dashboard/locale/sr/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/sr/LC_MESSAGES/django.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 09:45+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Serbian (http://www.transifex.com/projects/p/horizon/language/sr/)\n"
"MIME-Version: 1.0\n"
@@ -1406,7 +1406,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "Javni"
@@ -1744,7 +1744,7 @@ msgstr "Zona"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1820,7 +1820,7 @@ msgstr "Hostname"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1949,7 +1949,7 @@ msgstr "Nije moguće ažurirati skup metadata podataka"
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1980,7 +1980,7 @@ msgstr "Max. VeliÄina (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2292,7 +2292,7 @@ msgstr "IP adresa"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2389,7 +2389,7 @@ msgstr "The JSON formatted contents of a namespace."
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "Zaštićeno"
@@ -5435,32 +5435,32 @@ msgstr "Izmenjen projekat \"%s\"."
msgid "Unable to modify project \"%s\"."
msgstr "Nemoguće je izmeniti projekat \"%s\"."
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "Ne možete opozvati administratorske privilegijeu projektu u kome ste ulogovani. Molim prebaciti se na drugi projekat sa administrativnim pravima ili ukinite administrativna prava ruÄno kroz CLI."
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ", izmenite grupe projekta"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "NesupeÅ¡na izmena %(users_to_modify)s Älanovi projekta%(group_msg)s i izmena kvota projekta."
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "NeuspeÅ¡na izmena %s Älanova projekta, izmana grupa projekta i izmena kvota projekta."
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10610,7 +10610,7 @@ msgstr "Lokalni image za prebacivanje."
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "Formatiranje"
@@ -10732,36 +10732,51 @@ msgstr "Kreirajte volume"
msgid "Shared with Me"
msgstr "Podelite sa mnom"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr ""
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr ""
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr ""
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr ""
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr ""
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "Obrisano"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "Image"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "Snapshot"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "Nemoguće je dobiti image."
diff --git a/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po
index 44a212d61..7a833d9fc 100644
--- a/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po
@@ -17,8 +17,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-06 18:42+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/horizon/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
@@ -1407,7 +1407,7 @@ msgstr "ID"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "公有"
@@ -1737,7 +1737,7 @@ msgstr "域"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1813,7 +1813,7 @@ msgstr "主机åå­—"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1942,7 +1942,7 @@ msgstr "无法更新镜åƒå…ƒæ•°æ®"
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1973,7 +1973,7 @@ msgstr "容é‡æœ€å¤§å€¼ (MB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2281,7 +2281,7 @@ msgstr "IP 地å€"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2378,7 +2378,7 @@ msgstr "命å空间的JSONæ ¼å¼å†…容"
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "å—ä¿æŠ¤çš„"
@@ -5368,32 +5368,32 @@ msgstr "已修改的项目\"%s\"。"
msgid "Unable to modify project \"%s\"."
msgstr "无法修改项目\"%s\""
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "你无法从你目å‰ç™»å½•çš„项目中撤销你的管ç†å‘˜æƒé™ã€‚请切æ¢è‡³å…¶ä»–有管ç†å‘˜æƒé™çš„项目,或通过命令行(CLI)手工移除管ç†å‘˜è§’色。"
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr ",更新项目组"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "无法修改 %(users_to_modify)s 项目æˆå‘˜%(group_msg)s 并更新项目é…é¢ã€‚"
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "无法修改 %s 项目æˆå‘˜ï¼Œæ›´æ–°é¡¹ç›®ç»„和项目é…é¢ã€‚"
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10441,7 +10441,7 @@ msgstr "一个待上传的本地镜åƒã€‚"
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "é•œåƒæ ¼å¼"
@@ -10559,36 +10559,51 @@ msgstr "创建云硬盘"
msgid "Shared with Me"
msgstr "与我共享"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "è¿è¡Œä¸­"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "ä¿å­˜ä¸­"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "已排队"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "等待删除完æˆ"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "å·²æ€æ­»"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "已删除"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "é•œåƒ"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "å¿«ç…§"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "无法检索到镜åƒã€‚"
diff --git a/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po
index 31a7ebcbe..4178dee36 100644
--- a/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po
@@ -14,8 +14,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-06 21:08-0500\n"
-"PO-Revision-Date: 2015-04-07 06:11+0000\n"
+"POT-Creation-Date: 2015-04-08 17:57-0500\n"
+"PO-Revision-Date: 2015-04-09 06:52+0000\n"
"Last-Translator: Zhang Xiaowei <zero00072@gmail.com>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/horizon/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
@@ -1404,7 +1404,7 @@ msgstr "識別號"
#: dashboards/project/images/images/forms.py:104
#: dashboards/project/images/images/forms.py:250
#: dashboards/project/images/images/tables.py:185
-#: dashboards/project/images/images/tables.py:274
+#: dashboards/project/images/images/tables.py:283
#: dashboards/project/images/templates/images/images/_detail_overview.html:21
msgid "Public"
msgstr "公開"
@@ -1734,7 +1734,7 @@ msgstr "å€åŸŸ"
#: dashboards/project/databases/templates/databases/_detail_overview.html:18
#: dashboards/project/firewalls/tables.py:347
#: dashboards/project/firewalls/templates/firewalls/_firewall_details.html:25
-#: dashboards/project/images/images/tables.py:269
+#: dashboards/project/images/images/tables.py:278
#: dashboards/project/images/templates/images/images/_detail_overview.html:19
#: dashboards/project/instances/tables.py:1025
#: dashboards/project/instances/templates/instances/_detail_overview.html:14
@@ -1810,7 +1810,7 @@ msgstr "主機å稱"
#: dashboards/project/access_and_security/security_groups/forms.py:185
#: dashboards/project/data_processing/data_sources/tables.py:61
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:9
-#: dashboards/project/images/images/tables.py:266
+#: dashboards/project/images/images/tables.py:275
#: dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html:12
#: dashboards/project/loadbalancers/workflows.py:486
#: dashboards/project/routers/ports/tables.py:115
@@ -1939,7 +1939,7 @@ msgstr "無法更新此映åƒæª”的詮釋資料。"
#: dashboards/admin/images/panel.py:27 dashboards/admin/images/tables.py:77
#: dashboards/admin/images/templates/images/index.html:3
#: dashboards/admin/images/views.py:47
-#: dashboards/project/images/images/tables.py:291
+#: dashboards/project/images/images/tables.py:300
#: dashboards/project/images/panel.py:24
#: dashboards/project/images/templates/images/index.html:3
#: dashboards/project/images/views.py:38
@@ -1970,7 +1970,7 @@ msgstr "最大容é‡ï¼ˆGB)"
#: dashboards/admin/images/tables.py:71
#: dashboards/admin/instances/tables.py:132
-#: dashboards/project/images/images/tables.py:264
+#: dashboards/project/images/images/tables.py:273
#: dashboards/project/instances/tables.py:1015
#: dashboards/project/instances/templates/instances/_detail_overview.html:114
#: dashboards/project/instances/workflows/create_instance.py:108
@@ -2278,7 +2278,7 @@ msgstr "IP ä½å€"
#: dashboards/project/containers/templates/containers/_container_detail.html:22
#: dashboards/project/containers/templates/containers/_object_detail.html:18
#: dashboards/project/databases/tables.py:327
-#: dashboards/project/images/images/tables.py:285
+#: dashboards/project/images/images/tables.py:294
#: dashboards/project/images/templates/images/images/_detail_overview.html:46
#: dashboards/project/instances/tables.py:1020
#: dashboards/project/instances/templates/instances/_instance_flavor.html:7
@@ -2375,7 +2375,7 @@ msgstr "命å空間的 JSON æ ¼å¼å…§å®¹ã€‚"
#: dashboards/admin/metadata_defs/templates/metadata_defs/_detail_overview.html:20
#: dashboards/project/images/images/forms.py:105
#: dashboards/project/images/images/forms.py:251
-#: dashboards/project/images/images/tables.py:278
+#: dashboards/project/images/images/tables.py:287
#: dashboards/project/images/templates/images/images/_detail_overview.html:23
msgid "Protected"
msgstr "ä¿è­·"
@@ -5365,32 +5365,32 @@ msgstr "已更改專案「%sã€ã€‚"
msgid "Unable to modify project \"%s\"."
msgstr "無法更改專案「%sã€ã€‚"
-#: dashboards/identity/projects/workflows.py:660
+#: dashboards/identity/projects/workflows.py:661
msgid ""
"You cannot revoke your administrative privileges from the project you are "
"currently logged into. Please switch to another project with administrative "
"privileges or remove the administrative role manually via the CLI."
msgstr "您ä¸èƒ½å¾žæ­¤å°ˆæ¡ˆè£¡æ’¤éŠ·æ‚¨ç›®å‰å·²ç™»å…¥çš„管ç†å“¡æ¬Šé™ã€‚請以管ç†å“¡æ¬Šé™äº¤æ›åˆ°å…¶ä»–專案或者用命令列介é¢æ‰‹å‹•ç§»é™¤ç®¡ç†å“¡è§’色。"
-#: dashboards/identity/projects/workflows.py:720
+#: dashboards/identity/projects/workflows.py:721
msgid ", update project groups"
msgstr "ã€æ›´æ–°å°ˆæ¡ˆç¾¤çµ„"
-#: dashboards/identity/projects/workflows.py:724
+#: dashboards/identity/projects/workflows.py:725
#, python-format
msgid ""
"Failed to modify %(users_to_modify)s project members%(group_msg)s and update"
" project quotas."
msgstr "更改 %(users_to_modify)s 專案æˆå“¡%(group_msg)s以åŠæ›´æ–°å°ˆæ¡ˆé…é¡æ™‚失敗。"
-#: dashboards/identity/projects/workflows.py:801
+#: dashboards/identity/projects/workflows.py:802
#, python-format
msgid ""
"Failed to modify %s project members, update project groups and update "
"project quotas."
msgstr "更改 %s 專案æˆå“¡ã€æ›´æ–°å°ˆæ¡ˆç¾¤çµ„以åŠæ›´æ–°å°ˆæ¡ˆé…é¡æ™‚失敗。"
-#: dashboards/identity/projects/workflows.py:835
+#: dashboards/identity/projects/workflows.py:836
msgid ""
"Modified project information and members, but unable to modify project "
"quotas."
@@ -10438,7 +10438,7 @@ msgstr "上傳本地的映åƒæª”。"
#: dashboards/project/images/images/forms.py:76
#: dashboards/project/images/images/forms.py:232
-#: dashboards/project/images/images/tables.py:281
+#: dashboards/project/images/images/tables.py:290
msgid "Format"
msgstr "æ ¼å¼"
@@ -10556,36 +10556,51 @@ msgstr "新增雲硬碟"
msgid "Shared with Me"
msgstr "與我分享"
-#: dashboards/project/images/images/tables.py:254
+#: dashboards/project/images/images/tables.py:228
+msgctxt "Image format for display in table"
+msgid "Raw"
+msgstr "Raw"
+
+#: dashboards/project/images/images/tables.py:259
msgctxt "Current status of an Image"
msgid "Active"
msgstr "使用中"
-#: dashboards/project/images/images/tables.py:255
+#: dashboards/project/images/images/tables.py:260
msgctxt "Current status of an Image"
msgid "Saving"
msgstr "正在儲存"
-#: dashboards/project/images/images/tables.py:256
+#: dashboards/project/images/images/tables.py:261
msgctxt "Current status of an Image"
msgid "Queued"
msgstr "已排入"
-#: dashboards/project/images/images/tables.py:258
+#: dashboards/project/images/images/tables.py:263
msgctxt "Current status of an Image"
msgid "Pending Delete"
msgstr "等候刪除"
-#: dashboards/project/images/images/tables.py:259
+#: dashboards/project/images/images/tables.py:264
msgctxt "Current status of an Image"
msgid "Killed"
msgstr "已中斷"
-#: dashboards/project/images/images/tables.py:260
+#: dashboards/project/images/images/tables.py:265
msgctxt "Current status of an Image"
msgid "Deleted"
msgstr "已刪除"
+#: dashboards/project/images/images/tables.py:268
+msgctxt "Type of an image"
+msgid "Image"
+msgstr "映åƒæª”"
+
+#: dashboards/project/images/images/tables.py:269
+msgctxt "Type of an image"
+msgid "Snapshot"
+msgstr "å³æ™‚存檔"
+
#: dashboards/project/images/images/views.py:60
msgid "Unable to retrieve image."
msgstr "無法ç²å¾—映åƒæª”。"
diff --git a/openstack_dashboard/management/commands/apache_vhost.conf.template b/openstack_dashboard/management/commands/apache_vhost.conf.template
index 5db931852..06fe27fd6 100644
--- a/openstack_dashboard/management/commands/apache_vhost.conf.template
+++ b/openstack_dashboard/management/commands/apache_vhost.conf.template
@@ -24,12 +24,16 @@
WSGIPassAuthorization On
WSGIScriptAlias / {{ WSGI_FILE }}
-
+{% if APACHE2_VERSION >= 2.4 %}
+ <Location "/">
+ Require all granted
+ </Location>
+{% else %}
<Location "/">
Order Allow,Deny
Allow from all
</Location>
-
+{% endif %}
Alias /static {{ STATIC_PATH }}
<Location "/static">
SetHandler None
diff --git a/openstack_dashboard/management/commands/make_web_conf.py b/openstack_dashboard/management/commands/make_web_conf.py
index 38d1de887..9cbfe61d4 100644
--- a/openstack_dashboard/management/commands/make_web_conf.py
+++ b/openstack_dashboard/management/commands/make_web_conf.py
@@ -15,7 +15,9 @@ from __future__ import print_function
from optparse import make_option # noqa
import os
+import re
import socket
+import subprocess
import sys
import warnings
@@ -33,6 +35,14 @@ CURDIR = os.path.realpath(os.path.dirname(__file__))
PROJECT_PATH = os.path.realpath(os.path.join(CURDIR, '../..'))
STATIC_PATH = os.path.realpath(os.path.join(PROJECT_PATH, '../static'))
+# Known apache regular expression to retrieve it's version
+APACHE_VERSION_REG = r'Apache/(?P<version>[\d.]*)'
+# Known apache commands to retrieve it's version
+APACHE2_VERSION_CMDS = (
+ (('/usr/sbin/apache2ctl', '-V'), APACHE_VERSION_REG),
+ (('/usr/sbin/apache2', '-v'), APACHE_VERSION_REG),
+)
+
# Known apache log directory locations
APACHE_LOG_DIRS = (
'/var/log/httpd', # RHEL / Red Hat / CentOS / Fedora Linux
@@ -94,6 +104,29 @@ if virtualenv:
if os.path.exists(activate_this):
context['ACTIVATE_THIS'] = activate_this
+# Try to detect apache's version
+# We fallback on 2.4.
+context['APACHE2_VERSION'] = 2.4
+APACHE2_VERSION = None
+for cmd in APACHE2_VERSION_CMDS:
+ if os.path.exists(cmd[0][0]):
+ try:
+ reg = re.compile(cmd[1])
+ res = reg.search(
+ subprocess.check_output(cmd[0], stderr=subprocess.STDOUT))
+ if res:
+ APACHE2_VERSION = res.group('version')
+ break
+ except subprocess.CalledProcessError:
+ pass
+if APACHE2_VERSION:
+ ver_nums = APACHE2_VERSION.split('.')
+ if len(ver_nums) >= 2:
+ try:
+ context['APACHE2_VERSION'] = float('.'.join(ver_nums[:2]))
+ except ValueError:
+ pass
+
def find_apache_log_dir():
for log_dir in APACHE_LOG_DIRS:
@@ -190,6 +223,14 @@ location you desire, e.g.::
"the path to the SSLCertificateKeyFile "
"(default : %s)") % context['SSLKEY'],
metavar="SSLKEY"),
+ make_option("--apache-version",
+ dest="apache_version",
+ type="float",
+ help=("Use with the --apache option to define the apache "
+ "major (as a floating point number) version "
+ "(default : %s)."
+ % context['APACHE2_VERSION']),
+ metavar="APACHE_VERSION"),
make_option("-w", "--wsgi",
default=False, action="store_true", dest="wsgi",
help="generate the horizon.wsgi file"),
@@ -213,6 +254,8 @@ location you desire, e.g.::
context['SSLCERT'] = options['sslcert']
if options.get('sslkey'):
context['SSLKEY'] = options['sslkey']
+ if options.get('apache_version'):
+ context['APACHE2_VERSION'] = options['apache_version']
if options.get('namedhost'):
context['NAMEDHOST'] = context['VHOSTNAME']
diff --git a/openstack_dashboard/static/dashboard/cloud-services/cloud-services.js b/openstack_dashboard/static/dashboard/cloud-services/cloud-services.js
index 0a3bea86e..88ea08401 100644
--- a/openstack_dashboard/static/dashboard/cloud-services/cloud-services.js
+++ b/openstack_dashboard/static/dashboard/cloud-services/cloud-services.js
@@ -50,6 +50,7 @@
'novaExtensions',
'securityGroup',
'serviceCatalog',
+ 'settingsService',
function (cinderAPI,
glanceAPI,
@@ -58,7 +59,8 @@
novaAPI,
novaExtensions,
securityGroup,
- serviceCatalog) {
+ serviceCatalog,
+ settingsService) {
return {
cinder: cinderAPI,
@@ -68,35 +70,39 @@
nova: novaAPI,
novaExtensions: novaExtensions,
securityGroup: securityGroup,
- serviceCatalog: serviceCatalog
+ serviceCatalog: serviceCatalog,
+ settingsService: settingsService
};
}
])
/**
* @ngdoc factory
- * @name hz.dashboard:factory:ifExtensionsEnabled
+ * @name hz.dashboard:factory:ifFeaturesEnabled
* @module hz.dashboard
* @kind function
* @description
*
- * Check to see if all the listed extensions are enabled on a certain service,
+ * Check to see if all the listed features are enabled on a certain service,
* which is described by the service name.
*
* This is an asynchronous operation.
*
* @param String serviceName The name of the service, e.g. `novaExtensions`.
- * @param Array<String> extensions A list of extension's names.
+ * @param Array<String> features A list of feature's names.
* @return Promise the promise of the deferred task that gets resolved
* when all the sub-tasks are resolved.
*/
- .factory('ifExtensionsEnabled', ['$q', 'cloudServices',
+ .factory('ifFeaturesEnabled', ['$q', 'cloudServices',
function ($q, cloudServices) {
- return function ifExtensionsEnabled(serviceName, extensions) {
+ return function ifFeaturesEnabled(serviceName, features) {
+ // each cloudServices[serviceName].ifEnabled(feature) is an asynchronous
+ // operation which returns a promise, thus requiring the use of $q.all
+ // to defer.
return $q.all(
- extensions.map(function (extension) {
- return cloudServices[serviceName].ifEnabled(extension);
+ features.map(function (feature) {
+ return cloudServices[serviceName].ifEnabled(feature);
})
);//return
};//return
@@ -114,35 +120,41 @@
* based on `serviceName`.
*
* @param String serviceName The name of the service, e.g. `novaExtensions`.
+ * @param String attrName The name of the attribute in the service.
* @return Object a directive specification object that can be used to
* create an angular directive.
*/
- .factory('createDirectiveSpec', ['ifExtensionsEnabled',
- function (ifExtensionsEnabled) {
- return function createDirectiveSpec(serviceName) {
+ .factory('createDirectiveSpec', ['ifFeaturesEnabled',
+ function (ifFeaturesEnabled) {
+ return function createDirectiveSpec(serviceName, attrName) {
+
+ function link(scope, element, attrs, ctrl, transclude) {
+ element.addClass('ng-hide');
+ var features = fromJson(attrs[attrName]);
+ if (isArray(features)) {
+ ifFeaturesEnabled(serviceName, features).then(
+ // if the feature is enabled:
+ function () {
+ element.removeClass('ng-hide');
+ },
+ // if the feature is not enabled:
+ function () {
+ element.remove();
+ }
+ );
+ }
+ transclude(scope, function (clone) {
+ element.append(clone);
+ });
+ }
+
return {
+ link: link,
restrict: 'E',
- transclude: true,
- link: function link(scope, element, attrs, ctrl, transclude) {
- element.addClass('ng-hide');
- var extensions = fromJson(attrs.requiredExtensions);
- if (isArray(extensions)) {
- ifExtensionsEnabled(serviceName, extensions).then(
- function () {
- element.removeClass('ng-hide');
- },
- function () {
- element.remove();
- }
- );//if-then
- }
- transclude(scope, function (clone) {
- element.append(clone);
- });
- }//link
- };//return
- };//return
+ transclude: true
+ };
+ };
}
])
@@ -158,7 +170,7 @@
*
* @example
*
- ```html
+ ```html
<nova-extension required-extensions='["config_drive"]'>
<div class="checkbox customization-script-source">
<label>
@@ -181,12 +193,37 @@
</select>
</div>
</nova-extension>
- ```
+ ```
*/
.directive('novaExtension', ['createDirectiveSpec',
function (createDirectiveSpec) {
- return createDirectiveSpec('novaExtensions');
+ return createDirectiveSpec('novaExtensions', 'requiredExtensions');
+ }
+ ])
+
+ /**
+ * @ngdoc directive
+ * @name hz.dashboard:directive:settingsService
+ * @module hz.dashboard
+ * @description
+ *
+ * This is to enable specifying conditional UI in a declarative way.
+ * Some UI components should be showing only when some certain settings
+ * are enabled on `settingsService` service.
+ *
+ * @example
+ *
+ ```html
+ <settings-service required-settings='["something"]'>
+ <!-- ui code here -->
+ </settings-service>
+ ```
+ */
+
+ .directive('settingsService', ['createDirectiveSpec',
+ function (createDirectiveSpec) {
+ return createDirectiveSpec('settingsService', 'requiredSettings');
}
])
diff --git a/openstack_dashboard/static/dashboard/cloud-services/cloud-services.spec.js b/openstack_dashboard/static/dashboard/cloud-services/cloud-services.spec.js
index 858ae810d..1d167c19a 100644
--- a/openstack_dashboard/static/dashboard/cloud-services/cloud-services.spec.js
+++ b/openstack_dashboard/static/dashboard/cloud-services/cloud-services.spec.js
@@ -35,6 +35,7 @@
$provide.value('novaExtensions', {});
$provide.value('securityGroup', {});
$provide.value('serviceCatalog', {});
+ $provide.value('settingsService', {});
}));
beforeEach(inject(function ($injector) {
@@ -69,14 +70,18 @@
expect(cloudServices.novaExtensions).toBeDefined();
});
+ it('should have `cloudServices.settingsService` defined.', function () {
+ expect(cloudServices.settingsService).toBeDefined();
+ });
+
});
//
- // factory:ifExtensionsEnabled
+ // factory:ifFeaturesEnabled
//
- describe('factory:ifExtensionsEnabled', function () {
- var ifExtensionsEnabled,
+ describe('factory:ifFeaturesEnabled', function () {
+ var ifFeaturesEnabled,
$q,
cloudServices;
@@ -103,44 +108,44 @@
}));
beforeEach(inject(function ($injector) {
- ifExtensionsEnabled = $injector.get('ifExtensionsEnabled');
+ ifFeaturesEnabled = $injector.get('ifFeaturesEnabled');
}));
- it('should have `ifExtensionsEnabled` defined as a function.', function () {
- expect(ifExtensionsEnabled).toBeDefined();
- expect(angular.isFunction(ifExtensionsEnabled)).toBe(true);
+ it('should have `ifFeaturesEnabled` defined as a function.', function () {
+ expect(ifFeaturesEnabled).toBeDefined();
+ expect(angular.isFunction(ifFeaturesEnabled)).toBe(true);
});
- it('should call $q.all() and someService.ifEnabled() when invoking ifExtensionsEnabled().', function () {
+ it('should call $q.all() and someService.ifEnabled() when invoking ifFeaturesEnabled().', function () {
var extensions = ['ext1', 'ext2'];
- ifExtensionsEnabled('someService', extensions);
+ ifFeaturesEnabled('someService', extensions);
expect($q.all).toHaveBeenCalled();
expect(cloudServices.someService.ifEnabled).toHaveBeenCalled();
});
it('should not throw when passing in an empty extensions list.', function () {
expect(function () {
- ifExtensionsEnabled('someService', []);
+ ifFeaturesEnabled('someService', []);
}).not.toThrow();
});
it('should throw when extensions is null or undefined or not an array', function () {
expect(function () {
- ifExtensionsEnabled('someService', null);
+ ifFeaturesEnabled('someService', null);
}).toThrow();
expect(function () {
- ifExtensionsEnabled('someService');
+ ifFeaturesEnabled('someService');
}).toThrow();
expect(function () {
- ifExtensionsEnabled('123');
+ ifFeaturesEnabled('123');
}).toThrow();
});
it('should not throw when the provided serviceName is not a key in the services hash table', function () {
expect(function () {
- ifExtensionsEnabled('invlidServiceName', []);
+ ifFeaturesEnabled('invlidServiceName', []);
}).not.toThrow();
});
});
@@ -151,16 +156,16 @@
describe('factory:createDirectiveSpec', function () {
var createDirectiveSpec,
- ifExtensionsEnabled;
+ ifFeaturesEnabled;
beforeEach(module('hz.dashboard', function ($provide) {
- ifExtensionsEnabled = function () {
+ ifFeaturesEnabled = function () {
return {
then: function (successCallback, errorCallback) {
}
};
};
- $provide.value('ifExtensionsEnabled', ifExtensionsEnabled);
+ $provide.value('ifFeaturesEnabled', ifFeaturesEnabled);
}));
beforeEach(inject(function ($injector) {
@@ -176,7 +181,7 @@
var directiveSpec;
beforeEach(function () {
- directiveSpec = createDirectiveSpec('someService');
+ directiveSpec = createDirectiveSpec('someService', 'someFeature');
});
it('should be defined.', function () {
@@ -215,7 +220,7 @@
element;
beforeEach(module('hz.dashboard', function ($provide) {
- $provide.value('ifExtensionsEnabled', function () {
+ $provide.value('ifFeaturesEnabled', function () {
return {
then: function (successCallback, errorCallback) {
$timeout(successCallback);
@@ -252,6 +257,58 @@
});
+ //
+ // directive:settingsService
+ //
+
+ describe('directive:settingsService', function () {
+ var $timeout,
+ $scope,
+ html = [
+ '<settings-service required-settings=\'["something"]\'>',
+ '<div class="child-element">',
+ '</div>',
+ '</settings-service>'
+ ].join(''),
+ element;
+
+ beforeEach(module('hz.dashboard', function ($provide) {
+ $provide.value('ifFeaturesEnabled', function () {
+ return {
+ then: function (successCallback, errorCallback) {
+ $timeout(successCallback);
+ }
+ };
+ });
+ }));
+
+ beforeEach(inject(function ($injector) {
+ var $compile = $injector.get('$compile');
+ $scope = $injector.get('$rootScope').$new();
+ $timeout = $injector.get('$timeout');
+ element = $compile(html)($scope);
+ }));
+
+ it('should be compiled.', function () {
+ expect(element.hasClass('ng-scope')).toBe(true);
+ });
+
+ it('should have class name `ng-hide` by default.', function () {
+ expect(element.hasClass('ng-hide')).toBe(true);
+ });
+
+ it('should have no class name `ng-hide` after an asyncs callback.', function () {
+ $timeout(function () {
+ expect(element.hasClass('ng-hide')).toBe(false);
+ });
+ $timeout.flush();
+ });
+
+ it('should have the right child element.', function () {
+ expect(element.children().first().hasClass('child-element')).toBe(true);
+ });
+ });
+
})
;})();
diff --git a/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.html b/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.html
index f916f301d..40ae5467c 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.html
+++ b/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.html
@@ -1,5 +1,5 @@
<div ng-controller="LaunchInstanceConfigurationCtrl as config">
- <h1 clasa="title">{$ ::config.label.title $}</h1>
+ <h1>{$ ::config.label.title $}</h1>
<div class="content">
<div class="subtitle">{$ ::config.label.subtitle $}</div>
diff --git a/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.spec.js b/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.spec.js
index 1c405d25d..0aa2ecf06 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.spec.js
+++ b/openstack_dashboard/static/dashboard/launch-instance/configuration/configuration.spec.js
@@ -1,4 +1,3 @@
-/* jshint globalstrict: true */
/*
* (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
*
@@ -17,7 +16,71 @@
(function() {
'use strict';
- describe('Launch Instance Post-Creation Step', function() {
+ describe('Launch Instance Configuration Step', function() {
+
+ describe('LaunchInstanceConfigurationCtrl', function() {
+ var scope, ctrl;
+
+ beforeEach(module('hz.dashboard.launch-instance'));
+
+ beforeEach(inject(function($controller) {
+ scope = {
+ model: {
+ newInstanceSpec: {},
+ }
+ };
+
+ ctrl = $controller('LaunchInstanceConfigurationCtrl', {
+ $scope: scope
+ });
+ }));
+
+ it('contains its own labels', function() {
+ expect(ctrl.label).toBeDefined();
+ expect(Object.keys(ctrl.label).length).toBeGreaterThan(0);
+ });
+
+ it('has correct disk configuration options', function() {
+ expect(ctrl.diskConfigOptions).toBeDefined();
+ expect(ctrl.diskConfigOptions.length).toBe(2);
+ var vals = ctrl.diskConfigOptions.map(function(x) { return x.value; });
+ expect(vals).toContain('AUTO');
+ expect(vals).toContain('MANUAL');
+ });
+
+ it('defaults the disk configuration to "AUTO"', function() {
+ expect(scope.model.newInstanceSpec.disk_config).toBe('AUTO');
+ });
+
+ it('defaults the config_drive configuration to false', function() {
+ expect(scope.model.newInstanceSpec.config_drive).toBe(false);
+ });
+
+ it('defaults the user_data configuration to ""', function() {
+ expect(scope.model.newInstanceSpec.user_data).toBe('');
+ });
+
+ });
+
+ describe('LaunchInstanceConfigurationHelpCtrl', function() {
+ var ctrl;
+
+ beforeEach(module('hz.dashboard.launch-instance'));
+
+ beforeEach(inject(function($controller) {
+ ctrl = $controller('LaunchInstanceConfigurationHelpCtrl');
+ }));
+
+ it('defines the title', function() {
+ expect(ctrl.title).toBeDefined();
+ });
+
+ it('has help paragraphs', function() {
+ expect(ctrl.paragraphs).toBeDefined();
+ expect(ctrl.paragraphs.length).toBeGreaterThan(0);
+ });
+ });
+
});
})();
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/create-keypair.html b/openstack_dashboard/static/dashboard/launch-instance/keypair/create-keypair.html
new file mode 100644
index 000000000..bacdd6012
--- /dev/null
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/create-keypair.html
@@ -0,0 +1,34 @@
+<div class="ng-wizard no-navigation" ng-form="wizardForm">
+ <div class="title" ng-bind="::ctrl.labels.wizardTitle"></div>
+
+ <div class="step">
+ <h1>{$ ::ctrl.labels.title $}</h1>
+ <div class="content">
+ <div class="subtitle">{$ ::ctrl.labels.help $}</div>
+ <div class="form-group">
+ <div class="form-field required">
+ <label>{$ ::ctrl.labels.keyPairName $}</label>
+ <input class="form-control" name="name"
+ ng-model="ctrl.model.name"
+ ng-required="true" placeholder="{$ ::ctrl.labels.required $}">
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="toolbar">
+ <div class="secondary-btn-grp">
+ <button class="cancel btn btn-sm btn-default" ng-click="ctrl.cancel()">
+ <span class="fa fa-close"></span>
+ {$ ::ctrl.labels.cancel $}
+ </button>
+ </div>
+ <div class="primary-btn-grp">
+ <button class="finish btn btn-sm btn-success"
+ ng-click="ctrl.submit()" ng-disabled="wizardForm.$invalid">
+ <span class="fa fa-plus"></span>
+ {$ ::ctrl.labels.ok $}
+ </button>
+ </div>
+ </div>
+</div>
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/import-keypair.html b/openstack_dashboard/static/dashboard/launch-instance/keypair/import-keypair.html
new file mode 100644
index 000000000..636dedefc
--- /dev/null
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/import-keypair.html
@@ -0,0 +1,50 @@
+<div class="ng-wizard no-navigation" ng-form="wizardForm">
+ <div class="title" ng-bind="::ctrl.labels.wizardTitle"></div>
+
+ <div class="step">
+ <h1>{$ ::ctrl.labels.title $}</h1>
+ <div class="content">
+ <div class="subtitle">{$ ::ctrl.labels.help $}</div>
+
+ <div class="form-group">
+ <div class="form-field required name">
+ <label>{$ ::ctrl.labels.keyPairName $}</label>
+ <input class="form-control" name="name"
+ ng-model="ctrl.model.name"
+ ng-required="true" placeholder="{$ ::ctrl.labels.required $}"/>
+ </div>
+ <div class="form-field required key">
+ <label>{$ ::ctrl.labels.publicKey $}</label>
+ <textarea class="form-control" name="key" rows="15"
+ ng-model="ctrl.model.public_key"
+ ng-required="true" placeholder="{$ ::ctrl.labels.required $}">
+ </textarea>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="toolbar">
+ <div class="secondary-btn-grp">
+ <button class="cancel btn btn-sm btn-default" ng-click="ctrl.cancel()">
+ <span class="fa fa-close"></span>
+ {$ ::ctrl.labels.cancel $}
+ </button>
+ </div>
+ <div class="primary-btn-grp">
+ <button class="finish btn btn-sm btn-success"
+ ng-click="ctrl.submit()" ng-disabled="wizardForm.$invalid">
+ <span class="fa fa-upload"></span>
+ {$ ::ctrl.labels.ok $}
+ </button>
+ </div>
+ </div>
+
+ <help-panel>
+ <div ng-controller="LaunchInstanceImportKeyPairHelpCtrl as importHelpCtrl">
+ <h1>{$ ::importHelpCtrl.title $}</h1>
+ <p ng-repeat="paragraph in ::importHelpCtrl.paragraphs"
+ ng-bind-html="::paragraph"></p>
+ </div>
+ </help-panel>
+</div>
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair-details.html b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair-details.html
index 9b66b037e..624896334 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair-details.html
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair-details.html
@@ -1,6 +1,6 @@
<dl class="dl-horizontal key-pair-details">
<dt>{$ ctrl.tableLabels.public_key $}</dt>
<dd>
- <pre><code>{$ row.public_key $}</code></pre>
+ <pre><code>{$ row.public_key $}</code></pre>
</dd>
</dl>
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.html b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.html
index e100c3cef..432cefb47 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.html
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.html
@@ -4,68 +4,82 @@
<div class="content">
<div class="subtitle">{$ ::ctrl.label.subtitle $}</div>
- <transfer-table tr-model="ctrl.tableData"
- help-text="ctrl.tableHelp"
- limits="ctrl.tableLimits">
+ <div class="row form-group">
+ <div class="col-sm-12 form-inline">
+ <button type="button" class="btn btn-sm btn-primary pull-right"
+ ng-click="ctrl.createKeyPair()">
+ <span class="fa fa-fw fa-plus"></span>
+ {$ ::ctrl.label.createKeyPair $}
+ </button>
+ <button type="button" class="btn btn-sm btn-primary pull-right"
+ ng-click="ctrl.importKeyPair()">
+ <span class="fa fa-fw fa-upload"></span>
+ {$ ::ctrl.label.importKeyPair $}
+ </button>
+ </div>
+ </div>
- <!-- Key Pairs Allocated-->
- <allocated>
- <table st-table="ctrl.tableData.displayedAllocated"
- st-safe-src="ctrl.tableData.allocated" hz-table
- class="table-striped table-rsp table-detail modern">
- <thead>
+ <transfer-table tr-model="ctrl.tableData"
+ help-text="ctrl.tableHelp"
+ limits="ctrl.tableLimits">
+
+ <!-- Key Pairs Allocated-->
+ <allocated>
+ <table st-table="ctrl.tableData.displayedAllocated"
+ st-safe-src="ctrl.tableData.allocated" hz-table
+ class="table-striped table-rsp table-detail modern">
+ <thead>
<tr>
<th class="expander"></th>
<th class="rsp-p1">{$ ::ctrl.label.name $}</th>
<th class="rsp-p2">{$ ::ctrl.tableLabels.fingerprint $}</th>
<th></th>
</tr>
- </thead>
- <tbody>
- <tr ng-if="ctrl.tableData.allocated.length === 0">
- <td colspan="8">
- <div class="no-rows-help">
- {$ ::trCtrl.helpText.noneAllocText $}
- </div>
- </td>
- </tr>
- <tr ng-repeat-start="row in ctrl.tableData.displayedAllocated track by row.id">
- <td class="expander">
- <span class="fa fa-chevron-right" hz-expand-detail
- title="{$ ::trCtrl.helpText.expandDetailsText $}"></span>
- </td>
- <td class="rsp-p1">{$ row.name $}</td>
- <td class="rsp-p2">{$ row.fingerprint $}</td>
- <td class="action-col">
- <action-list>
- <action action-classes="'btn btn-sm btn-default'"
- callback="trCtrl.deallocate" item="row">
- <span class="fa fa-minus"></span>
- </action>
- </action-list>
- </td>
- </tr>
- <tr ng-repeat-end class="detail-row">
- <td></td>
- <td class="detail" colspan="3">
- <dl class="dl-horizontal" ng-include="ctrl.tableDetails">
- </dl>
- </td>
- </tr>
- </tbody>
- </table>
- </allocated>
+ </thead>
+ <tbody>
+ <tr ng-if="ctrl.tableData.allocated.length === 0">
+ <td colspan="8">
+ <div class="no-rows-help">
+ {$ ::trCtrl.helpText.noneAllocText $}
+ </div>
+ </td>
+ </tr>
+ <tr ng-repeat-start="row in ctrl.tableData.displayedAllocated track by row.id">
+ <td class="expander">
+ <span class="fa fa-chevron-right" hz-expand-detail
+ title="{$ ::trCtrl.helpText.expandDetailsText $}"></span>
+ </td>
+ <td class="rsp-p1">{$ row.name $}</td>
+ <td class="rsp-p2">{$ row.fingerprint $}</td>
+ <td class="action-col">
+ <action-list>
+ <action action-classes="'btn btn-sm btn-default'"
+ callback="trCtrl.deallocate" item="row">
+ <span class="fa fa-minus"></span>
+ </action>
+ </action-list>
+ </td>
+ </tr>
+ <tr ng-repeat-end class="detail-row">
+ <td></td>
+ <td class="detail" colspan="3">
+ <dl class="dl-horizontal" ng-include="ctrl.tableDetails">
+ </dl>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </allocated>
- <!-- Key Pairs Available -->
- <available>
- <table st-table="ctrl.tableData.displayedAvailable"
- st-safe-src="ctrl.tableData.available"
- hz-table class="table-striped table-rsp table-detail modern">
- <thead>
+ <!-- Key Pairs Available -->
+ <available>
+ <table st-table="ctrl.tableData.displayedAvailable"
+ st-safe-src="ctrl.tableData.available"
+ hz-table class="table-striped table-rsp table-detail modern">
+ <thead>
<tr>
<th class="search-header" colspan="7">
- <search-bar group-classes="input-group-sm"
- icon-classes="fa-search">
+ <search-bar group-classes="input-group-sm" icon-classes="fa-search">
</search-bar>
</th>
</tr>
@@ -75,8 +89,8 @@
<th st-sort="fingerprint" class="rsp-p1">{$ ::ctrl.tableLabels.fingerprint $}</th>
<th></th>
</tr>
- </thead>
- <tbody>
+ </thead>
+ <tbody>
<tr ng-if="trCtrl.numDisplayedAvailable() === 0">
<td colspan="8">
<div class="no-rows-help">
@@ -87,15 +101,15 @@
<tr ng-repeat-start="row in ctrl.tableData.displayedAvailable track by row.id"
ng-if="!trCtrl.allocatedIds[row.id]">
<td class="expander">
- <span class="fa fa-chevron-right" hz-expand-detail
- title="{$ ::trCtrl.helpText.expandDetailsText $}"></span>
+ <span class="fa fa-chevron-right" hz-expand-detail
+ title="{$ ::trCtrl.helpText.expandDetailsText $}"></span>
</td>
<td class="rsp-p1">{$ row.name$}</td>
<td class="rsp-p1">{$ row.fingerprint $}</td>
<td class="action-col">
<action-list>
<action action-classes="'btn btn-sm btn-default'"
- callback="trCtrl.allocate" item="row">
+ callback="trCtrl.allocate" item="row">
<span class="fa fa-plus"></span>
</action>
</action-list>
@@ -106,11 +120,11 @@
<td class="detail" colspan="3" ng-include="ctrl.tableDetails">
</td>
</tr>
- </tbody>
- </table>
- </available>
+ </tbody>
+ </table>
+ </available>
- </transfer-table> <!-- End Key Pairs Table -->
+ </transfer-table> <!-- End Key Pairs Table -->
</div> <!-- End Content -->
-</div> <!-- End Controller -->
+</div> <!-- End Controller --> \ No newline at end of file
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.js b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.js
index a10849867..ca388eb6d 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.js
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.js
@@ -3,7 +3,7 @@
var module = angular.module('hz.dashboard.launch-instance');
- /**
+ /**
* @ngdoc controller
* @name hz.dashboard.launch-instance.LaunchInstanceKeypairCtrl
* @description
@@ -11,70 +11,283 @@
*/
module.controller('LaunchInstanceKeypairCtrl', [
'launchInstanceModel',
- function (launchInstanceModel) {
- var ctrl = this;
-
- ctrl.label = {
- title: gettext('Key Pair'),
- subtitle: gettext('Select a key pair.'),
- name: gettext('Name'),
- description: gettext('Description')
- };
-
- ctrl.tableLabels = {
- fingerprint: gettext('Fingerprint'),
- public_key: gettext('Public Key')
- };
-
- ctrl.tableData = {
- available: launchInstanceModel.keypairs,
- allocated: launchInstanceModel.newInstanceSpec.key_pair,
- displayedAvailable: [],
- displayedAllocated: []
- };
-
- ctrl.tableDetails =
- '/static/dashboard/launch-instance/keypair/keypair-details.html';
-
- ctrl.tableHelp = {
- noneAllocText: gettext('Select a key pair from the available key pairs below.')
- };
-
- ctrl.tableLimits = {
- maxAllocation: 1
- };
-
- }
+ '$modal',
+ 'dashboardBasePath',
+ LaunchInstanceKeypairCtrl
]);
+ function LaunchInstanceKeypairCtrl(launchInstanceModel,
+ $modal,
+ dashboardBasePath) {
+ var ctrl = this;
- /**
+ ctrl.label = {
+ title: gettext('Key Pair'),
+ subtitle: gettext('A key pair allows you to SSH into your newly created instance. You may select an existing key pair, import a key pair, or generate a new key pair.'),
+ name: gettext('Name'),
+ description: gettext('Description'),
+ createKeyPair: gettext('Create Key Pair'),
+ importKeyPair: gettext('Import Key Pair')
+ };
+
+ ctrl.tableLabels = {
+ fingerprint: gettext('Fingerprint'),
+ public_key: gettext('Public Key')
+ };
+
+ ctrl.tableData = {
+ available: launchInstanceModel.keypairs,
+ allocated: launchInstanceModel.newInstanceSpec.key_pair,
+ displayedAvailable: [],
+ displayedAllocated: []
+ };
+
+ ctrl.tableDetails = dashboardBasePath + 'launch-instance/keypair/keypair-details.html';
+
+ ctrl.tableHelp = {
+ noneAllocText: gettext('Select a key pair from the available key pairs below.')
+ };
+
+ ctrl.tableLimits = {
+ maxAllocation: 1
+ };
+
+ // Allocate the new key pair (after import or create)
+ // if nothing is already allocated
+ ctrl.allocateNewKeyPair = function(newKeyPair) {
+ if (ctrl.tableData.allocated.length === 0) {
+ ctrl.tableData.allocated.push(newKeyPair);
+ }
+ };
+
+ ctrl.createKeyPair = function () {
+ $modal.open({
+ templateUrl: dashboardBasePath + 'launch-instance/keypair/create-keypair.html',
+ controller: 'LaunchInstanceCreateKeyPairCtrl as ctrl',
+ windowClass: 'modal-dialog-wizard',
+ }).result.then(
+ function (result) {
+ // Nova doesn't set the id in the response so we will use
+ // the name as the id. Name is the key used in URLs, etc.
+ result.id = result.name;
+
+ $modal.open({
+ templateUrl: dashboardBasePath + 'launch-instance/keypair/new-keypair.html',
+ controller: 'LaunchInstanceNewKeyPairCtrl as ctrl',
+ windowClass: 'modal-dialog-wizard',
+ resolve: {
+ keypair: function () {
+ return result;
+ }
+ }
+ });
+
+ launchInstanceModel.keypairs.push(result);
+ ctrl.allocateNewKeyPair(result);
+ }
+ );
+ };
+
+ ctrl.importKeyPair = function () {
+ $modal.open({
+ templateUrl: dashboardBasePath + 'launch-instance/keypair/import-keypair.html',
+ controller: 'LaunchInstanceImportKeyPairCtrl as ctrl',
+ windowClass: 'modal-dialog-wizard'
+ }).result.then(
+ function (result) {
+ // Nova doesn't set the id in the response so we will use
+ // the name as the id. Name is the key used in URLs, etc.
+ result.id = result.name;
+
+ launchInstanceModel.keypairs.push(result);
+ ctrl.allocateNewKeyPair(result);
+ }
+ );
+ };
+ }
+
+ /**
* @ngdoc controller
* @name hz.dashboard.launch-instance.LaunchInstanceKeypairHelpCtrl
* @description
- * Provide help for selection of security groups and key pairs.
+ * Provide help for selection of a key pair.
*/
- module.controller('LaunchInstanceKeypairHelpCtrl', [function () {
- var ctrl = this;
+ module.controller('LaunchInstanceKeypairHelpCtrl', [
+ LaunchInstanceKeypairHelpCtrl
+ ]);
- ctrl.title = gettext('Key Pair Help');
+ function LaunchInstanceKeypairHelpCtrl() {
+ var ctrl = this;
- var genKeyPairsMap = { genKeyPairCmd: 'ssh-keygen' };
- var genKeyPairsText = gettext('There are two ways to generate a key pair. From a Linux system, generate the key pair with the <samp>%(genKeyPairCmd)s</samp> command:');
+ ctrl.title = gettext('Key Pair Help');
- var keyPathsMap = { privateKeyPath: 'cloud.key', publicKeyPath: 'cloud.key.pub' };
- var keyPathText = gettext('This command generates a pair of keys: a private key (%(privateKeyPath)s) and a public key (%(publicKeyPath)s).');
+ var genKeyPairsMap = {genKeyPairCmd: 'ssh-keygen'};
+ var genKeyPairsText = gettext('There are two ways to generate a key pair. From a Linux system, generate the key pair with the <samp>%(genKeyPairCmd)s</samp> command:');
- var windowsCmdMap = { authorizeKeysFile: '.ssh/authorized_keys' };
- var windowsCmd = gettext('From a Windows system, you can use PuTTYGen to create private/public keys. Use the PuTTY Key Generator to create and save the keys, then copy the public key in the red highlighted box to your <samp>%(authorizeKeysFile)s</samp> file.');
+ var keyPathsMap = {
+ privateKeyPath: 'cloud.key',
+ publicKeyPath: 'cloud.key.pub'
+ };
+ var keyPathText = gettext('This command generates a pair of keys: a private key (%(privateKeyPath)s) and a public key (%(publicKeyPath)s).');
- ctrl.paragraphs = [
- gettext('The key pair allows you to SSH into the instance.'),
- interpolate(genKeyPairsText, genKeyPairsMap, true),
- '<samp>ssh-keygen -t rsa -f cloud.key</samp>',
- interpolate(keyPathText, keyPathsMap, true),
- interpolate(windowsCmd, windowsCmdMap, true)
- ];
- }
+ var windowsCmdMap = {authorizeKeysFile: '.ssh/authorized_keys'};
+ var windowsCmd = gettext('From a Windows system, you can use PuTTYGen to create private/public keys. Use the PuTTY Key Generator to create and save the keys, then copy the public key in the red highlighted box to your <samp>%(authorizeKeysFile)s</samp> file.');
+
+ ctrl.paragraphs = [
+ gettext('The key pair allows you to SSH into the instance.'),
+ interpolate(genKeyPairsText, genKeyPairsMap, true),
+ '<samp>ssh-keygen -t rsa -f cloud.key</samp>',
+ interpolate(keyPathText, keyPathsMap, true),
+ interpolate(windowsCmd, windowsCmdMap, true)
+ ];
+ }
+
+ /**
+ * @ngdoc controller
+ * @name hz.dashboard.launch-instance.LaunchInstanceCreateKeyPairCtrl
+ * @description
+ * Provide a dialog for creation of a new key pair.
+ */
+ module.controller('LaunchInstanceCreateKeyPairCtrl', [
+ '$modalInstance',
+ 'novaAPI',
+ LaunchInstanceCreateKeyPairCtrl
]);
+
+ function LaunchInstanceCreateKeyPairCtrl($modalInstance, novaAPI) {
+ var ctrl = this;
+
+ ctrl.labels = {
+ wizardTitle: gettext('Launch Instance'),
+ title: gettext('Create Key Pair'),
+ help: gettext('Key Pairs are how you login to your instance after it is launched. Choose a key pair name you will recognize.'),
+ keyPairName: gettext('Key Pair Name'),
+ cancel: gettext('Cancel'),
+ ok: gettext('Create Key Pair'),
+ required: gettext('Required')
+ };
+
+ ctrl.model = { name: '' };
+ ctrl.submit = function () {
+ novaAPI.createKeypair(ctrl.model)
+ .success(function (data) {
+ $modalInstance.close(data);
+
+ var successMsg = gettext('Successfully created key pair %(name)s');
+ horizon.alert('success', interpolate(successMsg, { name: data.name }, true));
+ });
+ };
+ ctrl.cancel = function () {
+ $modalInstance.dismiss();
+ };
+ }
+
+ /**
+ * @ngdoc controller
+ * @name hz.dashboard.launch-instance.LaunchInstanceNewKeyPairCtrl
+ * @description
+ * Provide a dialog for display of the information about a new
+ * public/private key pair.
+ */
+ module.controller('LaunchInstanceNewKeyPairCtrl', [
+ '$modalInstance',
+ 'keypair',
+ LaunchInstanceNewKeyPairCtrl
+ ]);
+
+ function LaunchInstanceNewKeyPairCtrl($modalInstance, keypair) {
+ var ctrl = this;
+
+ ctrl.labels = {
+ wizardTitle: gettext('Launch Instance'),
+ title: gettext('Private Key'),
+ help: gettext('This is your new key pair. Copy this information and keep it secure.'),
+ keyPairName: gettext('Key Pair Name'),
+ fingerprint: gettext('Fingerprint'),
+ privateKey: gettext('Private Key'),
+ publicKey: gettext('Public Key'),
+ ok: gettext('OK')
+ };
+
+ ctrl.keypair = keypair;
+ ctrl.ok = function () {
+ $modalInstance.dismiss();
+ };
+ }
+
+ /**
+ * @ngdoc controller
+ * @name hz.dashboard.launch-instance.LaunchInstanceImportKeyPairCtrl
+ * @description
+ * Provide a dialog for import of an existing ssh public key.
+ */
+ module.controller('LaunchInstanceImportKeyPairCtrl', [
+ '$modalInstance',
+ 'novaAPI',
+ LaunchInstanceImportKeyPairCtrl
+ ]);
+
+ function LaunchInstanceImportKeyPairCtrl($modalInstance, novaAPI) {
+ var ctrl = this;
+
+ ctrl.labels = {
+ wizardTitle: gettext('Launch Instance'),
+ title: gettext('Import Key Pair'),
+ help: gettext('Key Pairs are how you login to your instance after it is launched. Choose a key pair name you will recognize and paste your SSH public key into the space provided.'),
+ keyPairName: gettext('Key Pair Name'),
+ publicKey: gettext('Public Key'),
+ cancel: gettext('Cancel'),
+ ok: gettext('Import Key Pair'),
+ required: gettext('Required')
+ };
+
+ ctrl.model = { name: '', public_key: '' };
+ ctrl.submit = function () {
+ novaAPI.createKeypair(ctrl.model)
+ .success(function (data) {
+ $modalInstance.close(data);
+
+ var successMsg = gettext('Successfully imported key pair %(name)s');
+ horizon.alert('success', interpolate(successMsg, { name: data.name }, true));
+ });
+ };
+ ctrl.cancel = function () {
+ $modalInstance.dismiss();
+ };
+ }
+
+ /**
+ * @ngdoc controller
+ * @name LaunchInstanceImportKeyPairHelpCtrl
+ * @description
+ * The `LaunchInstanceImportKeyPairHelpCtrl` controller provides help text
+ * for the import key pair function within the Launch Instance Wizard.
+ *
+ */
+ module.controller('LaunchInstanceImportKeyPairHelpCtrl', [
+ LaunchInstanceImportKeyPairHelpCtrl
+ ]);
+
+ function LaunchInstanceImportKeyPairHelpCtrl() {
+ var ctrl = this;
+
+ ctrl.title = gettext('Import Key Pair Help');
+
+ var genKeyPairsMap = { genKeyPairCmd: 'ssh-keygen' };
+ var genKeyPairsText = gettext('There are two ways to generate a key pair. From a Linux system, generate the key pair with the <samp>%(genKeyPairCmd)s</samp> command:');
+
+ var keyPathsMap = { privateKeyPath: 'cloud.key', publicKeyPath: 'cloud.key.pub' };
+ var keyPathText = gettext('This command generates a pair of keys: a private key (%(privateKeyPath)s) and a public key (%(publicKeyPath)s).');
+
+ var windowsCmdMap = { authorizeKeysFile: '.ssh/authorized_keys' };
+ var windowsCmd = gettext('From a Windows system, you can use PuTTYGen to create private/public keys. Use the PuTTY Key Generator to create and save the keys, then copy the public key in the red highlighted box to your <samp>%(authorizeKeysFile)s</samp> file.');
+
+ ctrl.paragraphs = [
+ interpolate(genKeyPairsText, genKeyPairsMap, true),
+ '<samp>ssh-keygen -t rsa -f cloud.key</samp>',
+ interpolate(keyPathText, keyPathsMap, true),
+ interpolate(windowsCmd, windowsCmdMap, true)
+ ];
+ }
+
})();
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.scss b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.scss
index 947fa2e15..cd5b3db84 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.scss
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.scss
@@ -15,4 +15,19 @@
}
}
}
+
+ textarea {
+ font-family: $code-font-family;
+ }
+}
+
+.no-navigation {
+
+ .step {
+ left: 25px;
+ }
+
+ .form-field {
+ margin-bottom: 1em;
+ }
}
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.spec.js b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.spec.js
index 8f1a131aa..a8d5b7cdf 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.spec.js
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/keypair.spec.js
@@ -17,16 +17,26 @@
'use strict';
describe('Launch Instance Keypair Step', function() {
+
describe('LaunchInstanceKeypairCtrl', function() {
var ctrl;
- beforeEach(module('hz.dashboard.launch-instance'));
+ beforeEach(module(function ($provide) {
+ $provide.value('$modal', {});
+ }));
+
+ beforeEach(module('hz.dashboard'));
beforeEach(inject(function($controller) {
- var model = { newInstanceSpec: { key_pair: ['key1'] },
- keypairs: ['key1', 'key2'] };
+ var model = {
+ newInstanceSpec: {
+ key_pair: ['key1']
+ },
+ keypairs: ['key1', 'key2']
+ };
+
ctrl = $controller('LaunchInstanceKeypairCtrl',
- {launchInstanceModel: model});
+ { launchInstanceModel: model });
}));
it('contains its general labels', function() {
@@ -67,13 +77,12 @@
});
describe('LaunchInstanceKeypairHelpCtrl', function() {
- var scope, ctrl;
+ var ctrl;
beforeEach(module('hz.dashboard.launch-instance'));
beforeEach(inject(function($controller) {
- scope = {};
- ctrl = $controller('LaunchInstanceKeypairHelpCtrl', {$scope:scope});
+ ctrl = $controller('LaunchInstanceKeypairHelpCtrl');
}));
it('defines the title', function() {
@@ -86,6 +95,115 @@
});
});
+ describe('LaunchInstanceCreateKeyPairCtrl', function() {
+ var ctrl;
+
+ beforeEach(module(function ($provide) {
+ $provide.value('$modalInstance', {});
+ $provide.value('novaAPI', {});
+ }));
+
+ beforeEach(module('hz.dashboard'));
+
+ beforeEach(inject(function($controller) {
+ ctrl = $controller('LaunchInstanceCreateKeyPairCtrl');
+ }));
+
+ it('contains its general labels', function() {
+ expect(ctrl.labels).toBeDefined();
+ });
+
+ it('defines a model with a empty name', function() {
+ expect(ctrl.model).toBeDefined();
+ expect(ctrl.model.name).toBe('');
+ });
+
+ it('defines a submit function', function() {
+ expect(ctrl.submit).toBeDefined();
+ });
+
+ it('defines a cancel function', function() {
+ expect(ctrl.cancel).toBeDefined();
+ });
+ });
+
+ describe('LaunchInstanceNewKeyPairCtrl', function() {
+ var ctrl;
+
+ beforeEach(module(function ($provide) {
+ $provide.value('$modalInstance', {});
+ }));
+
+ beforeEach(module('hz.dashboard'));
+
+ beforeEach(inject(function($controller) {
+ ctrl = $controller('LaunchInstanceNewKeyPairCtrl', { keypair: {} });
+ }));
+
+ it('contains its general labels', function() {
+ expect(ctrl.labels).toBeDefined();
+ });
+
+ it('defines an empty keypair', function() {
+ expect(ctrl.keypair).toBeDefined();
+ });
+
+ it('defines an OK function', function() {
+ expect(ctrl.ok).toBeDefined();
+ });
+ });
+
+ describe('LaunchInstanceImportKeyPairCtrl', function() {
+ var ctrl;
+
+ beforeEach(module(function ($provide) {
+ $provide.value('$modalInstance', {});
+ $provide.value('novaAPI', {});
+ }));
+
+ beforeEach(module('hz.dashboard'));
+
+ beforeEach(inject(function($controller) {
+ ctrl = $controller('LaunchInstanceImportKeyPairCtrl');
+ }));
+
+ it('contains its general labels', function() {
+ expect(ctrl.labels).toBeDefined();
+ });
+
+ it('defines a model with a empty name and public key', function() {
+ expect(ctrl.model).toBeDefined();
+ expect(ctrl.model.name).toBe('');
+ expect(ctrl.model.public_key).toBe('');
+ });
+
+ it('defines a submit function', function() {
+ expect(ctrl.submit).toBeDefined();
+ });
+
+ it('defines a cancel function', function() {
+ expect(ctrl.cancel).toBeDefined();
+ });
+ });
+
+ describe('LaunchInstanceImportKeyPairHelpCtrl', function() {
+ var ctrl;
+
+ beforeEach(module('hz.dashboard.launch-instance'));
+
+ beforeEach(inject(function($controller) {
+ ctrl = $controller('LaunchInstanceImportKeyPairHelpCtrl');
+ }));
+
+ it('defines the title', function() {
+ expect(ctrl.title).toBeDefined();
+ });
+
+ it('has paragraphs', function() {
+ expect(ctrl.paragraphs).toBeDefined();
+ expect(ctrl.paragraphs.length).toBeGreaterThan(0);
+ });
+ });
});
diff --git a/openstack_dashboard/static/dashboard/launch-instance/keypair/new-keypair.html b/openstack_dashboard/static/dashboard/launch-instance/keypair/new-keypair.html
new file mode 100644
index 000000000..cd845f7e1
--- /dev/null
+++ b/openstack_dashboard/static/dashboard/launch-instance/keypair/new-keypair.html
@@ -0,0 +1,31 @@
+<div class="ng-wizard no-navigation">
+ <div class="title" ng-bind="::ctrl.labels.wizardTitle"></div>
+
+ <div class="step">
+ <h1>{$ ::ctrl.labels.title $}</h1>
+ <div class="content">
+ <div class="subtitle">{$ ::ctrl.labels.help $}</div>
+
+ <dl class="dl-horizontal key-pair-details">
+ <dt>{$ ::ctrl.labels.keyPairName $}</dt>
+ <dd><pre><code>{$ ctrl.keypair.name $}</code></pre></dd>
+ <dt>{$ ::ctrl.labels.fingerprint $}</dt>
+ <dd><pre><code>{$ ctrl.keypair.fingerprint $}</code></pre></dd>
+ <dt>{$ ::ctrl.labels.publicKey $}</dt>
+ <dd><pre><code>{$ ctrl.keypair.public_key $}</code></pre></dd>
+ <dt>{$ ::ctrl.labels.privateKey $}</dt>
+ <dd><pre><code>{$ ctrl.keypair.private_key $}</code></pre></dd>
+ </dl>
+ </div>
+ </div>
+
+ <div class="toolbar">
+ <div class="primary-btn-grp">
+ <button class="finish btn btn-sm btn-success"
+ ng-click="ctrl.ok()">
+ <span class="fa fa-check"></span>
+ {$ ::ctrl.labels.ok $}
+ </button>
+ </div>
+ </div>
+</div>
diff --git a/openstack_dashboard/static/dashboard/launch-instance/source/source.html b/openstack_dashboard/static/dashboard/launch-instance/source/source.html
index ae35d774c..d4e905672 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/source/source.html
+++ b/openstack_dashboard/static/dashboard/launch-instance/source/source.html
@@ -95,15 +95,31 @@
<div class="col-xs-12 col-sm-3">
<div class="form-group create-volume">
- <div class="checkbox">
- <label class="on-top">
- <input type="checkbox" ng-model="model.newInstanceSpec.vol_create">
- {$ ::label.volumeCreate $}</label>
+ <label class="on-top">{$ ::label.volumeCreate $}</label>
+ <div class="form-field">
+ <div class="btn-group">
+ <label class="btn btn-toggle"
+ ng-repeat="option in toggleButtonOptions"
+ ng-model="model.newInstanceSpec.vol_create"
+ btn-radio="option.value">{$ ::option.label $}</label>
+ </div>
</div>
</div>
</div>
- <div class="col-xs-12 col-sm-4 volume-size-wrapper" ng-if="model.newInstanceSpec.vol_create == true">
+ <settings-service required-settings='["OPENSTACK_HYPERVISOR_FEATURES.can_set_mount_point"]'
+ ng-if="model.newInstanceSpec.vol_create === true">
+ <div class="col-xs-12 col-sm-3">
+ <div class="form-field">
+ <label>{$ ::label.volumeDeviceName $}</label>
+ <input class="form-control input-sm"
+ ng-model="model.newInstanceSpec.vol_device_name"
+ type="text">
+ </div>
+ </div>
+ </settings-service>
+
+ <div class="col-xs-12 col-sm-2 volume-size-wrapper" ng-if="model.newInstanceSpec.vol_create == true">
<div class="form-field volume-size"
ng-class="{ 'has-warning': launchInstanceSourceForm['volume-size'].$invalid }">
<label class="on-top">{$ ::label.volumeSize $}</label>
@@ -122,11 +138,14 @@
<div class="col-xs-12 col-sm-4" ng-if="model.newInstanceSpec.vol_create == true">
<div class="form-group delete-volume">
- <div class="checkbox">
- <label class="on-top">
- <input type="checkbox"
- ng-model="model.newInstanceSpec.vol_delete_on_terminate">
- {$ ::label.deleteVolumeOnTerminate $}</label>
+ <label class="on-top">{$ ::label.deleteVolumeOnTerminate $}</label>
+ <div class="form-field">
+ <div class="btn-group">
+ <label class="btn btn-toggle"
+ ng-repeat="option in toggleButtonOptions"
+ ng-model="model.newInstanceSpec.vol_delete_on_terminate"
+ btn-radio="option.value">{$ ::option.label $}</label>
+ </div>
</div>
</div>
</div>
@@ -136,14 +155,19 @@
<div class="col-xs-12 col-sm-9"
ng-if="model.newInstanceSpec.source_type.type == 'volume' || model.newInstanceSpec.source_type.type == 'volume_snapshot'">
<div class="col-xs-12 col-sm-6">
+
<div class="form-group delete-volume">
- <div class="checkbox">
- <label class="on-top">
- <input type="checkbox"
- ng-model="model.newInstanceSpec.vol_delete_on_terminate">
- {$ ::label.deleteVolumeOnTerminate $}</label>
+ <label class="on-top">{$ ::label.deleteVolumeOnTerminate $}</label>
+ <div class="form-field">
+ <div class="btn-group">
+ <label class="btn btn-toggle"
+ ng-repeat="option in toggleButtonOptions"
+ ng-model="model.newInstanceSpec.vol_delete_on_terminate"
+ btn-radio="option.value">{$ ::option.label $}</label>
+ </div>
</div>
</div>
+
</div>
</div><!-- end volume select options -->
diff --git a/openstack_dashboard/static/dashboard/launch-instance/source/source.js b/openstack_dashboard/static/dashboard/launch-instance/source/source.js
index 56a409989..64dc33374 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/source/source.js
+++ b/openstack_dashboard/static/dashboard/launch-instance/source/source.js
@@ -83,9 +83,9 @@
instanceSourceTitle: gettext('Instance Source'),
instanceSourceSubTitle: gettext('Instance source is the template used to create an instance. You can use a snapshot of an existing instance, an image, or a volume (if enabled). You can also choose to use persistent storage by creating a new volume.'),
bootSource: gettext('Select Boot Source'),
- deviceSize: gettext('Device Size (GB)'),
- volumeSize: gettext('Volume Size (GB)'),
+ volumeSize: gettext('Size (GB)'),
volumeCreate: gettext('Create New Volume'),
+ volumeDeviceName: gettext('Device Name'),
deleteVolumeOnTerminate: gettext('Delete Volume on Terminate'),
id: gettext('ID'),
min_ram: gettext('Min Ram'),
@@ -99,6 +99,13 @@
$scope.instanceCountError = gettext('Instance count is required and must be an integer of at least 1');
$scope.volumeSizeError = gettext('Volume size is required and must be an integer');
+
+ // toggle button label/value defaults
+ $scope.toggleButtonOptions = [
+ { label: gettext('Yes'), value: true },
+ { label: gettext('No'), value: false }
+ ];
+
//
// Boot Sources
//
diff --git a/openstack_dashboard/static/dashboard/launch-instance/source/source.scss b/openstack_dashboard/static/dashboard/launch-instance/source/source.scss
index eb5a30e24..4dd356713 100644
--- a/openstack_dashboard/static/dashboard/launch-instance/source/source.scss
+++ b/openstack_dashboard/static/dashboard/launch-instance/source/source.scss
@@ -1,26 +1,3 @@
-.form-group .required label:after {
- content: " *";
- color: red;
-}
-
-.selected-source {
- background: #eee;
- padding: 12px 18px;
- margin-top: 20px;
- margin-bottom: 20px;
-
- .chart {
- width: 99%;
- margin-bottom: 0;
- padding: 10px;
-
- @media (min-width: 768px) {
- border-left: 1px solid #ccc;
- padding-left: 20px;
- }
- }
-}
-
[ng-controller="LaunchInstanceSourceCtrl"] {
td.hi-light {
@@ -32,22 +9,36 @@
text-align: right;
padding-right: 30px;
}
-}
-
-.instance-source {
- margin-top: 18px;
- margin-bottom: 40px;
- .image select {
- width: 99%;
+ .selected-source {
+ background: #eee;
+ padding: 12px 18px;
+ margin-top: 20px;
+ margin-bottom: 20px;
+
+ .chart {
+ width: 99%;
+ margin-bottom: 0;
+ padding: 10px;
+
+ @media (min-width: 768px) {
+ border-left: 1px solid #ccc;
+ padding-left: 20px;
+ }
+ }
}
- .volume-size input[type="number"]{
- width: 90%;
- }
+ .instance-source {
+ margin-top: 18px;
+ margin-bottom: 40px;
+
+ .image select {
+ width: 99%;
+ }
+
+ .volume-size input[type="number"]{
+ width: 90%;
+ }
- .create-volume,
- .delete-volume {
- margin-top: 1.7em;
}
}
diff --git a/openstack_dashboard/static/dashboard/scss/_mixins.scss b/openstack_dashboard/static/dashboard/scss/_mixins.scss
index 390122cfa..ba3b1533d 100644
--- a/openstack_dashboard/static/dashboard/scss/_mixins.scss
+++ b/openstack_dashboard/static/dashboard/scss/_mixins.scss
@@ -3,7 +3,7 @@
* check out http://www.sass-lang.com/guide#topic-6
*/
-@mixin search-placeholder {
+@mixin input-placeholder {
&::-webkit-input-placeholder {
@content;
}
diff --git a/openstack_dashboard/test/api_tests/config_rest_tests.py b/openstack_dashboard/test/api_tests/config_rest_tests.py
index e8e4bc7db..ed30c2625 100644
--- a/openstack_dashboard/test/api_tests/config_rest_tests.py
+++ b/openstack_dashboard/test/api_tests/config_rest_tests.py
@@ -51,6 +51,14 @@ class ConfigRestTestCase(test.TestCase):
self.assertStatusCode(response, 200)
self.assertContains(response.content, content)
+ def test_settings_config_get(self):
+ request = self.mock_rest_request()
+ response = config.Settings().get(request)
+ self.assertStatusCode(response, 200)
+ self.assertContains(response.content, "REST_API_SETTING_1")
+ self.assertContains(response.content, "REST_API_SETTING_2")
+ self.assertNotContains(response.content, "REST_API_SECURITY")
+
def test_ignore_list(self):
ignore_config = {"password_validator": "someobject"}
content = '"password_validator": "someobject"'
diff --git a/openstack_dashboard/test/settings.py b/openstack_dashboard/test/settings.py
index db01994c6..ecf06bb7d 100644
--- a/openstack_dashboard/test/settings.py
+++ b/openstack_dashboard/test/settings.py
@@ -205,3 +205,9 @@ POLICY_FILES = {
# The openstack_auth.user.Token object isn't JSON-serializable ATM
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
+
+REST_API_SETTING_1 = 'foo'
+REST_API_SETTING_2 = 'bar'
+REST_API_SECURITY = 'SECURITY'
+REST_API_REQUIRED_SETTINGS = ['REST_API_SETTING_1']
+REST_API_ADDITIONAL_SETTINGS = ['REST_API_SETTING_2']