diff options
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 "« Back" -msgstr "" +msgstr "« Wstecz" #: dashboards/project/networks/templates/networks/create.html:10 msgid "Next »" @@ -13465,7 +13480,7 @@ msgstr "NastÄ™pne »" #: 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'] |