summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/source/index.rst1
-rw-r--r--doc/source/quickstart.rst63
-rw-r--r--doc/source/ref/local_conf.rst73
-rw-r--r--horizon/base.py8
-rw-r--r--horizon/forms/fields.py4
-rw-r--r--horizon/locale/de/LC_MESSAGES/django.po14
-rw-r--r--horizon/locale/es/LC_MESSAGES/django.po14
-rw-r--r--horizon/locale/fr/LC_MESSAGES/django.po14
-rw-r--r--horizon/static/bootstrap/js/bootstrap.js1951
-rwxr-xr-xhorizon/static/horizon/lib/jquery/jquery-ui-1.9.2.custom.js3958
-rw-r--r--horizon/tables/actions.py4
-rw-r--r--horizon/tables/base.py12
-rw-r--r--horizon/tables/formset.py2
-rw-r--r--horizon/templates/horizon/_scripts.html2
-rw-r--r--horizon/templatetags/horizon.py26
-rw-r--r--horizon/templatetags/sizeformat.py2
-rw-r--r--horizon/test/helpers.py6
-rw-r--r--horizon/test/patches.py8
-rw-r--r--horizon/test/settings.py18
-rw-r--r--horizon/test/tests/base.py4
-rw-r--r--horizon/test/tests/middleware.py2
-rw-r--r--horizon/test/tests/tables.py8
-rw-r--r--horizon/test/tests/utils.py14
-rw-r--r--horizon/utils/functions.py2
-rw-r--r--horizon/workflows/base.py10
-rw-r--r--openstack_dashboard/api/cinder.py4
-rw-r--r--openstack_dashboard/api/nova.py4
-rw-r--r--openstack_dashboard/conf/cinder_policy.json1
-rw-r--r--openstack_dashboard/conf/nova_policy.json2
-rw-r--r--openstack_dashboard/dashboards/admin/dashboard.py2
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/__init__.py0
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/panel.py27
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/tables.py76
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/tabs.py44
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/templates/defaults/index.html15
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/tests.py137
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/urls.py24
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/views.py47
-rw-r--r--openstack_dashboard/dashboards/admin/defaults/workflows.py100
-rw-r--r--openstack_dashboard/dashboards/admin/info/tables.py52
-rw-r--r--openstack_dashboard/dashboards/admin/info/tabs.py20
-rw-r--r--openstack_dashboard/dashboards/admin/info/tests.py96
-rw-r--r--openstack_dashboard/dashboards/admin/instances/tables.py2
-rw-r--r--openstack_dashboard/dashboards/project/instances/tables.py2
-rw-r--r--openstack_dashboard/dashboards/project/instances/workflows/create_instance.py1
-rw-r--r--openstack_dashboard/enabled/_70_admin_default_panel.py.example4
-rw-r--r--openstack_dashboard/locale/de/LC_MESSAGES/django.po576
-rw-r--r--openstack_dashboard/locale/en/LC_MESSAGES/django.po547
-rw-r--r--openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po553
-rw-r--r--openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po553
-rw-r--r--openstack_dashboard/locale/es/LC_MESSAGES/django.po585
-rw-r--r--openstack_dashboard/locale/fr/LC_MESSAGES/django.po631
-rw-r--r--openstack_dashboard/locale/ja/LC_MESSAGES/django.po559
-rw-r--r--openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po555
-rw-r--r--openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po1873
-rw-r--r--openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po555
-rw-r--r--openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po555
-rw-r--r--openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po601
-rw-r--r--openstack_dashboard/settings.py20
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eotbin20335 -> 0 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg229
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttfbin41280 -> 0 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woffbin23320 -> 0 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss17
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap.scss50
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss67
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss57
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss26
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss236
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss159
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss241
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss35
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss62
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss35
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss214
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss478
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss237
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss84
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss162
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss48
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss66
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss129
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss56
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss39
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss147
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss658
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss242
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss425
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss55
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss88
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss240
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss133
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss101
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss89
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss34
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss173
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss150
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss235
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss247
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss38
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss95
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss294
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss56
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss853
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss29
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss50
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss14
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss11
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss18
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss50
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss7
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss22
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss84
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss58
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss87
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss122
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss21
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss33
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss12
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss31
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss10
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss9
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss23
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss20
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss6
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss21
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss10
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss9
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss28
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss11
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss224
-rwxr-xr-xopenstack_dashboard/static/dashboard/scss/horizon.scss1
-rw-r--r--openstack_dashboard/templatetags/context_selection.py3
-rw-r--r--openstack_dashboard/test/test_plugins/panel_config/_30_admin_default_panel.py4
-rw-r--r--openstack_dashboard/test/test_plugins/panel_tests.py2
-rw-r--r--openstack_dashboard/usage/tables.py2
-rw-r--r--openstack_dashboard/views.py13
-rw-r--r--requirements.txt2
-rwxr-xr-xrun_tests.sh2
143 files changed, 5294 insertions, 17910 deletions
diff --git a/doc/source/index.rst b/doc/source/index.rst
index cb5f8e069..536173bb8 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -96,6 +96,7 @@ In-depth documentation for Horizon and its APIs.
ref/decorators
ref/exceptions
ref/test
+ ref/local_conf
Source Code Reference
---------------------
diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst
index 77551be4c..92c8e6dc3 100644
--- a/doc/source/quickstart.rst
+++ b/doc/source/quickstart.rst
@@ -30,6 +30,13 @@ repository from http://github.com/openstack/horizon and execute the
> cd horizon
> ./run_tests.sh
+.. note::
+
+ Running ``run_tests.sh`` will build a virtualenv, ``.venv``, where all the
+ python dependencies for Horizon are installed and referenced. After the
+ dependencies are installed, the unit test suites in the Horizon repo will be
+ executed. There should be no errors from the tests.
+
Next you will need to setup your Django application config by copying ``openstack_dashboard/local/local_settings.py.example`` to ``openstack_dashboard/local/local_settings.py``. To do this quickly you can use the following command::
> cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py
@@ -39,32 +46,39 @@ Next you will need to setup your Django application config by copying ``openstac
To add new settings or customize existing settings, modify the ``local_settings.py`` file.
Horizon assumes a single end-point for OpenStack services which defaults to
-the local host (127.0.0.1). If this is not the case change the
-``OPENSTACK_HOST`` setting in the ``openstack_dashboard/local/local_settings.py`` file, to the actual IP address of the OpenStack end-point Horizon should use.
+the local host (127.0.0.1), as is the default in DevStack. If this is not the
+case change the ``OPENSTACK_HOST`` setting in the
+``openstack_dashboard/local/local_settings.py`` file, to the actual IP address
+of the OpenStack end-point Horizon should use.
-To start the Horizon development server use the Django ``manage.py`` utility
-with the context of the virtual environment::
+To start the Horizon development server use ``run_tests.sh``::
- > tools/with_venv.sh ./manage.py runserver
+ > ./run_tests.sh --runserver localhost:9000
-Alternately specify the listen IP and port::
+.. note::
- > tools/with_venv.sh ./manage.py runserver 0.0.0.0:8080
+ The default port for runserver is 8000 which is already consumed by
+ heat-api-cfn in DevStack. If not running in DevStack
+ `./run_tests.sh --runserver` will start the test server at
+ `http://localhost:8000`.
-.. note::
- If you would like to run commands without the prefix of ``tools/with_venv.sh`` you may source your environment directly. This will remain active as long as your shell session stays open::
+.. note::
- > source .venv/bin/activate
+ The ``run_tests.sh`` script provides wrappers around ``manage.py``.
+ For more information on manage.py which is a django, see
+ `https://docs.djangoproject.com/en/dev/ref/django-admin/`
-Once the Horizon server is running point a web browser to http://localhost:8000
+Once the Horizon server is running, point a web browser to http://localhost:9000
or to the IP and port the server is listening for.
.. note::
The ``DevStack`` project (http://devstack.org/) can be used to install
- an OpenStack development environment from scratch.
+ an OpenStack development environment from scratch. For a local.conf that
+ enables most services that Horizon supports managing see
+ :doc:`local.conf <ref/local_conf>`
.. note::
@@ -77,6 +91,31 @@ or to the IP and port the server is listening for.
Optional support is provided for Swift.
+
+Editing Horizon's Source
+========================
+
+Although DevStack installs and configures an instance of Horizon when running
+stack.sh, the preferred development setup follows the instructions above on the
+server/VM running DevStack. The are several advantages to maintaining a
+separate copy of the Horizon repo, rather than editing the devstack installed
+copy.
+
+ * Source code changes aren't as easily lost when running unstack.sh/stack.sh
+ * The development server picks up source code changes (other than JavaScript
+ and CSS due to compression and compilation) while still running.
+ * Log messages and print statements go directly to the console.
+ * Debugging with pdb becomes much simpler to interact with.
+
+.. Note::
+ JavaScript and CSS changes require a development server restart. Also,
+ forcing a refresh of the page (e.g. using Shift-F5) in the browser is
+ required to pull down non-cached versions of the CSS and JavaScript. The
+ default setting in Horizon is to do compilation and compression of these
+ files at server startup. If you have configured your local copy to do
+ offline compression, more steps are required.
+
+
Horizon's Structure
===================
diff --git a/doc/source/ref/local_conf.rst b/doc/source/ref/local_conf.rst
new file mode 100644
index 000000000..3061c9cbd
--- /dev/null
+++ b/doc/source/ref/local_conf.rst
@@ -0,0 +1,73 @@
+==========
+local.conf
+==========
+
+Configuring DevStack for Horizon
+================================
+
+Place the following content into `devstack/local.conf` to start the services
+that Horizon supports in DevStack when `stack.sh` is run.
+::
+
+ [[local|localrc]]
+
+ ADMIN_PASSWORD=pass
+ MYSQL_PASSWORD=pass
+ RABBIT_PASSWORD=pass
+ SERVICE_PASSWORD=pass
+ SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50
+
+ # Recloning will insure that your stack is up to date. The downside
+ # is overhead on restarts and potentially losing a stable environment.
+ # If set to yes, will reclone all repos every time stack.sh is run.
+ # The default is no.
+ #RECLONE=yes
+
+ # Note: there are several network setting changes that may be
+ # required to get networking properly configured in your environment.
+ # This file is just using the defaults set up by devstack.
+ # For a more detailed treatment of devstack network configuration
+ # options, please see: http://devstack.org/guides/single-machine.html
+
+ # Enable Swift (object-store) Service without replication
+ enable_service s-proxy s-object s-container s-account
+ SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5
+ SWIFT_REPLICAS=1
+ SWIFT_DATA_DIR=$DEST/data/swift
+
+ # enabling Neutron (network) Service
+ # to use nova net rather than neutron, comment out the following group
+ disable_service n-net
+ enable_service q-svc
+ enable_service q-agt
+ enable_service q-dhcp
+ enable_service q-13
+ enable_service q-meta
+ enable_service q-metering
+ enable_service neutron
+ enable_service q-lbaas
+ enable_service q-fwaas
+ enable_service q-vpn
+ # end group
+
+ # enable Heat (orchestration) Service
+ enable_service heat h-api h-api-cfn h-api-cw h-eng
+
+ # enable Sahara (data_processing) Service
+ enable_service sahara
+
+ # enable Trove (database) Service
+ enable_service trove tr-api tr-tmgr tr-cond
+
+ # enable Ceilometer (metering) Service
+ enable_service ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector ceilometer-api
+
+
+ # Set ``OFFLINE`` to ``True`` to configure ``stack.sh`` to run cleanly without
+ # Internet access. ``stack.sh`` must have been previously run with Internet
+ # access to install prerequisites and fetch repositories.
+ # OFFLINE=True
+
+ [[post-config|$GLANCE_API_CONF]]
+ [DEFAULT]
+ default_store=file
diff --git a/horizon/base.py b/horizon/base.py
index 1734a6fe7..17249c150 100644
--- a/horizon/base.py
+++ b/horizon/base.py
@@ -170,10 +170,10 @@ class Registry(object):
parent = self._registered_with._registerable_class.__name__
raise NotRegistered('%(type)s with slug "%(slug)s" is not '
'registered with %(parent)s "%(name)s".'
- % {"type": class_name,
- "slug": cls,
- "parent": parent,
- "name": self.slug})
+ % {"type": class_name,
+ "slug": cls,
+ "parent": parent,
+ "name": self.slug})
else:
slug = getattr(cls, "slug", cls)
raise NotRegistered('%(type)s with slug "%(slug)s" is not '
diff --git a/horizon/forms/fields.py b/horizon/forms/fields.py
index 89c3d8036..5207e7bb1 100644
--- a/horizon/forms/fields.py
+++ b/horizon/forms/fields.py
@@ -181,8 +181,8 @@ class SelectWidget(widgets.Select):
def render_option(self, selected_choices, option_value, option_label):
option_value = force_text(option_value)
- other_html = (option_value in selected_choices) and \
- u' selected="selected"' or ''
+ other_html = (u' selected="selected"'
+ if option_value in selected_choices else '')
if callable(self.transform_html_attrs):
html_attrs = self.transform_html_attrs(option_label)
diff --git a/horizon/locale/de/LC_MESSAGES/django.po b/horizon/locale/de/LC_MESSAGES/django.po
index c4238d7ca..a29f32002 100644
--- a/horizon/locale/de/LC_MESSAGES/django.po
+++ b/horizon/locale/de/LC_MESSAGES/django.po
@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 07:12+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
+"POT-Creation-Date: 2014-09-30 16:19-0500\n"
+"PO-Revision-Date: 2014-09-30 07:00+0000\n"
+"Last-Translator: Andreas Jaeger <jaegerandi@gmail.com>\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"
@@ -449,14 +449,14 @@ msgstr "0 Bytes"
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Sell Puppy"
+msgstr[1] "Sell Puppies"
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Sold Puppy"
+msgstr[1] "Sold Puppies"
#: utils/filters.py:49
msgid "Never"
diff --git a/horizon/locale/es/LC_MESSAGES/django.po b/horizon/locale/es/LC_MESSAGES/django.po
index cdfb16d89..a1295e187 100644
--- a/horizon/locale/es/LC_MESSAGES/django.po
+++ b/horizon/locale/es/LC_MESSAGES/django.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 07:12+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
+"POT-Creation-Date: 2014-09-30 16:19-0500\n"
+"PO-Revision-Date: 2014-09-30 08:31+0000\n"
+"Last-Translator: Marian Tort <marian.tort@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/horizon/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -447,14 +447,14 @@ msgstr "0 bytes"
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Sell Puppy"
+msgstr[1] "Sell Puppies"
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Sold Puppy"
+msgstr[1] "Sold Puppies"
#: utils/filters.py:49
msgid "Never"
diff --git a/horizon/locale/fr/LC_MESSAGES/django.po b/horizon/locale/fr/LC_MESSAGES/django.po
index 397eb79e8..a82d7cfaa 100644
--- a/horizon/locale/fr/LC_MESSAGES/django.po
+++ b/horizon/locale/fr/LC_MESSAGES/django.po
@@ -19,9 +19,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 07:12+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
+"POT-Creation-Date: 2014-09-30 16:19-0500\n"
+"PO-Revision-Date: 2014-09-30 07:20+0000\n"
+"Last-Translator: François Bureau\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"
@@ -456,14 +456,14 @@ msgstr "0 octet"
#: test/test_dashboards/dogs/puppies/tables.py:31
msgid "Sell Puppy"
msgid_plural "Sell Puppies"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Chiot a vendre"
+msgstr[1] "Chiots a vendre"
#: test/test_dashboards/dogs/puppies/tables.py:40
msgid "Sold Puppy"
msgid_plural "Sold Puppies"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Chiot vendu"
+msgstr[1] "Chiots vendus"
#: utils/filters.py:49
msgid "Never"
diff --git a/horizon/static/bootstrap/js/bootstrap.js b/horizon/static/bootstrap/js/bootstrap.js
deleted file mode 100644
index 8ae571b6d..000000000
--- a/horizon/static/bootstrap/js/bootstrap.js
+++ /dev/null
@@ -1,1951 +0,0 @@
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
-
-/* ========================================================================
- * Bootstrap: transition.js v3.1.1
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
- // ============================================================
-
- function transitionEnd() {
- var el = document.createElement('bootstrap')
-
- var transEndEventNames = {
- 'WebkitTransition' : 'webkitTransitionEnd',
- 'MozTransition' : 'transitionend',
- 'OTransition' : 'oTransitionEnd otransitionend',
- 'transition' : 'transitionend'
- }
-
- for (var name in transEndEventNames) {
- if (el.style[name] !== undefined) {
- return { end: transEndEventNames[name] }
- }
- }
-
- return false // explicit for ie8 ( ._.)
- }
-
- // http://blog.alexmaccaw.com/css-transitions
- $.fn.emulateTransitionEnd = function (duration) {
- var called = false, $el = this
- $(this).one($.support.transition.end, function () { called = true })
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
- setTimeout(callback, duration)
- return this
- }
-
- $(function () {
- $.support.transition = transitionEnd()
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: alert.js v3.1.1
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // ALERT CLASS DEFINITION
- // ======================
-
- var dismiss = '[data-dismiss="alert"]'
- var Alert = function (el) {
- $(el).on('click', dismiss, this.close)
- }
-
- Alert.prototype.close = function (e) {
- var $this = $(this)
- var selector = $this.attr('data-target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
-
- var $parent = $(selector)
-
- if (e) e.preventDefault()
-
- if (!$parent.length) {
- $parent = $this.hasClass('alert') ? $this : $this.parent()
- }
-
- $parent.trigger(e = $.Event('close.bs.alert'))
-
- if (e.isDefaultPrevented()) return
-
- $parent.removeClass('in')
-
- function removeElement() {
- $parent.trigger('closed.bs.alert').remove()
- }
-
- $.support.transition && $parent.hasClass('fade') ?
- $parent
- .one($.support.transition.end, removeElement)
- .emulateTransitionEnd(150) :
- removeElement()
- }
-
-
- // ALERT PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.alert
-
- $.fn.alert = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.alert')
-
- if (!data) $this.data('bs.alert', (data = new Alert(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- $.fn.alert.Constructor = Alert
-
-
- // ALERT NO CONFLICT
- // =================
-
- $.fn.alert.noConflict = function () {
- $.fn.alert = old
- return this
- }
-
-
- // ALERT DATA-API
- // ==============
-
- $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: button.js v3.1.1
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // BUTTON PUBLIC CLASS DEFINITION
- // ==============================
-
- var Button = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Button.DEFAULTS, options)
- this.isLoading = false
- }
-
- Button.DEFAULTS = {
- loadingText: 'loading...'
- }
-
- Button.prototype.setState = function (state) {
- var d = 'disabled'
- var $el = this.$element
- var val = $el.is('input') ? 'val' : 'html'
- var data = $el.data()
-
- state = state + 'Text'
-
- if (!data.resetText) $el.data('resetText', $el[val]())
-
- $el[val](data[state] || this.options[state])
-
- // push to event loop to allow forms to submit
- setTimeout($.proxy(function () {
- if (state == 'loadingText') {
- this.isLoading = true
- $el.addClass(d).attr(d, d)
- } else if (this.isLoading) {
- this.isLoading = false
- $el.removeClass(d).removeAttr(d)
- }
- }, this), 0)
- }
-
- Button.prototype.toggle = function () {
- var changed = true
- var $parent = this.$element.closest('[data-toggle="buttons"]')
-
- if ($parent.length) {
- var $input = this.$element.find('input')
- if ($input.prop('type') == 'radio') {
- if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
- else $parent.find('.active').removeClass('active')
- }
- if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
- }
-
- if (changed) this.$element.toggleClass('active')
- }
-
-
- // BUTTON PLUGIN DEFINITION
- // ========================
-
- var old = $.fn.button
-
- $.fn.button = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.button')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.button', (data = new Button(this, options)))
-
- if (option == 'toggle') data.toggle()
- else if (option) data.setState(option)
- })
- }
-
- $.fn.button.Constructor = Button
-
-
- // BUTTON NO CONFLICT
- // ==================
-
- $.fn.button.noConflict = function () {
- $.fn.button = old
- return this
- }
-
-
- // BUTTON DATA-API
- // ===============
-
- $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
- var $btn = $(e.target)
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
- $btn.button('toggle')
- e.preventDefault()
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: carousel.js v3.1.1
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // CAROUSEL CLASS DEFINITION
- // =========================
-
- var Carousel = function (element, options) {
- this.$element = $(element)
- this.$indicators = this.$element.find('.carousel-indicators')
- this.options = options
- this.paused =
- this.sliding =
- this.interval =
- this.$active =
- this.$items = null
-
- this.options.pause == 'hover' && this.$element
- .on('mouseenter', $.proxy(this.pause, this))
- .on('mouseleave', $.proxy(this.cycle, this))
- }
-
- Carousel.DEFAULTS = {
- interval: 5000,
- pause: 'hover',
- wrap: true
- }
-
- Carousel.prototype.cycle = function (e) {
- e || (this.paused = false)
-
- this.interval && clearInterval(this.interval)
-
- this.options.interval
- && !this.paused
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-
- return this
- }
-
- Carousel.prototype.getActiveIndex = function () {
- this.$active = this.$element.find('.item.active')
- this.$items = this.$active.parent().children()
-
- return this.$items.index(this.$active)
- }
-
- Carousel.prototype.to = function (pos) {
- var that = this
- var activeIndex = this.getActiveIndex()
-
- if (pos > (this.$items.length - 1) || pos < 0) return
-
- if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
- if (activeIndex == pos) return this.pause().cycle()
-
- return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
- }
-
- Carousel.prototype.pause = function (e) {
- e || (this.paused = true)
-
- if (this.$element.find('.next, .prev').length && $.support.transition) {
- this.$element.trigger($.support.transition.end)
- this.cycle(true)
- }
-
- this.interval = clearInterval(this.interval)
-
- return this
- }
-
- Carousel.prototype.next = function () {
- if (this.sliding) return
- return this.slide('next')
- }
-
- Carousel.prototype.prev = function () {
- if (this.sliding) return
- return this.slide('prev')
- }
-
- Carousel.prototype.slide = function (type, next) {
- var $active = this.$element.find('.item.active')
- var $next = next || $active[type]()
- var isCycling = this.interval
- var direction = type == 'next' ? 'left' : 'right'
- var fallback = type == 'next' ? 'first' : 'last'
- var that = this
-
- if (!$next.length) {
- if (!this.options.wrap) return
- $next = this.$element.find('.item')[fallback]()
- }
-
- if ($next.hasClass('active')) return this.sliding = false
-
- var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
- this.$element.trigger(e)
- if (e.isDefaultPrevented()) return
-
- this.sliding = true
-
- isCycling && this.pause()
-
- if (this.$indicators.length) {
- this.$indicators.find('.active').removeClass('active')
- this.$element.one('slid.bs.carousel', function () {
- var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
- $nextIndicator && $nextIndicator.addClass('active')
- })
- }
-
- if ($.support.transition && this.$element.hasClass('slide')) {
- $next.addClass(type)
- $next[0].offsetWidth // force reflow
- $active.addClass(direction)
- $next.addClass(direction)
- $active
- .one($.support.transition.end, function () {
- $next.removeClass([type, direction].join(' ')).addClass('active')
- $active.removeClass(['active', direction].join(' '))
- that.sliding = false
- setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
- })
- .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
- } else {
- $active.removeClass('active')
- $next.addClass('active')
- this.sliding = false
- this.$element.trigger('slid.bs.carousel')
- }
-
- isCycling && this.cycle()
-
- return this
- }
-
-
- // CAROUSEL PLUGIN DEFINITION
- // ==========================
-
- var old = $.fn.carousel
-
- $.fn.carousel = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.carousel')
- var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
- var action = typeof option == 'string' ? option : options.slide
-
- if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
- if (typeof option == 'number') data.to(option)
- else if (action) data[action]()
- else if (options.interval) data.pause().cycle()
- })
- }
-
- $.fn.carousel.Constructor = Carousel
-
-
- // CAROUSEL NO CONFLICT
- // ====================
-
- $.fn.carousel.noConflict = function () {
- $.fn.carousel = old
- return this
- }
-
-
- // CAROUSEL DATA-API
- // =================
-
- $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
- var $this = $(this), href
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- var options = $.extend({}, $target.data(), $this.data())
- var slideIndex = $this.attr('data-slide-to')
- if (slideIndex) options.interval = false
-
- $target.carousel(options)
-
- if (slideIndex = $this.attr('data-slide-to')) {
- $target.data('bs.carousel').to(slideIndex)
- }
-
- e.preventDefault()
- })
-
- $(window).on('load', function () {
- $('[data-ride="carousel"]').each(function () {
- var $carousel = $(this)
- $carousel.carousel($carousel.data())
- })
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: collapse.js v3.1.1
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // COLLAPSE PUBLIC CLASS DEFINITION
- // ================================
-
- var Collapse = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Collapse.DEFAULTS, options)
- this.transitioning = null
-
- if (this.options.parent) this.$parent = $(this.options.parent)
- if (this.options.toggle) this.toggle()
- }
-
- Collapse.DEFAULTS = {
- toggle: true
- }
-
- Collapse.prototype.dimension = function () {
- var hasWidth = this.$element.hasClass('width')
- return hasWidth ? 'width' : 'height'
- }
-
- Collapse.prototype.show = function () {
- if (this.transitioning || this.$element.hasClass('in')) return
-
- var startEvent = $.Event('show.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
-
- var actives = this.$parent && this.$parent.find('> .panel > .in')
-
- if (actives && actives.length) {
- var hasData = actives.data('bs.collapse')
- if (hasData && hasData.transitioning) return
- actives.collapse('hide')
- hasData || actives.data('bs.collapse', null)
- }
-
- var dimension = this.dimension()
-
- this.$element
- .removeClass('collapse')
- .addClass('collapsing')
- [dimension](0)
-
- this.transitioning = 1
-
- var complete = function () {
- this.$element
- .removeClass('collapsing')
- .addClass('collapse in')
- [dimension]('auto')
- this.transitioning = 0
- this.$element.trigger('shown.bs.collapse')
- }
-
- if (!$.support.transition) return complete.call(this)
-
- var scrollSize = $.camelCase(['scroll', dimension].join('-'))
-
- this.$element
- .one($.support.transition.end, $.proxy(complete, this))
- .emulateTransitionEnd(350)
- [dimension](this.$element[0][scrollSize])
- }
-
- Collapse.prototype.hide = function () {
- if (this.transitioning || !this.$element.hasClass('in')) return
-
- var startEvent = $.Event('hide.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
-
- var dimension = this.dimension()
-
- this.$element
- [dimension](this.$element[dimension]())
- [0].offsetHeight
-
- this.$element
- .addClass('collapsing')
- .removeClass('collapse')
- .removeClass('in')
-
- this.transitioning = 1
-
- var complete = function () {
- this.transitioning = 0
- this.$element
- .trigger('hidden.bs.collapse')
- .removeClass('collapsing')
- .addClass('collapse')
- }
-
- if (!$.support.transition) return complete.call(this)
-
- this.$element
- [dimension](0)
- .one($.support.transition.end, $.proxy(complete, this))
- .emulateTransitionEnd(350)
- }
-
- Collapse.prototype.toggle = function () {
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
- }
-
-
- // COLLAPSE PLUGIN DEFINITION
- // ==========================
-
- var old = $.fn.collapse
-
- $.fn.collapse = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.collapse')
- var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
- if (!data && options.toggle && option == 'show') option = !option
- if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.collapse.Constructor = Collapse
-
-
- // COLLAPSE NO CONFLICT
- // ====================
-
- $.fn.collapse.noConflict = function () {
- $.fn.collapse = old
- return this
- }
-
-
- // COLLAPSE DATA-API
- // =================
-
- $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
- var $this = $(this), href
- var target = $this.attr('data-target')
- || e.preventDefault()
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
- var $target = $(target)
- var data = $target.data('bs.collapse')
- var option = data ? 'toggle' : $this.data()
- var parent = $this.attr('data-parent')
- var $parent = parent && $(parent)
-
- if (!data || !data.transitioning) {
- if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
- $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
- }
-
- $target.collapse(option)
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: dropdown.js v3.1.1
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // DROPDOWN CLASS DEFINITION
- // =========================
-
- var backdrop = '.dropdown-backdrop'
- var toggle = '[data-toggle=dropdown]'
- var Dropdown = function (element) {
- $(element).on('click.bs.dropdown', this.toggle)
- }
-
- Dropdown.prototype.toggle = function (e) {
- var $this = $(this)
-
- if ($this.is('.disabled, :disabled')) return
-
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
-
- clearMenus()
-
- if (!isActive) {
- if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
- // if mobile we use a backdrop because click events don't delegate
- $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
- }
-
- var relatedTarget = { relatedTarget: this }
- $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
-
- if (e.isDefaultPrevented()) return
-
- $parent
- .toggleClass('open')
- .trigger('shown.bs.dropdown', relatedTarget)
-
- $this.focus()
- }
-
- return false
- }
-
- Dropdown.prototype.keydown = function (e) {
- if (!/(38|40|27)/.test(e.keyCode)) return
-
- var $this = $(this)
-
- e.preventDefault()
- e.stopPropagation()
-
- if ($this.is('.disabled, :disabled')) return
-
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
-
- if (!isActive || (isActive && e.keyCode == 27)) {
- if (e.which == 27) $parent.find(toggle).focus()
- return $this.click()
- }
-
- var desc = ' li:not(.divider):visible a'
- var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
-
- if (!$items.length) return
-
- var index = $items.index($items.filter(':focus'))
-
- if (e.keyCode == 38 && index > 0) index-- // up
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
- if (!~index) index = 0
-
- $items.eq(index).focus()
- }
-
- function clearMenus(e) {
- $(backdrop).remove()
- $(toggle).each(function () {
- var $parent = getParent($(this))
- var relatedTarget = { relatedTarget: this }
- if (!$parent.hasClass('open')) return
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
- if (e.isDefaultPrevented()) return
- $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
- })
- }
-
- function getParent($this) {
- var selector = $this.attr('data-target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- var $parent = selector && $(selector)
-
- return $parent && $parent.length ? $parent : $this.parent()
- }
-
-
- // DROPDOWN PLUGIN DEFINITION
- // ==========================
-
- var old = $.fn.dropdown
-
- $.fn.dropdown = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.dropdown')
-
- if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- $.fn.dropdown.Constructor = Dropdown
-
-
- // DROPDOWN NO CONFLICT
- // ====================
-
- $.fn.dropdown.noConflict = function () {
- $.fn.dropdown = old
- return this
- }
-
-
- // APPLY TO STANDARD DROPDOWN ELEMENTS
- // ===================================
-
- $(document)
- .on('click.bs.dropdown.data-api', clearMenus)
- .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
- .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
- .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: modal.js v3.1.1
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // MODAL CLASS DEFINITION
- // ======================
-
- var Modal = function (element, options) {
- this.options = options
- this.$element = $(element)
- this.$backdrop =
- this.isShown = null
-
- if (this.options.remote) {
- this.$element
- .find('.modal-content')
- .load(this.options.remote, $.proxy(function () {
- this.$element.trigger('loaded.bs.modal')
- }, this))
- }
- }
-
- Modal.DEFAULTS = {
- backdrop: true,
- keyboard: true,
- show: true
- }
-
- Modal.prototype.toggle = function (_relatedTarget) {
- return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
- }
-
- Modal.prototype.show = function (_relatedTarget) {
- var that = this
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
-
- this.$element.trigger(e)
-
- if (this.isShown || e.isDefaultPrevented()) return
-
- this.isShown = true
-
- this.escape()
-
- this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
-
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
-
- if (!that.$element.parent().length) {
- that.$element.appendTo(document.body) // don't move modals dom position
- }
-
- that.$element
- .show()
- .scrollTop(0)
-
- if (transition) {
- that.$element[0].offsetWidth // force reflow
- }
-
- that.$element
- .addClass('in')
- .attr('aria-hidden', false)
-
- that.enforceFocus()
-
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
-
- transition ?
- that.$element.find('.modal-dialog') // wait for modal to slide in
- .one($.support.transition.end, function () {
- that.$element.focus().trigger(e)
- })
- .emulateTransitionEnd(300) :
- that.$element.focus().trigger(e)
- })
- }
-
- Modal.prototype.hide = function (e) {
- if (e) e.preventDefault()
-
- e = $.Event('hide.bs.modal')
-
- this.$element.trigger(e)
-
- if (!this.isShown || e.isDefaultPrevented()) return
-
- this.isShown = false
-
- this.escape()
-
- $(document).off('focusin.bs.modal')
-
- this.$element
- .removeClass('in')
- .attr('aria-hidden', true)
- .off('click.dismiss.bs.modal')
-
- $.support.transition && this.$element.hasClass('fade') ?
- this.$element
- .one($.support.transition.end, $.proxy(this.hideModal, this))
- .emulateTransitionEnd(300) :
- this.hideModal()
- }
-
- Modal.prototype.enforceFocus = function () {
- $(document)
- .off('focusin.bs.modal') // guard against infinite focus loop
- .on('focusin.bs.modal', $.proxy(function (e) {
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
- this.$element.focus()
- }
- }, this))
- }
-
- Modal.prototype.escape = function () {
- if (this.isShown && this.options.keyboard) {
- this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
- e.which == 27 && this.hide()
- }, this))
- } else if (!this.isShown) {
- this.$element.off('keyup.dismiss.bs.modal')
- }
- }
-
- Modal.prototype.hideModal = function () {
- var that = this
- this.$element.hide()
- this.backdrop(function () {
- that.removeBackdrop()
- that.$element.trigger('hidden.bs.modal')
- })
- }
-
- Modal.prototype.removeBackdrop = function () {
- this.$backdrop && this.$backdrop.remove()
- this.$backdrop = null
- }
-
- Modal.prototype.backdrop = function (callback) {
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
-
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate
-
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
- .appendTo(document.body)
-
- this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
- if (e.target !== e.currentTarget) return
- this.options.backdrop == 'static'
- ? this.$element[0].focus.call(this.$element[0])
- : this.hide.call(this)
- }, this))
-
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
- this.$backdrop.addClass('in')
-
- if (!callback) return
-
- doAnimate ?
- this.$backdrop
- .one($.support.transition.end, callback)
- .emulateTransitionEnd(150) :
- callback()
-
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass('in')
-
- $.support.transition && this.$element.hasClass('fade') ?
- this.$backdrop
- .one($.support.transition.end, callback)
- .emulateTransitionEnd(150) :
- callback()
-
- } else if (callback) {
- callback()
- }
- }
-
-
- // MODAL PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.modal
-
- $.fn.modal = function (option, _relatedTarget) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.modal')
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
- if (typeof option == 'string') data[option](_relatedTarget)
- else if (options.show) data.show(_relatedTarget)
- })
- }
-
- $.fn.modal.Constructor = Modal
-
-
- // MODAL NO CONFLICT
- // =================
-
- $.fn.modal.noConflict = function () {
- $.fn.modal = old
- return this
- }
-
-
- // MODAL DATA-API
- // ==============
-
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
- var $this = $(this)
- var href = $this.attr('href')
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
- if ($this.is('a')) e.preventDefault()
-
- $target
- .modal(option, this)
- .one('hide', function () {
- $this.is(':visible') && $this.focus()
- })
- })
-
- $(document)
- .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
- .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tooltip.js v3.1.1
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // TOOLTIP PUBLIC CLASS DEFINITION
- // ===============================
-
- var Tooltip = function (element, options) {
- this.type =
- this.options =
- this.enabled =
- this.timeout =
- this.hoverState =
- this.$element = null
-
- this.init('tooltip', element, options)
- }
-
- Tooltip.DEFAULTS = {
- animation: true,
- placement: 'top',
- selector: false,
- template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
- trigger: 'hover focus',
- title: '',
- delay: 0,
- html: false,
- container: false
- }
-
- Tooltip.prototype.init = function (type, element, options) {
- this.enabled = true
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
-
- var triggers = this.options.trigger.split(' ')
-
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i]
-
- if (trigger == 'click') {
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
- } else if (trigger != 'manual') {
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
-
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
- }
- }
-
- this.options.selector ?
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
- this.fixTitle()
- }
-
- Tooltip.prototype.getDefaults = function () {
- return Tooltip.DEFAULTS
- }
-
- Tooltip.prototype.getOptions = function (options) {
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
-
- if (options.delay && typeof options.delay == 'number') {
- options.delay = {
- show: options.delay,
- hide: options.delay
- }
- }
-
- return options
- }
-
- Tooltip.prototype.getDelegateOptions = function () {
- var options = {}
- var defaults = this.getDefaults()
-
- this._options && $.each(this._options, function (key, value) {
- if (defaults[key] != value) options[key] = value
- })
-
- return options
- }
-
- Tooltip.prototype.enter = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
- clearTimeout(self.timeout)
-
- self.hoverState = 'in'
-
- if (!self.options.delay || !self.options.delay.show) return self.show()
-
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'in') self.show()
- }, self.options.delay.show)
- }
-
- Tooltip.prototype.leave = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
- clearTimeout(self.timeout)
-
- self.hoverState = 'out'
-
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'out') self.hide()
- }, self.options.delay.hide)
- }
-
- Tooltip.prototype.show = function () {
- var e = $.Event('show.bs.' + this.type)
-
- if (this.hasContent() && this.enabled) {
- this.$element.trigger(e)
-
- if (e.isDefaultPrevented()) return
- var that = this;
-
- var $tip = this.tip()
-
- this.setContent()
-
- if (this.options.animation) $tip.addClass('fade')
-
- var placement = typeof this.options.placement == 'function' ?
- this.options.placement.call(this, $tip[0], this.$element[0]) :
- this.options.placement
-
- var autoToken = /\s?auto?\s?/i
- var autoPlace = autoToken.test(placement)
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
-
- $tip
- .detach()
- .css({ top: 0, left: 0, display: 'block' })
- .addClass(placement)
-
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-
- var pos = this.getPosition()
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
-
- if (autoPlace) {
- var $parent = this.$element.parent()
-
- var orgPlacement = placement
- var docScroll = document.documentElement.scrollTop || document.body.scrollTop
- var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
- var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
- var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
-
- placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
- placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
- placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
- placement
-
- $tip
- .removeClass(orgPlacement)
- .addClass(placement)
- }
-
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
- this.applyPlacement(calculatedOffset, placement)
- this.hoverState = null
-
- var complete = function() {
- that.$element.trigger('shown.bs.' + that.type)
- }
-
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one($.support.transition.end, complete)
- .emulateTransitionEnd(150) :
- complete()
- }
- }
-
- Tooltip.prototype.applyPlacement = function (offset, placement) {
- var replace
- var $tip = this.tip()
- var width = $tip[0].offsetWidth
- var height = $tip[0].offsetHeight
-
- // manually read margins because getBoundingClientRect includes difference
- var marginTop = parseInt($tip.css('margin-top'), 10)
- var marginLeft = parseInt($tip.css('margin-left'), 10)
-
- // we must check for NaN for ie 8/9
- if (isNaN(marginTop)) marginTop = 0
- if (isNaN(marginLeft)) marginLeft = 0
-
- offset.top = offset.top + marginTop
- offset.left = offset.left + marginLeft
-
- // $.fn.offset doesn't round pixel values
- // so we use setOffset directly with our own function B-0
- $.offset.setOffset($tip[0], $.extend({
- using: function (props) {
- $tip.css({
- top: Math.round(props.top),
- left: Math.round(props.left)
- })
- }
- }, offset), 0)
-
- $tip.addClass('in')
-
- // check to see if placing tip in new offset caused the tip to resize itself
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
-
- if (placement == 'top' && actualHeight != height) {
- replace = true
- offset.top = offset.top + height - actualHeight
- }
-
- if (/bottom|top/.test(placement)) {
- var delta = 0
-
- if (offset.left < 0) {
- delta = offset.left * -2
- offset.left = 0
-
- $tip.offset(offset)
-
- actualWidth = $tip[0].offsetWidth
- actualHeight = $tip[0].offsetHeight
- }
-
- this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
- } else {
- this.replaceArrow(actualHeight - height, actualHeight, 'top')
- }
-
- if (replace) $tip.offset(offset)
- }
-
- Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
- this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
- }
-
- Tooltip.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
-
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
- $tip.removeClass('fade in top bottom left right')
- }
-
- Tooltip.prototype.hide = function () {
- var that = this
- var $tip = this.tip()
- var e = $.Event('hide.bs.' + this.type)
-
- function complete() {
- if (that.hoverState != 'in') $tip.detach()
- that.$element.trigger('hidden.bs.' + that.type)
- }
-
- this.$element.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- $tip.removeClass('in')
-
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one($.support.transition.end, complete)
- .emulateTransitionEnd(150) :
- complete()
-
- this.hoverState = null
-
- return this
- }
-
- Tooltip.prototype.fixTitle = function () {
- var $e = this.$element
- if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
- }
- }
-
- Tooltip.prototype.hasContent = function () {
- return this.getTitle()
- }
-
- Tooltip.prototype.getPosition = function () {
- var el = this.$element[0]
- return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
- width: el.offsetWidth,
- height: el.offsetHeight
- }, this.$element.offset())
- }
-
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
- }
-
- Tooltip.prototype.getTitle = function () {
- var title
- var $e = this.$element
- var o = this.options
-
- title = $e.attr('data-original-title')
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
-
- return title
- }
-
- Tooltip.prototype.tip = function () {
- return this.$tip = this.$tip || $(this.options.template)
- }
-
- Tooltip.prototype.arrow = function () {
- return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
- }
-
- Tooltip.prototype.validate = function () {
- if (!this.$element[0].parentNode) {
- this.hide()
- this.$element = null
- this.options = null
- }
- }
-
- Tooltip.prototype.enable = function () {
- this.enabled = true
- }
-
- Tooltip.prototype.disable = function () {
- this.enabled = false
- }
-
- Tooltip.prototype.toggleEnabled = function () {
- this.enabled = !this.enabled
- }
-
- Tooltip.prototype.toggle = function (e) {
- var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
- }
-
- Tooltip.prototype.destroy = function () {
- clearTimeout(this.timeout)
- this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
- }
-
-
- // TOOLTIP PLUGIN DEFINITION
- // =========================
-
- var old = $.fn.tooltip
-
- $.fn.tooltip = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tooltip')
- var options = typeof option == 'object' && option
-
- if (!data && option == 'destroy') return
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.tooltip.Constructor = Tooltip
-
-
- // TOOLTIP NO CONFLICT
- // ===================
-
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old
- return this
- }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: popover.js v3.1.1
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // POPOVER PUBLIC CLASS DEFINITION
- // ===============================
-
- var Popover = function (element, options) {
- this.init('popover', element, options)
- }
-
- if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
-
- Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
- placement: 'right',
- trigger: 'click',
- content: '',
- template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
- })
-
-
- // NOTE: POPOVER EXTENDS tooltip.js
- // ================================
-
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
-
- Popover.prototype.constructor = Popover
-
- Popover.prototype.getDefaults = function () {
- return Popover.DEFAULTS
- }
-
- Popover.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
- var content = this.getContent()
-
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
- $tip.find('.popover-content')[ // we use append for html objects to maintain js events
- this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
- ](content)
-
- $tip.removeClass('fade top bottom left right in')
-
- // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
- // this manually by checking the contents.
- if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
- }
-
- Popover.prototype.hasContent = function () {
- return this.getTitle() || this.getContent()
- }
-
- Popover.prototype.getContent = function () {
- var $e = this.$element
- var o = this.options
-
- return $e.attr('data-content')
- || (typeof o.content == 'function' ?
- o.content.call($e[0]) :
- o.content)
- }
-
- Popover.prototype.arrow = function () {
- return this.$arrow = this.$arrow || this.tip().find('.arrow')
- }
-
- Popover.prototype.tip = function () {
- if (!this.$tip) this.$tip = $(this.options.template)
- return this.$tip
- }
-
-
- // POPOVER PLUGIN DEFINITION
- // =========================
-
- var old = $.fn.popover
-
- $.fn.popover = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.popover')
- var options = typeof option == 'object' && option
-
- if (!data && option == 'destroy') return
- if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.popover.Constructor = Popover
-
-
- // POPOVER NO CONFLICT
- // ===================
-
- $.fn.popover.noConflict = function () {
- $.fn.popover = old
- return this
- }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: scrollspy.js v3.1.1
- * http://getbootstrap.com/javascript/#scrollspy
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // SCROLLSPY CLASS DEFINITION
- // ==========================
-
- function ScrollSpy(element, options) {
- var href
- var process = $.proxy(this.process, this)
-
- this.$element = $(element).is('body') ? $(window) : $(element)
- this.$body = $('body')
- this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
- this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
- this.selector = (this.options.target
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- || '') + ' .nav li > a'
- this.offsets = $([])
- this.targets = $([])
- this.activeTarget = null
-
- this.refresh()
- this.process()
- }
-
- ScrollSpy.DEFAULTS = {
- offset: 10
- }
-
- ScrollSpy.prototype.refresh = function () {
- var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
-
- this.offsets = $([])
- this.targets = $([])
-
- var self = this
- var $targets = this.$body
- .find(this.selector)
- .map(function () {
- var $el = $(this)
- var href = $el.data('target') || $el.attr('href')
- var $href = /^#./.test(href) && $(href)
-
- return ($href
- && $href.length
- && $href.is(':visible')
- && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
- })
- .sort(function (a, b) { return a[0] - b[0] })
- .each(function () {
- self.offsets.push(this[0])
- self.targets.push(this[1])
- })
- }
-
- ScrollSpy.prototype.process = function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
- var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
- var maxScroll = scrollHeight - this.$scrollElement.height()
- var offsets = this.offsets
- var targets = this.targets
- var activeTarget = this.activeTarget
- var i
-
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets.last()[0]) && this.activate(i)
- }
-
- if (activeTarget && scrollTop <= offsets[0]) {
- return activeTarget != (i = targets[0]) && this.activate(i)
- }
-
- for (i = offsets.length; i--;) {
- activeTarget != targets[i]
- && scrollTop >= offsets[i]
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
- && this.activate( targets[i] )
- }
- }
-
- ScrollSpy.prototype.activate = function (target) {
- this.activeTarget = target
-
- $(this.selector)
- .parentsUntil(this.options.target, '.active')
- .removeClass('active')
-
- var selector = this.selector +
- '[data-target="' + target + '"],' +
- this.selector + '[href="' + target + '"]'
-
- var active = $(selector)
- .parents('li')
- .addClass('active')
-
- if (active.parent('.dropdown-menu').length) {
- active = active
- .closest('li.dropdown')
- .addClass('active')
- }
-
- active.trigger('activate.bs.scrollspy')
- }
-
-
- // SCROLLSPY PLUGIN DEFINITION
- // ===========================
-
- var old = $.fn.scrollspy
-
- $.fn.scrollspy = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.scrollspy')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.scrollspy.Constructor = ScrollSpy
-
-
- // SCROLLSPY NO CONFLICT
- // =====================
-
- $.fn.scrollspy.noConflict = function () {
- $.fn.scrollspy = old
- return this
- }
-
-
- // SCROLLSPY DATA-API
- // ==================
-
- $(window).on('load', function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this)
- $spy.scrollspy($spy.data())
- })
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tab.js v3.1.1
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // TAB CLASS DEFINITION
- // ====================
-
- var Tab = function (element) {
- this.element = $(element)
- }
-
- Tab.prototype.show = function () {
- var $this = this.element
- var $ul = $this.closest('ul:not(.dropdown-menu)')
- var selector = $this.data('target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- if ($this.parent('li').hasClass('active')) return
-
- var previous = $ul.find('.active:last a')[0]
- var e = $.Event('show.bs.tab', {
- relatedTarget: previous
- })
-
- $this.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- var $target = $(selector)
-
- this.activate($this.parent('li'), $ul)
- this.activate($target, $target.parent(), function () {
- $this.trigger({
- type: 'shown.bs.tab',
- relatedTarget: previous
- })
- })
- }
-
- Tab.prototype.activate = function (element, container, callback) {
- var $active = container.find('> .active')
- var transition = callback
- && $.support.transition
- && $active.hasClass('fade')
-
- function next() {
- $active
- .removeClass('active')
- .find('> .dropdown-menu > .active')
- .removeClass('active')
-
- element.addClass('active')
-
- if (transition) {
- element[0].offsetWidth // reflow for transition
- element.addClass('in')
- } else {
- element.removeClass('fade')
- }
-
- if (element.parent('.dropdown-menu')) {
- element.closest('li.dropdown').addClass('active')
- }
-
- callback && callback()
- }
-
- transition ?
- $active
- .one($.support.transition.end, next)
- .emulateTransitionEnd(150) :
- next()
-
- $active.removeClass('in')
- }
-
-
- // TAB PLUGIN DEFINITION
- // =====================
-
- var old = $.fn.tab
-
- $.fn.tab = function ( option ) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tab')
-
- if (!data) $this.data('bs.tab', (data = new Tab(this)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.tab.Constructor = Tab
-
-
- // TAB NO CONFLICT
- // ===============
-
- $.fn.tab.noConflict = function () {
- $.fn.tab = old
- return this
- }
-
-
- // TAB DATA-API
- // ============
-
- $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
- e.preventDefault()
- $(this).tab('show')
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: affix.js v3.1.1
- * http://getbootstrap.com/javascript/#affix
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // AFFIX CLASS DEFINITION
- // ======================
-
- var Affix = function (element, options) {
- this.options = $.extend({}, Affix.DEFAULTS, options)
- this.$window = $(window)
- .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
- .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
-
- this.$element = $(element)
- this.affixed =
- this.unpin =
- this.pinnedOffset = null
-
- this.checkPosition()
- }
-
- Affix.RESET = 'affix affix-top affix-bottom'
-
- Affix.DEFAULTS = {
- offset: 0
- }
-
- Affix.prototype.getPinnedOffset = function () {
- if (this.pinnedOffset) return this.pinnedOffset
- this.$element.removeClass(Affix.RESET).addClass('affix')
- var scrollTop = this.$window.scrollTop()
- var position = this.$element.offset()
- return (this.pinnedOffset = position.top - scrollTop)
- }
-
- Affix.prototype.checkPositionWithEventLoop = function () {
- setTimeout($.proxy(this.checkPosition, this), 1)
- }
-
- Affix.prototype.checkPosition = function () {
- if (!this.$element.is(':visible')) return
-
- var scrollHeight = $(document).height()
- var scrollTop = this.$window.scrollTop()
- var position = this.$element.offset()
- var offset = this.options.offset
- var offsetTop = offset.top
- var offsetBottom = offset.bottom
-
- if (this.affixed == 'top') position.top += scrollTop
-
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
- if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
-
- var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
- offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
- offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
-
- if (this.affixed === affix) return
- if (this.unpin) this.$element.css('top', '')
-
- var affixType = 'affix' + (affix ? '-' + affix : '')
- var e = $.Event(affixType + '.bs.affix')
-
- this.$element.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- this.affixed = affix
- this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
-
- this.$element
- .removeClass(Affix.RESET)
- .addClass(affixType)
- .trigger($.Event(affixType.replace('affix', 'affixed')))
-
- if (affix == 'bottom') {
- this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })
- }
- }
-
-
- // AFFIX PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.affix
-
- $.fn.affix = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.affix')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.affix.Constructor = Affix
-
-
- // AFFIX NO CONFLICT
- // =================
-
- $.fn.affix.noConflict = function () {
- $.fn.affix = old
- return this
- }
-
-
- // AFFIX DATA-API
- // ==============
-
- $(window).on('load', function () {
- $('[data-spy="affix"]').each(function () {
- var $spy = $(this)
- var data = $spy.data()
-
- data.offset = data.offset || {}
-
- if (data.offsetBottom) data.offset.bottom = data.offsetBottom
- if (data.offsetTop) data.offset.top = data.offsetTop
-
- $spy.affix(data)
- })
- })
-
-}(jQuery);
diff --git a/horizon/static/horizon/lib/jquery/jquery-ui-1.9.2.custom.js b/horizon/static/horizon/lib/jquery/jquery-ui-1.9.2.custom.js
deleted file mode 100755
index f407f138e..000000000
--- a/horizon/static/horizon/lib/jquery/jquery-ui-1.9.2.custom.js
+++ /dev/null
@@ -1,3958 +0,0 @@
-/*! jQuery UI - v1.9.2 - 2014-01-16
-* http://jqueryui.com
-* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.selectable.js, jquery.ui.sortable.js
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-(function( $, undefined ) {
-
-var uuid = 0,
- runiqueId = /^ui-id-\d+$/;
-
-// prevent duplicate loading
-// this is only a problem because we proxy existing functions
-// and we don't want to double proxy them
-$.ui = $.ui || {};
-if ( $.ui.version ) {
- return;
-}
-
-$.extend( $.ui, {
- version: "1.9.2",
-
- keyCode: {
- BACKSPACE: 8,
- COMMA: 188,
- DELETE: 46,
- DOWN: 40,
- END: 35,
- ENTER: 13,
- ESCAPE: 27,
- HOME: 36,
- LEFT: 37,
- NUMPAD_ADD: 107,
- NUMPAD_DECIMAL: 110,
- NUMPAD_DIVIDE: 111,
- NUMPAD_ENTER: 108,
- NUMPAD_MULTIPLY: 106,
- NUMPAD_SUBTRACT: 109,
- PAGE_DOWN: 34,
- PAGE_UP: 33,
- PERIOD: 190,
- RIGHT: 39,
- SPACE: 32,
- TAB: 9,
- UP: 38
- }
-});
-
-// plugins
-$.fn.extend({
- _focus: $.fn.focus,
- focus: function( delay, fn ) {
- return typeof delay === "number" ?
- this.each(function() {
- var elem = this;
- setTimeout(function() {
- $( elem ).focus();
- if ( fn ) {
- fn.call( elem );
- }
- }, delay );
- }) :
- this._focus.apply( this, arguments );
- },
-
- scrollParent: function() {
- var scrollParent;
- if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
- scrollParent = this.parents().filter(function() {
- return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
- }).eq(0);
- } else {
- scrollParent = this.parents().filter(function() {
- return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
- }).eq(0);
- }
-
- return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
- },
-
- zIndex: function( zIndex ) {
- if ( zIndex !== undefined ) {
- return this.css( "zIndex", zIndex );
- }
-
- if ( this.length ) {
- var elem = $( this[ 0 ] ), position, value;
- while ( elem.length && elem[ 0 ] !== document ) {
- // Ignore z-index if position is set to a value where z-index is ignored by the browser
- // This makes behavior of this function consistent across browsers
- // WebKit always returns auto if the element is positioned
- position = elem.css( "position" );
- if ( position === "absolute" || position === "relative" || position === "fixed" ) {
- // IE returns 0 when zIndex is not specified
- // other browsers return a string
- // we ignore the case of nested elements with an explicit value of 0
- // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
- value = parseInt( elem.css( "zIndex" ), 10 );
- if ( !isNaN( value ) && value !== 0 ) {
- return value;
- }
- }
- elem = elem.parent();
- }
- }
-
- return 0;
- },
-
- uniqueId: function() {
- return this.each(function() {
- if ( !this.id ) {
- this.id = "ui-id-" + (++uuid);
- }
- });
- },
-
- removeUniqueId: function() {
- return this.each(function() {
- if ( runiqueId.test( this.id ) ) {
- $( this ).removeAttr( "id" );
- }
- });
- }
-});
-
-// selectors
-function focusable( element, isTabIndexNotNaN ) {
- var map, mapName, img,
- nodeName = element.nodeName.toLowerCase();
- if ( "area" === nodeName ) {
- map = element.parentNode;
- mapName = map.name;
- if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
- return false;
- }
- img = $( "img[usemap=#" + mapName + "]" )[0];
- return !!img && visible( img );
- }
- return ( /input|select|textarea|button|object/.test( nodeName ) ?
- !element.disabled :
- "a" === nodeName ?
- element.href || isTabIndexNotNaN :
- isTabIndexNotNaN) &&
- // the element and all of its ancestors must be visible
- visible( element );
-}
-
-function visible( element ) {
- return $.expr.filters.visible( element ) &&
- !$( element ).parents().andSelf().filter(function() {
- return $.css( this, "visibility" ) === "hidden";
- }).length;
-}
-
-$.extend( $.expr[ ":" ], {
- data: $.expr.createPseudo ?
- $.expr.createPseudo(function( dataName ) {
- return function( elem ) {
- return !!$.data( elem, dataName );
- };
- }) :
- // support: jQuery <1.8
- function( elem, i, match ) {
- return !!$.data( elem, match[ 3 ] );
- },
-
- focusable: function( element ) {
- return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
- },
-
- tabbable: function( element ) {
- var tabIndex = $.attr( element, "tabindex" ),
- isTabIndexNaN = isNaN( tabIndex );
- return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
- }
-});
-
-// support
-$(function() {
- var body = document.body,
- div = body.appendChild( div = document.createElement( "div" ) );
-
- // access offsetHeight before setting the style to prevent a layout bug
- // in IE 9 which causes the element to continue to take up space even
- // after it is removed from the DOM (#8026)
- div.offsetHeight;
-
- $.extend( div.style, {
- minHeight: "100px",
- height: "auto",
- padding: 0,
- borderWidth: 0
- });
-
- $.support.minHeight = div.offsetHeight === 100;
- $.support.selectstart = "onselectstart" in div;
-
- // set display to none to avoid a layout bug in IE
- // http://dev.jquery.com/ticket/4014
- body.removeChild( div ).style.display = "none";
-});
-
-// support: jQuery <1.8
-if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
- $.each( [ "Width", "Height" ], function( i, name ) {
- var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
- type = name.toLowerCase(),
- orig = {
- innerWidth: $.fn.innerWidth,
- innerHeight: $.fn.innerHeight,
- outerWidth: $.fn.outerWidth,
- outerHeight: $.fn.outerHeight
- };
-
- function reduce( elem, size, border, margin ) {
- $.each( side, function() {
- size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
- if ( border ) {
- size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
- }
- if ( margin ) {
- size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
- }
- });
- return size;
- }
-
- $.fn[ "inner" + name ] = function( size ) {
- if ( size === undefined ) {
- return orig[ "inner" + name ].call( this );
- }
-
- return this.each(function() {
- $( this ).css( type, reduce( this, size ) + "px" );
- });
- };
-
- $.fn[ "outer" + name] = function( size, margin ) {
- if ( typeof size !== "number" ) {
- return orig[ "outer" + name ].call( this, size );
- }
-
- return this.each(function() {
- $( this).css( type, reduce( this, size, true, margin ) + "px" );
- });
- };
- });
-}
-
-// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
-if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
- $.fn.removeData = (function( removeData ) {
- return function( key ) {
- if ( arguments.length ) {
- return removeData.call( this, $.camelCase( key ) );
- } else {
- return removeData.call( this );
- }
- };
- })( $.fn.removeData );
-}
-
-
-
-
-
-// deprecated
-
-(function() {
- var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
- $.ui.ie = uaMatch.length ? true : false;
- $.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
-})();
-
-$.fn.extend({
- disableSelection: function() {
- return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
- ".ui-disableSelection", function( event ) {
- event.preventDefault();
- });
- },
-
- enableSelection: function() {
- return this.unbind( ".ui-disableSelection" );
- }
-});
-
-$.extend( $.ui, {
- // $.ui.plugin is deprecated. Use the proxy pattern instead.
- plugin: {
- add: function( module, option, set ) {
- var i,
- proto = $.ui[ module ].prototype;
- for ( i in set ) {
- proto.plugins[ i ] = proto.plugins[ i ] || [];
- proto.plugins[ i ].push( [ option, set[ i ] ] );
- }
- },
- call: function( instance, name, args ) {
- var i,
- set = instance.plugins[ name ];
- if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
- return;
- }
-
- for ( i = 0; i < set.length; i++ ) {
- if ( instance.options[ set[ i ][ 0 ] ] ) {
- set[ i ][ 1 ].apply( instance.element, args );
- }
- }
- }
- },
-
- contains: $.contains,
-
- // only used by resizable
- hasScroll: function( el, a ) {
-
- //If overflow is hidden, the element might have extra content, but the user wants to hide it
- if ( $( el ).css( "overflow" ) === "hidden") {
- return false;
- }
-
- var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
- has = false;
-
- if ( el[ scroll ] > 0 ) {
- return true;
- }
-
- // TODO: determine which cases actually cause this to happen
- // if the element doesn't have the scroll set, see if it's possible to
- // set the scroll
- el[ scroll ] = 1;
- has = ( el[ scroll ] > 0 );
- el[ scroll ] = 0;
- return has;
- },
-
- // these are odd functions, fix the API or move into individual plugins
- isOverAxis: function( x, reference, size ) {
- //Determines when x coordinate is over "b" element axis
- return ( x > reference ) && ( x < ( reference + size ) );
- },
- isOver: function( y, x, top, left, height, width ) {
- //Determines when x, y coordinates is over "b" element
- return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
- }
-});
-
-})( jQuery );
-(function( $, undefined ) {
-
-var uuid = 0,
- slice = Array.prototype.slice,
- _cleanData = $.cleanData;
-$.cleanData = function( elems ) {
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- try {
- $( elem ).triggerHandler( "remove" );
- // http://bugs.jquery.com/ticket/8235
- } catch( e ) {}
- }
- _cleanData( elems );
-};
-
-$.widget = function( name, base, prototype ) {
- var fullName, existingConstructor, constructor, basePrototype,
- namespace = name.split( "." )[ 0 ];
-
- name = name.split( "." )[ 1 ];
- fullName = namespace + "-" + name;
-
- if ( !prototype ) {
- prototype = base;
- base = $.Widget;
- }
-
- // create selector for plugin
- $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
- return !!$.data( elem, fullName );
- };
-
- $[ namespace ] = $[ namespace ] || {};
- existingConstructor = $[ namespace ][ name ];
- constructor = $[ namespace ][ name ] = function( options, element ) {
- // allow instantiation without "new" keyword
- if ( !this._createWidget ) {
- return new constructor( options, element );
- }
-
- // allow instantiation without initializing for simple inheritance
- // must use "new" keyword (the code above always passes args)
- if ( arguments.length ) {
- this._createWidget( options, element );
- }
- };
- // extend with the existing constructor to carry over any static properties
- $.extend( constructor, existingConstructor, {
- version: prototype.version,
- // copy the object used to create the prototype in case we need to
- // redefine the widget later
- _proto: $.extend( {}, prototype ),
- // track widgets that inherit from this widget in case this widget is
- // redefined after a widget inherits from it
- _childConstructors: []
- });
-
- basePrototype = new base();
- // we need to make the options hash a property directly on the new instance
- // otherwise we'll modify the options hash on the prototype that we're
- // inheriting from
- basePrototype.options = $.widget.extend( {}, basePrototype.options );
- $.each( prototype, function( prop, value ) {
- if ( $.isFunction( value ) ) {
- prototype[ prop ] = (function() {
- var _super = function() {
- return base.prototype[ prop ].apply( this, arguments );
- },
- _superApply = function( args ) {
- return base.prototype[ prop ].apply( this, args );
- };
- return function() {
- var __super = this._super,
- __superApply = this._superApply,
- returnValue;
-
- this._super = _super;
- this._superApply = _superApply;
-
- returnValue = value.apply( this, arguments );
-
- this._super = __super;
- this._superApply = __superApply;
-
- return returnValue;
- };
- })();
- }
- });
- constructor.prototype = $.widget.extend( basePrototype, {
- // TODO: remove support for widgetEventPrefix
- // always use the name + a colon as the prefix, e.g., draggable:start
- // don't prefix for widgets that aren't DOM-based
- widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
- }, prototype, {
- constructor: constructor,
- namespace: namespace,
- widgetName: name,
- // TODO remove widgetBaseClass, see #8155
- widgetBaseClass: fullName,
- widgetFullName: fullName
- });
-
- // If this widget is being redefined then we need to find all widgets that
- // are inheriting from it and redefine all of them so that they inherit from
- // the new version of this widget. We're essentially trying to replace one
- // level in the prototype chain.
- if ( existingConstructor ) {
- $.each( existingConstructor._childConstructors, function( i, child ) {
- var childPrototype = child.prototype;
-
- // redefine the child widget using the same prototype that was
- // originally used, but inherit from the new version of the base
- $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
- });
- // remove the list of existing child constructors from the old constructor
- // so the old child constructors can be garbage collected
- delete existingConstructor._childConstructors;
- } else {
- base._childConstructors.push( constructor );
- }
-
- $.widget.bridge( name, constructor );
-};
-
-$.widget.extend = function( target ) {
- var input = slice.call( arguments, 1 ),
- inputIndex = 0,
- inputLength = input.length,
- key,
- value;
- for ( ; inputIndex < inputLength; inputIndex++ ) {
- for ( key in input[ inputIndex ] ) {
- value = input[ inputIndex ][ key ];
- if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
- // Clone objects
- if ( $.isPlainObject( value ) ) {
- target[ key ] = $.isPlainObject( target[ key ] ) ?
- $.widget.extend( {}, target[ key ], value ) :
- // Don't extend strings, arrays, etc. with objects
- $.widget.extend( {}, value );
- // Copy everything else by reference
- } else {
- target[ key ] = value;
- }
- }
- }
- }
- return target;
-};
-
-$.widget.bridge = function( name, object ) {
- var fullName = object.prototype.widgetFullName || name;
- $.fn[ name ] = function( options ) {
- var isMethodCall = typeof options === "string",
- args = slice.call( arguments, 1 ),
- returnValue = this;
-
- // allow multiple hashes to be passed on init
- options = !isMethodCall && args.length ?
- $.widget.extend.apply( null, [ options ].concat(args) ) :
- options;
-
- if ( isMethodCall ) {
- this.each(function() {
- var methodValue,
- instance = $.data( this, fullName );
- if ( !instance ) {
- return $.error( "cannot call methods on " + name + " prior to initialization; " +
- "attempted to call method '" + options + "'" );
- }
- if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
- return $.error( "no such method '" + options + "' for " + name + " widget instance" );
- }
- methodValue = instance[ options ].apply( instance, args );
- if ( methodValue !== instance && methodValue !== undefined ) {
- returnValue = methodValue && methodValue.jquery ?
- returnValue.pushStack( methodValue.get() ) :
- methodValue;
- return false;
- }
- });
- } else {
- this.each(function() {
- var instance = $.data( this, fullName );
- if ( instance ) {
- instance.option( options || {} )._init();
- } else {
- $.data( this, fullName, new object( options, this ) );
- }
- });
- }
-
- return returnValue;
- };
-};
-
-$.Widget = function( /* options, element */ ) {};
-$.Widget._childConstructors = [];
-
-$.Widget.prototype = {
- widgetName: "widget",
- widgetEventPrefix: "",
- defaultElement: "<div>",
- options: {
- disabled: false,
-
- // callbacks
- create: null
- },
- _createWidget: function( options, element ) {
- element = $( element || this.defaultElement || this )[ 0 ];
- this.element = $( element );
- this.uuid = uuid++;
- this.eventNamespace = "." + this.widgetName + this.uuid;
- this.options = $.widget.extend( {},
- this.options,
- this._getCreateOptions(),
- options );
-
- this.bindings = $();
- this.hoverable = $();
- this.focusable = $();
-
- if ( element !== this ) {
- // 1.9 BC for #7810
- // TODO remove dual storage
- $.data( element, this.widgetName, this );
- $.data( element, this.widgetFullName, this );
- this._on( true, this.element, {
- remove: function( event ) {
- if ( event.target === element ) {
- this.destroy();
- }
- }
- });
- this.document = $( element.style ?
- // element within the document
- element.ownerDocument :
- // element is window or document
- element.document || element );
- this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
- }
-
- this._create();
- this._trigger( "create", null, this._getCreateEventData() );
- this._init();
- },
- _getCreateOptions: $.noop,
- _getCreateEventData: $.noop,
- _create: $.noop,
- _init: $.noop,
-
- destroy: function() {
- this._destroy();
- // we can probably remove the unbind calls in 2.0
- // all event bindings should go through this._on()
- this.element
- .unbind( this.eventNamespace )
- // 1.9 BC for #7810
- // TODO remove dual storage
- .removeData( this.widgetName )
- .removeData( this.widgetFullName )
- // support: jquery <1.6.3
- // http://bugs.jquery.com/ticket/9413
- .removeData( $.camelCase( this.widgetFullName ) );
- this.widget()
- .unbind( this.eventNamespace )
- .removeAttr( "aria-disabled" )
- .removeClass(
- this.widgetFullName + "-disabled " +
- "ui-state-disabled" );
-
- // clean up events and states
- this.bindings.unbind( this.eventNamespace );
- this.hoverable.removeClass( "ui-state-hover" );
- this.focusable.removeClass( "ui-state-focus" );
- },
- _destroy: $.noop,
-
- widget: function() {
- return this.element;
- },
-
- option: function( key, value ) {
- var options = key,
- parts,
- curOption,
- i;
-
- if ( arguments.length === 0 ) {
- // don't return a reference to the internal hash
- return $.widget.extend( {}, this.options );
- }
-
- if ( typeof key === "string" ) {
- // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
- options = {};
- parts = key.split( "." );
- key = parts.shift();
- if ( parts.length ) {
- curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
- for ( i = 0; i < parts.length - 1; i++ ) {
- curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
- curOption = curOption[ parts[ i ] ];
- }
- key = parts.pop();
- if ( value === undefined ) {
- return curOption[ key ] === undefined ? null : curOption[ key ];
- }
- curOption[ key ] = value;
- } else {
- if ( value === undefined ) {
- return this.options[ key ] === undefined ? null : this.options[ key ];
- }
- options[ key ] = value;
- }
- }
-
- this._setOptions( options );
-
- return this;
- },
- _setOptions: function( options ) {
- var key;
-
- for ( key in options ) {
- this._setOption( key, options[ key ] );
- }
-
- return this;
- },
- _setOption: function( key, value ) {
- this.options[ key ] = value;
-
- if ( key === "disabled" ) {
- this.widget()
- .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
- .attr( "aria-disabled", value );
- this.hoverable.removeClass( "ui-state-hover" );
- this.focusable.removeClass( "ui-state-focus" );
- }
-
- return this;
- },
-
- enable: function() {
- return this._setOption( "disabled", false );
- },
- disable: function() {
- return this._setOption( "disabled", true );
- },
-
- _on: function( suppressDisabledCheck, element, handlers ) {
- var delegateElement,
- instance = this;
-
- // no suppressDisabledCheck flag, shuffle arguments
- if ( typeof suppressDisabledCheck !== "boolean" ) {
- handlers = element;
- element = suppressDisabledCheck;
- suppressDisabledCheck = false;
- }
-
- // no element argument, shuffle and use this.element
- if ( !handlers ) {
- handlers = element;
- element = this.element;
- delegateElement = this.widget();
- } else {
- // accept selectors, DOM elements
- element = delegateElement = $( element );
- this.bindings = this.bindings.add( element );
- }
-
- $.each( handlers, function( event, handler ) {
- function handlerProxy() {
- // allow widgets to customize the disabled handling
- // - disabled as an array instead of boolean
- // - disabled class as method for disabling individual parts
- if ( !suppressDisabledCheck &&
- ( instance.options.disabled === true ||
- $( this ).hasClass( "ui-state-disabled" ) ) ) {
- return;
- }
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
-
- // copy the guid so direct unbinding works
- if ( typeof handler !== "string" ) {
- handlerProxy.guid = handler.guid =
- handler.guid || handlerProxy.guid || $.guid++;
- }
-
- var match = event.match( /^(\w+)\s*(.*)$/ ),
- eventName = match[1] + instance.eventNamespace,
- selector = match[2];
- if ( selector ) {
- delegateElement.delegate( selector, eventName, handlerProxy );
- } else {
- element.bind( eventName, handlerProxy );
- }
- });
- },
-
- _off: function( element, eventName ) {
- eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
- element.unbind( eventName ).undelegate( eventName );
- },
-
- _delay: function( handler, delay ) {
- function handlerProxy() {
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
- var instance = this;
- return setTimeout( handlerProxy, delay || 0 );
- },
-
- _hoverable: function( element ) {
- this.hoverable = this.hoverable.add( element );
- this._on( element, {
- mouseenter: function( event ) {
- $( event.currentTarget ).addClass( "ui-state-hover" );
- },
- mouseleave: function( event ) {
- $( event.currentTarget ).removeClass( "ui-state-hover" );
- }
- });
- },
-
- _focusable: function( element ) {
- this.focusable = this.focusable.add( element );
- this._on( element, {
- focusin: function( event ) {
- $( event.currentTarget ).addClass( "ui-state-focus" );
- },
- focusout: function( event ) {
- $( event.currentTarget ).removeClass( "ui-state-focus" );
- }
- });
- },
-
- _trigger: function( type, event, data ) {
- var prop, orig,
- callback = this.options[ type ];
-
- data = data || {};
- event = $.Event( event );
- event.type = ( type === this.widgetEventPrefix ?
- type :
- this.widgetEventPrefix + type ).toLowerCase();
- // the original event may come from any element
- // so we need to reset the target on the new event
- event.target = this.element[ 0 ];
-
- // copy original event properties over to the new event
- orig = event.originalEvent;
- if ( orig ) {
- for ( prop in orig ) {
- if ( !( prop in event ) ) {
- event[ prop ] = orig[ prop ];
- }
- }
- }
-
- this.element.trigger( event, data );
- return !( $.isFunction( callback ) &&
- callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
- event.isDefaultPrevented() );
- }
-};
-
-$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
- $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
- if ( typeof options === "string" ) {
- options = { effect: options };
- }
- var hasOptions,
- effectName = !options ?
- method :
- options === true || typeof options === "number" ?
- defaultEffect :
- options.effect || defaultEffect;
- options = options || {};
- if ( typeof options === "number" ) {
- options = { duration: options };
- }
- hasOptions = !$.isEmptyObject( options );
- options.complete = callback;
- if ( options.delay ) {
- element.delay( options.delay );
- }
- if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
- element[ method ]( options );
- } else if ( effectName !== method && element[ effectName ] ) {
- element[ effectName ]( options.duration, options.easing, callback );
- } else {
- element.queue(function( next ) {
- $( this )[ method ]();
- if ( callback ) {
- callback.call( element[ 0 ] );
- }
- next();
- });
- }
- };
-});
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
- $.Widget.prototype._getCreateOptions = function() {
- return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
- };
-}
-
-})( jQuery );
-(function( $, undefined ) {
-
-var mouseHandled = false;
-$( document ).mouseup( function( e ) {
- mouseHandled = false;
-});
-
-$.widget("ui.mouse", {
- version: "1.9.2",
- options: {
- cancel: 'input,textarea,button,select,option',
- distance: 1,
- delay: 0
- },
- _mouseInit: function() {
- var that = this;
-
- this.element
- .bind('mousedown.'+this.widgetName, function(event) {
- return that._mouseDown(event);
- })
- .bind('click.'+this.widgetName, function(event) {
- if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
- $.removeData(event.target, that.widgetName + '.preventClickEvent');
- event.stopImmediatePropagation();
- return false;
- }
- });
-
- this.started = false;
- },
-
- // TODO: make sure destroying one instance of mouse doesn't mess with
- // other instances of mouse
- _mouseDestroy: function() {
- this.element.unbind('.'+this.widgetName);
- if ( this._mouseMoveDelegate ) {
- $(document)
- .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
- .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
- }
- },
-
- _mouseDown: function(event) {
- // don't let more than one widget handle mouseStart
- if( mouseHandled ) { return; }
-
- // we may have missed mouseup (out of window)
- (this._mouseStarted && this._mouseUp(event));
-
- this._mouseDownEvent = event;
-
- var that = this,
- btnIsLeft = (event.which === 1),
- // event.target.nodeName works around a bug in IE 8 with
- // disabled inputs (#7620)
- elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
- if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
- return true;
- }
-
- this.mouseDelayMet = !this.options.delay;
- if (!this.mouseDelayMet) {
- this._mouseDelayTimer = setTimeout(function() {
- that.mouseDelayMet = true;
- }, this.options.delay);
- }
-
- if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
- this._mouseStarted = (this._mouseStart(event) !== false);
- if (!this._mouseStarted) {
- event.preventDefault();
- return true;
- }
- }
-
- // Click event may never have fired (Gecko & Opera)
- if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
- $.removeData(event.target, this.widgetName + '.preventClickEvent');
- }
-
- // these delegates are required to keep context
- this._mouseMoveDelegate = function(event) {
- return that._mouseMove(event);
- };
- this._mouseUpDelegate = function(event) {
- return that._mouseUp(event);
- };
- $(document)
- .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
- .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
- event.preventDefault();
-
- mouseHandled = true;
- return true;
- },
-
- _mouseMove: function(event) {
- // IE mouseup check - mouseup happened when mouse was out of window
- if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
- return this._mouseUp(event);
- }
-
- if (this._mouseStarted) {
- this._mouseDrag(event);
- return event.preventDefault();
- }
-
- if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
- this._mouseStarted =
- (this._mouseStart(this._mouseDownEvent, event) !== false);
- (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
- }
-
- return !this._mouseStarted;
- },
-
- _mouseUp: function(event) {
- $(document)
- .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
- .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
- if (this._mouseStarted) {
- this._mouseStarted = false;
-
- if (event.target === this._mouseDownEvent.target) {
- $.data(event.target, this.widgetName + '.preventClickEvent', true);
- }
-
- this._mouseStop(event);
- }
-
- return false;
- },
-
- _mouseDistanceMet: function(event) {
- return (Math.max(
- Math.abs(this._mouseDownEvent.pageX - event.pageX),
- Math.abs(this._mouseDownEvent.pageY - event.pageY)
- ) >= this.options.distance
- );
- },
-
- _mouseDelayMet: function(event) {
- return this.mouseDelayMet;
- },
-
- // These are placeholder methods, to be overriden by extending plugin
- _mouseStart: function(event) {},
- _mouseDrag: function(event) {},
- _mouseStop: function(event) {},
- _mouseCapture: function(event) { return true; }
-});
-
-})(jQuery);
-(function( $, undefined ) {
-
-$.ui = $.ui || {};
-
-var cachedScrollbarWidth,
- max = Math.max,
- abs = Math.abs,
- round = Math.round,
- rhorizontal = /left|center|right/,
- rvertical = /top|center|bottom/,
- roffset = /[\+\-]\d+%?/,
- rposition = /^\w+/,
- rpercent = /%$/,
- _position = $.fn.position;
-
-function getOffsets( offsets, width, height ) {
- return [
- parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
- parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
- ];
-}
-function parseCss( element, property ) {
- return parseInt( $.css( element, property ), 10 ) || 0;
-}
-
-$.position = {
- scrollbarWidth: function() {
- if ( cachedScrollbarWidth !== undefined ) {
- return cachedScrollbarWidth;
- }
- var w1, w2,
- div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
- innerDiv = div.children()[0];
-
- $( "body" ).append( div );
- w1 = innerDiv.offsetWidth;
- div.css( "overflow", "scroll" );
-
- w2 = innerDiv.offsetWidth;
-
- if ( w1 === w2 ) {
- w2 = div[0].clientWidth;
- }
-
- div.remove();
-
- return (cachedScrollbarWidth = w1 - w2);
- },
- getScrollInfo: function( within ) {
- var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
- overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
- hasOverflowX = overflowX === "scroll" ||
- ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
- hasOverflowY = overflowY === "scroll" ||
- ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
- return {
- width: hasOverflowX ? $.position.scrollbarWidth() : 0,
- height: hasOverflowY ? $.position.scrollbarWidth() : 0
- };
- },
- getWithinInfo: function( element ) {
- var withinElement = $( element || window ),
- isWindow = $.isWindow( withinElement[0] );
- return {
- element: withinElement,
- isWindow: isWindow,
- offset: withinElement.offset() || { left: 0, top: 0 },
- scrollLeft: withinElement.scrollLeft(),
- scrollTop: withinElement.scrollTop(),
- width: isWindow ? withinElement.width() : withinElement.outerWidth(),
- height: isWindow ? withinElement.height() : withinElement.outerHeight()
- };
- }
-};
-
-$.fn.position = function( options ) {
- if ( !options || !options.of ) {
- return _position.apply( this, arguments );
- }
-
- // make a copy, we don't want to modify arguments
- options = $.extend( {}, options );
-
- var atOffset, targetWidth, targetHeight, targetOffset, basePosition,
- target = $( options.of ),
- within = $.position.getWithinInfo( options.within ),
- scrollInfo = $.position.getScrollInfo( within ),
- targetElem = target[0],
- collision = ( options.collision || "flip" ).split( " " ),
- offsets = {};
-
- if ( targetElem.nodeType === 9 ) {
- targetWidth = target.width();
- targetHeight = target.height();
- targetOffset = { top: 0, left: 0 };
- } else if ( $.isWindow( targetElem ) ) {
- targetWidth = target.width();
- targetHeight = target.height();
- targetOffset = { top: target.scrollTop(), left: target.scrollLeft() };
- } else if ( targetElem.preventDefault ) {
- // force left top to allow flipping
- options.at = "left top";
- targetWidth = targetHeight = 0;
- targetOffset = { top: targetElem.pageY, left: targetElem.pageX };
- } else {
- targetWidth = target.outerWidth();
- targetHeight = target.outerHeight();
- targetOffset = target.offset();
- }
- // clone to reuse original targetOffset later
- basePosition = $.extend( {}, targetOffset );
-
- // force my and at to have valid horizontal and vertical positions
- // if a value is missing or invalid, it will be converted to center
- $.each( [ "my", "at" ], function() {
- var pos = ( options[ this ] || "" ).split( " " ),
- horizontalOffset,
- verticalOffset;
-
- if ( pos.length === 1) {
- pos = rhorizontal.test( pos[ 0 ] ) ?
- pos.concat( [ "center" ] ) :
- rvertical.test( pos[ 0 ] ) ?
- [ "center" ].concat( pos ) :
- [ "center", "center" ];
- }
- pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
- pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
-
- // calculate offsets
- horizontalOffset = roffset.exec( pos[ 0 ] );
- verticalOffset = roffset.exec( pos[ 1 ] );
- offsets[ this ] = [
- horizontalOffset ? horizontalOffset[ 0 ] : 0,
- verticalOffset ? verticalOffset[ 0 ] : 0
- ];
-
- // reduce to just the positions without the offsets
- options[ this ] = [
- rposition.exec( pos[ 0 ] )[ 0 ],
- rposition.exec( pos[ 1 ] )[ 0 ]
- ];
- });
-
- // normalize collision option
- if ( collision.length === 1 ) {
- collision[ 1 ] = collision[ 0 ];
- }
-
- if ( options.at[ 0 ] === "right" ) {
- basePosition.left += targetWidth;
- } else if ( options.at[ 0 ] === "center" ) {
- basePosition.left += targetWidth / 2;
- }
-
- if ( options.at[ 1 ] === "bottom" ) {
- basePosition.top += targetHeight;
- } else if ( options.at[ 1 ] === "center" ) {
- basePosition.top += targetHeight / 2;
- }
-
- atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
- basePosition.left += atOffset[ 0 ];
- basePosition.top += atOffset[ 1 ];
-
- return this.each(function() {
- var collisionPosition, using,
- elem = $( this ),
- elemWidth = elem.outerWidth(),
- elemHeight = elem.outerHeight(),
- marginLeft = parseCss( this, "marginLeft" ),
- marginTop = parseCss( this, "marginTop" ),
- collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
- collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
- position = $.extend( {}, basePosition ),
- myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
-
- if ( options.my[ 0 ] === "right" ) {
- position.left -= elemWidth;
- } else if ( options.my[ 0 ] === "center" ) {
- position.left -= elemWidth / 2;
- }
-
- if ( options.my[ 1 ] === "bottom" ) {
- position.top -= elemHeight;
- } else if ( options.my[ 1 ] === "center" ) {
- position.top -= elemHeight / 2;
- }
-
- position.left += myOffset[ 0 ];
- position.top += myOffset[ 1 ];
-
- // if the browser doesn't support fractions, then round for consistent results
- if ( !$.support.offsetFractions ) {
- position.left = round( position.left );
- position.top = round( position.top );
- }
-
- collisionPosition = {
- marginLeft: marginLeft,
- marginTop: marginTop
- };
-
- $.each( [ "left", "top" ], function( i, dir ) {
- if ( $.ui.position[ collision[ i ] ] ) {
- $.ui.position[ collision[ i ] ][ dir ]( position, {
- targetWidth: targetWidth,
- targetHeight: targetHeight,
- elemWidth: elemWidth,
- elemHeight: elemHeight,
- collisionPosition: collisionPosition,
- collisionWidth: collisionWidth,
- collisionHeight: collisionHeight,
- offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
- my: options.my,
- at: options.at,
- within: within,
- elem : elem
- });
- }
- });
-
- if ( $.fn.bgiframe ) {
- elem.bgiframe();
- }
-
- if ( options.using ) {
- // adds feedback as second argument to using callback, if present
- using = function( props ) {
- var left = targetOffset.left - position.left,
- right = left + targetWidth - elemWidth,
- top = targetOffset.top - position.top,
- bottom = top + targetHeight - elemHeight,
- feedback = {
- target: {
- element: target,
- left: targetOffset.left,
- top: targetOffset.top,
- width: targetWidth,
- height: targetHeight
- },
- element: {
- element: elem,
- left: position.left,
- top: position.top,
- width: elemWidth,
- height: elemHeight
- },
- horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
- vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
- };
- if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
- feedback.horizontal = "center";
- }
- if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
- feedback.vertical = "middle";
- }
- if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
- feedback.important = "horizontal";
- } else {
- feedback.important = "vertical";
- }
- options.using.call( this, props, feedback );
- };
- }
-
- elem.offset( $.extend( position, { using: using } ) );
- });
-};
-
-$.ui.position = {
- fit: {
- left: function( position, data ) {
- var within = data.within,
- withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
- outerWidth = within.width,
- collisionPosLeft = position.left - data.collisionPosition.marginLeft,
- overLeft = withinOffset - collisionPosLeft,
- overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
- newOverRight;
-
- // element is wider than within
- if ( data.collisionWidth > outerWidth ) {
- // element is initially over the left side of within
- if ( overLeft > 0 && overRight <= 0 ) {
- newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
- position.left += overLeft - newOverRight;
- // element is initially over right side of within
- } else if ( overRight > 0 && overLeft <= 0 ) {
- position.left = withinOffset;
- // element is initially over both left and right sides of within
- } else {
- if ( overLeft > overRight ) {
- position.left = withinOffset + outerWidth - data.collisionWidth;
- } else {
- position.left = withinOffset;
- }
- }
- // too far left -> align with left edge
- } else if ( overLeft > 0 ) {
- position.left += overLeft;
- // too far right -> align with right edge
- } else if ( overRight > 0 ) {
- position.left -= overRight;
- // adjust based on position and margin
- } else {
- position.left = max( position.left - collisionPosLeft, position.left );
- }
- },
- top: function( position, data ) {
- var within = data.within,
- withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
- outerHeight = data.within.height,
- collisionPosTop = position.top - data.collisionPosition.marginTop,
- overTop = withinOffset - collisionPosTop,
- overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
- newOverBottom;
-
- // element is taller than within
- if ( data.collisionHeight > outerHeight ) {
- // element is initially over the top of within
- if ( overTop > 0 && overBottom <= 0 ) {
- newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
- position.top += overTop - newOverBottom;
- // element is initially over bottom of within
- } else if ( overBottom > 0 && overTop <= 0 ) {
- position.top = withinOffset;
- // element is initially over both top and bottom of within
- } else {
- if ( overTop > overBottom ) {
- position.top = withinOffset + outerHeight - data.collisionHeight;
- } else {
- position.top = withinOffset;
- }
- }
- // too far up -> align with top
- } else if ( overTop > 0 ) {
- position.top += overTop;
- // too far down -> align with bottom edge
- } else if ( overBottom > 0 ) {
- position.top -= overBottom;
- // adjust based on position and margin
- } else {
- position.top = max( position.top - collisionPosTop, position.top );
- }
- }
- },
- flip: {
- left: function( position, data ) {
- var within = data.within,
- withinOffset = within.offset.left + within.scrollLeft,
- outerWidth = within.width,
- offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
- collisionPosLeft = position.left - data.collisionPosition.marginLeft,
- overLeft = collisionPosLeft - offsetLeft,
- overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
- myOffset = data.my[ 0 ] === "left" ?
- -data.elemWidth :
- data.my[ 0 ] === "right" ?
- data.elemWidth :
- 0,
- atOffset = data.at[ 0 ] === "left" ?
- data.targetWidth :
- data.at[ 0 ] === "right" ?
- -data.targetWidth :
- 0,
- offset = -2 * data.offset[ 0 ],
- newOverRight,
- newOverLeft;
-
- if ( overLeft < 0 ) {
- newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
- if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
- position.left += myOffset + atOffset + offset;
- }
- }
- else if ( overRight > 0 ) {
- newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
- if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
- position.left += myOffset + atOffset + offset;
- }
- }
- },
- top: function( position, data ) {
- var within = data.within,
- withinOffset = within.offset.top + within.scrollTop,
- outerHeight = within.height,
- offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
- collisionPosTop = position.top - data.collisionPosition.marginTop,
- overTop = collisionPosTop - offsetTop,
- overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
- top = data.my[ 1 ] === "top",
- myOffset = top ?
- -data.elemHeight :
- data.my[ 1 ] === "bottom" ?
- data.elemHeight :
- 0,
- atOffset = data.at[ 1 ] === "top" ?
- data.targetHeight :
- data.at[ 1 ] === "bottom" ?
- -data.targetHeight :
- 0,
- offset = -2 * data.offset[ 1 ],
- newOverTop,
- newOverBottom;
- if ( overTop < 0 ) {
- newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
- if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
- position.top += myOffset + atOffset + offset;
- }
- }
- else if ( overBottom > 0 ) {
- newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
- if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
- position.top += myOffset + atOffset + offset;
- }
- }
- }
- },
- flipfit: {
- left: function() {
- $.ui.position.flip.left.apply( this, arguments );
- $.ui.position.fit.left.apply( this, arguments );
- },
- top: function() {
- $.ui.position.flip.top.apply( this, arguments );
- $.ui.position.fit.top.apply( this, arguments );
- }
- }
-};
-
-// fraction support test
-(function () {
- var testElement, testElementParent, testElementStyle, offsetLeft, i,
- body = document.getElementsByTagName( "body" )[ 0 ],
- div = document.createElement( "div" );
-
- //Create a "fake body" for testing based on method used in jQuery.support
- testElement = document.createElement( body ? "div" : "body" );
- testElementStyle = {
- visibility: "hidden",
- width: 0,
- height: 0,
- border: 0,
- margin: 0,
- background: "none"
- };
- if ( body ) {
- $.extend( testElementStyle, {
- position: "absolute",
- left: "-1000px",
- top: "-1000px"
- });
- }
- for ( i in testElementStyle ) {
- testElement.style[ i ] = testElementStyle[ i ];
- }
- testElement.appendChild( div );
- testElementParent = body || document.documentElement;
- testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
- div.style.cssText = "position: absolute; left: 10.7432222px;";
-
- offsetLeft = $( div ).offset().left;
- $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
-
- testElement.innerHTML = "";
- testElementParent.removeChild( testElement );
-})();
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
- // offset option
- (function( $ ) {
- var _position = $.fn.position;
- $.fn.position = function( options ) {
- if ( !options || !options.offset ) {
- return _position.call( this, options );
- }
- var offset = options.offset.split( " " ),
- at = options.at.split( " " );
- if ( offset.length === 1 ) {
- offset[ 1 ] = offset[ 0 ];
- }
- if ( /^\d/.test( offset[ 0 ] ) ) {
- offset[ 0 ] = "+" + offset[ 0 ];
- }
- if ( /^\d/.test( offset[ 1 ] ) ) {
- offset[ 1 ] = "+" + offset[ 1 ];
- }
- if ( at.length === 1 ) {
- if ( /left|center|right/.test( at[ 0 ] ) ) {
- at[ 1 ] = "center";
- } else {
- at[ 1 ] = at[ 0 ];
- at[ 0 ] = "center";
- }
- }
- return _position.call( this, $.extend( options, {
- at: at[ 0 ] + offset[ 0 ] + " " + at[ 1 ] + offset[ 1 ],
- offset: undefined
- } ) );
- };
- }( jQuery ) );
-}
-
-}( jQuery ) );
-(function( $, undefined ) {
-
-$.widget("ui.draggable", $.ui.mouse, {
- version: "1.9.2",
- widgetEventPrefix: "drag",
- options: {
- addClasses: true,
- appendTo: "parent",
- axis: false,
- connectToSortable: false,
- containment: false,
- cursor: "auto",
- cursorAt: false,
- grid: false,
- handle: false,
- helper: "original",
- iframeFix: false,
- opacity: false,
- refreshPositions: false,
- revert: false,
- revertDuration: 500,
- scope: "default",
- scroll: true,
- scrollSensitivity: 20,
- scrollSpeed: 20,
- snap: false,
- snapMode: "both",
- snapTolerance: 20,
- stack: false,
- zIndex: false
- },
- _create: function() {
-
- if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
- this.element[0].style.position = 'relative';
-
- (this.options.addClasses && this.element.addClass("ui-draggable"));
- (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
-
- this._mouseInit();
-
- },
-
- _destroy: function() {
- this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
- this._mouseDestroy();
- },
-
- _mouseCapture: function(event) {
-
- var o = this.options;
-
- // among others, prevent a drag on a resizable-handle
- if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
- return false;
-
- //Quit if we're not on a valid handle
- this.handle = this._getHandle(event);
- if (!this.handle)
- return false;
-
- $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
- $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
- .css({
- width: this.offsetWidth+"px", height: this.offsetHeight+"px",
- position: "absolute", opacity: "0.001", zIndex: 1000
- })
- .css($(this).offset())
- .appendTo("body");
- });
-
- return true;
-
- },
-
- _mouseStart: function(event) {
-
- var o = this.options;
-
- //Create and append the visible helper
- this.helper = this._createHelper(event);
-
- this.helper.addClass("ui-draggable-dragging");
-
- //Cache the helper size
- this._cacheHelperProportions();
-
- //If ddmanager is used for droppables, set the global draggable
- if($.ui.ddmanager)
- $.ui.ddmanager.current = this;
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- //Cache the margins of the original element
- this._cacheMargins();
-
- //Store the helper's css position
- this.cssPosition = this.helper.css("position");
- this.scrollParent = this.helper.scrollParent();
-
- //The element's absolute position on the page minus margins
- this.offset = this.positionAbs = this.element.offset();
- this.offset = {
- top: this.offset.top - this.margins.top,
- left: this.offset.left - this.margins.left
- };
-
- $.extend(this.offset, {
- click: { //Where the click happened, relative to the element
- left: event.pageX - this.offset.left,
- top: event.pageY - this.offset.top
- },
- parent: this._getParentOffset(),
- relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
- });
-
- //Generate the original position
- this.originalPosition = this.position = this._generatePosition(event);
- this.originalPageX = event.pageX;
- this.originalPageY = event.pageY;
-
- //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
- (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-
- //Set a containment if given in the options
- if(o.containment)
- this._setContainment();
-
- //Trigger event + callbacks
- if(this._trigger("start", event) === false) {
- this._clear();
- return false;
- }
-
- //Recache the helper size
- this._cacheHelperProportions();
-
- //Prepare the droppable offsets
- if ($.ui.ddmanager && !o.dropBehaviour)
- $.ui.ddmanager.prepareOffsets(this, event);
-
-
- this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-
- //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
- if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
-
- return true;
- },
-
- _mouseDrag: function(event, noPropagation) {
-
- //Compute the helpers position
- this.position = this._generatePosition(event);
- this.positionAbs = this._convertPositionTo("absolute");
-
- //Call plugins and callbacks and use the resulting position if something is returned
- if (!noPropagation) {
- var ui = this._uiHash();
- if(this._trigger('drag', event, ui) === false) {
- this._mouseUp({});
- return false;
- }
- this.position = ui.position;
- }
-
- if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
- if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
- if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
-
- return false;
- },
-
- _mouseStop: function(event) {
-
- //If we are using droppables, inform the manager about the drop
- var dropped = false;
- if ($.ui.ddmanager && !this.options.dropBehaviour)
- dropped = $.ui.ddmanager.drop(this, event);
-
- //if a drop comes from outside (a sortable)
- if(this.dropped) {
- dropped = this.dropped;
- this.dropped = false;
- }
-
- //if the original element is no longer in the DOM don't bother to continue (see #8269)
- var element = this.element[0], elementInDom = false;
- while ( element && (element = element.parentNode) ) {
- if (element == document ) {
- elementInDom = true;
- }
- }
- if ( !elementInDom && this.options.helper === "original" )
- return false;
-
- if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
- var that = this;
- $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
- if(that._trigger("stop", event) !== false) {
- that._clear();
- }
- });
- } else {
- if(this._trigger("stop", event) !== false) {
- this._clear();
- }
- }
-
- return false;
- },
-
- _mouseUp: function(event) {
- //Remove frame helpers
- $("div.ui-draggable-iframeFix").each(function() {
- this.parentNode.removeChild(this);
- });
-
- //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
- if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
-
- return $.ui.mouse.prototype._mouseUp.call(this, event);
- },
-
- cancel: function() {
-
- if(this.helper.is(".ui-draggable-dragging")) {
- this._mouseUp({});
- } else {
- this._clear();
- }
-
- return this;
-
- },
-
- _getHandle: function(event) {
-
- var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
- $(this.options.handle, this.element)
- .find("*")
- .andSelf()
- .each(function() {
- if(this == event.target) handle = true;
- });
-
- return handle;
-
- },
-
- _createHelper: function(event) {
-
- var o = this.options;
- var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
-
- if(!helper.parents('body').length)
- helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
-
- if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
- helper.css("position", "absolute");
-
- return helper;
-
- },
-
- _adjustOffsetFromHelper: function(obj) {
- if (typeof obj == 'string') {
- obj = obj.split(' ');
- }
- if ($.isArray(obj)) {
- obj = {left: +obj[0], top: +obj[1] || 0};
- }
- if ('left' in obj) {
- this.offset.click.left = obj.left + this.margins.left;
- }
- if ('right' in obj) {
- this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
- }
- if ('top' in obj) {
- this.offset.click.top = obj.top + this.margins.top;
- }
- if ('bottom' in obj) {
- this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
- }
- },
-
- _getParentOffset: function() {
-
- //Get the offsetParent and cache its position
- this.offsetParent = this.helper.offsetParent();
- var po = this.offsetParent.offset();
-
- // This is a special case where we need to modify a offset calculated on start, since the following happened:
- // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
- // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
- // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
- if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
- po.left += this.scrollParent.scrollLeft();
- po.top += this.scrollParent.scrollTop();
- }
-
- if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
- || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
- po = { top: 0, left: 0 };
-
- return {
- top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
- left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
- };
-
- },
-
- _getRelativeOffset: function() {
-
- if(this.cssPosition == "relative") {
- var p = this.element.position();
- return {
- top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
- left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
- };
- } else {
- return { top: 0, left: 0 };
- }
-
- },
-
- _cacheMargins: function() {
- this.margins = {
- left: (parseInt(this.element.css("marginLeft"),10) || 0),
- top: (parseInt(this.element.css("marginTop"),10) || 0),
- right: (parseInt(this.element.css("marginRight"),10) || 0),
- bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
- };
- },
-
- _cacheHelperProportions: function() {
- this.helperProportions = {
- width: this.helper.outerWidth(),
- height: this.helper.outerHeight()
- };
- },
-
- _setContainment: function() {
-
- var o = this.options;
- if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
- if(o.containment == 'document' || o.containment == 'window') this.containment = [
- o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
- o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
- (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
- (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
- ];
-
- if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
- var c = $(o.containment);
- var ce = c[0]; if(!ce) return;
- var co = c.offset();
- var over = ($(ce).css("overflow") != 'hidden');
-
- this.containment = [
- (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
- (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
- (over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
- (over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom
- ];
- this.relative_container = c;
-
- } else if(o.containment.constructor == Array) {
- this.containment = o.containment;
- }
-
- },
-
- _convertPositionTo: function(d, pos) {
-
- if(!pos) pos = this.position;
- var mod = d == "absolute" ? 1 : -1;
- var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
- return {
- top: (
- pos.top // The absolute mouse position
- + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
- + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
- - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
- ),
- left: (
- pos.left // The absolute mouse position
- + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
- + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
- - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
- )
- };
-
- },
-
- _generatePosition: function(event) {
-
- var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
- var pageX = event.pageX;
- var pageY = event.pageY;
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
-
- if(this.originalPosition) { //If we are not dragging yet, we won't check for options
- var containment;
- if(this.containment) {
- if (this.relative_container){
- var co = this.relative_container.offset();
- containment = [ this.containment[0] + co.left,
- this.containment[1] + co.top,
- this.containment[2] + co.left,
- this.containment[3] + co.top ];
- }
- else {
- containment = this.containment;
- }
-
- if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
- if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
- if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
- if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
- }
-
- if(o.grid) {
- //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
- var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
- pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
- var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
- pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
- }
-
- }
-
- return {
- top: (
- pageY // The absolute mouse position
- - this.offset.click.top // Click offset (relative to the element)
- - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
- - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
- + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
- ),
- left: (
- pageX // The absolute mouse position
- - this.offset.click.left // Click offset (relative to the element)
- - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
- - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
- + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
- )
- };
-
- },
-
- _clear: function() {
- this.helper.removeClass("ui-draggable-dragging");
- if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
- //if($.ui.ddmanager) $.ui.ddmanager.current = null;
- this.helper = null;
- this.cancelHelperRemoval = false;
- },
-
- // From now on bulk stuff - mainly helpers
-
- _trigger: function(type, event, ui) {
- ui = ui || this._uiHash();
- $.ui.plugin.call(this, type, [event, ui]);
- if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
- return $.Widget.prototype._trigger.call(this, type, event, ui);
- },
-
- plugins: {},
-
- _uiHash: function(event) {
- return {
- helper: this.helper,
- position: this.position,
- originalPosition: this.originalPosition,
- offset: this.positionAbs
- };
- }
-
-});
-
-$.ui.plugin.add("draggable", "connectToSortable", {
- start: function(event, ui) {
-
- var inst = $(this).data("draggable"), o = inst.options,
- uiSortable = $.extend({}, ui, { item: inst.element });
- inst.sortables = [];
- $(o.connectToSortable).each(function() {
- var sortable = $.data(this, 'sortable');
- if (sortable && !sortable.options.disabled) {
- inst.sortables.push({
- instance: sortable,
- shouldRevert: sortable.options.revert
- });
- sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
- sortable._trigger("activate", event, uiSortable);
- }
- });
-
- },
- stop: function(event, ui) {
-
- //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
- var inst = $(this).data("draggable"),
- uiSortable = $.extend({}, ui, { item: inst.element });
-
- $.each(inst.sortables, function() {
- if(this.instance.isOver) {
-
- this.instance.isOver = 0;
-
- inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
- this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
-
- //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
- if(this.shouldRevert) this.instance.options.revert = true;
-
- //Trigger the stop of the sortable
- this.instance._mouseStop(event);
-
- this.instance.options.helper = this.instance.options._helper;
-
- //If the helper has been the original item, restore properties in the sortable
- if(inst.options.helper == 'original')
- this.instance.currentItem.css({ top: 'auto', left: 'auto' });
-
- } else {
- this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
- this.instance._trigger("deactivate", event, uiSortable);
- }
-
- });
-
- },
- drag: function(event, ui) {
-
- var inst = $(this).data("draggable"), that = this;
-
- var checkPos = function(o) {
- var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
- var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
- var itemHeight = o.height, itemWidth = o.width;
- var itemTop = o.top, itemLeft = o.left;
-
- return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
- };
-
- $.each(inst.sortables, function(i) {
-
- var innermostIntersecting = false;
- var thisSortable = this;
- //Copy over some variables to allow calling the sortable's native _intersectsWith
- this.instance.positionAbs = inst.positionAbs;
- this.instance.helperProportions = inst.helperProportions;
- this.instance.offset.click = inst.offset.click;
-
- if(this.instance._intersectsWith(this.instance.containerCache)) {
- innermostIntersecting = true;
- $.each(inst.sortables, function () {
- this.instance.positionAbs = inst.positionAbs;
- this.instance.helperProportions = inst.helperProportions;
- this.instance.offset.click = inst.offset.click;
- if (this != thisSortable
- && this.instance._intersectsWith(this.instance.containerCache)
- && $.ui.contains(thisSortable.instance.element[0], this.instance.element[0]))
- innermostIntersecting = false;
- return innermostIntersecting;
- });
- }
-
-
- if(innermostIntersecting) {
- //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
- if(!this.instance.isOver) {
-
- this.instance.isOver = 1;
- //Now we fake the start of dragging for the sortable instance,
- //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
- //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
- this.instance.currentItem = $(that).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
- this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
- this.instance.options.helper = function() { return ui.helper[0]; };
-
- event.target = this.instance.currentItem[0];
- this.instance._mouseCapture(event, true);
- this.instance._mouseStart(event, true, true);
-
- //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
- this.instance.offset.click.top = inst.offset.click.top;
- this.instance.offset.click.left = inst.offset.click.left;
- this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
- this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
-
- inst._trigger("toSortable", event);
- inst.dropped = this.instance.element; //draggable revert needs that
- //hack so receive/update callbacks work (mostly)
- inst.currentItem = inst.element;
- this.instance.fromOutside = inst;
-
- }
-
- //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
- if(this.instance.currentItem) this.instance._mouseDrag(event);
-
- } else {
-
- //If it doesn't intersect with the sortable, and it intersected before,
- //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
- if(this.instance.isOver) {
-
- this.instance.isOver = 0;
- this.instance.cancelHelperRemoval = true;
-
- //Prevent reverting on this forced stop
- this.instance.options.revert = false;
-
- // The out event needs to be triggered independently
- this.instance._trigger('out', event, this.instance._uiHash(this.instance));
-
- this.instance._mouseStop(event, true);
- this.instance.options.helper = this.instance.options._helper;
-
- //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
- this.instance.currentItem.remove();
- if(this.instance.placeholder) this.instance.placeholder.remove();
-
- inst._trigger("fromSortable", event);
- inst.dropped = false; //draggable revert needs that
- }
-
- };
-
- });
-
- }
-});
-
-$.ui.plugin.add("draggable", "cursor", {
- start: function(event, ui) {
- var t = $('body'), o = $(this).data('draggable').options;
- if (t.css("cursor")) o._cursor = t.css("cursor");
- t.css("cursor", o.cursor);
- },
- stop: function(event, ui) {
- var o = $(this).data('draggable').options;
- if (o._cursor) $('body').css("cursor", o._cursor);
- }
-});
-
-$.ui.plugin.add("draggable", "opacity", {
- start: function(event, ui) {
- var t = $(ui.helper), o = $(this).data('draggable').options;
- if(t.css("opacity")) o._opacity = t.css("opacity");
- t.css('opacity', o.opacity);
- },
- stop: function(event, ui) {
- var o = $(this).data('draggable').options;
- if(o._opacity) $(ui.helper).css('opacity', o._opacity);
- }
-});
-
-$.ui.plugin.add("draggable", "scroll", {
- start: function(event, ui) {
- var i = $(this).data("draggable");
- if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
- },
- drag: function(event, ui) {
-
- var i = $(this).data("draggable"), o = i.options, scrolled = false;
-
- if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
-
- if(!o.axis || o.axis != 'x') {
- if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
- i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
- else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
- i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
- }
-
- if(!o.axis || o.axis != 'y') {
- if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
- i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
- else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
- i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
- }
-
- } else {
-
- if(!o.axis || o.axis != 'x') {
- if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
- scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
- else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
- scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
- }
-
- if(!o.axis || o.axis != 'y') {
- if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
- scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
- else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
- scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
- }
-
- }
-
- if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
- $.ui.ddmanager.prepareOffsets(i, event);
-
- }
-});
-
-$.ui.plugin.add("draggable", "snap", {
- start: function(event, ui) {
-
- var i = $(this).data("draggable"), o = i.options;
- i.snapElements = [];
-
- $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
- var $t = $(this); var $o = $t.offset();
- if(this != i.element[0]) i.snapElements.push({
- item: this,
- width: $t.outerWidth(), height: $t.outerHeight(),
- top: $o.top, left: $o.left
- });
- });
-
- },
- drag: function(event, ui) {
-
- var inst = $(this).data("draggable"), o = inst.options;
- var d = o.snapTolerance;
-
- var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
- y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
-
- for (var i = inst.snapElements.length - 1; i >= 0; i--){
-
- var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
- t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
-
- //Yes, I know, this is insane ;)
- if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
- if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
- inst.snapElements[i].snapping = false;
- continue;
- }
-
- if(o.snapMode != 'inner') {
- var ts = Math.abs(t - y2) <= d;
- var bs = Math.abs(b - y1) <= d;
- var ls = Math.abs(l - x2) <= d;
- var rs = Math.abs(r - x1) <= d;
- if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
- if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
- if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
- if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
- }
-
- var first = (ts || bs || ls || rs);
-
- if(o.snapMode != 'outer') {
- var ts = Math.abs(t - y1) <= d;
- var bs = Math.abs(b - y2) <= d;
- var ls = Math.abs(l - x1) <= d;
- var rs = Math.abs(r - x2) <= d;
- if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
- if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
- if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
- if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
- }
-
- if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
- (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
- inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
-
- };
-
- }
-});
-
-$.ui.plugin.add("draggable", "stack", {
- start: function(event, ui) {
-
- var o = $(this).data("draggable").options;
-
- var group = $.makeArray($(o.stack)).sort(function(a,b) {
- return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
- });
- if (!group.length) { return; }
-
- var min = parseInt(group[0].style.zIndex) || 0;
- $(group).each(function(i) {
- this.style.zIndex = min + i;
- });
-
- this[0].style.zIndex = min + group.length;
-
- }
-});
-
-$.ui.plugin.add("draggable", "zIndex", {
- start: function(event, ui) {
- var t = $(ui.helper), o = $(this).data("draggable").options;
- if(t.css("zIndex")) o._zIndex = t.css("zIndex");
- t.css('zIndex', o.zIndex);
- },
- stop: function(event, ui) {
- var o = $(this).data("draggable").options;
- if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
- }
-});
-
-})(jQuery);
-(function( $, undefined ) {
-
-$.widget("ui.droppable", {
- version: "1.9.2",
- widgetEventPrefix: "drop",
- options: {
- accept: '*',
- activeClass: false,
- addClasses: true,
- greedy: false,
- hoverClass: false,
- scope: 'default',
- tolerance: 'intersect'
- },
- _create: function() {
-
- var o = this.options, accept = o.accept;
- this.isover = 0; this.isout = 1;
-
- this.accept = $.isFunction(accept) ? accept : function(d) {
- return d.is(accept);
- };
-
- //Store the droppable's proportions
- this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
-
- // Add the reference and positions to the manager
- $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
- $.ui.ddmanager.droppables[o.scope].push(this);
-
- (o.addClasses && this.element.addClass("ui-droppable"));
-
- },
-
- _destroy: function() {
- var drop = $.ui.ddmanager.droppables[this.options.scope];
- for ( var i = 0; i < drop.length; i++ )
- if ( drop[i] == this )
- drop.splice(i, 1);
-
- this.element.removeClass("ui-droppable ui-droppable-disabled");
- },
-
- _setOption: function(key, value) {
-
- if(key == 'accept') {
- this.accept = $.isFunction(value) ? value : function(d) {
- return d.is(value);
- };
- }
- $.Widget.prototype._setOption.apply(this, arguments);
- },
-
- _activate: function(event) {
- var draggable = $.ui.ddmanager.current;
- if(this.options.activeClass) this.element.addClass(this.options.activeClass);
- (draggable && this._trigger('activate', event, this.ui(draggable)));
- },
-
- _deactivate: function(event) {
- var draggable = $.ui.ddmanager.current;
- if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
- (draggable && this._trigger('deactivate', event, this.ui(draggable)));
- },
-
- _over: function(event) {
-
- var draggable = $.ui.ddmanager.current;
- if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
- if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
- if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
- this._trigger('over', event, this.ui(draggable));
- }
-
- },
-
- _out: function(event) {
-
- var draggable = $.ui.ddmanager.current;
- if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
- if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
- if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
- this._trigger('out', event, this.ui(draggable));
- }
-
- },
-
- _drop: function(event,custom) {
-
- var draggable = custom || $.ui.ddmanager.current;
- if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
-
- var childrenIntersection = false;
- this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
- var inst = $.data(this, 'droppable');
- if(
- inst.options.greedy
- && !inst.options.disabled
- && inst.options.scope == draggable.options.scope
- && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
- && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
- ) { childrenIntersection = true; return false; }
- });
- if(childrenIntersection) return false;
-
- if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
- if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
- if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
- this._trigger('drop', event, this.ui(draggable));
- return this.element;
- }
-
- return false;
-
- },
-
- ui: function(c) {
- return {
- draggable: (c.currentItem || c.element),
- helper: c.helper,
- position: c.position,
- offset: c.positionAbs
- };
- }
-
-});
-
-$.ui.intersect = function(draggable, droppable, toleranceMode) {
-
- if (!droppable.offset) return false;
-
- var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
- y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
- var l = droppable.offset.left, r = l + droppable.proportions.width,
- t = droppable.offset.top, b = t + droppable.proportions.height;
-
- switch (toleranceMode) {
- case 'fit':
- return (l <= x1 && x2 <= r
- && t <= y1 && y2 <= b);
- break;
- case 'intersect':
- return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
- && x2 - (draggable.helperProportions.width / 2) < r // Left Half
- && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
- && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
- break;
- case 'pointer':
- var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
- draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
- isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
- return isOver;
- break;
- case 'touch':
- return (
- (y1 >= t && y1 <= b) || // Top edge touching
- (y2 >= t && y2 <= b) || // Bottom edge touching
- (y1 < t && y2 > b) // Surrounded vertically
- ) && (
- (x1 >= l && x1 <= r) || // Left edge touching
- (x2 >= l && x2 <= r) || // Right edge touching
- (x1 < l && x2 > r) // Surrounded horizontally
- );
- break;
- default:
- return false;
- break;
- }
-
-};
-
-/*
- This manager tracks offsets of draggables and droppables
-*/
-$.ui.ddmanager = {
- current: null,
- droppables: { 'default': [] },
- prepareOffsets: function(t, event) {
-
- var m = $.ui.ddmanager.droppables[t.options.scope] || [];
- var type = event ? event.type : null; // workaround for #2317
- var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
-
- droppablesLoop: for (var i = 0; i < m.length; i++) {
-
- if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
- for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
- m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
-
- if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
-
- m[i].offset = m[i].element.offset();
- m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
-
- }
-
- },
- drop: function(draggable, event) {
-
- var dropped = false;
- $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
-
- if(!this.options) return;
- if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
- dropped = this._drop.call(this, event) || dropped;
-
- if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
- this.isout = 1; this.isover = 0;
- this._deactivate.call(this, event);
- }
-
- });
- return dropped;
-
- },
- dragStart: function( draggable, event ) {
- //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
- draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
- if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
- });
- },
- drag: function(draggable, event) {
-
- //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
- if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
-
- //Run through all droppables and check their positions based on specific tolerance options
- $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
-
- if(this.options.disabled || this.greedyChild || !this.visible) return;
- var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
-
- var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
- if(!c) return;
-
- var parentInstance;
- if (this.options.greedy) {
- // find droppable parents with same scope
- var scope = this.options.scope;
- var parent = this.element.parents(':data(droppable)').filter(function () {
- return $.data(this, 'droppable').options.scope === scope;
- });
-
- if (parent.length) {
- parentInstance = $.data(parent[0], 'droppable');
- parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
- }
- }
-
- // we just moved into a greedy child
- if (parentInstance && c == 'isover') {
- parentInstance['isover'] = 0;
- parentInstance['isout'] = 1;
- parentInstance._out.call(parentInstance, event);
- }
-
- this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
- this[c == "isover" ? "_over" : "_out"].call(this, event);
-
- // we just moved out of a greedy child
- if (parentInstance && c == 'isout') {
- parentInstance['isout'] = 0;
- parentInstance['isover'] = 1;
- parentInstance._over.call(parentInstance, event);
- }
- });
-
- },
- dragStop: function( draggable, event ) {
- draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
- //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
- if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
- }
-};
-
-})(jQuery);
-(function( $, undefined ) {
-
-$.widget("ui.selectable", $.ui.mouse, {
- version: "1.9.2",
- options: {
- appendTo: 'body',
- autoRefresh: true,
- distance: 0,
- filter: '*',
- tolerance: 'touch'
- },
- _create: function() {
- var that = this;
-
- this.element.addClass("ui-selectable");
-
- this.dragged = false;
-
- // cache selectee children based on filter
- var selectees;
- this.refresh = function() {
- selectees = $(that.options.filter, that.element[0]);
- selectees.addClass("ui-selectee");
- selectees.each(function() {
- var $this = $(this);
- var pos = $this.offset();
- $.data(this, "selectable-item", {
- element: this,
- $element: $this,
- left: pos.left,
- top: pos.top,
- right: pos.left + $this.outerWidth(),
- bottom: pos.top + $this.outerHeight(),
- startselected: false,
- selected: $this.hasClass('ui-selected'),
- selecting: $this.hasClass('ui-selecting'),
- unselecting: $this.hasClass('ui-unselecting')
- });
- });
- };
- this.refresh();
-
- this.selectees = selectees.addClass("ui-selectee");
-
- this._mouseInit();
-
- this.helper = $("<div class='ui-selectable-helper'></div>");
- },
-
- _destroy: function() {
- this.selectees
- .removeClass("ui-selectee")
- .removeData("selectable-item");
- this.element
- .removeClass("ui-selectable ui-selectable-disabled");
- this._mouseDestroy();
- },
-
- _mouseStart: function(event) {
- var that = this;
-
- this.opos = [event.pageX, event.pageY];
-
- if (this.options.disabled)
- return;
-
- var options = this.options;
-
- this.selectees = $(options.filter, this.element[0]);
-
- this._trigger("start", event);
-
- $(options.appendTo).append(this.helper);
- // position helper (lasso)
- this.helper.css({
- "left": event.clientX,
- "top": event.clientY,
- "width": 0,
- "height": 0
- });
-
- if (options.autoRefresh) {
- this.refresh();
- }
-
- this.selectees.filter('.ui-selected').each(function() {
- var selectee = $.data(this, "selectable-item");
- selectee.startselected = true;
- if (!event.metaKey && !event.ctrlKey) {
- selectee.$element.removeClass('ui-selected');
- selectee.selected = false;
- selectee.$element.addClass('ui-unselecting');
- selectee.unselecting = true;
- // selectable UNSELECTING callback
- that._trigger("unselecting", event, {
- unselecting: selectee.element
- });
- }
- });
-
- $(event.target).parents().andSelf().each(function() {
- var selectee = $.data(this, "selectable-item");
- if (selectee) {
- var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
- selectee.$element
- .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
- .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
- selectee.unselecting = !doSelect;
- selectee.selecting = doSelect;
- selectee.selected = doSelect;
- // selectable (UN)SELECTING callback
- if (doSelect) {
- that._trigger("selecting", event, {
- selecting: selectee.element
- });
- } else {
- that._trigger("unselecting", event, {
- unselecting: selectee.element
- });
- }
- return false;
- }
- });
-
- },
-
- _mouseDrag: function(event) {
- var that = this;
- this.dragged = true;
-
- if (this.options.disabled)
- return;
-
- var options = this.options;
-
- var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
- if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
- if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
- this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
-
- this.selectees.each(function() {
- var selectee = $.data(this, "selectable-item");
- //prevent helper from being selected if appendTo: selectable
- if (!selectee || selectee.element == that.element[0])
- return;
- var hit = false;
- if (options.tolerance == 'touch') {
- hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
- } else if (options.tolerance == 'fit') {
- hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
- }
-
- if (hit) {
- // SELECT
- if (selectee.selected) {
- selectee.$element.removeClass('ui-selected');
- selectee.selected = false;
- }
- if (selectee.unselecting) {
- selectee.$element.removeClass('ui-unselecting');
- selectee.unselecting = false;
- }
- if (!selectee.selecting) {
- selectee.$element.addClass('ui-selecting');
- selectee.selecting = true;
- // selectable SELECTING callback
- that._trigger("selecting", event, {
- selecting: selectee.element
- });
- }
- } else {
- // UNSELECT
- if (selectee.selecting) {
- if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
- selectee.$element.removeClass('ui-selecting');
- selectee.selecting = false;
- selectee.$element.addClass('ui-selected');
- selectee.selected = true;
- } else {
- selectee.$element.removeClass('ui-selecting');
- selectee.selecting = false;
- if (selectee.startselected) {
- selectee.$element.addClass('ui-unselecting');
- selectee.unselecting = true;
- }
- // selectable UNSELECTING callback
- that._trigger("unselecting", event, {
- unselecting: selectee.element
- });
- }
- }
- if (selectee.selected) {
- if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
- selectee.$element.removeClass('ui-selected');
- selectee.selected = false;
-
- selectee.$element.addClass('ui-unselecting');
- selectee.unselecting = true;
- // selectable UNSELECTING callback
- that._trigger("unselecting", event, {
- unselecting: selectee.element
- });
- }
- }
- }
- });
-
- return false;
- },
-
- _mouseStop: function(event) {
- var that = this;
-
- this.dragged = false;
-
- var options = this.options;
-
- $('.ui-unselecting', this.element[0]).each(function() {
- var selectee = $.data(this, "selectable-item");
- selectee.$element.removeClass('ui-unselecting');
- selectee.unselecting = false;
- selectee.startselected = false;
- that._trigger("unselected", event, {
- unselected: selectee.element
- });
- });
- $('.ui-selecting', this.element[0]).each(function() {
- var selectee = $.data(this, "selectable-item");
- selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
- selectee.selecting = false;
- selectee.selected = true;
- selectee.startselected = true;
- that._trigger("selected", event, {
- selected: selectee.element
- });
- });
- this._trigger("stop", event);
-
- this.helper.remove();
-
- return false;
- }
-
-});
-
-})(jQuery);
-(function( $, undefined ) {
-
-$.widget("ui.sortable", $.ui.mouse, {
- version: "1.9.2",
- widgetEventPrefix: "sort",
- ready: false,
- options: {
- appendTo: "parent",
- axis: false,
- connectWith: false,
- containment: false,
- cursor: 'auto',
- cursorAt: false,
- dropOnEmpty: true,
- forcePlaceholderSize: false,
- forceHelperSize: false,
- grid: false,
- handle: false,
- helper: "original",
- items: '> *',
- opacity: false,
- placeholder: false,
- revert: false,
- scroll: true,
- scrollSensitivity: 20,
- scrollSpeed: 20,
- scope: "default",
- tolerance: "intersect",
- zIndex: 1000
- },
- _create: function() {
-
- var o = this.options;
- this.containerCache = {};
- this.element.addClass("ui-sortable");
-
- //Get the items
- this.refresh();
-
- //Let's determine if the items are being displayed horizontally
- this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
-
- //Let's determine the parent's offset
- this.offset = this.element.offset();
-
- //Initialize mouse events for interaction
- this._mouseInit();
-
- //We're ready to go
- this.ready = true
-
- },
-
- _destroy: function() {
- this.element
- .removeClass("ui-sortable ui-sortable-disabled");
- this._mouseDestroy();
-
- for ( var i = this.items.length - 1; i >= 0; i-- )
- this.items[i].item.removeData(this.widgetName + "-item");
-
- return this;
- },
-
- _setOption: function(key, value){
- if ( key === "disabled" ) {
- this.options[ key ] = value;
-
- this.widget().toggleClass( "ui-sortable-disabled", !!value );
- } else {
- // Don't call widget base _setOption for disable as it adds ui-state-disabled class
- $.Widget.prototype._setOption.apply(this, arguments);
- }
- },
-
- _mouseCapture: function(event, overrideHandle) {
- var that = this;
-
- if (this.reverting) {
- return false;
- }
-
- if(this.options.disabled || this.options.type == 'static') return false;
-
- //We have to refresh the items data once first
- this._refreshItems(event);
-
- //Find out if the clicked node (or one of its parents) is a actual item in this.items
- var currentItem = null, nodes = $(event.target).parents().each(function() {
- if($.data(this, that.widgetName + '-item') == that) {
- currentItem = $(this);
- return false;
- }
- });
- if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
-
- if(!currentItem) return false;
- if(this.options.handle && !overrideHandle) {
- var validHandle = false;
-
- $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
- if(!validHandle) return false;
- }
-
- this.currentItem = currentItem;
- this._removeCurrentsFromItems();
- return true;
-
- },
-
- _mouseStart: function(event, overrideHandle, noActivation) {
-
- var o = this.options;
- this.currentContainer = this;
-
- //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
- this.refreshPositions();
-
- //Create and append the visible helper
- this.helper = this._createHelper(event);
-
- //Cache the helper size
- this._cacheHelperProportions();
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- //Cache the margins of the original element
- this._cacheMargins();
-
- //Get the next scrolling parent
- this.scrollParent = this.helper.scrollParent();
-
- //The element's absolute position on the page minus margins
- this.offset = this.currentItem.offset();
- this.offset = {
- top: this.offset.top - this.margins.top,
- left: this.offset.left - this.margins.left
- };
-
- $.extend(this.offset, {
- click: { //Where the click happened, relative to the element
- left: event.pageX - this.offset.left,
- top: event.pageY - this.offset.top
- },
- parent: this._getParentOffset(),
- relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
- });
-
- // Only after we got the offset, we can change the helper's position to absolute
- // TODO: Still need to figure out a way to make relative sorting possible
- this.helper.css("position", "absolute");
- this.cssPosition = this.helper.css("position");
-
- //Generate the original position
- this.originalPosition = this._generatePosition(event);
- this.originalPageX = event.pageX;
- this.originalPageY = event.pageY;
-
- //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
- (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-
- //Cache the former DOM position
- this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
-
- //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
- if(this.helper[0] != this.currentItem[0]) {
- this.currentItem.hide();
- }
-
- //Create the placeholder
- this._createPlaceholder();
-
- //Set a containment if given in the options
- if(o.containment)
- this._setContainment();
-
- if(o.cursor) { // cursor option
- if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
- $('body').css("cursor", o.cursor);
- }
-
- if(o.opacity) { // opacity option
- if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
- this.helper.css("opacity", o.opacity);
- }
-
- if(o.zIndex) { // zIndex option
- if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
- this.helper.css("zIndex", o.zIndex);
- }
-
- //Prepare scrolling
- if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
- this.overflowOffset = this.scrollParent.offset();
-
- //Call callbacks
- this._trigger("start", event, this._uiHash());
-
- //Recache the helper size
- if(!this._preserveHelperProportions)
- this._cacheHelperProportions();
-
-
- //Post 'activate' events to possible containers
- if(!noActivation) {
- for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
- }
-
- //Prepare possible droppables
- if($.ui.ddmanager)
- $.ui.ddmanager.current = this;
-
- if ($.ui.ddmanager && !o.dropBehaviour)
- $.ui.ddmanager.prepareOffsets(this, event);
-
- this.dragging = true;
-
- this.helper.addClass("ui-sortable-helper");
- this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
- return true;
-
- },
-
- _mouseDrag: function(event) {
-
- //Compute the helpers position
- this.position = this._generatePosition(event);
- this.positionAbs = this._convertPositionTo("absolute");
-
- if (!this.lastPositionAbs) {
- this.lastPositionAbs = this.positionAbs;
- }
-
- //Do scrolling
- if(this.options.scroll) {
- var o = this.options, scrolled = false;
- if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
-
- if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
- else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
-
- if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
- else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
-
- } else {
-
- if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
- scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
- else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
- scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
-
- if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
- scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
- else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
- scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
-
- }
-
- if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
- $.ui.ddmanager.prepareOffsets(this, event);
- }
-
- //Regenerate the absolute position used for position checks
- this.positionAbs = this._convertPositionTo("absolute");
-
- //Set the helper position
- if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
- if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
-
- //Rearrange
- for (var i = this.items.length - 1; i >= 0; i--) {
-
- //Cache variables and intersection, continue if no intersection
- var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
- if (!intersection) continue;
-
- // Only put the placeholder inside the current Container, skip all
- // items form other containers. This works because when moving
- // an item from one container to another the
- // currentContainer is switched before the placeholder is moved.
- //
- // Without this moving items in "sub-sortables" can cause the placeholder to jitter
- // beetween the outer and inner container.
- if (item.instance !== this.currentContainer) continue;
-
- if (itemElement != this.currentItem[0] //cannot intersect with itself
- && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
- && !$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
- && (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
- //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
- ) {
-
- this.direction = intersection == 1 ? "down" : "up";
-
- if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
- this._rearrange(event, item);
- } else {
- break;
- }
-
- this._trigger("change", event, this._uiHash());
- break;
- }
- }
-
- //Post events to containers
- this._contactContainers(event);
-
- //Interconnect with droppables
- if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
-
- //Call callbacks
- this._trigger('sort', event, this._uiHash());
-
- this.lastPositionAbs = this.positionAbs;
- return false;
-
- },
-
- _mouseStop: function(event, noPropagation) {
-
- if(!event) return;
-
- //If we are using droppables, inform the manager about the drop
- if ($.ui.ddmanager && !this.options.dropBehaviour)
- $.ui.ddmanager.drop(this, event);
-
- if(this.options.revert) {
- var that = this;
- var cur = this.placeholder.offset();
-
- this.reverting = true;
-
- $(this.helper).animate({
- left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
- top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
- }, parseInt(this.options.revert, 10) || 500, function() {
- that._clear(event);
- });
- } else {
- this._clear(event, noPropagation);
- }
-
- return false;
-
- },
-
- cancel: function() {
-
- if(this.dragging) {
-
- this._mouseUp({ target: null });
-
- if(this.options.helper == "original")
- this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
- else
- this.currentItem.show();
-
- //Post deactivating events to containers
- for (var i = this.containers.length - 1; i >= 0; i--){
- this.containers[i]._trigger("deactivate", null, this._uiHash(this));
- if(this.containers[i].containerCache.over) {
- this.containers[i]._trigger("out", null, this._uiHash(this));
- this.containers[i].containerCache.over = 0;
- }
- }
-
- }
-
- if (this.placeholder) {
- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
- if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
- if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
-
- $.extend(this, {
- helper: null,
- dragging: false,
- reverting: false,
- _noFinalSort: null
- });
-
- if(this.domPosition.prev) {
- $(this.domPosition.prev).after(this.currentItem);
- } else {
- $(this.domPosition.parent).prepend(this.currentItem);
- }
- }
-
- return this;
-
- },
-
- serialize: function(o) {
-
- var items = this._getItemsAsjQuery(o && o.connected);
- var str = []; o = o || {};
-
- $(items).each(function() {
- var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
- if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
- });
-
- if(!str.length && o.key) {
- str.push(o.key + '=');
- }
-
- return str.join('&');
-
- },
-
- toArray: function(o) {
-
- var items = this._getItemsAsjQuery(o && o.connected);
- var ret = []; o = o || {};
-
- items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
- return ret;
-
- },
-
- /* Be careful with the following core functions */
- _intersectsWith: function(item) {
-
- var x1 = this.positionAbs.left,
- x2 = x1 + this.helperProportions.width,
- y1 = this.positionAbs.top,
- y2 = y1 + this.helperProportions.height;
-
- var l = item.left,
- r = l + item.width,
- t = item.top,
- b = t + item.height;
-
- var dyClick = this.offset.click.top,
- dxClick = this.offset.click.left;
-
- var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
-
- if( this.options.tolerance == "pointer"
- || this.options.forcePointerForContainers
- || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
- ) {
- return isOverElement;
- } else {
-
- return (l < x1 + (this.helperProportions.width / 2) // Right Half
- && x2 - (this.helperProportions.width / 2) < r // Left Half
- && t < y1 + (this.helperProportions.height / 2) // Bottom Half
- && y2 - (this.helperProportions.height / 2) < b ); // Top Half
-
- }
- },
-
- _intersectsWithPointer: function(item) {
-
- var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
- isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
- isOverElement = isOverElementHeight && isOverElementWidth,
- verticalDirection = this._getDragVerticalDirection(),
- horizontalDirection = this._getDragHorizontalDirection();
-
- if (!isOverElement)
- return false;
-
- return this.floating ?
- ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
- : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
-
- },
-
- _intersectsWithSides: function(item) {
-
- var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
- isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
- verticalDirection = this._getDragVerticalDirection(),
- horizontalDirection = this._getDragHorizontalDirection();
-
- if (this.floating && horizontalDirection) {
- return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
- } else {
- return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
- }
-
- },
-
- _getDragVerticalDirection: function() {
- var delta = this.positionAbs.top - this.lastPositionAbs.top;
- return delta != 0 && (delta > 0 ? "down" : "up");
- },
-
- _getDragHorizontalDirection: function() {
- var delta = this.positionAbs.left - this.lastPositionAbs.left;
- return delta != 0 && (delta > 0 ? "right" : "left");
- },
-
- refresh: function(event) {
- this._refreshItems(event);
- this.refreshPositions();
- return this;
- },
-
- _connectWith: function() {
- var options = this.options;
- return options.connectWith.constructor == String
- ? [options.connectWith]
- : options.connectWith;
- },
-
- _getItemsAsjQuery: function(connected) {
-
- var items = [];
- var queries = [];
- var connectWith = this._connectWith();
-
- if(connectWith && connected) {
- for (var i = connectWith.length - 1; i >= 0; i--){
- var cur = $(connectWith[i]);
- for (var j = cur.length - 1; j >= 0; j--){
- var inst = $.data(cur[j], this.widgetName);
- if(inst && inst != this && !inst.options.disabled) {
- queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
- }
- };
- };
- }
-
- queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
-
- for (var i = queries.length - 1; i >= 0; i--){
- queries[i][0].each(function() {
- items.push(this);
- });
- };
-
- return $(items);
-
- },
-
- _removeCurrentsFromItems: function() {
-
- var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
-
- this.items = $.grep(this.items, function (item) {
- for (var j=0; j < list.length; j++) {
- if(list[j] == item.item[0])
- return false;
- };
- return true;
- });
-
- },
-
- _refreshItems: function(event) {
-
- this.items = [];
- this.containers = [this];
- var items = this.items;
- var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
- var connectWith = this._connectWith();
-
- if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
- for (var i = connectWith.length - 1; i >= 0; i--){
- var cur = $(connectWith[i]);
- for (var j = cur.length - 1; j >= 0; j--){
- var inst = $.data(cur[j], this.widgetName);
- if(inst && inst != this && !inst.options.disabled) {
- queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
- this.containers.push(inst);
- }
- };
- };
- }
-
- for (var i = queries.length - 1; i >= 0; i--) {
- var targetData = queries[i][1];
- var _queries = queries[i][0];
-
- for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
- var item = $(_queries[j]);
-
- item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
-
- items.push({
- item: item,
- instance: targetData,
- width: 0, height: 0,
- left: 0, top: 0
- });
- };
- };
-
- },
-
- refreshPositions: function(fast) {
-
- //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
- if(this.offsetParent && this.helper) {
- this.offset.parent = this._getParentOffset();
- }
-
- for (var i = this.items.length - 1; i >= 0; i--){
- var item = this.items[i];
-
- //We ignore calculating positions of all connected containers when we're not over them
- if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
- continue;
-
- var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
-
- if (!fast) {
- item.width = t.outerWidth();
- item.height = t.outerHeight();
- }
-
- var p = t.offset();
- item.left = p.left;
- item.top = p.top;
- };
-
- if(this.options.custom && this.options.custom.refreshContainers) {
- this.options.custom.refreshContainers.call(this);
- } else {
- for (var i = this.containers.length - 1; i >= 0; i--){
- var p = this.containers[i].element.offset();
- this.containers[i].containerCache.left = p.left;
- this.containers[i].containerCache.top = p.top;
- this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
- this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
- };
- }
-
- return this;
- },
-
- _createPlaceholder: function(that) {
- that = that || this;
- var o = that.options;
-
- if(!o.placeholder || o.placeholder.constructor == String) {
- var className = o.placeholder;
- o.placeholder = {
- element: function() {
-
- var el = $(document.createElement(that.currentItem[0].nodeName))
- .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
- .removeClass("ui-sortable-helper")[0];
-
- if(!className)
- el.style.visibility = "hidden";
-
- return el;
- },
- update: function(container, p) {
-
- // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
- // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
- if(className && !o.forcePlaceholderSize) return;
-
- //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
- if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
- if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
- }
- };
- }
-
- //Create the placeholder
- that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
-
- //Append it after the actual current item
- that.currentItem.after(that.placeholder);
-
- //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
- o.placeholder.update(that, that.placeholder);
-
- },
-
- _contactContainers: function(event) {
-
- // get innermost container that intersects with item
- var innermostContainer = null, innermostIndex = null;
-
-
- for (var i = this.containers.length - 1; i >= 0; i--){
-
- // never consider a container that's located within the item itself
- if($.contains(this.currentItem[0], this.containers[i].element[0]))
- continue;
-
- if(this._intersectsWith(this.containers[i].containerCache)) {
-
- // if we've already found a container and it's more "inner" than this, then continue
- if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
- continue;
-
- innermostContainer = this.containers[i];
- innermostIndex = i;
-
- } else {
- // container doesn't intersect. trigger "out" event if necessary
- if(this.containers[i].containerCache.over) {
- this.containers[i]._trigger("out", event, this._uiHash(this));
- this.containers[i].containerCache.over = 0;
- }
- }
-
- }
-
- // if no intersecting containers found, return
- if(!innermostContainer) return;
-
- // move the item into the container if it's not there already
- if(this.containers.length === 1) {
- this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
- this.containers[innermostIndex].containerCache.over = 1;
- } else {
-
- //When entering a new container, we will find the item with the least distance and append our item near it
- var dist = 10000; var itemWithLeastDistance = null;
- var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
- var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
- var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
- for (var j = this.items.length - 1; j >= 0; j--) {
- if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
- if(this.items[j].item[0] == this.currentItem[0]) continue;
- var cur = this.items[j].item.offset()[posProperty];
- var nearBottom = false;
- if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
- nearBottom = true;
- cur += this.items[j][sizeProperty];
- }
-
- if(Math.abs(cur - base) < dist) {
- dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
- this.direction = nearBottom ? "up": "down";
- }
- }
-
- if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
- return;
-
- this.currentContainer = this.containers[innermostIndex];
- itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
- this._trigger("change", event, this._uiHash());
- this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
-
- //Update the placeholder
- this.options.placeholder.update(this.currentContainer, this.placeholder);
-
- this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
- this.containers[innermostIndex].containerCache.over = 1;
- }
-
-
- },
-
- _createHelper: function(event) {
-
- var o = this.options;
- var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
-
- if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
- $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
-
- if(helper[0] == this.currentItem[0])
- this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
-
- if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
- if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
-
- return helper;
-
- },
-
- _adjustOffsetFromHelper: function(obj) {
- if (typeof obj == 'string') {
- obj = obj.split(' ');
- }
- if ($.isArray(obj)) {
- obj = {left: +obj[0], top: +obj[1] || 0};
- }
- if ('left' in obj) {
- this.offset.click.left = obj.left + this.margins.left;
- }
- if ('right' in obj) {
- this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
- }
- if ('top' in obj) {
- this.offset.click.top = obj.top + this.margins.top;
- }
- if ('bottom' in obj) {
- this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
- }
- },
-
- _getParentOffset: function() {
-
-
- //Get the offsetParent and cache its position
- this.offsetParent = this.helper.offsetParent();
- var po = this.offsetParent.offset();
-
- // This is a special case where we need to modify a offset calculated on start, since the following happened:
- // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
- // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
- // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
- if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
- po.left += this.scrollParent.scrollLeft();
- po.top += this.scrollParent.scrollTop();
- }
-
- if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
- || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
- po = { top: 0, left: 0 };
-
- return {
- top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
- left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
- };
-
- },
-
- _getRelativeOffset: function() {
-
- if(this.cssPosition == "relative") {
- var p = this.currentItem.position();
- return {
- top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
- left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
- };
- } else {
- return { top: 0, left: 0 };
- }
-
- },
-
- _cacheMargins: function() {
- this.margins = {
- left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
- top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
- };
- },
-
- _cacheHelperProportions: function() {
- this.helperProportions = {
- width: this.helper.outerWidth(),
- height: this.helper.outerHeight()
- };
- },
-
- _setContainment: function() {
-
- var o = this.options;
- if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
- if(o.containment == 'document' || o.containment == 'window') this.containment = [
- 0 - this.offset.relative.left - this.offset.parent.left,
- 0 - this.offset.relative.top - this.offset.parent.top,
- $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
- ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
- ];
-
- if(!(/^(document|window|parent)$/).test(o.containment)) {
- var ce = $(o.containment)[0];
- var co = $(o.containment).offset();
- var over = ($(ce).css("overflow") != 'hidden');
-
- this.containment = [
- co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
- co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
- co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
- co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
- ];
- }
-
- },
-
- _convertPositionTo: function(d, pos) {
-
- if(!pos) pos = this.position;
- var mod = d == "absolute" ? 1 : -1;
- var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
- return {
- top: (
- pos.top // The absolute mouse position
- + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
- + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
- - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
- ),
- left: (
- pos.left // The absolute mouse position
- + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
- + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
- - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
- )
- };
-
- },
-
- _generatePosition: function(event) {
-
- var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
- // This is another very weird special case that only happens for relative elements:
- // 1. If the css position is relative
- // 2. and the scroll parent is the document or similar to the offset parent
- // we have to refresh the relative offset during the scroll so there are no jumps
- if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
- this.offset.relative = this._getRelativeOffset();
- }
-
- var pageX = event.pageX;
- var pageY = event.pageY;
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
-
- if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-
- if(this.containment) {
- if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
- if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
- if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
- if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
- }
-
- if(o.grid) {
- var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
- pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
- var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
- pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
- }
-
- }
-
- return {
- top: (
- pageY // The absolute mouse position
- - this.offset.click.top // Click offset (relative to the element)
- - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
- - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
- + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
- ),
- left: (
- pageX // The absolute mouse position
- - this.offset.click.left // Click offset (relative to the element)
- - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
- - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
- + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
- )
- };
-
- },
-
- _rearrange: function(event, i, a, hardRefresh) {
-
- a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
-
- //Various things done here to improve the performance:
- // 1. we create a setTimeout, that calls refreshPositions
- // 2. on the instance, we have a counter variable, that get's higher after every append
- // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
- // 4. this lets only the last addition to the timeout stack through
- this.counter = this.counter ? ++this.counter : 1;
- var counter = this.counter;
-
- this._delay(function() {
- if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
- });
-
- },
-
- _clear: function(event, noPropagation) {
-
- this.reverting = false;
- // We delay all events that have to be triggered to after the point where the placeholder has been removed and
- // everything else normalized again
- var delayedTriggers = [];
-
- // We first have to update the dom position of the actual currentItem
- // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
- if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
- this._noFinalSort = null;
-
- if(this.helper[0] == this.currentItem[0]) {
- for(var i in this._storedCSS) {
- if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
- }
- this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
- } else {
- this.currentItem.show();
- }
-
- if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
- if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
-
- // Check if the items Container has Changed and trigger appropriate
- // events.
- if (this !== this.currentContainer) {
- if(!noPropagation) {
- delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
- delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
- delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
- }
- }
-
-
- //Post events to containers
- for (var i = this.containers.length - 1; i >= 0; i--){
- if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
- if(this.containers[i].containerCache.over) {
- delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
- this.containers[i].containerCache.over = 0;
- }
- }
-
- //Do what was originally in plugins
- if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
- if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
- if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
-
- this.dragging = false;
- if(this.cancelHelperRemoval) {
- if(!noPropagation) {
- this._trigger("beforeStop", event, this._uiHash());
- for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
- this._trigger("stop", event, this._uiHash());
- }
-
- this.fromOutside = false;
- return false;
- }
-
- if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
-
- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
- this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-
- if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
-
- if(!noPropagation) {
- for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
- this._trigger("stop", event, this._uiHash());
- }
-
- this.fromOutside = false;
- return true;
-
- },
-
- _trigger: function() {
- if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
- this.cancel();
- }
- },
-
- _uiHash: function(_inst) {
- var inst = _inst || this;
- return {
- helper: inst.helper,
- placeholder: inst.placeholder || $([]),
- position: inst.position,
- originalPosition: inst.originalPosition,
- offset: inst.positionAbs,
- item: inst.currentItem,
- sender: _inst ? _inst.element : null
- };
- }
-
-});
-
-})(jQuery);
diff --git a/horizon/tables/actions.py b/horizon/tables/actions.py
index 6f825d712..143dad056 100644
--- a/horizon/tables/actions.py
+++ b/horizon/tables/actions.py
@@ -492,8 +492,8 @@ class FilterAction(BaseAction):
# and actions won't allow it. Need to be fixed in the future.
cls_name = self.__class__.__name__
raise NotImplementedError("You must define a %s method "
- "for %s data type in %s." %
- (func_name, data_type, cls_name))
+ "for %s data type in %s." %
+ (func_name, data_type, cls_name))
_data = filter_func(table, data, filter_string)
self.assign_type_string(table, _data, data_type)
filtered_data.extend(_data)
diff --git a/horizon/tables/base.py b/horizon/tables/base.py
index 8f6eecfd7..16e3fd9fc 100644
--- a/horizon/tables/base.py
+++ b/horizon/tables/base.py
@@ -768,7 +768,7 @@ class Cell(html.HTMLElement):
"""Returns a flattened string of the cell's CSS classes."""
if not self.url:
self.column.classes = [cls for cls in self.column.classes
- if cls != "anchor"]
+ if cls != "anchor"]
column_class_string = self.column.get_final_attrs().get('class', "")
classes = set(column_class_string.split(" "))
if self.column.status:
@@ -944,8 +944,8 @@ class DataTableOptions(object):
"""
def __init__(self, options):
self.name = getattr(options, 'name', self.__class__.__name__)
- verbose_name = getattr(options, 'verbose_name', None) \
- or self.name.title()
+ verbose_name = (getattr(options, 'verbose_name', None)
+ or self.name.title())
self.verbose_name = verbose_name
self.columns = getattr(options, 'columns', None)
self.status_columns = getattr(options, 'status_columns', [])
@@ -983,9 +983,9 @@ class DataTableOptions(object):
'template',
'horizon/common/_data_table.html')
self.row_actions_template = \
- 'horizon/common/_data_table_row_actions.html'
+ 'horizon/common/_data_table_row_actions.html'
self.table_actions_template = \
- 'horizon/common/_data_table_table_actions.html'
+ 'horizon/common/_data_table_table_actions.html'
self.context_var_name = unicode(getattr(options,
'context_var_name',
'table'))
@@ -1300,7 +1300,7 @@ class DataTable(object):
if not matches:
raise exceptions.Http302(self.get_absolute_url(),
_('No match returned for the id "%s".')
- % lookup)
+ % lookup)
return matches[0]
@property
diff --git a/horizon/tables/formset.py b/horizon/tables/formset.py
index b7278a52f..a690eee4d 100644
--- a/horizon/tables/formset.py
+++ b/horizon/tables/formset.py
@@ -138,7 +138,7 @@ class FormsetDataTableMixin(object):
formset = self.get_formset()
formset.is_valid()
for datum, form in itertools.izip_longest(self.filtered_data,
- formset):
+ formset):
row = self._meta.row_class(self, datum, form)
if self.get_object_id(datum) == self.current_item_id:
self.selected = True
diff --git a/horizon/templates/horizon/_scripts.html b/horizon/templates/horizon/_scripts.html
index f824c4e6d..aed45a3cb 100644
--- a/horizon/templates/horizon/_scripts.html
+++ b/horizon/templates/horizon/_scripts.html
@@ -25,7 +25,7 @@
<script src="{{ STATIC_URL }}horizon/lib/jquery/jquery.tablesorter.js" type="text/javascript" charset="utf-8"></script>
<script src="{{ STATIC_URL }}horizon/lib/spin.js" type="text/javascript" charset="utf-8"></script>
<script src="{{ STATIC_URL }}horizon/lib/spin.jquery.js" type="text/javascript" charset="utf-8"></script>
-<script src="{{ STATIC_URL }}horizon/lib/jquery/jquery-ui-1.9.2.custom.js" type="text/javascript" charset="utf-8"></script>
+<script src="{{ STATIC_URL }}horizon/lib/jquery-ui/ui/jquery-ui.js" type="text/javascript" charset="utf-8"></script>
<script src="{{ STATIC_URL }}horizon/lib/jquery/jquery.bootstrap.wizard.js" type="text/javascript" charset="utf-8"></script>
<script src="{{ STATIC_URL }}horizon/lib/d3.js" type="text/javascript" charset="utf-8"></script>
diff --git a/horizon/templatetags/horizon.py b/horizon/templatetags/horizon.py
index a5e1b1645..f798b4a13 100644
--- a/horizon/templatetags/horizon.py
+++ b/horizon/templatetags/horizon.py
@@ -41,7 +41,7 @@ def has_permissions(user, component):
@register.filter
def has_permissions_on_list(components, user):
return [component for component
- in components if has_permissions(user, component)]
+ in components if has_permissions(user, component)]
@register.inclusion_tag('horizon/_accordion_nav.html', takes_context=True)
@@ -57,19 +57,19 @@ def horizon_nav(context):
for group in panel_groups.values():
allowed_panels = []
for panel in group:
- if callable(panel.nav) and panel.nav(context) and \
- panel.can_access(context):
+ if (callable(panel.nav) and panel.nav(context) and
+ panel.can_access(context)):
allowed_panels.append(panel)
- elif not callable(panel.nav) and panel.nav and \
- panel.can_access(context):
+ elif (not callable(panel.nav) and panel.nav and
+ panel.can_access(context)):
allowed_panels.append(panel)
if allowed_panels:
non_empty_groups.append((group.name, allowed_panels))
- if callable(dash.nav) and dash.nav(context) and \
- dash.can_access(context):
+ if (callable(dash.nav) and dash.nav(context) and
+ dash.can_access(context)):
dashboards.append((dash, SortedDict(non_empty_groups)))
- elif not callable(dash.nav) and dash.nav and \
- dash.can_access(context):
+ elif (not callable(dash.nav) and dash.nav and
+ dash.can_access(context)):
dashboards.append((dash, SortedDict(non_empty_groups)))
return {'components': dashboards,
'user': context['request'].user,
@@ -109,11 +109,11 @@ def horizon_dashboard_nav(context):
for group in panel_groups.values():
allowed_panels = []
for panel in group:
- if callable(panel.nav) and panel.nav(context) and \
- panel.can_access(context):
+ if (callable(panel.nav) and panel.nav(context) and
+ panel.can_access(context)):
allowed_panels.append(panel)
- elif not callable(panel.nav) and panel.nav and \
- panel.can_access(context):
+ elif (not callable(panel.nav) and panel.nav and
+ panel.can_access(context)):
allowed_panels.append(panel)
if allowed_panels:
non_empty_groups.append((group.name, allowed_panels))
diff --git a/horizon/templatetags/sizeformat.py b/horizon/templatetags/sizeformat.py
index b64eaba3b..75f58a121 100644
--- a/horizon/templatetags/sizeformat.py
+++ b/horizon/templatetags/sizeformat.py
@@ -66,7 +66,7 @@ def filesizeformat(bytes, filesize_number_format):
return _("%s TB") % \
filesize_number_format(bytes / (1024 * 1024 * 1024 * 1024))
return _("%s PB") % \
- filesize_number_format(bytes / (1024 * 1024 * 1024 * 1024 * 1024))
+ filesize_number_format(bytes / (1024 * 1024 * 1024 * 1024 * 1024))
def float_cast_filesizeformat(value, multiplier=1, format=int_format):
diff --git a/horizon/test/helpers.py b/horizon/test/helpers.py
index 4624406d2..3c5b21d13 100644
--- a/horizon/test/helpers.py
+++ b/horizon/test/helpers.py
@@ -107,7 +107,7 @@ class RequestFactoryWithMessages(RequestFactory):
@unittest.skipIf(os.environ.get('SKIP_UNITTESTS', False),
- "The SKIP_UNITTESTS env variable is set.")
+ "The SKIP_UNITTESTS env variable is set.")
class TestCase(django_test.TestCase):
"""Specialized base test case class for Horizon which gives access to
numerous additional features:
@@ -191,8 +191,8 @@ class TestCase(django_test.TestCase):
msgs = [force_text(m.message)
for m in messages if msg_type in m.tags]
assert len(msgs) == count, \
- "%s messages not as expected: %s" % (msg_type.title(),
- ", ".join(msgs))
+ "%s messages not as expected: %s" % (msg_type.title(),
+ ", ".join(msgs))
@unittest.skipUnless(os.environ.get('WITH_SELENIUM', False),
diff --git a/horizon/test/patches.py b/horizon/test/patches.py
index 612c967cf..f94714e56 100644
--- a/horizon/test/patches.py
+++ b/horizon/test/patches.py
@@ -42,8 +42,8 @@ def parse_starttag_patched(self, i):
attrname, rest, attrvalue = m.group(1, 2, 3)
if not rest:
attrvalue = None
- elif attrvalue[:1] == '\'' == attrvalue[-1:] or \
- attrvalue[:1] == '"' == attrvalue[-1:]:
+ elif (attrvalue[:1] == '\'' == attrvalue[-1:] or
+ attrvalue[:1] == '"' == attrvalue[-1:]):
attrvalue = attrvalue[1:-1]
if attrvalue:
attrvalue = self.unescape(attrvalue)
@@ -55,8 +55,8 @@ def parse_starttag_patched(self, i):
lineno, offset = self.getpos()
if "\n" in self.__starttag_text:
lineno = lineno + self.__starttag_text.count("\n")
- offset = len(self.__starttag_text) \
- - self.__starttag_text.rfind("\n")
+ offset = (len(self.__starttag_text)
+ - self.__starttag_text.rfind("\n"))
else:
offset = offset + len(self.__starttag_text)
self.error("junk characters in start tag: %r"
diff --git a/horizon/test/settings.py b/horizon/test/settings.py
index cf9a788e2..adad16edb 100644
--- a/horizon/test/settings.py
+++ b/horizon/test/settings.py
@@ -27,6 +27,7 @@ import xstatic.pkg.angular
import xstatic.pkg.angular_cookies
import xstatic.pkg.angular_mock
import xstatic.pkg.bootstrap_datepicker
+import xstatic.pkg.bootstrap_scss
import xstatic.pkg.d3
import xstatic.pkg.font_awesome
import xstatic.pkg.hogan
@@ -35,6 +36,7 @@ import xstatic.pkg.jquery
import xstatic.pkg.jquery_migrate
import xstatic.pkg.jquery_quicksearch
import xstatic.pkg.jquery_tablesorter
+import xstatic.pkg.jquery_ui
import xstatic.pkg.jsencrypt
import xstatic.pkg.qunit
import xstatic.pkg.rickshaw
@@ -75,6 +77,7 @@ INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django_nose',
+ 'django_pyscss',
'compressor',
'horizon',
'horizon.test',
@@ -153,7 +156,7 @@ STATICFILES_FINDERS = (
'compressor.finders.CompressorFinder',
)
-STATICFILES_DIRS = (
+STATICFILES_DIRS = [
('horizon/lib/angular',
xstatic.main.XStatic(xstatic.pkg.angular).base_dir),
('horizon/lib/angular',
@@ -162,6 +165,8 @@ STATICFILES_DIRS = (
xstatic.main.XStatic(xstatic.pkg.angular_mock).base_dir),
('horizon/lib/bootstrap_datepicker',
xstatic.main.XStatic(xstatic.pkg.bootstrap_datepicker).base_dir),
+ ('bootstrap',
+ xstatic.main.XStatic(xstatic.pkg.bootstrap_scss).base_dir),
('horizon/lib',
xstatic.main.XStatic(xstatic.pkg.d3).base_dir),
('horizon/lib',
@@ -186,7 +191,16 @@ STATICFILES_DIRS = (
xstatic.main.XStatic(xstatic.pkg.rickshaw).base_dir),
('horizon/lib',
xstatic.main.XStatic(xstatic.pkg.spin).base_dir),
-)
+]
+
+if xstatic.main.XStatic(xstatic.pkg.jquery_ui).version.startswith('1.10.'):
+ # The 1.10.x versions already contain the 'ui' directory.
+ STATICFILES_DIRS.append(('horizon/lib/jquery-ui',
+ xstatic.main.XStatic(xstatic.pkg.jquery_ui).base_dir))
+else:
+ # Newer versions dropped the directory, add it to keep the path the same.
+ STATICFILES_DIRS.append(('horizon/lib/jquery-ui/ui',
+ xstatic.main.XStatic(xstatic.pkg.jquery_ui).base_dir))
LOGGING = {
'version': 1,
diff --git a/horizon/test/tests/base.py b/horizon/test/tests/base.py
index 1ca82073c..73f8b6075 100644
--- a/horizon/test/tests/base.py
+++ b/horizon/test/tests/base.py
@@ -342,7 +342,7 @@ class GetUserHomeTests(BaseHorizonTests):
conf.HORIZON_CONFIG._setup()
self.assertEqual(self.test_user.username.upper(),
- base.Horizon.get_user_home(self.test_user))
+ base.Horizon.get_user_home(self.test_user))
def test_using_module_function(self):
module_func = 'django.utils.encoding.force_text'
@@ -351,7 +351,7 @@ class GetUserHomeTests(BaseHorizonTests):
self.test_user.username = 'testname'
self.assertEqual(self.original_username,
- base.Horizon.get_user_home(self.test_user))
+ base.Horizon.get_user_home(self.test_user))
def test_using_url(self):
fixed_url = "/url"
diff --git a/horizon/test/tests/middleware.py b/horizon/test/tests/middleware.py
index dd6b73937..617351f88 100644
--- a/horizon/test/tests/middleware.py
+++ b/horizon/test/tests/middleware.py
@@ -56,7 +56,7 @@ class MiddlewareTests(test.TestCase):
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
request.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
request.horizon = {'async_messages':
- [('error', 'error_msg', 'extra_tag')]}
+ [('error', 'error_msg', 'extra_tag')]}
response = HttpResponseRedirect(url)
response.client = self.client
diff --git a/horizon/test/tests/tables.py b/horizon/test/tests/tables.py
index e4fa5d977..ad18f84e3 100644
--- a/horizon/test/tests/tables.py
+++ b/horizon/test/tests/tables.py
@@ -227,7 +227,7 @@ class MyTable(tables.DataTable):
link_attrs={'data-type': 'modal dialog',
'data-tip': 'click for dialog'})
status = tables.Column('status', link=get_link,
- cell_attributes_getter=tooltip_dict.get)
+ cell_attributes_getter=tooltip_dict.get)
optional = tables.Column('optional', empty_value='N/A')
excluded = tables.Column('excluded')
@@ -1219,12 +1219,12 @@ class DataTableTests(test.TestCase):
self.assertEqual(row.cells['status'].data, 'down')
self.assertEqual(row.cells['status'].attrs,
- {'title': 'service is not available',
+ {'title': 'service is not available',
'style': 'color:red;cursor:pointer'})
self.assertEqual(row1.cells['status'].data, 'up')
self.assertEqual(row1.cells['status'].attrs,
- {'title': 'service is up and running',
- 'style': 'color:green;cursor:pointer'})
+ {'title': 'service is up and running',
+ 'style': 'color:green;cursor:pointer'})
self.assertEqual(row2.cells['status'].data, 'standby')
self.assertEqual(row2.cells['status'].attrs, {})
diff --git a/horizon/test/tests/utils.py b/horizon/test/tests/utils.py
index 961f10fe3..7f8018a15 100644
--- a/horizon/test/tests/utils.py
+++ b/horizon/test/tests/utils.py
@@ -79,9 +79,9 @@ class ValidatorsTests(test.TestCase):
"1.2.3.4:1111:2222::5555//22",
"fe80::204:61ff:254.157.241.86/200",
# some valid IPv4 addresses
- "10.144.11.107/4",
- "255.255.255.255/0",
- "0.1.2.3/16")
+ "10.144.11.107/4",
+ "255.255.255.255/0",
+ "0.1.2.3/16")
ip = forms.IPField(mask=True, version=forms.IPv6)
for cidr in GOOD_CIDRS:
self.assertIsNone(ip.validate(cidr))
@@ -149,7 +149,7 @@ class ValidatorsTests(test.TestCase):
ipv4 = forms.IPField(required=True, version=forms.IPv4)
ipv6 = forms.IPField(required=False, version=forms.IPv6)
ipmixed = forms.IPField(required=False,
- version=forms.IPv4 | forms.IPv6)
+ version=forms.IPv4 | forms.IPv6)
for ip_addr in GOOD_IPS_V4:
self.assertIsNone(ipv4.validate(ip_addr))
@@ -170,9 +170,9 @@ class ValidatorsTests(test.TestCase):
self.assertRaises(ValidationError, ipv4.validate, "") # required=True
iprange = forms.IPField(required=False,
- mask=True,
- mask_range_from=10,
- version=forms.IPv4 | forms.IPv6)
+ mask=True,
+ mask_range_from=10,
+ version=forms.IPv4 | forms.IPv6)
self.assertRaises(ValidationError, iprange.validate,
"fe80::204:61ff:254.157.241.86/6")
self.assertRaises(ValidationError, iprange.validate,
diff --git a/horizon/utils/functions.py b/horizon/utils/functions.py
index 3d3836614..85802f53e 100644
--- a/horizon/utils/functions.py
+++ b/horizon/utils/functions.py
@@ -39,7 +39,7 @@ def add_logout_reason(request, response, reason):
lang = translation.get_language_from_request(request)
with translation.override(lang):
reason = unicode(reason).encode('utf-8')
- response.set_cookie('logout_reason', reason, max_age=30)
+ response.set_cookie('logout_reason', reason, max_age=10)
def logout_with_message(request, msg):
diff --git a/horizon/workflows/base.py b/horizon/workflows/base.py
index 6eb5167d4..2ae20b83f 100644
--- a/horizon/workflows/base.py
+++ b/horizon/workflows/base.py
@@ -67,8 +67,8 @@ class ActionMetaclass(forms.forms.DeclarativeFieldsMetaclass):
cls.slug = getattr(opts, "slug", slugify(name))
cls.permissions = getattr(opts, "permissions", ())
cls.progress_message = getattr(opts,
- "progress_message",
- _("Processing..."))
+ "progress_message",
+ _("Processing..."))
cls.help_text = getattr(opts, "help_text", "")
cls.help_text_template = getattr(opts, "help_text_template", None)
return cls
@@ -347,8 +347,8 @@ class Step(object):
except ImportError:
raise ImportError("Could not import %s from the "
"module %s as a connection "
- "handler on %s."
- % (bits[-1], module_name, cls))
+ "handler on %s."
+ % (bits[-1], module_name, cls))
except AttributeError:
raise AttributeError("Could not import %s from the "
"module %s as a connection "
@@ -723,7 +723,7 @@ class Workflow(html.HTMLElement):
def _trigger_handlers(self, key):
responses = []
handlers = [(step.slug, f) for step in self.steps
- for f in step._handlers.get(key, [])]
+ for f in step._handlers.get(key, [])]
for slug, handler in handlers:
responses.append((slug, handler(self.request, self.context)))
return responses
diff --git a/openstack_dashboard/api/cinder.py b/openstack_dashboard/api/cinder.py
index 515281d07..734bacaa9 100644
--- a/openstack_dashboard/api/cinder.py
+++ b/openstack_dashboard/api/cinder.py
@@ -393,6 +393,10 @@ def volume_type_list_with_qos_associations(request):
return vol_types
+def default_quota_update(request, **kwargs):
+ cinderclient(request).quota_classes.update(DEFAULT_QUOTA_NAME, **kwargs)
+
+
def volume_type_list(request):
return cinderclient(request).volume_types.list()
diff --git a/openstack_dashboard/api/nova.py b/openstack_dashboard/api/nova.py
index e8b392b89..f52472f54 100644
--- a/openstack_dashboard/api/nova.py
+++ b/openstack_dashboard/api/nova.py
@@ -670,6 +670,10 @@ def default_quota_get(request, tenant_id):
return base.QuotaSet(novaclient(request).quotas.defaults(tenant_id))
+def default_quota_update(request, **kwargs):
+ novaclient(request).quota_classes.update(DEFAULT_QUOTA_NAME, **kwargs)
+
+
def usage_get(request, tenant_id, start, end):
return NovaUsage(novaclient(request).usage.get(tenant_id, start, end))
diff --git a/openstack_dashboard/conf/cinder_policy.json b/openstack_dashboard/conf/cinder_policy.json
index 8fe7bc771..b20bb853d 100644
--- a/openstack_dashboard/conf/cinder_policy.json
+++ b/openstack_dashboard/conf/cinder_policy.json
@@ -31,6 +31,7 @@
"volume_extension:quotas:show": [],
"volume_extension:quotas:update": [["rule:admin_api"]],
+ "volume_extension:quota_classes": [],
"volume_extension:volume_admin_actions:reset_status": [["rule:admin_api"]],
"volume_extension:snapshot_admin_actions:reset_status": [["rule:admin_api"]],
diff --git a/openstack_dashboard/conf/nova_policy.json b/openstack_dashboard/conf/nova_policy.json
index f53c1b258..487e46c11 100644
--- a/openstack_dashboard/conf/nova_policy.json
+++ b/openstack_dashboard/conf/nova_policy.json
@@ -166,6 +166,8 @@
"compute_extension:v3:os-quota-sets:show": "",
"compute_extension:v3:os-quota-sets:update": "rule:admin_api",
"compute_extension:v3:os-quota-sets:delete": "rule:admin_api",
+ "compute_extension:quota_classes": "",
+ "compute_extension:v3:os-quota-class-sets": "",
"compute_extension:rescue": "",
"compute_extension:v3:os-rescue": "",
"compute_extension:security_group_default_rules": "rule:admin_api",
diff --git a/openstack_dashboard/dashboards/admin/dashboard.py b/openstack_dashboard/dashboards/admin/dashboard.py
index 25d198f95..d594fabdd 100644
--- a/openstack_dashboard/dashboards/admin/dashboard.py
+++ b/openstack_dashboard/dashboards/admin/dashboard.py
@@ -22,7 +22,7 @@ class SystemPanels(horizon.PanelGroup):
name = _("System")
panels = ('overview', 'metering', 'hypervisors', 'aggregates',
'instances', 'volumes', 'flavors', 'images',
- 'networks', 'routers', 'info')
+ 'networks', 'routers', 'defaults', 'info')
class Admin(horizon.Dashboard):
diff --git a/openstack_dashboard/dashboards/admin/defaults/__init__.py b/openstack_dashboard/dashboards/admin/defaults/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/__init__.py
diff --git a/openstack_dashboard/dashboards/admin/defaults/panel.py b/openstack_dashboard/dashboards/admin/defaults/panel.py
new file mode 100644
index 000000000..56fe532ac
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/panel.py
@@ -0,0 +1,27 @@
+# Copyright 2013 Kylin, 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.
+
+from django.utils.translation import ugettext_lazy as _
+
+import horizon
+
+from openstack_dashboard.dashboards.admin import dashboard
+
+
+class Defaults(horizon.Panel):
+ name = _("Defaults")
+ slug = 'defaults'
+
+
+dashboard.Admin.register(Defaults)
diff --git a/openstack_dashboard/dashboards/admin/defaults/tables.py b/openstack_dashboard/dashboards/admin/defaults/tables.py
new file mode 100644
index 000000000..9294b75ad
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/tables.py
@@ -0,0 +1,76 @@
+# Copyright 2013 Kylin, 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.
+
+from django.utils.translation import ugettext_lazy as _
+
+from horizon import tables
+
+
+class QuotaFilterAction(tables.FilterAction):
+ def filter(self, table, tenants, filter_string):
+ q = filter_string.lower()
+
+ def comp(tenant):
+ if q in tenant.name.lower():
+ return True
+ return False
+
+ return filter(comp, tenants)
+
+
+class UpdateDefaultQuotas(tables.LinkAction):
+ name = "update_defaults"
+ verbose_name = _("Update Defaults")
+ url = "horizon:admin:defaults:update_defaults"
+ classes = ("ajax-modal", "btn-edit")
+
+
+def get_quota_name(quota):
+ QUOTA_NAMES = {
+ 'injected_file_content_bytes': _('Injected File Content Bytes'),
+ 'injected_file_path_bytes': _('Length of Injected File Path'),
+ 'metadata_items': _('Metadata Items'),
+ 'cores': _('VCPUs'),
+ 'instances': _('Instances'),
+ 'injected_files': _('Injected Files'),
+ 'volumes': _('Volumes'),
+ 'snapshots': _('Volume Snapshots'),
+ 'gigabytes': _('Total Size of Volumes and Snapshots (GB)'),
+ 'ram': _('RAM (MB)'),
+ 'floating_ips': _('Floating IPs'),
+ 'security_groups': _('Security Groups'),
+ 'security_group_rules': _('Security Group Rules'),
+ 'key_pairs': _('Key Pairs'),
+ 'fixed_ips': _('Fixed IPs'),
+ 'volumes_volume_luks': _('LUKS Volumes'),
+ 'snapshots_volume_luks': _('LUKS Volume Snapshots'),
+ 'gigabytes_volume_luks':
+ _('Total Size of LUKS Volumes and Snapshots (GB)'),
+ 'dm-crypt': _('dm-crypt'),
+ }
+ return QUOTA_NAMES.get(quota.name, quota.name.replace("_", " ").title())
+
+
+class QuotasTable(tables.DataTable):
+ name = tables.Column(get_quota_name, verbose_name=_('Quota Name'))
+ limit = tables.Column("limit", verbose_name=_('Limit'))
+
+ def get_object_id(self, obj):
+ return obj.name
+
+ class Meta:
+ name = "quotas"
+ verbose_name = _("Quotas")
+ table_actions = (QuotaFilterAction, UpdateDefaultQuotas)
+ multi_select = False
diff --git a/openstack_dashboard/dashboards/admin/defaults/tabs.py b/openstack_dashboard/dashboards/admin/defaults/tabs.py
new file mode 100644
index 000000000..832a09a0b
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/tabs.py
@@ -0,0 +1,44 @@
+# Copyright 2013 Kylin, 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.
+
+from django.utils.translation import ugettext_lazy as _
+
+from horizon import exceptions
+from horizon import tabs
+
+from openstack_dashboard.usage import quotas
+
+from openstack_dashboard.dashboards.admin.defaults import tables
+
+
+class DefaultQuotasTab(tabs.TableTab):
+ table_classes = (tables.QuotasTable,)
+ name = _("Default Quotas")
+ slug = "quotas"
+ template_name = ("horizon/common/_detail_table.html")
+
+ def get_quotas_data(self):
+ request = self.tab_group.request
+ try:
+ data = quotas.get_default_quota_data(request)
+ except Exception:
+ data = []
+ exceptions.handle(self.request, _('Unable to get quota info.'))
+ return data
+
+
+class DefaultsTabs(tabs.TabGroup):
+ slug = "defaults"
+ tabs = (DefaultQuotasTab,)
+ sticky = True
diff --git a/openstack_dashboard/dashboards/admin/defaults/templates/defaults/index.html b/openstack_dashboard/dashboards/admin/defaults/templates/defaults/index.html
new file mode 100644
index 000000000..c85503037
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/templates/defaults/index.html
@@ -0,0 +1,15 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block title %}{% trans "Defaults" %}{% endblock %}
+
+{% block page_header %}
+ {% include "horizon/common/_page_header.html" with title=_("Defaults")%}
+{% endblock page_header %}
+
+{% block main %}
+<div class="row">
+ <div class="col-sm-12">
+ {{ tab_group.render }}
+ </div>
+</div>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/defaults/tests.py b/openstack_dashboard/dashboards/admin/defaults/tests.py
new file mode 100644
index 000000000..b1faa88eb
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/tests.py
@@ -0,0 +1,137 @@
+# Copyright 2013 Kylin, 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.
+
+from django.core.urlresolvers import reverse
+from django import http
+from mox import IsA # noqa
+
+from openstack_dashboard import api
+from openstack_dashboard.test import helpers as test
+from openstack_dashboard.usage import quotas
+
+INDEX_URL = reverse('horizon:admin:defaults:index')
+
+
+class ServicesViewTests(test.BaseAdminViewTests):
+ def test_index(self):
+ self._test_index(neutron_enabled=True)
+
+ def test_index_with_neutron_disabled(self):
+ self._test_index(neutron_enabled=False)
+
+ def test_index_with_neutron_sg_disabled(self):
+ self._test_index(neutron_enabled=True,
+ neutron_sg_enabled=False)
+
+ def _test_index(self, neutron_enabled=True, neutron_sg_enabled=True):
+ # Neutron does not have an API for getting default system
+ # quotas. When not using Neutron, the floating ips quotas
+ # should be in the list.
+ self.mox.StubOutWithMock(api.nova, 'default_quota_get')
+ self.mox.StubOutWithMock(api.cinder, 'default_quota_get')
+ self.mox.StubOutWithMock(api.base, 'is_service_enabled')
+ if neutron_enabled:
+ self.mox.StubOutWithMock(api.neutron, 'is_extension_supported')
+
+ api.base.is_service_enabled(IsA(http.HttpRequest), 'volume') \
+ .AndReturn(True)
+ api.base.is_service_enabled(IsA(http.HttpRequest), 'network') \
+ .MultipleTimes().AndReturn(neutron_enabled)
+
+ api.nova.default_quota_get(IsA(http.HttpRequest),
+ self.tenant.id).AndReturn(self.quotas.nova)
+ api.cinder.default_quota_get(IsA(http.HttpRequest), self.tenant.id) \
+ .AndReturn(self.cinder_quotas.first())
+ if neutron_enabled:
+ api.neutron.is_extension_supported(
+ IsA(http.HttpRequest),
+ 'security-group').AndReturn(neutron_sg_enabled)
+
+ self.mox.ReplayAll()
+
+ res = self.client.get(INDEX_URL)
+
+ self.assertTemplateUsed(res, 'admin/defaults/index.html')
+
+ quotas_tab = res.context['tab_group'].get_tab('quotas')
+ expected_tabs = ['<Quota: (injected_file_content_bytes, 1)>',
+ '<Quota: (metadata_items, 1)>',
+ '<Quota: (injected_files, 1)>',
+ '<Quota: (gigabytes, 1000)>',
+ '<Quota: (ram, 10000)>',
+ '<Quota: (instances, 10)>',
+ '<Quota: (snapshots, 1)>',
+ '<Quota: (volumes, 1)>',
+ '<Quota: (cores, 10)>',
+ '<Quota: (floating_ips, 1)>',
+ '<Quota: (fixed_ips, 10)>',
+ '<Quota: (security_groups, 10)>',
+ '<Quota: (security_group_rules, 20)>']
+ if neutron_enabled:
+ expected_tabs.remove('<Quota: (floating_ips, 1)>')
+ expected_tabs.remove('<Quota: (fixed_ips, 10)>')
+ if neutron_sg_enabled:
+ expected_tabs.remove('<Quota: (security_groups, 10)>')
+ expected_tabs.remove('<Quota: (security_group_rules, 20)>')
+
+ self.assertQuerysetEqual(quotas_tab._tables['quotas'].data,
+ expected_tabs,
+ ordered=False)
+
+
+class UpdateDefaultQuotasTests(test.BaseAdminViewTests):
+ def _get_quota_info(self, quota):
+ quota_data = {}
+ for field in (quotas.QUOTA_FIELDS + quotas.MISSING_QUOTA_FIELDS):
+ if field != 'fixed_ips':
+ limit = quota.get(field).limit or 10
+ quota_data[field] = int(limit)
+ return quota_data
+
+ @test.create_stubs({api.nova: ('default_quota_update', ),
+ api.cinder: ('default_quota_update', ),
+ quotas: ('get_default_quota_data',
+ 'get_disabled_quotas')})
+ def test_update_default_quotas(self):
+ quota = self.quotas.first()
+
+ # init
+ quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
+ .AndReturn(self.disabled_quotas.first())
+ quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
+
+ # update some fields
+ quota[0].limit = 123
+ quota[1].limit = -1
+ updated_quota = self._get_quota_info(quota)
+
+ # handle
+ nova_fields = quotas.NOVA_QUOTA_FIELDS + quotas.MISSING_QUOTA_FIELDS
+ nova_updated_quota = dict([(key, updated_quota[key]) for key in
+ nova_fields if key != 'fixed_ips'])
+ api.nova.default_quota_update(IsA(http.HttpRequest),
+ **nova_updated_quota)
+
+ cinder_updated_quota = dict([(key, updated_quota[key]) for key in
+ quotas.CINDER_QUOTA_FIELDS])
+ api.cinder.default_quota_update(IsA(http.HttpRequest),
+ **cinder_updated_quota)
+
+ self.mox.ReplayAll()
+
+ url = reverse('horizon:admin:defaults:update_defaults')
+ res = self.client.post(url, updated_quota)
+
+ self.assertNoFormErrors(res)
+ self.assertRedirectsNoFollow(res, INDEX_URL)
diff --git a/openstack_dashboard/dashboards/admin/defaults/urls.py b/openstack_dashboard/dashboards/admin/defaults/urls.py
new file mode 100644
index 000000000..3201642c3
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/urls.py
@@ -0,0 +1,24 @@
+# Copyright 2013 Kylin, 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.
+
+from django.conf.urls import patterns
+from django.conf.urls import url
+
+from openstack_dashboard.dashboards.admin.defaults import views
+
+
+urlpatterns = patterns('openstack_dashboard.dashboards.admin.defaults.views',
+ url(r'^$', views.IndexView.as_view(), name='index'),
+ url(r'^update_defaults$',
+ views.UpdateDefaultQuotasView.as_view(), name='update_defaults'))
diff --git a/openstack_dashboard/dashboards/admin/defaults/views.py b/openstack_dashboard/dashboards/admin/defaults/views.py
new file mode 100644
index 000000000..787dc979f
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/views.py
@@ -0,0 +1,47 @@
+# Copyright 2013 Kylin, 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.
+
+from django.utils.translation import ugettext_lazy as _
+
+from horizon import tabs
+from horizon import workflows
+
+from openstack_dashboard.dashboards.admin.defaults import tabs as project_tabs
+from openstack_dashboard.dashboards.admin.defaults import workflows as \
+ project_workflows
+from openstack_dashboard.usage import quotas
+
+
+class IndexView(tabs.TabbedTableView):
+ tab_group_class = project_tabs.DefaultsTabs
+ template_name = 'admin/defaults/index.html'
+
+
+class UpdateDefaultQuotasView(workflows.WorkflowView):
+ workflow_class = project_workflows.UpdateDefaultQuotas
+
+ def get_initial(self):
+ initial = super(UpdateDefaultQuotasView, self).get_initial()
+
+ # get initial quota defaults
+ try:
+ quota_defaults = quotas.get_default_quota_data(self.request)
+ for field in (quotas.QUOTA_FIELDS + quotas.MISSING_QUOTA_FIELDS):
+ initial[field] = quota_defaults.get(field).limit
+
+ except Exception:
+ error_msg = _('Unable to retrieve default quota values.')
+ self.add_error_to_step(error_msg, 'update_default_quotas')
+
+ return initial
diff --git a/openstack_dashboard/dashboards/admin/defaults/workflows.py b/openstack_dashboard/dashboards/admin/defaults/workflows.py
new file mode 100644
index 000000000..a416d77a8
--- /dev/null
+++ b/openstack_dashboard/dashboards/admin/defaults/workflows.py
@@ -0,0 +1,100 @@
+# Copyright 2013 Kylin, 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.
+
+
+from django.utils.translation import ugettext_lazy as _
+
+from horizon import exceptions
+from horizon import forms
+from horizon import workflows
+
+from openstack_dashboard.api import base
+from openstack_dashboard.api import cinder
+from openstack_dashboard.api import nova
+from openstack_dashboard.usage import quotas
+
+ALL_NOVA_QUOTA_FIELDS = quotas.NOVA_QUOTA_FIELDS + quotas.MISSING_QUOTA_FIELDS
+
+
+class UpdateDefaultQuotasAction(workflows.Action):
+ ifcb_label = _("Injected File Content Bytes")
+ ifpb_label = _("Length of Injected File Path")
+ injected_file_content_bytes = forms.IntegerField(min_value=-1,
+ label=ifcb_label)
+ metadata_items = forms.IntegerField(min_value=-1,
+ label=_("Metadata Items"))
+ ram = forms.IntegerField(min_value=-1, label=_("RAM (MB)"))
+ floating_ips = forms.IntegerField(min_value=-1, label=_("Floating IPs"))
+ key_pairs = forms.IntegerField(min_value=-1, label=_("Key Pairs"))
+ injected_file_path_bytes = forms.IntegerField(min_value=-1,
+ label=ifpb_label)
+ instances = forms.IntegerField(min_value=-1, label=_("Instances"))
+ security_group_rules = forms.IntegerField(min_value=-1,
+ label=_("Security Group Rules"))
+ injected_files = forms.IntegerField(min_value=-1,
+ label=_("Injected Files"))
+ cores = forms.IntegerField(min_value=-1, label=_("VCPUs"))
+ security_groups = forms.IntegerField(min_value=-1,
+ label=_("Security Groups"))
+ gigabytes = forms.IntegerField(min_value=-1,
+ label=_("Total Size of Volumes and Snapshots (GB)"))
+ snapshots = forms.IntegerField(min_value=-1, label=_("Volume Snapshots"))
+ volumes = forms.IntegerField(min_value=-1, label=_("Volumes"))
+
+ def __init__(self, request, *args, **kwargs):
+ super(UpdateDefaultQuotasAction, self).__init__(request,
+ *args,
+ **kwargs)
+ disabled_quotas = quotas.get_disabled_quotas(request)
+ for field in disabled_quotas:
+ if field in self.fields:
+ self.fields[field].required = False
+ self.fields[field].widget = forms.HiddenInput()
+
+ class Meta:
+ name = _("Default Quotas")
+ slug = 'update_default_quotas'
+ help_text = _("From here you can update the default quotas "
+ "(max limits).")
+
+
+class UpdateDefaultQuotasStep(workflows.Step):
+ action_class = UpdateDefaultQuotasAction
+ contributes = (quotas.QUOTA_FIELDS + quotas.MISSING_QUOTA_FIELDS)
+
+
+class UpdateDefaultQuotas(workflows.Workflow):
+ slug = "update_default_quotas"
+ name = _("Update Default Quotas")
+ finalize_button_name = _("Update Defaults")
+ success_message = _('Default quotas updated.')
+ failure_message = _('Unable to update default quotas.')
+ success_url = "horizon:admin:defaults:index"
+ default_steps = (UpdateDefaultQuotasStep,)
+
+ def handle(self, request, data):
+ # Update the default quotas.
+ # `fixed_ips` update for quota class is not supported by novaclient
+ nova_data = dict([(key, data[key]) for key in ALL_NOVA_QUOTA_FIELDS
+ if key != 'fixed_ips'])
+ try:
+ nova.default_quota_update(request, **nova_data)
+
+ if base.is_service_enabled(request, 'volume'):
+ cinder_data = dict([(key, data[key]) for key in
+ quotas.CINDER_QUOTA_FIELDS])
+ cinder.default_quota_update(request, **cinder_data)
+ except Exception:
+ exceptions.handle(request, _('Unable to update default quotas.'))
+ return True
diff --git a/openstack_dashboard/dashboards/admin/info/tables.py b/openstack_dashboard/dashboards/admin/info/tables.py
index 2bec2e294..c654d9b5a 100644
--- a/openstack_dashboard/dashboards/admin/info/tables.py
+++ b/openstack_dashboard/dashboards/admin/info/tables.py
@@ -186,55 +186,3 @@ class NetworkAgentsTable(tables.DataTable):
verbose_name = _("Network Agents")
table_actions = (NetworkAgentsFilterAction,)
multi_select = False
-
-
-class QuotaFilterAction(tables.FilterAction):
- def filter(self, table, tenants, filter_string):
- q = filter_string.lower()
-
- def comp(tenant):
- if q in tenant.name.lower():
- return True
- return False
-
- return filter(comp, tenants)
-
-
-def get_quota_name(quota):
- QUOTA_NAMES = {
- 'injected_file_content_bytes': _('Injected File Content Bytes'),
- 'injected_file_path_bytes': _('Length of Injected File Path'),
- 'metadata_items': _('Metadata Items'),
- 'cores': _('VCPUs'),
- 'instances': _('Instances'),
- 'injected_files': _('Injected Files'),
- 'volumes': _('Volumes'),
- 'snapshots': _('Volume Snapshots'),
- 'gigabytes': _('Total Size of Volumes and Snapshots (GB)'),
- 'ram': _('RAM (MB)'),
- 'floating_ips': _('Floating IPs'),
- 'security_groups': _('Security Groups'),
- 'security_group_rules': _('Security Group Rules'),
- 'key_pairs': _('Key Pairs'),
- 'fixed_ips': _('Fixed IPs'),
- 'volumes_volume_luks': _('LUKS Volumes'),
- 'snapshots_volume_luks': _('LUKS Volume Snapshots'),
- 'gigabytes_volume_luks':
- _('Total Size of LUKS Volumes and Snapshots (GB)'),
- 'dm-crypt': _('dm-crypt'),
- }
- return QUOTA_NAMES.get(quota.name, quota.name.replace("_", " ").title())
-
-
-class QuotasTable(tables.DataTable):
- name = tables.Column(get_quota_name, verbose_name=_('Quota Name'))
- limit = tables.Column("limit", verbose_name=_('Limit'))
-
- def get_object_id(self, obj):
- return obj.name
-
- class Meta:
- name = "quotas"
- verbose_name = _("Quotas")
- table_actions = (QuotaFilterAction,)
- multi_select = False
diff --git a/openstack_dashboard/dashboards/admin/info/tabs.py b/openstack_dashboard/dashboards/admin/info/tabs.py
index 3cf84d614..d2d8d3437 100644
--- a/openstack_dashboard/dashboards/admin/info/tabs.py
+++ b/openstack_dashboard/dashboards/admin/info/tabs.py
@@ -23,7 +23,6 @@ from openstack_dashboard.api import neutron
from openstack_dashboard.api import nova
from openstack_dashboard.dashboards.admin.info import constants
from openstack_dashboard.dashboards.admin.info import tables
-from openstack_dashboard.usage import quotas
class ServicesTab(tabs.TableTab):
@@ -103,25 +102,8 @@ class NetworkAgentsTab(tabs.TableTab):
return agents
-class DefaultQuotasTab(tabs.TableTab):
- table_classes = (tables.QuotasTable,)
- name = _("Default Quotas")
- slug = "quotas"
- template_name = constants.INFO_DETAIL_TEMPLATE_NAME
- permissions = ('openstack.services.compute',)
-
- def get_quotas_data(self):
- request = self.tab_group.request
- try:
- data = quotas.get_default_quota_data(request)
- except Exception:
- data = []
- exceptions.handle(self.request, _('Unable to get quota info.'))
- return data
-
-
class SystemInfoTabs(tabs.TabGroup):
slug = "system_info"
tabs = (ServicesTab, NovaServicesTab, CinderServicesTab,
- NetworkAgentsTab, DefaultQuotasTab)
+ NetworkAgentsTab)
sticky = True
diff --git a/openstack_dashboard/dashboards/admin/info/tests.py b/openstack_dashboard/dashboards/admin/info/tests.py
index 6c15a6662..2893785cc 100644
--- a/openstack_dashboard/dashboards/admin/info/tests.py
+++ b/openstack_dashboard/dashboards/admin/info/tests.py
@@ -26,31 +26,23 @@ INDEX_URL = reverse('horizon:admin:info:index')
class SystemInfoViewTests(test.BaseAdminViewTests):
@test.create_stubs({api.base: ('is_service_enabled',),
- api.nova: ('default_quota_get', 'service_list'),
+ api.nova: ('service_list',),
api.neutron: ('agent_list', 'is_extension_supported'),
- api.cinder: ('default_quota_get', 'service_list')})
+ api.cinder: ('service_list',)})
def test_index(self):
services = self.services.list()
api.nova.service_list(IsA(http.HttpRequest)).AndReturn(services)
+ api.base.is_service_enabled(IsA(http.HttpRequest), IgnoreArg()) \
+ .MultipleTimes().AndReturn(True)
api.neutron.is_extension_supported(IsA(http.HttpRequest),
'agent').AndReturn(True)
agents = self.agents.list()
api.neutron.agent_list(IsA(http.HttpRequest)).AndReturn(agents)
- api.base.is_service_enabled(IsA(http.HttpRequest), IgnoreArg()) \
- .MultipleTimes().AndReturn(True)
- api.nova.default_quota_get(IsA(http.HttpRequest),
- IgnoreArg()).AndReturn({})
-
- api.cinder.default_quota_get(IsA(http.HttpRequest), self.tenant.id)\
- .AndReturn(self.cinder_quotas.first())
cinder_services = self.cinder_services.list()
api.cinder.service_list(IsA(http.HttpRequest)).\
AndReturn(cinder_services)
- api.neutron.is_extension_supported(IsA(http.HttpRequest),
- 'security-group').AndReturn(True)
-
self.mox.ReplayAll()
res = self.client.get(INDEX_URL)
@@ -79,25 +71,19 @@ class SystemInfoViewTests(test.BaseAdminViewTests):
self.mox.VerifyAll()
@test.create_stubs({api.base: ('is_service_enabled',),
- api.cinder: ('default_quota_get', 'service_list'),
- api.nova: ('default_quota_get', 'service_list'),
+ api.cinder: ('service_list',),
+ api.nova: ('service_list',),
api.neutron: ('agent_list', 'is_extension_supported')})
def test_cinder_services_index(self):
cinder_services = self.cinder_services.list()
api.nova.service_list(IsA(http.HttpRequest)).AndReturn([])
- api.cinder.default_quota_get(IsA(http.HttpRequest), self.tenant.id)\
- .AndReturn(self.cinder_quotas.first())
api.cinder.service_list(IsA(http.HttpRequest)).\
AndReturn(cinder_services)
api.neutron.agent_list(IsA(http.HttpRequest)).AndReturn([])
api.base.is_service_enabled(IsA(http.HttpRequest), IgnoreArg()) \
.MultipleTimes().AndReturn(True)
- api.nova.default_quota_get(IsA(http.HttpRequest),
- IgnoreArg()).AndReturn({})
api.neutron.is_extension_supported(IsA(http.HttpRequest),
'agent').AndReturn(True)
- api.neutron.is_extension_supported(IsA(http.HttpRequest),
- 'security-group').AndReturn(True)
self.mox.ReplayAll()
res = self.client.get(INDEX_URL)
@@ -109,73 +95,3 @@ class SystemInfoViewTests(test.BaseAdminViewTests):
['cinder_services'].data,
['<Service: cinder-scheduler>',
'<Service: cinder-volume>'])
-
- def test_default_quotas_index(self):
- self._test_default_quotas_index(neutron_enabled=True)
-
- def test_default_quotas_index_with_neutron_disabled(self):
- self._test_default_quotas_index(neutron_enabled=False)
-
- def test_default_quotas_index_with_neutron_sg_disabled(self):
- self._test_default_quotas_index(neutron_enabled=True,
- neutron_sg_enabled=False)
-
- @test.create_stubs({api.base: ('is_service_enabled',),
- api.nova: ('default_quota_get', 'service_list'),
- api.cinder: ('default_quota_get', 'service_list')})
- def _test_default_quotas_index(self, neutron_enabled=True,
- neutron_sg_enabled=True):
- # Neutron does not have an API for getting default system
- # quotas. When not using Neutron, the floating ips quotas
- # should be in the list.
- api.base.is_service_enabled(IsA(http.HttpRequest), 'volume') \
- .MultipleTimes().AndReturn(True)
- api.base.is_service_enabled(IsA(http.HttpRequest), 'network') \
- .MultipleTimes().AndReturn(neutron_enabled)
-
- api.nova.service_list(IsA(http.HttpRequest)).AndReturn([])
- api.nova.default_quota_get(IsA(http.HttpRequest),
- self.tenant.id).AndReturn(self.quotas.nova)
- api.cinder.default_quota_get(IsA(http.HttpRequest), self.tenant.id)\
- .AndReturn(self.cinder_quotas.first())
- api.cinder.service_list(IsA(http.HttpRequest)).AndReturn([])
-
- if neutron_enabled:
- self.mox.StubOutWithMock(api.neutron, 'agent_list')
- self.mox.StubOutWithMock(api.neutron, 'is_extension_supported')
- api.neutron.is_extension_supported(IsA(http.HttpRequest),
- 'agent').AndReturn(True)
-
- api.neutron.agent_list(IsA(http.HttpRequest)).AndReturn([])
-
- api.neutron.is_extension_supported(IsA(http.HttpRequest),
- 'security-group').AndReturn(neutron_sg_enabled)
-
- self.mox.ReplayAll()
-
- res = self.client.get(INDEX_URL)
-
- quotas_tab = res.context['tab_group'].get_tab('quotas')
- expected_tabs = ['<Quota: (injected_file_content_bytes, 1)>',
- '<Quota: (metadata_items, 1)>',
- '<Quota: (injected_files, 1)>',
- '<Quota: (gigabytes, 1000)>',
- '<Quota: (ram, 10000)>',
- '<Quota: (instances, 10)>',
- '<Quota: (snapshots, 1)>',
- '<Quota: (volumes, 1)>',
- '<Quota: (cores, 10)>',
- '<Quota: (floating_ips, 1)>',
- '<Quota: (fixed_ips, 10)>',
- '<Quota: (security_groups, 10)>',
- '<Quota: (security_group_rules, 20)>']
- if neutron_enabled:
- expected_tabs.remove('<Quota: (floating_ips, 1)>')
- expected_tabs.remove('<Quota: (fixed_ips, 10)>')
- if neutron_sg_enabled:
- expected_tabs.remove('<Quota: (security_groups, 10)>')
- expected_tabs.remove('<Quota: (security_group_rules, 20)>')
-
- self.assertQuerysetEqual(quotas_tab._tables['quotas'].data,
- expected_tabs,
- ordered=False)
diff --git a/openstack_dashboard/dashboards/admin/instances/tables.py b/openstack_dashboard/dashboards/admin/instances/tables.py
index 5c2afa596..6e7504748 100644
--- a/openstack_dashboard/dashboards/admin/instances/tables.py
+++ b/openstack_dashboard/dashboards/admin/instances/tables.py
@@ -149,7 +149,7 @@ class AdminInstancesTable(tables.DataTable):
filters=(title, filters.replace_underscores),
verbose_name=_("Power State"))
created = tables.Column("created",
- verbose_name=_("Uptime"),
+ verbose_name=_("Time since created"),
filters=(filters.parse_isotime,
filters.timesince_sortable),
attrs={'data-type': 'timesince'})
diff --git a/openstack_dashboard/dashboards/project/instances/tables.py b/openstack_dashboard/dashboards/project/instances/tables.py
index 4395900c8..2737529e3 100644
--- a/openstack_dashboard/dashboards/project/instances/tables.py
+++ b/openstack_dashboard/dashboards/project/instances/tables.py
@@ -911,7 +911,7 @@ class InstancesTable(tables.DataTable):
verbose_name=_("Power State"),
display_choices=POWER_DISPLAY_CHOICES)
created = tables.Column("created",
- verbose_name=_("Uptime"),
+ verbose_name=_("Time since created"),
filters=(filters.parse_isotime,
filters.timesince_sortable),
attrs={'data-type': 'timesince'})
diff --git a/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py b/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py
index 893109171..9a74ee85f 100644
--- a/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py
+++ b/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py
@@ -677,6 +677,7 @@ class SetNetworkAction(workflows.Action):
for n in networks:
n.set_id_as_name_if_empty()
network_list.append((n.id, n.name))
+ sorted(network_list, key=lambda obj: obj[1])
except Exception:
exceptions.handle(request,
_('Unable to retrieve networks.'))
diff --git a/openstack_dashboard/enabled/_70_admin_default_panel.py.example b/openstack_dashboard/enabled/_70_admin_default_panel.py.example
index 23d3773ab..b38ebdaf8 100644
--- a/openstack_dashboard/enabled/_70_admin_default_panel.py.example
+++ b/openstack_dashboard/enabled/_70_admin_default_panel.py.example
@@ -1,9 +1,9 @@
# The name of the panel to be added to HORIZON_CONFIG. Required.
-PANEL = 'instances'
+PANEL = 'defaults'
# The name of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'admin'
# The name of the panel group the PANEL is associated with.
PANEL_GROUP = 'admin'
# If set, it will update the default panel of the PANEL_DASHBOARD.
-DEFAULT_PANEL = 'instances'
+DEFAULT_PANEL = 'defaults'
diff --git a/openstack_dashboard/locale/de/LC_MESSAGES/django.po b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
index 000c81fde..3915a538b 100644
--- a/openstack_dashboard/locale/de/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
@@ -7,14 +7,15 @@
# Carsten Duch <cad@teuto.net>, 2014
# Christian Berendt <berendt@b1-systems.de>, 2014
# Ettore Atalan <atalanttore@googlemail.com>, 2014
+# Matthias Runge <mrunge@redhat.com>, 2014
# Peter Singhof <peter.singhof@hp.com>, 2014
# Robert Simai, 2014
msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 13:04+0000\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -23,55 +24,55 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "Format auswählen"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon Kernelabbild"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Maschinenabbild"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdiskabbild"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - Datenträgerabbild"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU Emulator"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "Alle TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "Alle UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "Alle ICMP"
@@ -327,16 +328,26 @@ msgstr "Keine Verbindung zu Neutron."
msgid "Unable to parse IP address %s."
msgstr "IP Adresse %s kann nicht analysiert werden."
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "Der 'operation' Parameter für get_dvr_permission ist ungültig. Zulässige Werte: %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Neutron Prüfung fehlgeschlagen, die \"dvr\" Erweiterung wird nicht unterstützt"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr ""
#: api/nova.py:211
#, python-format
@@ -368,12 +379,12 @@ msgstr "Änderung der Instanz-Sicherheitsgruppe %(num_groups_to_modify)d fehlges
msgid "Failed to modify %d instance security groups"
msgstr "Verändern der %d Instanz Sicherheitsgruppen fehlgeschlagen"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "Name: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "Evakuierung von Instanzen fehlgeschlagen: %s"
@@ -482,7 +493,7 @@ msgstr "Administrator"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -990,6 +1001,230 @@ msgstr "Aggregat-Metadaten bearbeiten."
msgid "Manage Hosts Aggregate"
msgstr "Host-Aggregate verwalten"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "Voreinstellungen"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "Voreinstellungen aktualisieren"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "Anzahl Bytes der injizierte Dateien"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "Länge des injizierten Dateipfades"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Metadaten Elemente"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "VCPUs"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "Instanzen"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "Injizierte Dateien"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "Datenträger"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "Schattenkopien"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "Gesamtgröße von Datenträgern und Schattenkopien (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "Floating IPs"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "Sicherheitsgruppen"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "Sicherheitsgrupperegeln"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "Schlüsselpaare"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "Feste IPs"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS Datenträger"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "LUKS Schattenkopien"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "Gesamtgröße an LUKS Datenträgern und Schattenkopien (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Kontingentsname"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "Limit"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Kontingente"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "Standardkontingente"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "Kontingentinfo konnte nicht abgerufen werden."
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "Standardkontingentswerte können nicht abgerufen werden."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "Hier können Sie die Standard-Quotas (Maximalwerte) aktualisieren."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "Standard-Quota aktualisieren"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "Standard-Quotas aktualisiert."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "Standard-Quotas können nicht aktualisiert werden."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "Außerstande Varianten Metadata zu updaten."
@@ -1049,18 +1284,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "Varianten-Name"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "VCPUs"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1123,7 +1346,7 @@ msgstr "Auslagerungs-Platte"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1178,13 +1401,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "Der Name darf nur Buchstaben, Zahlen, Unterstriche, Punkte und Bindestriche enthalten."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "Root-Festpplatte (GB)"
@@ -1355,28 +1571,6 @@ msgstr "Speicher (benutzt)"
msgid "Storage (total)"
msgstr "Speicher (gesamt)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "Instanzen"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1562,7 +1756,7 @@ msgid "Compute Host"
msgstr "Compute Host"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "Nova Serviceliste kann nicht abgerufen werden."
@@ -1800,7 +1994,7 @@ msgstr "Deaktiviert"
msgid "Service"
msgstr "Dienst"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "Dienste"
@@ -1810,11 +2004,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "Letzte Aktualisierung"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Compute Dienste"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "Block Storage Dienste"
@@ -1828,153 +2022,22 @@ msgstr "Hoch"
msgid "Down"
msgstr "Runter"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "Netzwerk Agenten"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "Anzahl Bytes der injizierte Dateien"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "Länge des injizierten Dateipfades"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Metadaten Elemente"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "Injizierte Dateien"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "Datenträger"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "Schattenkopien"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "Gesamtgröße von Datenträgern und Schattenkopien (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "Floating IPs"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "Sicherheitsgruppen"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "Sicherheitsgrupperegeln"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "Schlüsselpaare"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "Feste IPs"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS Datenträger"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "LUKS Schattenkopien"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "Gesamtgröße an LUKS Datenträgern und Schattenkopien (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Kontingentsname"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "Limit"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Kontingente"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Cinder-Dienstliste kann nicht abgerufen werden."
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "Netzwerkagenteninfo kann nicht abgerufen werden."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "Außerstande die Netzwerk Agenten Liste abzurufen."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "Standardkontingente"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "Kontingentinfo konnte nicht abgerufen werden."
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "Versionsinformationen können nicht abgerufen werden."
@@ -2473,7 +2536,7 @@ msgstr "Segmentierungs-ID"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2502,7 +2565,7 @@ msgstr "Wähle ein Projekt"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "Externes Netzwerk"
@@ -3081,7 +3144,7 @@ msgstr "Ãœberwachung"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3207,21 +3270,28 @@ msgid "Project ID"
msgstr "Projekt-ID"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "Verteilt"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "Information über Externes Gateway"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "Angeschlossenes externes Netzwerk"
@@ -3727,8 +3797,8 @@ msgstr "Spezifikationen verwalten"
#: dashboards/admin/volumes/volume_types/tables.py:118
msgid "Delete QOS Spec"
msgid_plural "Delete QOS Specs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lösche QOS Spezifikation"
+msgstr[1] "Lösche QOS Spezifikationen"
#: dashboards/admin/volumes/volume_types/tables.py:126
msgid "Deleted QOS Spec"
@@ -4353,10 +4423,6 @@ msgstr "Unzureichende Berechtigungsebene um Projektinformationen einzusehen."
msgid "Unable to retrieve default Neutron quota values."
msgstr "Neutron Standard-Kontingente können nicht abgerufen werden."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "Standardkontingentswerte können nicht abgerufen werden."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4745,7 +4811,7 @@ msgstr "Zugriff & Sicherheit"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "Sicherheitsgruppen können nicht abgerufen werden."
@@ -4755,7 +4821,7 @@ msgstr "Liste der Schlüsselpaare kann nicht abgerufen werden."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "Floating IP Nummern können nicht abgerufen werden."
@@ -5018,7 +5084,7 @@ msgstr "Die Textfolge darf nur ASCII Zeichen einschließlich Zahlen enthalten."
#: dashboards/project/access_and_security/security_groups/forms.py:52
#, python-format
msgid "Successfully created security group: %s"
-msgstr "SIcherheitsgruppe %s erfolgreich erstellt."
+msgstr "Sicherheitsgruppe %s erfolgreich erstellt."
#: dashboards/project/access_and_security/security_groups/forms.py:58
msgid "Unable to create security group."
@@ -5570,8 +5636,8 @@ msgstr "Container wurde erfolgreich als privat markiert."
#: dashboards/project/containers/tables.py:110
msgid "Delete Container"
msgid_plural "Delete Containers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lösche Container"
+msgstr[1] "Lösche Container"
#: dashboards/project/containers/tables.py:118
msgid "Deleted Container"
@@ -8153,8 +8219,8 @@ msgstr[1] ""
#: dashboards/project/firewalls/tables.py:103
msgid "Delete Firewall"
msgid_plural "Delete Firewalls"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lösche Firewall"
+msgstr[1] "Lösche Firewalls"
#: dashboards/project/firewalls/tables.py:111
msgid "Scheduled deletion of Firewall"
@@ -9789,7 +9855,7 @@ msgstr "Irgendeine Verfügbarkeitszone"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "Kontingent Informationen können nicht abgerufen werden."
@@ -11275,39 +11341,48 @@ msgid "Router Name"
msgstr "Routername"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "Routertyp"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "Serverstandard verwenden"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "Zentralisiert"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "Router %s wurde erfolgreich angelegt."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "Kontingent für die Ressource Router überschritten."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "Router \"%s\" konnte nicht angelegt werden."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "Router %s wurde erfolgreich aktualisiert."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "Aktualisierung des Routers %s fehlgeschlagen"
@@ -11355,8 +11430,13 @@ msgstr[1] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "Der Gateway für den Router kann nicht identifiziert werden \"%(name)s\": \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "Router-Details können nicht abgerufen werden."
@@ -12566,8 +12646,8 @@ msgstr "Starten als Instanz"
#: dashboards/project/volumes/volumes/tables.py:67
msgid "Delete Volume"
msgid_plural "Delete Volumes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lösche Datenträger"
+msgstr[1] "Lösche Datenträger"
#: dashboards/project/volumes/volumes/tables.py:75
msgid "Scheduled deletion of Volume"
@@ -13427,8 +13507,8 @@ msgstr "Netzwerkprofil erstellen."
#: dashboards/router/nexus1000v/tables.py:42
msgid "Delete Network Profile"
msgid_plural "Delete Network Profiles"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lösche Netzwerkprofil"
+msgstr[1] "Lösche Netzwerkprofile"
#: dashboards/router/nexus1000v/tables.py:50
msgid "Deleted Network Profile"
@@ -13645,28 +13725,28 @@ msgstr "Regionen:"
msgid "Invalid date format: Using today as default."
msgstr "Ungültiges Datumsformat: verwende Heute als Voreinstellung."
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "Netzwerk Kontingent Informationen können nicht abgerufen werden."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "Datenträgerbegrenzungsinformationen können nicht abgerufen werden."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "Limit-Informationen können nicht abgerufen werden."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "Auslastungsinformationen können nicht abgerufen werden."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "Ungültiger Zeitbereich. Das Enddatum sollte nach dem Startdatum liegen."
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/en/LC_MESSAGES/django.po b/openstack_dashboard/locale/en/LC_MESSAGES/django.po
index 44b01cdfb..791130db0 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: 2014-09-30 01:42-0500\n"
+"POT-Creation-Date: 2014-10-02 01:03-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"
@@ -17,55 +17,55 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr ""
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr ""
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr ""
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr ""
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr ""
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr ""
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr ""
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr ""
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr ""
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr ""
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr ""
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr ""
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr ""
@@ -321,15 +321,25 @@ msgstr ""
msgid "Unable to parse IP address %s."
msgstr ""
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
msgstr ""
#: api/nova.py:211
@@ -362,12 +372,12 @@ msgstr ""
msgid "Failed to modify %d instance security groups"
msgstr ""
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr ""
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr ""
@@ -476,7 +486,7 @@ msgstr ""
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -984,6 +994,230 @@ msgstr ""
msgid "Manage Hosts Aggregate"
msgstr ""
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr ""
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr ""
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr ""
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr ""
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr ""
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr ""
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr ""
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr ""
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr ""
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr ""
@@ -1043,18 +1277,6 @@ msgstr ""
msgid "Flavor Name"
msgstr ""
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr ""
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1117,7 +1339,7 @@ msgstr ""
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1172,13 +1394,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr ""
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr ""
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr ""
@@ -1348,28 +1563,6 @@ msgstr ""
msgid "Storage (total)"
msgstr ""
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr ""
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1555,7 +1748,7 @@ msgid "Compute Host"
msgstr ""
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr ""
@@ -1793,7 +1986,7 @@ msgstr ""
msgid "Service"
msgstr ""
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr ""
@@ -1803,11 +1996,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr ""
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr ""
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr ""
@@ -1821,153 +2014,22 @@ msgstr ""
msgid "Down"
msgstr ""
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr ""
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr ""
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr ""
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr ""
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr ""
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr ""
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr ""
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr ""
@@ -2466,7 +2528,7 @@ msgstr ""
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2495,7 +2557,7 @@ msgstr ""
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr ""
@@ -3074,7 +3136,7 @@ msgstr ""
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3200,21 +3262,28 @@ msgid "Project ID"
msgstr ""
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr ""
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr ""
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr ""
@@ -4362,10 +4431,6 @@ msgstr ""
msgid "Unable to retrieve default Neutron quota values."
msgstr ""
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr ""
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4754,7 +4819,7 @@ msgstr ""
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr ""
@@ -4764,7 +4829,7 @@ msgstr ""
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr ""
@@ -9807,7 +9872,7 @@ msgstr ""
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr ""
@@ -11301,39 +11366,48 @@ msgid "Router Name"
msgstr ""
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr ""
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr ""
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr ""
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr ""
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr ""
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr ""
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr ""
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr ""
@@ -11381,8 +11455,13 @@ msgstr[1] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr ""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr ""
@@ -13680,28 +13759,28 @@ msgstr ""
msgid "Invalid date format: Using today as default."
msgstr ""
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr ""
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr ""
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr ""
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr ""
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr ""
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
index af65fac40..398a4a33c 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: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 13:04+0000\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -18,55 +18,55 @@ msgstr ""
"Language: en_AU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "Select format"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon Kernel Image"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Machine Image"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk Image"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - Optical Disk Image"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU Emulator"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "All TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "All UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "All ICMP"
@@ -322,16 +322,26 @@ msgstr "Unable to connect to Neutron."
msgid "Unable to parse IP address %s."
msgstr "Unable to parse IP address %s."
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "The 'operation' parameter for get_dvr_permission is invalid. It should be one of %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Failed to check Neutron \"dvr\" extension is not supported"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr ""
#: api/nova.py:211
#, python-format
@@ -363,12 +373,12 @@ msgstr "Failed to modify %(num_groups_to_modify)d instance security groups: %(er
msgid "Failed to modify %d instance security groups"
msgstr "Failed to modify %d instance security groups"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "Name: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "Failed to evacuate instances: %s"
@@ -477,7 +487,7 @@ msgstr "Admin"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -985,6 +995,230 @@ msgstr "Update Aggregate Metadata"
msgid "Manage Hosts Aggregate"
msgstr "Manage Hosts Aggregate"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "Defaults"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "Update Defaults"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "Injected File Content Bytes"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "Length of Injected File Path"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Metadata Items"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "VCPUs"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "Instances"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "Injected Files"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "Volumes"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "Volume Snapshots"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "Total Size of Volumes and Snapshots (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "Floating IPs"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "Security Groups"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "Security Group Rules"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "Key Pairs"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "Fixed IPs"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS Volumes"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "LUKS Volume Snapshots"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "Total Size of LUKS Volumes and Snapshots (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Quota Name"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "Limit"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Quotas"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "Default Quotas"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "Unable to get quota info."
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "Unable to retrieve default quota values."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "From here you can update the default quotas (max limits)."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "Update Default Quotas"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "Default quotas updated."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "Unable to update default quotas."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "Unable to update the flavour metadata."
@@ -1044,18 +1278,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "Flavor Name"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "VCPUs"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1118,7 +1340,7 @@ msgstr "Swap Disk"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1173,13 +1395,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "Name may only contain letters, numbers, underscores, full stops and hyphens."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr ""
@@ -1350,28 +1565,6 @@ msgstr "Storage (used)"
msgid "Storage (total)"
msgstr "Storage (total)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "Instances"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1557,7 +1750,7 @@ msgid "Compute Host"
msgstr "Compute Host"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "Unable to get nova services list."
@@ -1795,7 +1988,7 @@ msgstr "Disabled"
msgid "Service"
msgstr "Service"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "Services"
@@ -1805,11 +1998,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "Last Updated"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Compute Services"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "Block Storage Services"
@@ -1823,153 +2016,22 @@ msgstr "Up"
msgid "Down"
msgstr "Down"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "Network Agents"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "Injected File Content Bytes"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "Length of Injected File Path"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Metadata Items"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "Injected Files"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "Volumes"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "Volume Snapshots"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "Total Size of Volumes and Snapshots (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "Floating IPs"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "Security Groups"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "Security Group Rules"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "Key Pairs"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "Fixed IPs"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS Volumes"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "LUKS Volume Snapshots"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "Total Size of LUKS Volumes and Snapshots (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Quota Name"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "Limit"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Quotas"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Unable to get cinder services list."
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "Unable to get network agents info."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "Unable to get network agents list."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "Default Quotas"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "Unable to get quota info."
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "Unable to retrieve version information."
@@ -2468,7 +2530,7 @@ msgstr "Segmentation ID"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2497,7 +2559,7 @@ msgstr "Shared"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "External Network"
@@ -3076,7 +3138,7 @@ msgstr "Monitoring"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3202,21 +3264,28 @@ msgid "Project ID"
msgstr "Project ID"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "Distributed"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "External Gateway Information"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "Connected External Network"
@@ -4348,10 +4417,6 @@ msgstr "Insufficient privilege level to view project information."
msgid "Unable to retrieve default Neutron quota values."
msgstr "Unable to retrieve default Neutron quota values."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "Unable to retrieve default quota values."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4740,7 +4805,7 @@ msgstr "Access & Security"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "Unable to retrieve security groups."
@@ -4750,7 +4815,7 @@ msgstr "Unable to retrieve key pair list."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "Unable to retrieve floating IP addresses."
@@ -9784,7 +9849,7 @@ msgstr "Any Availability Zone"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "Unable to retrieve quota information."
@@ -11270,39 +11335,48 @@ msgid "Router Name"
msgstr "Router Name"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "Router Type"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "Use Server Default"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "Centralised"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "Router %s was successfully created."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "Quota exceeded for resource router."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "Failed to create router \"%s\"."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "Router %s was successfully updated."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "Failed to update router %s"
@@ -11350,8 +11424,13 @@ msgstr[1] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "Unable to retrieve router details."
@@ -13640,28 +13719,28 @@ msgstr "Regions:"
msgid "Invalid date format: Using today as default."
msgstr "Invalid date format: Using today as default."
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "Unable to retrieve network quota information."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "Unable to retrieve volume limit information."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "Unable to retrieve limit information."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "Unable to retrieve usage information."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "Invalid time period. The end date should be more recent than the start date."
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
index e1409eefb..e5fe24e07 100644
--- a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 13:04+0000\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -19,55 +19,55 @@ msgstr ""
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "Select format"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon Kernel Image"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Machine Image"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk Image"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - Optical Disk Image"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU Emulator"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "All TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "All UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "All ICMP"
@@ -323,16 +323,26 @@ msgstr "Unable to connect to Neutron."
msgid "Unable to parse IP address %s."
msgstr "Unable to parse IP address %s."
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "The 'operation' parameter for get_dvr_permission is invalid. It should be one of %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Failed to check Neutron \"dvr\" extension is not supported"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr ""
#: api/nova.py:211
#, python-format
@@ -364,12 +374,12 @@ msgstr "Failed to modify %(num_groups_to_modify)d instance security groups: %(er
msgid "Failed to modify %d instance security groups"
msgstr "Failed to modify %d instance security groups"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "Name: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "Failed to evacuate instances: %s"
@@ -478,7 +488,7 @@ msgstr "Admin"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -986,6 +996,230 @@ msgstr "Update Aggregate Metadata"
msgid "Manage Hosts Aggregate"
msgstr "Manage Hosts Aggregate"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "Defaults"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "Update Defaults"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "Injected File Content Bytes"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "Length of Injected File Path"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Metadata Items"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "VCPUs"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "Instances"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "Injected Files"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "Volumes"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "Volume Snapshots"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "Total Size of Volumes and Snapshots (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "Floating IPs"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "Security Groups"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "Security Group Rules"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "Key Pairs"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "Fixed IPs"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS Volumes"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "LUKS Volume Snapshots"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "Total Size of LUKS Volumes and Snapshots (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Quota Name"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "Limit"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Quotas"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "Default Quotas"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "Unable to get quota info."
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "Unable to retrieve default quota values."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "From here you can update the default quotas (max limits)."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "Update Default Quotas"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "Default quotas updated."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "Unable to update default quotas."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "Unable to update the flavor metadata."
@@ -1045,18 +1279,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "Flavour Name"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "VCPUs"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1119,7 +1341,7 @@ msgstr "Swap Disk"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1174,13 +1396,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "Name may only contain letters, numbers, underscores, full stops and hyphens."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr ""
@@ -1351,28 +1566,6 @@ msgstr "Storage (used)"
msgid "Storage (total)"
msgstr "Storage (total)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "Instances"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1558,7 +1751,7 @@ msgid "Compute Host"
msgstr "Compute Host"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "Unable to get nova services list."
@@ -1796,7 +1989,7 @@ msgstr "Disabled"
msgid "Service"
msgstr "Service"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "Services"
@@ -1806,11 +1999,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "Last Updated"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Compute Services"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "Block Storage Services"
@@ -1824,153 +2017,22 @@ msgstr "Up"
msgid "Down"
msgstr "Down"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "Network Agents"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "Injected File Content Bytes"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "Length of Injected File Path"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Metadata Items"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "Injected Files"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "Volumes"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "Volume Snapshots"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "Total Size of Volumes and Snapshots (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "Floating IPs"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "Security Groups"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "Security Group Rules"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "Key Pairs"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "Fixed IPs"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS Volumes"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "LUKS Volume Snapshots"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "Total Size of LUKS Volumes and Snapshots (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Quota Name"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "Limit"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Quotas"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Unable to get cinder services list."
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "Unable to get network agents info."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "Unable to get network agents list."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "Default Quotas"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "Unable to get quota info."
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "Unable to retrieve version information."
@@ -2469,7 +2531,7 @@ msgstr "Segmentation ID"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2498,7 +2560,7 @@ msgstr "Shared"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "External Network"
@@ -3077,7 +3139,7 @@ msgstr "Monitoring"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3203,21 +3265,28 @@ msgid "Project ID"
msgstr "Project ID"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "Distributed"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "External Gateway Information"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "Connected External Network"
@@ -4349,10 +4418,6 @@ msgstr "Insufficient privilege level to view project information."
msgid "Unable to retrieve default Neutron quota values."
msgstr "Unable to retrieve default Neutron quota values."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "Unable to retrieve default quota values."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4741,7 +4806,7 @@ msgstr "Access & Security"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "Unable to retrieve security groups."
@@ -4751,7 +4816,7 @@ msgstr "Unable to retrieve key pair list."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "Unable to retrieve floating IP addresses."
@@ -9785,7 +9850,7 @@ msgstr "Any Availability Zone"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "Unable to retrieve quota information."
@@ -11271,39 +11336,48 @@ msgid "Router Name"
msgstr "Router Name"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "Router Type"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "Use Server Default"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "Centralized"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "Router %s was successfully created."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "Quota exceeded for resource router."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "Failed to create router \"%s\"."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "Router %s was successfully updated."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "Failed to update router %s"
@@ -11351,8 +11425,13 @@ msgstr[1] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "Unable to retrieve router details."
@@ -13641,28 +13720,28 @@ msgstr "Regions:"
msgid "Invalid date format: Using today as default."
msgstr "Invalid date format: Using today as default."
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "Unable to retrieve network quota information."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "Unable to retrieve volume limit information."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "Unable to retrieve limit information."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "Unable to retrieve usage information."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "Invalid time period. The end date should be more recent than the start date."
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/es/LC_MESSAGES/django.po b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
index 1f0425e5c..b55d54548 100644
--- a/openstack_dashboard/locale/es/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
@@ -15,8 +15,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 13:04+0000\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -25,55 +25,55 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "Seleccionar formato"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon Kernel Image"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Machine Image"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk Image"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - Imagen de disco óptico"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - Emulador QEMU"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Fila"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "Todos los TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "Todos los UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "Todos los ICMP"
@@ -329,16 +329,26 @@ msgstr "No ha sido posible conectar con Neutron."
msgid "Unable to parse IP address %s."
msgstr "No ha sido posible analizar dirección IP %s."
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "El parametro 'operation' para get_dvr_permission es invalido. Debería ser uno de %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Fallo al verificar la extension \"dvr\" de Neutron, no esta soportada"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr ""
#: api/nova.py:211
#, python-format
@@ -370,12 +380,12 @@ msgstr "Error al modificar %(num_groups_to_modify)d grupos de seguridad de la in
msgid "Failed to modify %d instance security groups"
msgstr "Fallo al modificar la instancia de seguridad de grupos %d"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "Nombre: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "Fallo al evacuar las instancias: %s"
@@ -484,7 +494,7 @@ msgstr "Administrador"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -561,8 +571,8 @@ msgstr[1] "Eliminar agregados de anfitrión"
#: dashboards/admin/aggregates/tables.py:37
msgid "Deleted Host Aggregate"
msgid_plural "Deleted Host Aggregates"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Agregado de host eliminado"
+msgstr[1] "Agregados de host eliminados"
#: dashboards/admin/aggregates/tables.py:48
#: dashboards/admin/aggregates/workflows.py:176
@@ -992,6 +1002,230 @@ msgstr "Actualizar los metadatos agregados"
msgid "Manage Hosts Aggregate"
msgstr "Administrar agregados de hosts"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "Predeterminados"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "Actualizar predeterminados"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "Bytes de contenido del archivo inyectado"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "Longitud de la ruta del archivo inyectada"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Ãtems de metadatos"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "VCPU"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "Instancias"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "Archivos inyectados"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "Volúmenes"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "Snapshots de volumen"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "Tamaño total de volúmenes y snapshots (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "IPs flotantes"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "Grupos de seguridad"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "Reglas del grupo de seguridad"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "Pares de claves"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "IPs fijas"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "Volúmenes LUKS"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "Snapshots de volumen LUKS"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "Tamaño total de volúmenes e instantáneas LUKS (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Nombre de la cuota"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "Límite"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Cuotas"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "Cuotas predeterminadas"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "No ha sido posible obtener la información de la cuota."
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "No ha sido posible obtener los valores predeterminados de la cuota."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "Desde aquí puede actualizar las cuotas predeterminadas (límites máximos)."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "Actualizar cuotas predeterminadas"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "Cuotas por defecto actualizadas."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "No ha sido posible actualizar las cuotas predeterminadas."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "No ha sido posible actualizar los metadatos del sabor."
@@ -1051,18 +1285,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "Nombre del sabor"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "VCPU"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1125,7 +1347,7 @@ msgstr "Disco de intercambio (swap)"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1180,13 +1402,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "El nombre sólo puede incluir letras, números, guiones, guiones bajos y puntos."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "Disco raíz (GB)"
@@ -1357,28 +1572,6 @@ msgstr "Almacenamiento (usado)"
msgid "Storage (total)"
msgstr "Almacenamiento (total)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "Instancias"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1564,7 +1757,7 @@ msgid "Compute Host"
msgstr "Anfitrión de cómputo"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "No ha sido posible obtener la lista de servicios de nova."
@@ -1802,7 +1995,7 @@ msgstr "Deshabilitado"
msgid "Service"
msgstr "Servicio"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "Servicios"
@@ -1812,11 +2005,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "Actualizada por última vez"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Servicios de computación"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "Servicios de almacenamiento de bloques"
@@ -1830,153 +2023,22 @@ msgstr "Arriba"
msgid "Down"
msgstr "Abajo"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "Agentes de red"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "Bytes de contenido del archivo inyectado"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "Longitud de la ruta del archivo inyectada"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Ãtems de metadatos"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "Archivos inyectados"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "Volúmenes"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "Snapshots de volumen"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "Tamaño total de volúmenes y snapshots (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "IPs flotantes"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "Grupos de seguridad"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "Reglas del grupo de seguridad"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "Pares de claves"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "IPs fijas"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "Volúmenes LUKS"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "Snapshots de volumen LUKS"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "Tamaño total de volúmenes e instantáneas LUKS (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Nombre de la cuota"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "Límite"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Cuotas"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "No ha sido posible obtener la lista de servicios de cinder"
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "No ha sido posible obtener información de los agentes de red."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "No ha sido posible obtener la lista de agentes de red."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "Cuotas predeterminadas"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "No ha sido posible obtener la información de la cuota."
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "No ha sido posible obtener información de la versión."
@@ -2475,7 +2537,7 @@ msgstr "ID de segmentación"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2504,7 +2566,7 @@ msgstr "Compartido"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "Red externa"
@@ -2725,8 +2787,8 @@ msgstr[1] "Eliminar agentes DHCP"
#: dashboards/admin/networks/agents/tables.py:47
msgid "Deleted DHCP Agent"
msgid_plural "Deleted DHCP Agents"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Agente DHCP eliminado"
+msgstr[1] "Agentes DHCP eliminados"
#: dashboards/admin/networks/agents/tables.py:60
#, python-format
@@ -3083,7 +3145,7 @@ msgstr "Monitorización"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3209,21 +3271,28 @@ msgid "Project ID"
msgstr "ID del proyecto"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "Distribuido.¡"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr "Modo alta disponibilidad"
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "Información de la puerta de enlace exterior"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "Red exterior conectada"
@@ -3709,14 +3778,14 @@ msgstr "Gestion de las asociaciones de especificaciones QoS"
#: dashboards/admin/volumes/volume_types/tables.py:52
msgid "Delete VolumeType"
msgid_plural "Delete VolumeTypes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Eliminar tipo de volumen"
+msgstr[1] "Eliminar tipos de volumen"
#: dashboards/admin/volumes/volume_types/tables.py:60
msgid "Deleted VolumeType"
msgid_plural "Deleted VolumeTypes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Tipo de volumen eliminado"
+msgstr[1] "Tipos de volumen eliminados"
#: dashboards/admin/volumes/volume_types/tables.py:73
msgid "Associated QOS Spec"
@@ -3729,14 +3798,14 @@ msgstr "Gestion de especificaciones"
#: dashboards/admin/volumes/volume_types/tables.py:118
msgid "Delete QOS Spec"
msgid_plural "Delete QOS Specs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Eliminar QOS Spec"
+msgstr[1] "Eliminar QOS Specs"
#: dashboards/admin/volumes/volume_types/tables.py:126
msgid "Deleted QOS Spec"
msgid_plural "Deleted QOS Specs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "QOS Specs eliminada"
+msgstr[1] "QOS Specs eliminadas"
#: dashboards/admin/volumes/volume_types/tables.py:138
msgid "Edit Consumer"
@@ -3796,14 +3865,14 @@ msgstr "No ha sido posible editar una especificaciones adicionales para el tipo
#: dashboards/admin/volumes/volume_types/extras/tables.py:27
msgid "Delete Extra Spec"
msgid_plural "Delete Extra Specs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Eliminar Spec extra"
+msgstr[1] "Eliinar Specs extra"
#: dashboards/admin/volumes/volume_types/extras/tables.py:35
msgid "Deleted Extra Spec"
msgid_plural "Deleted Extra Specs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Specs extra eliminada"
+msgstr[1] "Specs extra eliminadas"
#: dashboards/admin/volumes/volume_types/extras/tables.py:59
#: dashboards/admin/volumes/volume_types/qos_specs/tables.py:48
@@ -4355,10 +4424,6 @@ msgstr "Privilegios insuficientes para consultar la información del proyecto."
msgid "Unable to retrieve default Neutron quota values."
msgstr "No ha sido posible obtener los valores predeterminados de cuota de Neutron."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "No ha sido posible obtener los valores predeterminados de la cuota."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4747,7 +4812,7 @@ msgstr "Acceso y seguridad"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "No ha sido posible obtener los grupos de seguridad."
@@ -4757,7 +4822,7 @@ msgstr "No ha sido posible obtener la lista de pares de claves."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "No ha sido posible obtener la lista de direcciones IP flotantes."
@@ -9791,7 +9856,7 @@ msgstr "Cualquier zona de disponibilidad"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "No ha sido posible obtener información de cuotas."
@@ -11277,39 +11342,48 @@ msgid "Router Name"
msgstr "Nombre del router"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "Tipo de enrutador"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "Usar el predeterminado del servidor"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "Centralizado"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr "Habilitar modo HA"
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr "Deshabilitar modo HA"
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "Se ha creado el router %s correctamente."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "Cuota de recursos del router excedida."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "Ha ocurrido un fallo al crear el router \"%s\"."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "El enrutador %s fue actualizado correctamente."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "Fallo al actualizar el router %s"
@@ -11357,8 +11431,13 @@ msgstr[1] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "No ha sido posible borrar la puerta de enlace del router \"%(name)s\": \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr "Modo HA"
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "No ha sido posible obtener los detalles del router."
@@ -13647,28 +13726,28 @@ msgstr "Regiones:"
msgid "Invalid date format: Using today as default."
msgstr "Formato de fecha no válido: se usará la de hoy como predeterminada."
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "No ha sido posible obtener la información de la cuota de la red."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "No ha sido posible obtener la información del límite del volumen."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "No ha sido posible obtener la información del límite."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "No ha sido posible obtener la información del uso."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "Período de tiempo no válido. La fecha de finalización debe ser más reciente que la fecha de inicio."
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
index 414dc8e73..6a20bda3c 100644
--- a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
@@ -38,8 +38,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 13:04+0000\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -48,55 +48,55 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "Sélectionner un format"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon Kernel Image"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Machine Image"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk Image"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - ISO 9660"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - Emulateur QEMU"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "Tout TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "Tout UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "All ICMP"
@@ -352,16 +352,26 @@ msgstr "Impossible de se connecter à Neutron"
msgid "Unable to parse IP address %s."
msgstr "Impossible d'analyser l'adresse IP %s"
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
+#, python-format
+msgid ""
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr ""
+
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "Le paramètre 'opération' pour get_dvr_permission est invalide. Il devrait être un des %s"
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Échec dans la vérification que l'extension Neutron \"dvr\" n'est pas supportée. "
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr ""
#: api/nova.py:211
#, python-format
@@ -393,12 +403,12 @@ msgstr "Echec de modification de %(num_groups_to_modify)d groupes de sécurité
msgid "Failed to modify %d instance security groups"
msgstr "Echec de modification de %d groupes de sécurité de l'instance"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "Nom : %(name)s ID : %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "L'évacuation des instances: %s a échoué"
@@ -507,7 +517,7 @@ msgstr "Admin"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -1015,6 +1025,230 @@ msgstr "Mise à jour des Métadonnées Globales"
msgid "Manage Hosts Aggregate"
msgstr "Gestion de l'agrégat d'hôtes"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "Valeurs par défaut"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "Mettre à jour les Valeurs par Défaut"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "Taille en octets des Fichiers Injectés "
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "Longueur de chemin de fichier injecté"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Eléments des métadonnées"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "VCPUs"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "Instances"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "Fichiers Injectés"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "Volumes"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "Instantanés de volumes"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "Taille totale des volumes et des instantanés (Go)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (Mo)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "IP flottantes"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "Groupes de sécurité"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "Règles de groupe de sécurité"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "Paires de clés"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "IP fixes"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS Volumes"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "Instantanés de volumes LUKS "
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "Taille totale des volumes et clichés instantanés LUKS (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Nom du quota"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "Limite"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Quotas"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "Quotas par défaut"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "Impossible d'obtenir les informations de quota."
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "Impossible de récupérer les valeurs par défaut des quotas."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "Ici, vous pouvez mettre à jour les quotas par défaut (limites maximales)."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "Mettre à jour les Quotas par Défaut"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "Les quotas par défaut ont été mis à jour."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "Impossible de mettre à jour les quotas par défaut."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "Incapable de mettre à jour les métadonnées des types d'instances."
@@ -1074,18 +1308,6 @@ msgstr "%sGo"
msgid "Flavor Name"
msgstr "Nom du gabarit"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "VCPUs"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1148,7 +1370,7 @@ msgstr "Disque d'échange"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1203,13 +1425,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "Le nom peut seulement contenir des lettres, chiffres, caractères de soulignement, points et traits d'union."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (Mo)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "Disque de Démarrage (Go)"
@@ -1380,28 +1595,6 @@ msgstr "Stockage (utilisé)"
msgid "Storage (total)"
msgstr "Stockage (total)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "Instances"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1587,7 +1780,7 @@ msgid "Compute Host"
msgstr "Hôte Compute"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "Impossible d'obtenir la liste des services Nova."
@@ -1825,7 +2018,7 @@ msgstr "Désactivé"
msgid "Service"
msgstr "Service"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "Services"
@@ -1835,11 +2028,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "Dernière mise à jour"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Services de Calcul"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "Service de Stockage Blocs"
@@ -1853,153 +2046,22 @@ msgstr "Haut"
msgid "Down"
msgstr "Bas"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "Agents réseau."
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "Taille en octets des Fichiers Injectés "
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "Longueur de chemin de fichier injecté"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Eléments des métadonnées"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "Fichiers Injectés"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "Volumes"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "Instantanés de volumes"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "Taille totale des volumes et des instantanés (Go)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "IP flottantes"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "Groupes de sécurité"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "Règles de groupe de sécurité"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "Paires de clés"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "IP fixes"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS Volumes"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "Instantanés de volumes LUKS "
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "Taille totale des volumes et clichés instantanés LUKS (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Nom du quota"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "Limite"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Quotas"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Impossible d'obtenir la liste des services Cinder."
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "Impossible d'obtenir les informations des agents réseau."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "Impossible d'obtenir la liste des agents réseau."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "Quotas par défaut"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "Impossible d'obtenir les informations de quota."
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "Impossible d'obtenir les informations de version. "
@@ -2498,7 +2560,7 @@ msgstr "ID du segment"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2527,7 +2589,7 @@ msgstr "Partagé"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "Réseau externe"
@@ -3106,7 +3168,7 @@ msgstr "Monitoring"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3232,21 +3294,28 @@ msgid "Project ID"
msgstr "ID Projet"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "Distribué"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "Informations de la passerelle externe"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "Réseau externe connecté"
@@ -4378,10 +4447,6 @@ msgstr "Niveau de privilèges insuffisant pour voir les informations du projet."
msgid "Unable to retrieve default Neutron quota values."
msgstr "Impossible de récupérer les valeurs par défaut des quotas Neutron."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "Impossible de récupérer les valeurs par défaut des quotas."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4770,7 +4835,7 @@ msgstr "Accès et Sécurité"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "Impossible de récupérer les groupes de sécurité."
@@ -4780,7 +4845,7 @@ msgstr "Impossible de récupérer la liste des paires de clés."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "Impossible de récupérer les adresses IP flottantes."
@@ -5595,14 +5660,14 @@ msgstr "L'accès aux conteneurs depuis le privé a été correctement mis à jou
#: dashboards/project/containers/tables.py:110
msgid "Delete Container"
msgid_plural "Delete Containers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer le Conteneur"
+msgstr[1] "Supprimer les Conteneurs"
#: dashboards/project/containers/tables.py:118
msgid "Deleted Container"
msgid_plural "Deleted Containers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Conteneur Supprimé"
+msgstr[1] "Conteneurs supprimés"
#: dashboards/project/containers/tables.py:132
msgid "Unable to delete container."
@@ -5642,14 +5707,14 @@ msgstr "Détails du Conteneur"
#: dashboards/project/containers/tables.py:333
msgid "Delete Object"
msgid_plural "Delete Objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer l'Objet"
+msgstr[1] "Supprimer les Objets"
#: dashboards/project/containers/tables.py:341
msgid "Deleted Object"
msgid_plural "Deleted Objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Objet Supprimé"
+msgstr[1] "Objets Supprimés"
#: dashboards/project/containers/tables.py:368
msgid "Copy"
@@ -5865,15 +5930,15 @@ msgstr "Copier le modèle"
#: dashboards/project/data_processing/nodegroup_templates/tables.py:56
msgid "Delete Template"
msgid_plural "Delete Templates"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer le Modèle"
+msgstr[1] "Supprimer les Modèles"
#: dashboards/project/data_processing/cluster_templates/tables.py:72
#: dashboards/project/data_processing/nodegroup_templates/tables.py:64
msgid "Deleted Template"
msgid_plural "Deleted Templates"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Modèle Supprimé"
+msgstr[1] "Modèles supprimés"
#: dashboards/project/data_processing/cluster_templates/tables.py:87
#: dashboards/project/data_processing/nodegroup_templates/tables.py:28
@@ -6160,14 +6225,14 @@ msgstr "Echelonner le Cluster"
#: dashboards/project/data_processing/clusters/tables.py:53
msgid "Delete Cluster"
msgid_plural "Delete Clusters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer le Cluster"
+msgstr[1] "Supprimer les Clusters"
#: dashboards/project/data_processing/clusters/tables.py:61
msgid "Deleted Cluster"
msgid_plural "Deleted Clusters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Cluster Supprimé"
+msgstr[1] "Clusters Supprimés"
#: dashboards/project/data_processing/clusters/tables.py:84
msgid "Unable to update row"
@@ -6386,14 +6451,14 @@ msgstr "Inscrire l'image"
#: dashboards/project/data_processing/data_image_registry/tables.py:54
msgid "Unregister Image"
msgid_plural "Unregister Images"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Désinscrire l'Image"
+msgstr[1] "Désinscrire les Images"
#: dashboards/project/data_processing/data_image_registry/tables.py:62
msgid "Unregistered Image"
msgid_plural "Unregistered Images"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Image Désinscrite"
+msgstr[1] "Images Désinscrites"
#: dashboards/project/data_processing/data_image_registry/tables.py:80
msgid "Tags"
@@ -6523,14 +6588,14 @@ msgstr "Créer une source de données"
#: dashboards/project/data_processing/data_sources/tables.py:38
msgid "Delete Data source"
msgid_plural "Delete Data sources"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer la source de Donnée"
+msgstr[1] "Supprimer les Sources de Données"
#: dashboards/project/data_processing/data_sources/tables.py:46
msgid "Deleted Data source"
msgid_plural "Deleted Data sources"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Source de Donnée Supprimée"
+msgstr[1] "Sources de Données Supprimées"
#: dashboards/project/data_processing/data_sources/tabs.py:38
msgid "Unable to retrieve data source details"
@@ -6782,8 +6847,8 @@ msgstr[1] ""
#: dashboards/project/data_processing/jobs/workflows/launch.py:415
msgid "Launch Job"
msgid_plural "Launch Jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lancer la Tâche"
+msgstr[1] "Lancer les Tâches"
#: dashboards/project/data_processing/job_executions/tables.py:66
#: dashboards/project/data_processing/job_executions/tables.py:95
@@ -6792,8 +6857,8 @@ msgstr[1] ""
#: dashboards/project/data_processing/jobs/tables.py:130
msgid "Launched Job"
msgid_plural "Launched Jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Tâche Lancée"
+msgstr[1] "Tâches Lancées"
#: dashboards/project/data_processing/job_executions/tables.py:72
msgid "Relaunch On Existing Cluster"
@@ -6889,14 +6954,14 @@ msgstr "Créer une tâche"
#: dashboards/project/data_processing/jobs/tables.py:40
msgid "Delete Job"
msgid_plural "Delete Jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer la Tâche"
+msgstr[1] "Supprimer les Tâches"
#: dashboards/project/data_processing/jobs/tables.py:48
msgid "Deleted Job"
msgid_plural "Deleted Jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Tâche Supprimée"
+msgstr[1] "Tâches Supprimées"
#: dashboards/project/data_processing/jobs/tables.py:78
msgid "Launch On Existing Cluster"
@@ -7302,11 +7367,11 @@ msgstr "Pool d'IP flottantes"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:103
msgid "Create security group for this Node Group."
-msgstr ""
+msgstr "Créer un groupe de sécurité pour ce Groupe de Nœuds."
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:111
msgid "Launch instances in these security groups."
-msgstr ""
+msgstr "Lancer ces instances dans ces groupes de sécurité."
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:116
msgid "Processes"
@@ -9608,7 +9673,7 @@ msgstr "Pas de gabarits répondant aux critères minimaux pour l'image sélectio
#: dashboards/project/instances/templates/instances/_launch_advanced_help.html:2
msgid "Specify advanced options to use when launching an instance."
-msgstr ""
+msgstr "Spécifier les options avancées à utiliser quand vous lancez une instance."
#: dashboards/project/instances/templates/instances/_launch_customize_help.html:2
msgid ""
@@ -9814,7 +9879,7 @@ msgstr "Toutes les zones de disponibilité"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "Impossible de récupérer les informations de quotas."
@@ -11300,39 +11365,48 @@ msgid "Router Name"
msgstr "Nom du routeur"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "Type de routeur"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "Utiliser la valeur par défaut du serveur"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "Centralisé"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "Le routeur %s a été créé avec succès."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "Quota dépassé pour le router de la ressource."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "Echec de la création du routeur \"%s\"."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "Le routeur %s a été mis à jour avec succès."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "Échec dans la mise à jour du routeur %s "
@@ -11380,8 +11454,13 @@ msgstr[1] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "Impossible de supprimer la passerelle pour le routeur \"%(name)s\" : \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "Impossible de récupérer les détails du routeur."
@@ -11460,14 +11539,14 @@ msgstr "Ajouter une règle de routage"
#: dashboards/project/routers/extensions/routerrules/tables.py:47
msgid "Delete Router Rule"
msgid_plural "Delete Router Rules"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer la Règle du Routeur"
+msgstr[1] "Supprimer les Règles du Routeur"
#: dashboards/project/routers/extensions/routerrules/tables.py:55
msgid "Deleted Router Rule"
msgid_plural "Deleted Router Rules"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Règle du Routeur Supprimée"
+msgstr[1] "Règles du Routeur Supprimées"
#: dashboards/project/routers/extensions/routerrules/tabs.py:59
msgid "Router Rules Grid"
@@ -13670,28 +13749,28 @@ msgstr "Régions :"
msgid "Invalid date format: Using today as default."
msgstr "Format de date invalide : date du jour utilisée par défaut."
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "Impossible de récupérer les informations de quotas réseau."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "Impossible de récupérer les informations de limite de volume."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "Impossible de récupérer les informations de limite."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "Impossible de récupérer les informations d'utilisation."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "Période invalide. La date de fin doit être plus récente que la date de début."
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
index 939d56b4b..ee34ca1be 100644
--- a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 13:31+0000\n"
-"Last-Translator: ykatabam <ykatabam@redhat.com>\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -22,55 +22,55 @@ msgstr ""
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "å½¢å¼ã‚’é¸æŠžã—ã¦ãã ã•ã„"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon カーãƒãƒ«ãƒ»ã‚¤ãƒ¡ãƒ¼ã‚¸"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon マシン・イメージ"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon ラムディスク・イメージ"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - 光学ディスク・イメージ"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU エミュレーター"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "All TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "All UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "All ICMP"
@@ -326,16 +326,26 @@ msgstr "Neutron ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。"
msgid "Unable to parse IP address %s."
msgstr "IPアドレス %s ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "get_dvr_permission ã® 'operation' パラメーターãŒç„¡åŠ¹ã§ã™ã€‚ %s ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“。"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr "è¦æ±‚ã•ã‚ŒãŸæ©Ÿèƒ½ \"'%(feature)s' ãŒä¸æ˜Žã§ã™ã€‚FEATURE_MAP ã§å®šç¾©ã•ã‚Œã¦ã„る機能åを指定ã—ã¦ãã ã•ã„。"
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Neutron ㌠\"dvr\" æ‹¡å¼µã«å¯¾å¿œã—ã¦ã„ã‚‹ã‹ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸ"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr "get_dvr_permission '%(feature)s' ã® 'operation' パラメーターãŒç„¡åŠ¹ã§ã™ã€‚ %(allowed)s ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“。"
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr "Neutron ㌠'%s' æ‹¡å¼µã«å¯¾å¿œã—ã¦ã„ã‚‹ã‹ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
#: api/nova.py:211
#, python-format
@@ -367,12 +377,12 @@ msgstr "インスタンス㮠%(num_groups_to_modify)d 個ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã
msgid "Failed to modify %d instance security groups"
msgstr "インスタンス㮠%d 個ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—ãŒæ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸ"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "åå‰: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "インスタンスã®é€€é¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
@@ -481,7 +491,7 @@ msgstr "管ç†"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -987,6 +997,230 @@ msgstr "アグリゲートã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®æ›´æ–°"
msgid "Manage Hosts Aggregate"
msgstr "ホストアグリゲートã®ç®¡ç†"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "デフォルト値"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "デフォルト値ã®å¤‰æ›´"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "injected file ã®ãƒã‚¤ãƒˆæ•°"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "injected file ã®ãƒ‘ス長"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "メタデータ項目数"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "仮想 CPU"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "インスタンス"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "injected file"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "ボリューム"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "ボリュームã®ã‚¹ãƒŠãƒƒãƒ—ショット"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "ボリュームã¨ã‚¹ãƒŠãƒƒãƒ—ショットã®åˆè¨ˆã‚µã‚¤ã‚º (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "メモリー (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "Floating IP"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "セキュリティグループ"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "セキュリティグループルール"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "キーペア"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "Fixed IP"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS ボリューム"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "LUKS ボリュームスナップショット"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "LUKS ボリュームã¨ã‚¹ãƒŠãƒƒãƒ—ショットã®åˆè¨ˆã‚µã‚¤ã‚º (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "クォータå"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "上é™å€¤"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "クォータ"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "標準ã®ã‚¯ã‚©ãƒ¼ã‚¿"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "クォータ情報をå–å¾—ã§ãã¾ã›ã‚“。"
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "クォータã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "ã“ã“ã‹ã‚‰æ¨™æº–ã®ã‚¯ã‚©ãƒ¼ã‚¿ (上é™) ã‚’æ›´æ–°ã§ãã¾ã™ã€‚"
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "標準ã®ã‚¯ã‚©ãƒ¼ã‚¿ã®æ›´æ–°"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "標準ã®ã‚¯ã‚©ãƒ¼ã‚¿ã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚"
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "クォータã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’æ›´æ–°ã§ãã¾ã›ã‚“。"
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "フレーãƒãƒ¼ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’æ›´æ–°ã§ãã¾ã›ã‚“。"
@@ -1044,18 +1278,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "フレーãƒãƒ¼å"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "仮想 CPU"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1118,7 +1340,7 @@ msgstr "スワップディスク"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1173,13 +1395,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã€æ•°å­—ã€ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ã€ãƒ”リオドã€ãƒã‚¤ãƒ•ãƒ³ã ã‘ãŒä½¿ç”¨ã§ãã¾ã™ã€‚"
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "メモリー (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "ルートディスク (GB)"
@@ -1350,28 +1565,6 @@ msgstr "ストレージ (使用中)"
msgid "Storage (total)"
msgstr "ストレージ (ç·é‡)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "インスタンス"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1555,7 +1748,7 @@ msgid "Compute Host"
msgstr "コンピュートホスト"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "nova サービスã®ä¸€è¦§ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
@@ -1793,7 +1986,7 @@ msgstr "無効"
msgid "Service"
msgstr "サービス"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "サービス"
@@ -1803,11 +1996,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "最終更新"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "コンピュートサービス"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "ブロックストレージサービス"
@@ -1821,153 +2014,22 @@ msgstr "動作中"
msgid "Down"
msgstr "åœæ­¢ä¸­"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆ"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "injected file ã®ãƒã‚¤ãƒˆæ•°"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "injected file ã®ãƒ‘ス長"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "メタデータ項目数"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "injected file"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "ボリューム"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "ボリュームã®ã‚¹ãƒŠãƒƒãƒ—ショット"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "ボリュームã¨ã‚¹ãƒŠãƒƒãƒ—ショットã®åˆè¨ˆã‚µã‚¤ã‚º (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "Floating IP"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "セキュリティグループ"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "セキュリティグループルール"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "キーペア"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "Fixed IP"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS ボリューム"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "LUKS ボリュームスナップショット"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "LUKS ボリュームã¨ã‚¹ãƒŠãƒƒãƒ—ショットã®åˆè¨ˆã‚µã‚¤ã‚º (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "クォータå"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "上é™å€¤"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "クォータ"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Cinder ã®ã‚µãƒ¼ãƒ“ス一覧をå–å¾—ã§ãã¾ã›ã‚“。"
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆæƒ…報をå–å¾—ã§ãã¾ã›ã‚“。"
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®ä¸€è¦§ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "標準ã®ã‚¯ã‚©ãƒ¼ã‚¿"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "クォータ情報をå–å¾—ã§ãã¾ã›ã‚“。"
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報をå–å¾—ã§ãã¾ã›ã‚“。"
@@ -2466,7 +2528,7 @@ msgstr "セグメント ID"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2495,7 +2557,7 @@ msgstr "共有"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "外部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
@@ -3066,7 +3128,7 @@ msgstr "監視"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3192,21 +3254,28 @@ msgid "Project ID"
msgstr "プロジェクト ID"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "分散ルータ"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr "高å¯ç”¨æ€§ï¼ˆHA)モード"
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "外部ゲートウェイã®æƒ…å ±"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "接続ã•ã‚ŒãŸå¤–部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
@@ -4332,10 +4401,6 @@ msgstr "プロジェクト情報をå‚ç…§ã™ã‚‹ã®ã«å¿…è¦ãªæ¨©é™ãŒã‚ã‚Šã¾
msgid "Unable to retrieve default Neutron quota values."
msgstr "Neutron ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¯ã‚©ãƒ¼ã‚¿å€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "クォータã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4718,7 +4783,7 @@ msgstr "アクセスã¨ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "セキュリティグループã®ä¸€è¦§ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
@@ -4728,7 +4793,7 @@ msgstr "キーペアã®ä¸€è¦§ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "Floating IP アドレスをå–å¾—ã§ãã¾ã›ã‚“。"
@@ -9710,7 +9775,7 @@ msgstr "ã™ã¹ã¦ã®ã‚¢ãƒ™ã‚¤ãƒ©ãƒ“リティゾーン"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "クォータ情報をå–å¾—ã§ãã¾ã›ã‚“。"
@@ -11196,39 +11261,48 @@ msgid "Router Name"
msgstr "ルーターå"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "ルーター種別"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "デフォルト設定を使用"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "集中ルータ"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr "HA モード有効"
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr "HA モード無効"
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "ルーター %s ãŒæ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "ルーターã®ã‚¯ã‚©ãƒ¼ã‚¿ã‚’超éŽã—ã¾ã—ãŸã€‚"
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "ルーター \"%s\" を作æˆã§ãã¾ã›ã‚“。"
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "ルーター %s ãŒæ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "ルーター %s ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -11260,20 +11334,25 @@ msgstr "ゲートウェイã®è¨­å®š"
#: dashboards/project/routers/tables.py:108
msgid "Clear Gateway"
msgid_plural "Clear Gateways"
-msgstr[0] "ゲートウェイã®è§£é™¤"
+msgstr[0] "ゲートウェイã®å‰Šé™¤"
#: dashboards/project/routers/tables.py:116
msgid "Cleared Gateway"
msgid_plural "Cleared Gateways"
-msgstr[0] "ゲートウェイを解除ã—ã¾ã—ãŸ"
+msgstr[0] "ゲートウェイを削除ã—ã¾ã—ãŸ"
#: dashboards/project/routers/tables.py:132
#, python-format
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "ルーター \"%(name)s\" ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚’削除ã§ãã¾ã›ã‚“: \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr "HA モード"
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "ルーターã®è©³ç´°ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
@@ -13550,28 +13629,28 @@ msgstr "リージョン:"
msgid "Invalid date format: Using today as default."
msgstr "ä¸æ­£ãªæ—¥ä»˜ã®å½¢å¼ã§ã™ã€‚デフォルト値ã¨ã—ã¦ä»Šæ—¥ã®æ—¥ä»˜ã‚’使用ã—ã¾ã™ã€‚"
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚¯ã‚©ãƒ¼ã‚¿æƒ…報をå–å¾—ã§ãã¾ã›ã‚“。"
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "ボリュームã®ãƒªã‚½ãƒ¼ã‚¹ä¸Šé™æƒ…報をå–å¾—ã§ãã¾ã›ã‚“。"
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "リソース上é™æƒ…報をå–å¾—ã§ãã¾ã›ã‚“。"
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "使用状æ³ã‚’å–å¾—ã§ãã¾ã›ã‚“。"
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "指定ã•ã‚ŒãŸæœŸé–“ãŒä¸æ­£ã§ã™ã€‚終了日ã¯é–‹å§‹æ—¥ã‚ˆã‚Šå¾Œã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
index a8e463b30..7297f58c4 100644
--- a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 14:51+0000\n"
-"Last-Translator: Sungjin Kang <potopro@gmail.com>\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -21,55 +21,55 @@ msgstr ""
"Language: ko_KR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "í¬ë§· ì„ íƒ"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon Kernel Image"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Machine Image"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk Image"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - Optical Disk Image"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU Emulator"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "모든 TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "모든 UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "모든 ICMP"
@@ -325,16 +325,26 @@ msgstr "Neutronì— ì ‘ì†í•  수 없습니다."
msgid "Unable to parse IP address %s."
msgstr "IP 주소 %s를 구문 분ì„í•  수 없습니다."
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "get_dvr_permissionì˜ 'operation' 매개 변수가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. %s 중 하나여야 합니다."
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Neutron \"dvr\" 실패를 확ì¸í•˜ëŠ” í™•ìž¥ê¸°ëŠ¥ì€ ì§€ì›í•˜ì§€ 않습니다."
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr ""
#: api/nova.py:211
#, python-format
@@ -366,12 +376,12 @@ msgstr "%(num_groups_to_modify)d ì¸ìŠ¤í„´ìŠ¤ ì‹œí리티 그룹 ìˆ˜ì •ì— ì‹¤í
msgid "Failed to modify %d instance security groups"
msgstr "%d ì¸ìŠ¤í„´ìŠ¤ ì‹œí리티 ê·¸ë£¹ì„ ìˆ˜ì •í•˜ì§€ 못하였습니다."
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "ì´ë¦„: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "ì¸ìŠ¤í„´ìŠ¤ë¥¼ ì² ìˆ˜í•˜ëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤: %s"
@@ -480,7 +490,7 @@ msgstr "관리ìž"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -986,6 +996,230 @@ msgstr "집계 메타ë°ì´íƒ€ ì—…ë°ì´íŠ¸"
msgid "Manage Hosts Aggregate"
msgstr "호스트 합계 관리"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "기본"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "ì—…ë°ì´íŠ¸ 기본"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "첨부한 íŒŒì¼ ì½˜í…츠 ë°”ì´íŠ¸"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "첨부한 íŒŒì¼ ìœ„ì¹˜ì— ëŒ€í•œ 길ì´"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Metadata 항목"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "VCPUs"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "ì¸ìŠ¤í„´ìŠ¤"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "첨부한 파ì¼"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "볼륨"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "볼륨 스냅샷"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "볼륨 ë° ìŠ¤ëƒ…ìƒ· ì´ëŸ‰ (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "ìœ ë™ IP"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "ì‹œí리티 그룹"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "ì‹œí리티 그룹 룰"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "키 패어"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "ê³ ì • IP"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS 볼륨"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "LUKS 볼륨 스냅샷"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "LUKS 볼륨 ë° ìŠ¤ëƒ…ìƒ· ì´ëŸ‰ (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Quota ì´ë¦„"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "제한"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Quotas"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "기본 Quotas"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "Quota 정보를 가져올 수 없습니다."
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "기본 quota ê°’ì„ ì°¾ì§€ 못했습니다."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "여기서 기본 quota (최대 한계)를 ì—…ë°ì´íŠ¸ í•  수 있습니다."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "기본 Quotas ì—…ë°ì´íŠ¸"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "기본 quotaê°€ ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "기본 quotas를 ì—…ë°ì´íŠ¸í•  수 없습니다."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "Flavor 메타ë°ì´íƒ€ë¥¼ ì—…ë°ì´íŠ¸í•˜ì§€ 못했습니다."
@@ -1043,18 +1277,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "Flavor ì´ë¦„"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "VCPUs"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1117,7 +1339,7 @@ msgstr "Swap 디스í¬"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1172,13 +1394,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "ì´ë¦„ì€ ë¬¸ìž, 숫ìž, 밑줄, 마침표와 하ì´í”ˆë§Œ 사용할 수 있습니다."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "루트 ë””ìŠ¤í¬ (GB)"
@@ -1349,28 +1564,6 @@ msgstr "스토리지 (사용중)"
msgid "Storage (total)"
msgstr "스토리지 (전체)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "ì¸ìŠ¤í„´ìŠ¤"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1554,7 +1747,7 @@ msgid "Compute Host"
msgstr "Compute 호스트"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "Nova 서비스 목ë¡ì„ 가져올 수 없습니다"
@@ -1792,7 +1985,7 @@ msgstr "비활성ëœ"
msgid "Service"
msgstr "서비스"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "서비스"
@@ -1802,11 +1995,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "마지막 ì—…ë°ì´íŠ¸"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Compute 서비스"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "ë¸”ë¡ ìŠ¤í† ë¦¬ì§€ 서비스"
@@ -1820,153 +2013,22 @@ msgstr "위로"
msgid "Down"
msgstr "아래로"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "ë„¤íŠ¸ì›Œí¬ ì—ì´ì „트"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "첨부한 íŒŒì¼ ì½˜í…츠 ë°”ì´íŠ¸"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "첨부한 íŒŒì¼ ìœ„ì¹˜ì— ëŒ€í•œ 길ì´"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Metadata 항목"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "첨부한 파ì¼"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "볼륨"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "볼륨 스냅샷"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "볼륨 ë° ìŠ¤ëƒ…ìƒ· ì´ëŸ‰ (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "ìœ ë™ IP"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "ì‹œí리티 그룹"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "ì‹œí리티 그룹 룰"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "키 패어"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "ê³ ì • IP"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS 볼륨"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "LUKS 볼륨 스냅샷"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "LUKS 볼륨 ë° ìŠ¤ëƒ…ìƒ· ì´ëŸ‰ (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Quota ì´ë¦„"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "제한"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Quotas"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Cinder 서비스 목ë¡ì„ 가져올 수 없습니다."
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "ë„¤íŠ¸ì›Œí¬ ì—ì´ì „트 정보를 가져올 수 없습니다."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "ë„¤íŠ¸ì›Œí¬ ì—ì´ì „트 목ë¡ì„ 불러올 수 없습니다."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "기본 Quotas"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "Quota 정보를 가져올 수 없습니다."
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "버전 정보를 찾지 못했습니다."
@@ -2465,7 +2527,7 @@ msgstr "구분 ID"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2494,7 +2556,7 @@ msgstr "공유"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "외부 네트워í¬"
@@ -3065,7 +3127,7 @@ msgstr "모니터ë§"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3191,21 +3253,28 @@ msgid "Project ID"
msgstr "프로ì íŠ¸ ID"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "분산"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "외부 게ì´íŠ¸ì›¨ì´ ì •ë³´"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "외부 ë„¤íŠ¸ì›Œí¬ ì—°ê²°í•©ë‹ˆë‹¤."
@@ -4331,10 +4400,6 @@ msgstr "불충분한 권한 수준으로 프로ì íŠ¸ 정보를 ë³¼ 수 있습ë‹
msgid "Unable to retrieve default Neutron quota values."
msgstr "기본 Neutron quota ê°’ì„ ì°¾ì§€ 못했습니다."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "기본 quota ê°’ì„ ì°¾ì§€ 못했습니다."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4717,7 +4782,7 @@ msgstr "ì ‘ê·¼ & ì‹œí리티"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "ì‹œí리티 ê·¸ë£¹ì„ ì°¾ì§€ 못했습니다."
@@ -4727,7 +4792,7 @@ msgstr "키 패어 목ë¡ì„ 찾지 못했습니다."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "ìœ ë™ IP 주소를 찾지 못했습니다."
@@ -9709,7 +9774,7 @@ msgstr "ìž„ì˜ì˜ 가용성 ì¡´"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "Quota 정보를 찾지 못했습니다."
@@ -11195,39 +11260,48 @@ msgid "Router Name"
msgstr "ë¼ìš°í„° ì´ë¦„"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "ë¼ìš°í„° 타입"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "사용하는 서버 기본"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "중앙 집중"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "ë¼ìš°í„° %s를 성공ì ìœ¼ë¡œ ìƒì„±í•˜ì˜€ìŠµë‹ˆë‹¤."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "리소스 ë¼ìš°í„°ì— 대한 quota를 넘었습니다."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "ë¼ìš°í„° \"%s\"를 ìƒì„±í•˜ì§€ 못하였습니다."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "ë¼ìš°í„° %s를 성공ì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ 했습니다."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "ë¼ìš°í„° %s를 ì—…ë°ì´íŠ¸í•˜ì§€ 못했습니다."
@@ -11271,8 +11345,13 @@ msgstr[0] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "ë¼ìš°í„° \"%(name)s\"ì—ì„œ 게ì´íŠ¸ì›¨ì´ë¥¼ 제거하지 못하였습니다.: \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "ë¼ìš°í„° 세부 정보를 찾지 못했습니다."
@@ -13549,28 +13628,28 @@ msgstr "지역들:"
msgid "Invalid date format: Using today as default."
msgstr "유효하지 ì•Šì€ ë‚ ì§œ í¬ë§·: 오늘 날짜를 기본으로 사용"
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "ë„¤íŠ¸ì›Œí¬ quota 정보를 찾지 못했습니다."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "볼륨 최대 사용량 정보를 찾지 못했습니다."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "최대 사용량 정보를 찾지 못했습니다."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "사용한 정보를 찾지 못했습니다."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "유효하지 ì•Šì€ ì‹œê°„ 주기. 최종 날짜는 반드시 시작 날짜 ì´í›„여야 합니다. "
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po b/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
index b0d147ef6..5995ee771 100644
--- a/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 14:20+0000\n"
-"Last-Translator: Åukasz JernaÅ› <deejay1@srem.org>\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,55 +20,55 @@ msgstr ""
"Language: pl_PL\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "Wybierz format"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon Kernel Image"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Machine Image"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk Image"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - Optical Disk Image"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU Emulator"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Nieprzetworzone"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "Wszystkie TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "Wszystkie UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "Wszystkie ICMP"
@@ -324,16 +324,26 @@ msgstr "Nie można połączyć z Neutron."
msgid "Unable to parse IP address %s."
msgstr "Nie można przetworzyć adresu IP %s."
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "Niepoprawny parametr „operationâ€dla get_dvr_permission. Powinien być jednym z %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr "Żądana cecha „%(feature)s†nie jest znana. Należy upewnić się, że podano cechę zdefiniowaną w FEATURE_MAP."
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr ""
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr "Parametr „operation†dla get_feature_permission „%(feature)s†jest nieprawidłowy. Powinien być jednym z %(allowed)s"
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr "Nie można sprawdzić Neutron, rozszerzenie „%s†jest niewspierane"
#: api/nova.py:211
#, python-format
@@ -365,12 +375,12 @@ msgstr "Nie można zmodyfikować %(num_groups_to_modify)d grup zabezpieczeń in
msgid "Failed to modify %d instance security groups"
msgstr "Nie można zmodyfikować %d grup zabezpieczeń instancji."
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "Nazwa: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "Nie można ewakuować instancji: %s"
@@ -479,7 +489,7 @@ msgstr "Administracja"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -524,7 +534,7 @@ msgstr "Strefa dostępności"
#: dashboards/admin/aggregates/forms.py:45
#, python-format
msgid "Successfully updated aggregate: \"%s.\""
-msgstr "Zaktualizowano agregat: „%s"
+msgstr "Zaktualizowano agregat: „%sâ€."
#: dashboards/admin/aggregates/forms.py:50
#: dashboards/admin/aggregates/workflows.py:211
@@ -697,7 +707,7 @@ msgstr "Nie wybrano hosta."
msgid ""
"Add hosts to this aggregate or remove hosts from it. Hosts can be in "
"multiple aggregates."
-msgstr ""
+msgstr "Dodawanie lub usuwanie hostów z tego agregatu. Hosty mogą znajdować się w wielu agregatach."
#: dashboards/admin/aggregates/workflows.py:159
msgid "All Available Hosts"
@@ -882,7 +892,7 @@ msgstr "Opis"
msgid ""
"Host aggregates divide an availability zone into logical units by grouping "
"together hosts. Edit the aggregate host to select hosts contained in it."
-msgstr ""
+msgstr "Agregaty hostów dzielą strefę dostępności w logiczne jednostki poprzez grupowanie hostów ze sobą. Należy edytować agregat hostów, by wybrać zawarte w nim hosty."
#: dashboards/admin/aggregates/templates/aggregates/_update.html:25
#: dashboards/admin/hypervisors/templates/hypervisors/compute/_evacuate_host.html:24
@@ -982,16 +992,240 @@ msgstr "Anuluj"
#: dashboards/admin/aggregates/templates/aggregates/update_metadata.html:3
#: dashboards/admin/aggregates/templates/aggregates/update_metadata.html:6
msgid "Update Aggregate Metadata"
-msgstr ""
+msgstr "Aktualizuj metadane agregatu"
#: dashboards/admin/aggregates/templates/aggregates/manage_hosts.html:3
#: dashboards/admin/aggregates/templates/aggregates/manage_hosts.html:6
msgid "Manage Hosts Aggregate"
msgstr "Zarządzaj agregatem hostów"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "Wartości domyślne"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "Zaktualizuj wartości domyślne"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "Wielkość w bajtach wstrzykniętej zawartości"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "Długość wstrzykiwanej ścieżki plików"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Pozycje metadanych"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "VCPU"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "Instancje"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "Wstrzyknięte pliki"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "Wolumeny"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "Migawki wolumenu"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "Całkowity rozmiar wolumenów i migawek (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "PÅ‚ywajÄ…ce adresy IP"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "Grupy zabezpieczeń"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "Reguły grup zabezpieczeń"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "Pary kluczy"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "Stałe adresy IP"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "Wolumeny LUKS"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "Migawki wolumenów LUKS"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "Całkowity rozmiar wolumenów i migawek LUKS (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Nazwa limitu"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "Limit"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Limity"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "Domyślne limity"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "Nie można pobrać informacji o limitach."
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "Nie można pobrać domyślnych wartości limitów."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "Pozwala na aktualizację domyślnych limitów."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "Aktualizacja domyślnych limitów"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr ""
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "Nie można zaktualizować domyślnych limitów."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
-msgstr ""
+msgstr "Nie można zaktualizować metadanych odmiany."
#: dashboards/admin/flavors/panel.py:27 dashboards/admin/flavors/tables.py:149
#: dashboards/admin/flavors/templates/flavors/index.html:3
@@ -1050,18 +1284,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "Nazwa odmiany"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "VCPU"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1124,7 +1346,7 @@ msgstr "Dysk swap"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1179,13 +1401,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "Nazwa może zawierać wyłącznie litery, cyfry, kropki, myślniki i znaki podkreślenia."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "Główny dysk (GB)"
@@ -1356,28 +1571,6 @@ msgstr "Pamięć masowa (używana)"
msgid "Storage (total)"
msgstr "Pamięć masowa (łącznie)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "Instancje"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1433,7 +1626,7 @@ msgstr "Współdzielony storage"
#: dashboards/admin/hypervisors/compute/forms.py:47
msgid "Select a target host"
-msgstr ""
+msgstr "Wybierz host docelowy"
#: dashboards/admin/hypervisors/compute/forms.py:49
#: dashboards/admin/instances/forms.py:58
@@ -1565,7 +1758,7 @@ msgid "Compute Host"
msgstr "Host obliczeniowy"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "Nie można pobrać listy usług nova."
@@ -1803,7 +1996,7 @@ msgstr "Wyłączone"
msgid "Service"
msgstr "Usługa"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "Usługi"
@@ -1813,13 +2006,13 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "Ostatnio zaktualizowano"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Usługi obliczeniowe"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
-msgstr "Usługi Przechowywania Blokowego"
+msgstr "Usługi przechowywania blokowego"
#: dashboards/admin/info/tables.py:163
#: dashboards/admin/networks/agents/tables.py:87
@@ -1831,153 +2024,22 @@ msgstr "Podniesiono"
msgid "Down"
msgstr "Położono"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "Agenci sieciowi"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "Wielkość w bajtach wstrzykniętej zawartości"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr ""
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Pozycje metadanych"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "Wstrzyknięte pliki"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "Wolumeny"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "Migawki wolumenu"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "Całkowity rozmiar wolumenów i migawek (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "PÅ‚ywajÄ…ce adresy IP"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "Grupy zabezpieczeń"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "Reguły grup zabezpieczeń"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "Pary kluczy"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "Stałe adresy IP"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "Wolumeny LUKS"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "Migawki wolumenów LUKS"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "Całkowity rozmiar wolumenów i migawek LUKS (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Nazwa limitu"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "Limit"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Limity"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Nie można pobrać listy usług cinder."
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "Nie można pobrać informacji o agentach sieciowych."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "Nie można pobrać listy agentów sieciowych."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "Domyślne limity"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "Nie można pobrać informacji o limitach."
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "Nie można pobrać informacji o wersji."
@@ -2476,7 +2538,7 @@ msgstr "ID segmentacji"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2505,7 +2567,7 @@ msgstr "Współdzielone"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "Zewnętrzna sieć"
@@ -2703,7 +2765,7 @@ msgstr "Agent DHCP, do którego należy podpiąć sieć."
#: dashboards/admin/networks/agents/forms.py:57
msgid "Select a new agent"
-msgstr ""
+msgstr "Wybierz nowego agenta"
#: dashboards/admin/networks/agents/forms.py:59
msgid "No other agents available."
@@ -2963,13 +3025,13 @@ msgid ""
"Provider specified network can be created. You can specify a physical "
"network type (like Flat, VLAN, GRE, and VXLAN) and its segmentation_id or "
"physical network name for a new virtual network."
-msgstr ""
+msgstr "Można utworzyć sieć podaną przez dostawcę. Można podać typ sieci fizycznej (jak, Płaska, VLAN, GRE i VXLAN) oraz jej segmentation_id lub nazwę sieci fizycznej dla nowej sieci wirtualnej."
#: dashboards/admin/networks/templates/networks/_create.html:21
msgid ""
"In addition, you can create an external network or a shared network by "
"checking the corresponding checkbox."
-msgstr ""
+msgstr "Dodatkowo można utworzyć zewnętrzna lub współdzieloną sieć poprzez zaznaczenie odpowiedniego pola wyboru."
#: dashboards/admin/networks/templates/networks/_update.html:18
#: dashboards/project/networks/templates/networks/_update.html:18
@@ -3092,7 +3154,7 @@ msgstr "Monitoring"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3218,21 +3280,28 @@ msgid "Project ID"
msgstr "ID projektu"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
-msgstr ""
+msgstr "Rozproszony"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr "Tryb wysokiej dostępności (HA)"
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "Informacje o zewnętrznej bramie"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "Podłączona sieć zewnętrzna"
@@ -3280,7 +3349,7 @@ msgstr "Nie można pobrać typów wolumenów."
#: dashboards/admin/volumes/tabs.py:87
msgid "Unable to retrieve QOS specs"
-msgstr ""
+msgstr "Nie można pobrać specyfikacji QOS"
#: dashboards/admin/volumes/tabs.py:109 dashboards/project/volumes/tabs.py:90
#: dashboards/project/volumes/volumes/forms.py:201
@@ -3320,7 +3389,7 @@ msgstr "Nie można zaktualizować stanu migawki wolumenu."
#: dashboards/admin/volumes/templates/volumes/snapshots/_update_status.html:28
#: dashboards/admin/volumes/templates/volumes/volumes/_update_status.html:28
msgid "Update Status"
-msgstr ""
+msgstr "Aktualizuj stan"
#: dashboards/admin/volumes/snapshots/tables.py:61
#: dashboards/project/volumes/backups/tables.py:120
@@ -3422,7 +3491,7 @@ msgstr "Utworzono"
#: dashboards/admin/volumes/templates/volumes/snapshots/update_status.html:3
#: dashboards/admin/volumes/templates/volumes/snapshots/update_status.html:6
msgid "Update Volume Snapshot Status"
-msgstr ""
+msgstr "Aktualizuj stan migawki wolumenu"
#: dashboards/admin/volumes/templates/volumes/snapshots/_update_status.html:19
msgid ""
@@ -3431,12 +3500,12 @@ msgid ""
" an administrator may need to explicitly update the status value. This is equivalent to\n"
" the <tt>cinder snapshot-reset-state</tt> command.\n"
" "
-msgstr "\nStan migawki wolumenu zazwyczaj jest zarządzany automatycznie. W niektórych sytuacjach administrator może musieć ręcznie podać stan wolumeny. Jest to równoważne z poleceniem <tt>cinder snapshot-reset-state</tt>."
+msgstr "\nStan migawki wolumenu zazwyczaj jest zarządzany automatycznie. W niektórych sytuacjach administrator może musieć ręcznie podać stan migawki wolumenu.\nJest to równoważne z poleceniem <tt>cinder snapshot-reset-state</tt>."
#: dashboards/admin/volumes/templates/volumes/volume_types/_associate_qos_spec.html:9
#: dashboards/admin/volumes/templates/volumes/volume_types/associate_qos_spec.html:6
msgid "Associate QOS Spec with Volume Type"
-msgstr ""
+msgstr "PowiÄ…zanie specyfikacji QOS z typem wolumenu"
#: dashboards/admin/volumes/templates/volumes/volume_types/_associate_qos_spec.html:19
msgid ""
@@ -3451,7 +3520,7 @@ msgid ""
" This is equivalent to the <tt>cinder qos-associate</tt> and <tt>cinder qos-disassociate</tt>\n"
" commands.\n"
" "
-msgstr ""
+msgstr "\nDodanie, zmiana lub usunięcie specyfikacji QOS powiązanej z tym typem wolumenu.\n<br>\n<br>\n„Brak†oznacza, że żadna specyfikacja QOS nie jest obecnie powiązana. Ustawienie specyfikacji na „Brak†usunie obecne powiązanie.\n<br>\n<br>\nJest to odpowiednik poleceń <tt>cinder qos-associate</tt> i<tt>cinder qos-disassociate</tt>."
#: dashboards/admin/volumes/templates/volumes/volume_types/_associate_qos_spec.html:34
#: dashboards/project/access_and_security/floating_ips/tables.py:107
@@ -3464,7 +3533,7 @@ msgstr "Powiąż"
#: dashboards/admin/volumes/templates/volumes/volume_types/create_qos_spec.html:3
#: dashboards/admin/volumes/volume_types/tables.py:107
msgid "Create QOS Spec"
-msgstr ""
+msgstr "Tworzenie specyfikacji QOS"
#: dashboards/admin/volumes/templates/volumes/volume_types/_create_qos_spec.html:19
msgid ""
@@ -3480,7 +3549,7 @@ msgid ""
" administrator would like the QOS policy to be enforced. This value can be \"front-end\"\n"
" (Nova Compute), \"back-end\" (Cinder back-end), or both.\n"
" "
-msgstr ""
+msgstr "\nSpecyfikacje QOS mogÄ… zostać powiÄ…zane z typami wolumenów.\nWykorzystujÄ™ siÄ™ je, by okreÅ›lić zestaw wÅ‚aÅ›ciwoÅ›ci jakoÅ›ci usÅ‚ug wymaganych przez wÅ‚aÅ›ciciela wolumenu. Jest to odpowiednik\npolecenia <tt>cinder qos-create</tt>. Po utworzeniu specyfikacji QOS, należy kliknąć przycisk „ZarzÄ…dzaj specyfikacjamiâ€, aby zarzÄ…dzać parami klucz-wartość dla specyfikacji QOS.\n<br>\n<br>\nKażda specyfikacja QOS bÄ™dzie posiadaÅ‚a wartość „konsumentaâ€, która wskazuje\ngdzie administrator chciaÅ‚by wymusić politykÄ™ QOS. Wartość ta może być „front-end†(UsÅ‚uga obliczeniowa/Nova Compute), „back-end†(Cinder) lub obie."
#: dashboards/admin/volumes/templates/volumes/volume_types/_create_qos_spec.html:36
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/_create.html:25
@@ -3520,11 +3589,11 @@ msgid ""
" click the \"View Extra Specs\" button to set up extra specs key-value\n"
" pair(s) for that volume type.\n"
" "
-msgstr ""
+msgstr "\nTyp wolumenu jest typem lub etykietÄ…, która może zostać wybrana podczas\ntworzenie wolumenu w OpenStack. Zazwyczaj okreÅ›la zestaw możliwoÅ›ci sterownika przechowywania danych dla tego wolumenu. PrzykÅ‚adowo „Wydajnośćâ€, „SSDâ€, „kopie zapasoweâ€.\nJest to odpowiednik polecenia <tt>cinder type-create</tt>. Po utworzeniu typu wolumenu, należy kliknąć przycisk „WyÅ›wietl dodatkowe specyfikacjeâ€, aby ustawić pary klucz-wartość dla tego typu wolumenu."
#: dashboards/admin/volumes/templates/volumes/volume_types/_edit_qos_spec_consumer.html:9
msgid "Edit Consumer of QOS Spec"
-msgstr ""
+msgstr "Edycja konsumenta specyfikacji QOS"
#: dashboards/admin/volumes/templates/volumes/volume_types/_edit_qos_spec_consumer.html:19
msgid ""
@@ -3533,19 +3602,19 @@ msgid ""
" administrator would like the QOS policy to be enforced. This value can be \"front-end\"\n"
" (Nova Compute), \"back-end\" (Cinder back-end), or both.\n"
" "
-msgstr ""
+msgstr "\nKażda specyfikacja QOS bÄ™dzie posiadaÅ‚a wartość „konsumentaâ€, która wskazuje\ngdzie administrator chciaÅ‚by wymusić politykÄ™ QOS. Wartość ta może być „front-end†(UsÅ‚uga obliczeniowa/Nova Compute), „back-end†(Cinder) lub obie."
#: dashboards/admin/volumes/templates/volumes/volume_types/_edit_qos_spec_consumer.html:28
msgid "Modify Consumer"
-msgstr ""
+msgstr "Modyfikacja konsumenta"
#: dashboards/admin/volumes/templates/volumes/volume_types/associate_qos_spec.html:3
msgid "Associate QOS Spec"
-msgstr ""
+msgstr "PowiÄ…zanie specyfikacji QOS"
#: dashboards/admin/volumes/templates/volumes/volume_types/create_qos_spec.html:6
msgid "Create a QOS Spec"
-msgstr ""
+msgstr "Tworzenie specyfikacji QOS"
#: dashboards/admin/volumes/templates/volumes/volume_types/create_volume_type.html:6
msgid "Create a Volume Type"
@@ -3554,16 +3623,16 @@ msgstr "Utwórz typ wolumenu"
#: dashboards/admin/volumes/templates/volumes/volume_types/edit_qos_spec_consumer.html:3
#: dashboards/admin/volumes/templates/volumes/volume_types/edit_qos_spec_consumer.html:6
msgid "Edit QOS Spec Consumer"
-msgstr ""
+msgstr "Edycja konsumenta specyfikacji QOS"
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/_create.html:10
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/create.html:4
msgid "Create Volume Type Extra Spec"
-msgstr ""
+msgstr "Tworzenie dodatkowej specyfikacji typu wolumenu"
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/_create.html:20
msgid "Create a new \"extra spec\" key-value pair for a volume type."
-msgstr ""
+msgstr "Tworzenie nowej pary klucz-wartość dodatkowej specyfikacji dla typu wolumenu."
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/_edit.html:10
msgid "Edit Extra Spec Value"
@@ -3572,12 +3641,12 @@ msgstr "Edycja dodatkowej opcji odmiany"
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/_edit.html:20
#, python-format
msgid "Update the \"extra spec\" value for \"%(key)s\""
-msgstr ""
+msgstr "Aktualizuj wartość dodatkowej specyfikacji dla „%(key)sâ€"
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/_index.html:6
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/index.html:4
msgid "Volume Type Extra Specs"
-msgstr ""
+msgstr "Dodatkowa specyfikacja typu wolumenu"
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/_index.html:13
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_index.html:14
@@ -3595,50 +3664,50 @@ msgstr "Typ wolumenu"
#: dashboards/admin/volumes/templates/volumes/volume_types/extras/edit.html:4
msgid "Edit Volume Type Extra Spec"
-msgstr ""
+msgstr "Edycja dodatkowej specyfikacji typu wolumenu"
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_create.html:10
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/create.html:4
msgid "Create Spec"
-msgstr ""
+msgstr "Utwórz specyfikację"
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_create.html:20
#, python-format
msgid "Create a new \"spec\" key-value pair for QOS Spec \"%(qos_spec_name)s\""
-msgstr ""
+msgstr "Utwórz nowÄ… parÄ™ klucz-wartość specyfikacji dla specyfikacji QOS „%(qos_spec_name)sâ€"
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_edit.html:10
msgid "Edit Spec Value: "
-msgstr ""
+msgstr "Edycja wartości specyfikacji: "
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_edit.html:20
#, python-format
msgid "Update the spec value for \"%(key)s\""
-msgstr ""
+msgstr "Aktualizuj wartość specyfikacji dla „%(key)sâ€"
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/create.html:7
#: dashboards/admin/volumes/volume_types/qos_specs/tables.py:35
msgid "Spec"
-msgstr ""
+msgstr "Specyfikacja"
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/edit.html:4
msgid "Edit Spec"
-msgstr ""
+msgstr "Edytuj specyfikacjÄ™"
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/edit.html:7
msgid "QOS Spec: "
-msgstr ""
+msgstr "Specyfikacja QOS: "
#: dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/index.html:5
msgid "QOS Spec"
-msgstr ""
+msgstr "Specyfikacja QOS"
#: dashboards/admin/volumes/templates/volumes/volumes/_update_status.html:9
#: dashboards/admin/volumes/templates/volumes/volumes/update_status.html:3
#: dashboards/admin/volumes/templates/volumes/volumes/update_status.html:6
#: dashboards/admin/volumes/volumes/tables.py:31
msgid "Update Volume Status"
-msgstr ""
+msgstr "Aktualizuj stan wolumenu"
#: dashboards/admin/volumes/templates/volumes/volumes/_update_status.html:19
msgid ""
@@ -3647,7 +3716,7 @@ msgid ""
" administrator may need to explicitly update the status value. This is equivalent to\n"
" the <tt>cinder reset-state</tt> command.\n"
" "
-msgstr ""
+msgstr "\nStan wolumenu zazwyczaj jest zarządzany automatycznie. W niektórych sytuacjach administrator może musieć ręcznie podać stan wolumenu. Jest to równoważne z poleceniem <tt>cinder reset-state</tt>."
#: dashboards/admin/volumes/templates/volumes/volumes/detail.html:3
#: dashboards/project/volumes/templates/volumes/volumes/detail.html:3
@@ -3666,46 +3735,46 @@ msgstr "Szczegóły wolumenu:"
#: dashboards/admin/volumes/volume_types/forms.py:25
msgid "QOS Spec to be associated"
-msgstr ""
+msgstr "Specyfikacja QOS do powiÄ…zania"
#: dashboards/admin/volumes/volume_types/forms.py:26
msgid "Choose associated QOS Spec."
-msgstr ""
+msgstr "Wybór powiązanej specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/forms.py:71
msgid ""
"New associated QOS Spec must be different than the current associated QOS "
"Spec."
-msgstr ""
+msgstr "Nowe powiązanie specyfikacji QOS musi być inne niż obecne powiązanie."
#: dashboards/admin/volumes/volume_types/forms.py:103
msgid "Successfully updated QOS Spec association."
-msgstr ""
+msgstr "Zaktualizowano powiÄ…zanie specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/forms.py:107
msgid "Error updating QOS Spec association."
-msgstr ""
+msgstr "BÅ‚Ä…d podczas aktualizacji powiÄ…zania specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/forms.py:113
msgid "QOS Spec Consumer"
-msgstr ""
+msgstr "Konsument specyfikacji QOS"
#: dashboards/admin/volumes/volume_types/forms.py:115
msgid "Choose consumer for this QOS Spec."
-msgstr ""
+msgstr "Wybór konsumenta dla tej specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/forms.py:131
msgid ""
"QOS Spec consumer value must be different than the current consumer value."
-msgstr ""
+msgstr "Wartość konsumenta specyfikacji QOS musi być różna od obecnej wartości konsumenta."
#: dashboards/admin/volumes/volume_types/forms.py:145
msgid "Successfully modified QOS Spec consumer."
-msgstr ""
+msgstr "Zmodyfikowano konsumenta specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/forms.py:148
msgid "Error editing QOS Spec consumer."
-msgstr ""
+msgstr "BÅ‚Ä…d podczas edycji konsumenta specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/tables.py:33
msgid "View Extra Specs"
@@ -3713,73 +3782,73 @@ msgstr "Wyświetl dodatkowe opcje"
#: dashboards/admin/volumes/volume_types/tables.py:41
msgid "Manage QOS Spec Association"
-msgstr ""
+msgstr "ZarzÄ…dzanie powiÄ…zaniami specyfikacji QOS"
#: dashboards/admin/volumes/volume_types/tables.py:52
msgid "Delete VolumeType"
msgid_plural "Delete VolumeTypes"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń typ wolumenu"
+msgstr[1] "Usuń typy wolumenów"
+msgstr[2] "Usuń typy wolumenów"
#: dashboards/admin/volumes/volume_types/tables.py:60
msgid "Deleted VolumeType"
msgid_plural "Deleted VolumeTypes"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto typ wolumenu"
+msgstr[1] "Usunięto typy wolumenów"
+msgstr[2] "Usunięto typy wolumenów"
#: dashboards/admin/volumes/volume_types/tables.py:73
msgid "Associated QOS Spec"
-msgstr ""
+msgstr "PowiÄ…zane specyfikacje QOS"
#: dashboards/admin/volumes/volume_types/tables.py:93
msgid "Manage Specs"
-msgstr ""
+msgstr "ZarzÄ…dzanie specyfikacjami"
#: dashboards/admin/volumes/volume_types/tables.py:118
msgid "Delete QOS Spec"
msgid_plural "Delete QOS Specs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń specyfikację QOS"
+msgstr[1] "Usuń specyfikacje QOS"
+msgstr[2] "Usuń specyfikacje QOS"
#: dashboards/admin/volumes/volume_types/tables.py:126
msgid "Deleted QOS Spec"
msgid_plural "Deleted QOS Specs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto specyfikację QOS"
+msgstr[1] "Usunięto specyfikacje QOS"
+msgstr[2] "Usunięto specyfikacje QOS"
#: dashboards/admin/volumes/volume_types/tables.py:138
msgid "Edit Consumer"
-msgstr ""
+msgstr "Edytuj konsumenta"
#: dashboards/admin/volumes/volume_types/tables.py:147
#: dashboards/admin/volumes/volumes/forms.py:89
msgid "Consumer"
-msgstr ""
+msgstr "Konsument"
#: dashboards/admin/volumes/volume_types/tables.py:161
msgid "QOS Specs"
-msgstr ""
+msgstr "Specyfikacja QOS"
#: dashboards/admin/volumes/volume_types/views.py:69
msgid "Unable to retrieve QOS Spec details."
-msgstr ""
+msgstr "Nie można pobrać specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/views.py:101
#: dashboards/admin/volumes/volume_types/extras/views.py:36
msgid "Unable to retrieve volume type details."
-msgstr ""
+msgstr "Nie można pobrać szczegółów typu wolumenu."
#: dashboards/admin/volumes/volume_types/views.py:111
msgid "Unable to retrieve QOS Specs."
-msgstr ""
+msgstr "Nie można pobrać specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/views.py:130
msgid "Unable to retrieve QOS Spec association."
-msgstr ""
+msgstr "Nie można pobrać powiązania ze specyfikacją QOS."
#: dashboards/admin/volumes/volume_types/extras/forms.py:23
#: dashboards/admin/volumes/volume_types/extras/tables.py:69
@@ -3795,7 +3864,7 @@ msgstr "Utworzono dodatkowÄ… opcję „%sâ€."
#: dashboards/admin/volumes/volume_types/extras/forms.py:37
msgid "Unable to create volume type extra spec."
-msgstr ""
+msgstr "Nie można utworzyć dodatkowej specyfikacji wolumenu."
#: dashboards/admin/volumes/volume_types/extras/forms.py:50
#, python-format
@@ -3804,21 +3873,21 @@ msgstr "Zapisano dodatkowÄ… opcję „%sâ€."
#: dashboards/admin/volumes/volume_types/extras/forms.py:55
msgid "Unable to edit volume type extra spec."
-msgstr ""
+msgstr "Nie można edytować dodatkowej specyfikacji wolumenu."
#: dashboards/admin/volumes/volume_types/extras/tables.py:27
msgid "Delete Extra Spec"
msgid_plural "Delete Extra Specs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń dodatkową specyfikację"
+msgstr[1] "Usuń dodatkowe specyfikacje"
+msgstr[2] "Usuń dodatkowe specyfikacje"
#: dashboards/admin/volumes/volume_types/extras/tables.py:35
msgid "Deleted Extra Spec"
msgid_plural "Deleted Extra Specs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto dodatkową specyfikację"
+msgstr[1] "Usunięto dodatkowe specyfikacje"
+msgstr[2] "Usunięto dodatkowe specyfikacje"
#: dashboards/admin/volumes/volume_types/extras/tables.py:59
#: dashboards/admin/volumes/volume_types/qos_specs/tables.py:48
@@ -3840,25 +3909,25 @@ msgstr "Nie można pobrać listy dodatkowych opcji."
#: dashboards/admin/volumes/volume_types/extras/views.py:90
msgid "Unable to retrieve volume type extra spec details."
-msgstr ""
+msgstr "Nie można pobrać dodatkowych specyfikacji typu wolumenu."
#: dashboards/admin/volumes/volume_types/qos_specs/forms.py:37
#, python-format
msgid "Created spec \"%s\"."
-msgstr ""
+msgstr "Utworzono specyfikacjÄ™ „%sâ€."
#: dashboards/admin/volumes/volume_types/qos_specs/forms.py:42
msgid "Unable to create spec."
-msgstr ""
+msgstr "Nie można utworzyć specyfikacji."
#: dashboards/admin/volumes/volume_types/qos_specs/forms.py:64
#, python-format
msgid "Saved spec \"%s\"."
-msgstr ""
+msgstr "Zapisano specyfikacjÄ™ „%sâ€."
#: dashboards/admin/volumes/volume_types/qos_specs/forms.py:69
msgid "Unable to edit spec."
-msgstr ""
+msgstr "Nie można edytować specyfikacji."
#: dashboards/admin/volumes/volume_types/qos_specs/tables.py:63
msgid "Key-Value Pairs"
@@ -3866,15 +3935,15 @@ msgstr "Pary klucz - wartość"
#: dashboards/admin/volumes/volume_types/qos_specs/views.py:48
msgid "undefined"
-msgstr ""
+msgstr "niezdefiniowane"
#: dashboards/admin/volumes/volume_types/qos_specs/views.py:64
msgid "Unable to retrieve QOS spec list."
-msgstr ""
+msgstr "Nie można pobrać listy specyfikacji QOS."
#: dashboards/admin/volumes/volume_types/qos_specs/views.py:100
msgid "Unable to retrieve QOS spec details."
-msgstr ""
+msgstr "Nie można pobrać szczegółów specyfikacji QOS."
#: dashboards/admin/volumes/volumes/forms.py:36
#, python-format
@@ -3901,21 +3970,21 @@ msgstr "W użyciu"
#: dashboards/admin/volumes/volumes/forms.py:77
#, python-format
msgid "Successfully updated volume status to \"%s\"."
-msgstr ""
+msgstr "Zmieniono stan wolumenu na „%sâ€."
#: dashboards/admin/volumes/volumes/forms.py:82
#, python-format
msgid "Unable to update volume status to \"%s\"."
-msgstr ""
+msgstr "Nie można zmienić stanu wolumenu na „%sâ€."
#: dashboards/admin/volumes/volumes/forms.py:97
#, python-format
msgid "Successfully created QOS Spec: %s"
-msgstr ""
+msgstr "Utworzono specyfikacjÄ™ QOS: %s"
#: dashboards/admin/volumes/volumes/forms.py:102
msgid "Unable to create QOS Spec."
-msgstr ""
+msgstr "Nie można utworzyć specyfikacji QOS."
#: dashboards/admin/volumes/volumes/views.py:61
#: dashboards/project/volumes/volumes/views.py:62
@@ -3924,7 +3993,7 @@ msgstr "Nie można pobrać szczegółów wolumenu."
#: dashboards/identity/dashboard.py:22
msgid "Identity"
-msgstr ""
+msgstr "Tożsamość"
#: dashboards/identity/domains/panel.py:24
#: dashboards/identity/domains/tables.py:92
@@ -3994,11 +4063,11 @@ msgstr "Nie można pobrać listy domen."
#: dashboards/identity/domains/views.py:60
msgid "Unable to retrieve domain information."
-msgstr ""
+msgstr "Nie można pobrać informacji o domenie."
#: dashboards/identity/domains/views.py:62
msgid "Insufficient privilege level to view domain information."
-msgstr ""
+msgstr "Brak uprawnień do przeglądania informacji o domenie."
#: dashboards/identity/domains/views.py:88
msgid "Unable to retrieve domain details."
@@ -4007,13 +4076,13 @@ msgstr "Nie można pobrać szczegółów domeny."
#: dashboards/identity/domains/workflows.py:43
#: dashboards/identity/domains/workflows.py:280
msgid "Domain Information"
-msgstr ""
+msgstr "Informacje o domenie"
#: dashboards/identity/domains/workflows.py:45
msgid ""
"Domains provide separation between users and infrastructure used by "
"different organizations."
-msgstr ""
+msgstr "Domeny zapewniają separację między użytkownikami oraz infrastrukturą wykorzystywaną przez różne organizacje. "
#: dashboards/identity/domains/workflows.py:71
#: dashboards/identity/domains/workflows.py:170
@@ -4025,7 +4094,7 @@ msgstr "Nie można znaleźć domyślnej roli „%s†w Keystone"
#: dashboards/identity/domains/workflows.py:76
msgid "Unable to find default role."
-msgstr ""
+msgstr "Nie znaleziono domyślnej roli."
#: dashboards/identity/domains/workflows.py:88
#: dashboards/identity/projects/workflows.py:248
@@ -4042,12 +4111,12 @@ msgstr "Nie można pobrać listy ról."
#: dashboards/identity/domains/workflows.py:114
msgid "Unable to retrieve user domain role assignments."
-msgstr ""
+msgstr "Nie można pobrać przypisań do ról użytkowników domeny."
#: dashboards/identity/domains/workflows.py:126
#: dashboards/identity/domains/workflows.py:133
msgid "Domain Members"
-msgstr ""
+msgstr "Członkowie domeny"
#: dashboards/identity/domains/workflows.py:132
#: dashboards/identity/projects/workflows.py:237
@@ -4104,7 +4173,7 @@ msgid ""
"Domains provide separation between users and infrastructure used by "
"different organizations. Edit the domain details to add or remove groups in "
"the domain."
-msgstr ""
+msgstr "Domeny zapewniają separację między użytkownikami oraz infrastrukturą wykorzystywaną przez różne organizacje. Można edytować szczegóły domeny, aby dodać lub usunąć z niej grupy."
#: dashboards/identity/domains/workflows.py:298
msgid "Edit Domain"
@@ -4125,12 +4194,12 @@ msgid ""
"You cannot revoke your administrative privileges from the domain you are "
"currently logged into. Please switch to another domain with administrative "
"privileges or remove the administrative role manually via the CLI."
-msgstr ""
+msgstr "Nie można odwołać uprawnień administracyjnych z domeny, w której jest się zalogowanym. Należy przełączyć się do innej domeny z uprawnieniami administracyjnymi lub usunąć rolę administracyjną ręcznie przy pomocy CLI."
#: dashboards/identity/domains/workflows.py:401
#, python-format
msgid "Failed to modify %s project members and update domain groups."
-msgstr ""
+msgstr "Nie można zmodyfikować członków projektu %s oraz zaktualizować grup domennowych."
#: dashboards/identity/domains/workflows.py:473
#, python-format
@@ -4275,7 +4344,7 @@ msgstr "Nie można pobrać listy grup."
#: dashboards/identity/groups/views.py:51
msgid "Insufficient privilege level to view group information."
-msgstr ""
+msgstr "Brak uprawnień do przeglądania informacji o grupie."
#: dashboards/identity/groups/views.py:75
msgid "Unable to update group."
@@ -4297,7 +4366,7 @@ msgstr "Dodanie powiÄ…zania grupy"
msgid ""
"Groups are used to manage access and assign roles to multiple users at once."
" After creating the group, edit the group to add users."
-msgstr ""
+msgstr "Grupy są wykorzystywane do zarządzania dostępem oraz przyznawania ról dla wielu użytkowników równocześnie. Po utworzeniu grupy należy ją edytować, aby dodać użytkowników."
#: dashboards/identity/groups/templates/groups/_update.html:8
#: dashboards/identity/groups/templates/groups/_update.html:23
@@ -4310,7 +4379,7 @@ msgstr "Aktualizuj grupÄ™"
msgid ""
"Groups are used to manage access and assign roles to multiple users at once."
" Edit the group to add users."
-msgstr ""
+msgstr "Grupy są wykorzystywane do zarządzania dostępem oraz przyznawania ról dla wielu użytkowników równocześnie. Należy edytować grupę, aby dodać użytkowników."
#: dashboards/identity/groups/templates/groups/add_non_member.html:3
msgid "Add User to Group"
@@ -4364,16 +4433,12 @@ msgstr "Nie można pobrać informacji o projekcie."
#: dashboards/identity/projects/views.py:107
msgid "Insufficient privilege level to view project information."
-msgstr ""
+msgstr "Brak uprawnień do przeglądania informacji o projekcie."
#: dashboards/identity/projects/views.py:151
msgid "Unable to retrieve default Neutron quota values."
msgstr "Nie można pobrać domyślnych wartości limitów dla Neutron."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "Nie można pobrać domyślnych wartości limitów."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4385,7 +4450,7 @@ msgstr "Nie można pobrać szczegółów projektu."
#: dashboards/identity/projects/workflows.py:44
msgid "Injected File Content (Bytes)"
-msgstr ""
+msgstr "Wstrzyknięta zawartość pliku (bajty)"
#: dashboards/identity/projects/workflows.py:87
msgid "Quota"
@@ -4393,17 +4458,17 @@ msgstr "Limit"
#: dashboards/identity/projects/workflows.py:89
msgid "Set maximum quotas for the project."
-msgstr ""
+msgstr "Ustawienie maksymalnych limitów dla projektu."
#: dashboards/identity/projects/workflows.py:99
#, python-format
msgid "%(used)s %(key)s used"
-msgstr ""
+msgstr "%(used)s %(key)s użyto"
#: dashboards/identity/projects/workflows.py:104
#, python-format
msgid "Quota value(s) cannot be less than the current usage value(s): %s."
-msgstr ""
+msgstr "Wartości limitów nie mogą być mniejsze niż obecne wartości zużycia: %s."
#: dashboards/identity/projects/workflows.py:122
#: dashboards/identity/users/forms.py:78
@@ -4414,11 +4479,11 @@ msgstr "Nazwa domeny"
#: dashboards/identity/projects/workflows.py:145
#: dashboards/identity/projects/workflows.py:492
msgid "Project Information"
-msgstr ""
+msgstr "Informacje o projekcie"
#: dashboards/identity/projects/workflows.py:146
msgid "Create a project to organize users."
-msgstr ""
+msgstr "Utworzenie projektu pozwala na uporządkowanie użytkowników"
#: dashboards/identity/projects/workflows.py:164
msgid "Unable to retrieve user list. Please try again later."
@@ -4466,7 +4531,7 @@ msgstr "Nie można ustawić limitów dla projektu."
#: dashboards/identity/projects/workflows.py:494
msgid "Edit the project details."
-msgstr ""
+msgstr "Edycja szczegółów projektu."
#: dashboards/identity/projects/workflows.py:511
#, python-format
@@ -4569,11 +4634,11 @@ msgstr "Nie można pobrać listy ról."
#: dashboards/identity/roles/views.py:48
msgid "Insufficient privilege level to view role information."
-msgstr ""
+msgstr "Brak uprawnień do przeglądania informacji o roli."
#: dashboards/identity/roles/templates/roles/_create.html:18
msgid "Create a new role."
-msgstr ""
+msgstr "Tworzy nowÄ… rolÄ™."
#: dashboards/identity/roles/templates/roles/_update.html:8
#: dashboards/identity/roles/templates/roles/_update.html:23
@@ -4584,7 +4649,7 @@ msgstr "Aktualizacja roli"
#: dashboards/identity/roles/templates/roles/_update.html:18
msgid "Edit the role's details."
-msgstr ""
+msgstr "Edycja szczegółów roli"
#: dashboards/identity/users/forms.py:56
msgid "No available projects"
@@ -4647,30 +4712,30 @@ msgstr "Utwórz użytkownika"
#: dashboards/identity/users/tables.py:64
msgid "Enable User"
msgid_plural "Enable Users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Włącz użytkownika"
+msgstr[1] "Włącz użytkowników"
+msgstr[2] "Włącz użytkowników"
#: dashboards/identity/users/tables.py:69
msgid "Disable User"
msgid_plural "Disable Users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyłącz użytkownika"
+msgstr[1] "Wyłącz użytkowników"
+msgstr[2] "Wyłącz użytkowników"
#: dashboards/identity/users/tables.py:79
msgid "Enabled User"
msgid_plural "Enabled Users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Włączony użytkownik"
+msgstr[1] "Włączeni użytkownicy"
+msgstr[2] "Włączeni użytkownicy"
#: dashboards/identity/users/tables.py:84
msgid "Disabled User"
msgid_plural "Disabled Users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyłączony użytkownik"
+msgstr[1] "Wyłączeni użytkownicy"
+msgstr[2] "Wyłączeni użytkownicy"
#: dashboards/identity/users/tables.py:114
msgid "You cannot disable the user you are currently logged in as."
@@ -4679,24 +4744,24 @@ msgstr "Nie można wyłączyć aktualnie zalogowanego użytkownika."
#: dashboards/identity/users/tables.py:129
msgid "Delete User"
msgid_plural "Delete Users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń użytkownika"
+msgstr[1] "Usuń użytkowników"
+msgstr[2] "Usuń użytkowników"
#: dashboards/identity/users/tables.py:137
msgid "Deleted User"
msgid_plural "Deleted Users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto użytkownika"
+msgstr[1] "Usunięto użytkowników"
+msgstr[2] "Usunięto użytkowników"
#: dashboards/identity/users/views.py:65
msgid "Unable to retrieve user information."
-msgstr ""
+msgstr "Nie można pobrać informacji o użytkowniku."
#: dashboards/identity/users/views.py:67
msgid "Insufficient privilege level to view user information."
-msgstr ""
+msgstr "Brak uprawnień do przeglądania informacji o użytkowniku."
#: dashboards/identity/users/views.py:90
msgid "Unable to update user."
@@ -4710,7 +4775,7 @@ msgstr "Nie można pobrać ról użytkowników."
msgid ""
"Create a new user and set related properties including the Primary Project "
"and Role."
-msgstr ""
+msgstr "Utworzenie nowego użytkownika i ustawienie powiązanych właściwości, takich jak główny projekt i rola."
#: dashboards/identity/users/templates/users/_update.html:8
#: dashboards/identity/users/templates/users/_update.html:33
@@ -4721,7 +4786,7 @@ msgstr "Aktualizuj użytkownika"
#: dashboards/identity/users/templates/users/_update.html:18
msgid "Edit the user's details, including the Primary Project and Role."
-msgstr ""
+msgstr "Edycja szczegółów użytkownika, włącznie z głównym projektem oraz rolą."
#: dashboards/project/dashboard.py:22
msgid "Compute"
@@ -4768,7 +4833,7 @@ msgstr "Dostęp i bezpieczeństwo"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "Nie można pobrać grup zabezpieczeń."
@@ -4778,7 +4843,7 @@ msgstr "Nie można pobrać listy par kluczy."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "Nie można pobrać pływających adresów IP."
@@ -4863,16 +4928,16 @@ msgstr "(Przekroczono limity)"
#: dashboards/project/access_and_security/floating_ips/tables.py:79
msgid "Release Floating IP"
msgid_plural "Release Floating IPs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Zwolnij pływający adres IP"
+msgstr[1] "Zwolnij pływające adresy IP"
+msgstr[2] "Zwolnij pływające adresy IP"
#: dashboards/project/access_and_security/floating_ips/tables.py:87
msgid "Released Floating IP"
msgid_plural "Released Floating IPs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Zwolniono pływający adres IP"
+msgstr[1] "Zwolniono pływające adresy IP"
+msgstr[2] "Zwolniono pływające adresy IP"
#: dashboards/project/access_and_security/floating_ips/tables.py:129
#: dashboards/project/loadbalancers/workflows.py:729
@@ -4892,16 +4957,16 @@ msgstr "Nie można odwiązać pływającego adresu IP."
#: dashboards/project/access_and_security/floating_ips/tables.py:158
#, python-format
msgid "%(instance_name)s %(fixed_ip)s"
-msgstr ""
+msgstr "%(instance_name)s %(fixed_ip)s"
#: dashboards/project/access_and_security/floating_ips/tables.py:162
#, python-format
msgid "Load Balancer VIP %s"
-msgstr ""
+msgstr "VIP load balancera %s"
#: dashboards/project/access_and_security/floating_ips/tables.py:183
msgid "Mapped Fixed IP Address"
-msgstr ""
+msgstr "Mapowano stały adres IP"
#: dashboards/project/access_and_security/floating_ips/tables.py:186
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:18
@@ -4932,7 +4997,7 @@ msgstr "Wybór adresu IP"
#: dashboards/project/access_and_security/floating_ips/workflows.py:77
msgid "No floating IP addresses allocated"
-msgstr ""
+msgstr "Nie alokowano pływających adresów IP"
#: dashboards/project/access_and_security/floating_ips/workflows.py:100
msgid "Select a port"
@@ -4970,7 +5035,7 @@ msgstr "Nie można powiązać adresu IP %s."
msgid ""
"Key pair name may only contain letters, numbers, underscores, spaces and "
"hyphens."
-msgstr ""
+msgstr "Nazwa pary kluczy może składać się jedynie z liter, cyfr, podkreśleń, spacji oraz myślników."
#: dashboards/project/access_and_security/keypairs/forms.py:41
#: dashboards/project/access_and_security/keypairs/forms.py:51
@@ -5002,9 +5067,9 @@ msgstr[2] "Usuń pary kluczy"
#: dashboards/project/access_and_security/keypairs/tables.py:39
msgid "Deleted Key Pair"
msgid_plural "Deleted Key Pairs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto parę kluczy"
+msgstr[1] "Usunięto pary kluczy"
+msgstr[2] "Usunięto pary kluczy"
#: dashboards/project/access_and_security/keypairs/tables.py:50
#: dashboards/project/access_and_security/templates/access_and_security/keypairs/_import.html:8
@@ -5252,16 +5317,16 @@ msgstr "Nie można dodać reguły do grupy zabezpieczeń"
#: dashboards/project/access_and_security/security_groups/tables.py:36
msgid "Delete Security Group"
msgid_plural "Delete Security Groups"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń grupę zabezpieczeń"
+msgstr[1] "Usuń grupy zabezpieczeń"
+msgstr[2] "Usuń grupy zabezpieczeń"
#: dashboards/project/access_and_security/security_groups/tables.py:44
msgid "Deleted Security Group"
msgid_plural "Deleted Security Groups"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto grupę zabezpieczeń"
+msgstr[1] "Usunięto grupy zabezpieczeń"
+msgstr[2] "Usunięto grupy zabezpieczeń"
#: dashboards/project/access_and_security/security_groups/tables.py:69
#: dashboards/project/access_and_security/templates/access_and_security/security_groups/_create.html:8
@@ -5296,16 +5361,16 @@ msgstr "Dodaj regułę"
#: dashboards/project/firewalls/tables.py:58
msgid "Delete Rule"
msgid_plural "Delete Rules"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń regułę"
+msgstr[1] "Usuń reguły"
+msgstr[2] "Usuń reguły"
#: dashboards/project/access_and_security/security_groups/tables.py:166
msgid "Deleted Rule"
msgid_plural "Deleted Rules"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto regułę"
+msgstr[1] "Usunięto reguły"
+msgstr[2] "Usunięto reguły"
#: dashboards/project/access_and_security/security_groups/tables.py:220
msgid "Any"
@@ -5439,13 +5504,13 @@ msgid ""
"Security groups are sets of IP filter rules that are applied to the network "
"settings for the VM. After the security group is created, you can add rules "
"to the security group."
-msgstr ""
+msgstr "Grupy zabezpieczeń są zestawem reguł filtra IP, które są nakładane na ustawienie sieciowe maszyny wirtualnej. Po utworzeniu grupy zabezpieczeń można zacząć dodawać do niej reguły."
#: dashboards/project/access_and_security/templates/access_and_security/security_groups/_update.html:19
msgid ""
"Security groups are sets of IP filter rules that are applied to the network "
"settings for the VM. Edit the security group to add and change the rules."
-msgstr ""
+msgstr "Grupy zabezpieczeń są zestawem reguł filtra IP, które są nakładane na ustawienie sieciowe maszyny wirtualnej. Edytowanie grupy zabezpieczeń pozwala na dodawanie i zmianę reguł."
#: dashboards/project/access_and_security/templates/access_and_security/security_groups/detail.html:3
msgid "Manage Security Group Rules"
@@ -5550,7 +5615,7 @@ msgstr "Docelowy kontener"
#: dashboards/project/containers/forms.py:190
msgctxt "Swift pseudo folder path"
msgid "Path"
-msgstr ""
+msgstr "Ścieżka"
#: dashboards/project/containers/forms.py:193
msgid "Destination object name"
@@ -5601,16 +5666,16 @@ msgstr "Ustawiono dostęp kontenera jako prywatny."
#: dashboards/project/containers/tables.py:110
msgid "Delete Container"
msgid_plural "Delete Containers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń kontener"
+msgstr[1] "Usuń kontenery"
+msgstr[2] "Usuń kontenery"
#: dashboards/project/containers/tables.py:118
msgid "Deleted Container"
msgid_plural "Deleted Containers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto kontener"
+msgstr[1] "Usunięto kontenery"
+msgstr[2] "Usunięto kontenery"
#: dashboards/project/containers/tables.py:132
msgid "Unable to delete container."
@@ -5650,16 +5715,16 @@ msgstr "Szczegóły kontenera"
#: dashboards/project/containers/tables.py:333
msgid "Delete Object"
msgid_plural "Delete Objects"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń obiekt"
+msgstr[1] "Usuń obiekty"
+msgstr[2] "Usuń obiekty"
#: dashboards/project/containers/tables.py:341
msgid "Deleted Object"
msgid_plural "Deleted Objects"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto obiekt"
+msgstr[1] "Usunięto obiekty"
+msgstr[2] "Usunięto obiekty"
#: dashboards/project/containers/tables.py:368
msgid "Copy"
@@ -5731,7 +5796,7 @@ msgid ""
"Make a new copy of an existing object to store in this or another container."
" You may additionally specify the path within the selected container where "
"the new copy should be stored."
-msgstr ""
+msgstr "Tworzy nową kopię istniejącego obiektu, celem przechowania go w bieżącym lub innym kontenerze. Dodatkowo można podać ścieżkę wewnątrz wybranego kontenera, pod którą ma być przechowywany obiekt."
#: dashboards/project/containers/templates/containers/_create.html:18
msgid ""
@@ -5826,30 +5891,30 @@ msgstr "Wyślij obiekty"
#: dashboards/project/data_processing/cluster_templates/forms.py:31
msgid "Cluster Template Name"
-msgstr ""
+msgstr "Nazwa szablonu klastra"
#: dashboards/project/data_processing/cluster_templates/forms.py:39
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:14
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_details.html:30
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:22
msgid "Template"
-msgstr ""
+msgstr "Szablon"
#: dashboards/project/data_processing/cluster_templates/forms.py:57
msgid "Unable to upload cluster template file"
-msgstr ""
+msgstr "Nie można przesłać pliku szablonu klastra"
#: dashboards/project/data_processing/cluster_templates/panel.py:22
#: dashboards/project/data_processing/cluster_templates/tables.py:127
msgid "Cluster Templates"
-msgstr ""
+msgstr "Szablony klastra"
#: dashboards/project/data_processing/cluster_templates/tables.py:31
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_upload_file.html:11
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/upload_file.html:3
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/upload_file.html:6
msgid "Upload Template"
-msgstr ""
+msgstr "Wyślij szablon"
#: dashboards/project/data_processing/cluster_templates/tables.py:39
#: dashboards/project/data_processing/clusters/tables.py:33
@@ -5868,33 +5933,33 @@ msgstr "Uruchom klaster"
#: dashboards/project/data_processing/cluster_templates/tables.py:55
#: dashboards/project/data_processing/nodegroup_templates/tables.py:47
msgid "Copy Template"
-msgstr ""
+msgstr "Kopiuj szablon"
#: dashboards/project/data_processing/cluster_templates/tables.py:64
#: dashboards/project/data_processing/cluster_templates/tables.py:78
#: dashboards/project/data_processing/nodegroup_templates/tables.py:56
msgid "Delete Template"
msgid_plural "Delete Templates"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń szablon"
+msgstr[1] "Usuń szablony"
+msgstr[2] "Usuń szablony"
#: dashboards/project/data_processing/cluster_templates/tables.py:72
#: dashboards/project/data_processing/nodegroup_templates/tables.py:64
msgid "Deleted Template"
msgid_plural "Deleted Templates"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto szablon"
+msgstr[1] "Usunięto szablony"
+msgstr[2] "Usunięto szablony"
#: dashboards/project/data_processing/cluster_templates/tables.py:87
#: dashboards/project/data_processing/nodegroup_templates/tables.py:28
msgid "Create Template"
-msgstr ""
+msgstr "Utwórz szablon"
#: dashboards/project/data_processing/cluster_templates/tables.py:96
msgid "Configure Cluster Template"
-msgstr ""
+msgstr "Konfiguruj szablon klastra"
#: dashboards/project/data_processing/cluster_templates/tables.py:115
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_configure_general_help.html:6
@@ -5906,7 +5971,7 @@ msgstr ""
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_configure_general_help.html:6
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:24
msgid "Plugin"
-msgstr ""
+msgstr "Wtyczka"
#: dashboards/project/data_processing/cluster_templates/tables.py:117
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html:16
@@ -5934,11 +5999,11 @@ msgstr "Grupy węzłów"
#: dashboards/project/data_processing/jobs/tabs.py:26
#: dashboards/project/data_processing/nodegroup_templates/tabs.py:30
msgid "General Info"
-msgstr ""
+msgstr "Ogólne informacje"
#: dashboards/project/data_processing/cluster_templates/tabs.py:43
msgid "Unable to fetch cluster template details."
-msgstr ""
+msgstr "Nie można pobrać szczegółów szablonu klastra."
#: dashboards/project/data_processing/cluster_templates/tabs.py:68
msgid "Unable to fetch node group details."
@@ -5946,16 +6011,16 @@ msgstr "Nie można pobrać szczegółów grupy węzłów."
#: dashboards/project/data_processing/cluster_templates/views.py:52
msgid "Unable to fetch cluster template list"
-msgstr ""
+msgstr "Nie można pobrać listy szablonów klastra."
#: dashboards/project/data_processing/cluster_templates/views.py:112
#: dashboards/project/data_processing/clusters/views.py:97
msgid "Unable to fetch cluster template."
-msgstr ""
+msgstr "Nie można pobrać szablonu klastra."
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_configure_general_help.html:4
msgid "This Cluster Template will be created for:"
-msgstr ""
+msgstr "Ten szablon klastra zostanie utworzony dla:"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_configure_general_help.html:8
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:60
@@ -5968,19 +6033,19 @@ msgstr "Wersja Hadoop"
msgid ""
"The Cluster Template object should specify Node Group Templates that will be used to build a Hadoop Cluster.\n"
" You can add Node Groups using Node Group Templates on a &quotNode Groups&quot tab."
-msgstr ""
+msgstr "Obiekt szablonu klastra powinien określać szablony grupy węzłów, które zostaną wykorzystane do zbudowania klastra Hadoop.\nMożna dodawać grupy węzłów wykorzystując szablony grup węzłów w zakładce &quot;Grupy węzłów&quot;"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_configure_general_help.html:16
msgid ""
"You may set <b>cluster</b> scoped Hadoop configurations on corresponding "
"tabs."
-msgstr ""
+msgstr "Można ustawić konfigurację w <b>obrębie klastra</b> Hadoop na odpowiednich zakładkach."
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_configure_general_help.html:19
msgid ""
"The Cluster Template object may specify a list of processes in anti-affinity group.\n"
" That means these processes may not be launched more than once on a single host."
-msgstr ""
+msgstr "Obiekt szablonu klastra może podawać listę procesów w grupie anti-affinity.\nOznacza to, że te procesy nie mogę być uruchomione więcej niż raz na pojedynczym hoście."
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_create_general_help.html:3
msgid "Select a plugin and Hadoop version for a new Cluster template."
@@ -5989,24 +6054,24 @@ msgstr "Należy wybrać wtyczkę i wersję Hadoop dla nowego szablonu klastra."
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html:3
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:3
msgid "Template Overview"
-msgstr ""
+msgstr "PrzeglÄ…d szablonu"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html:20
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_details.html:46
msgid "Anti-affinity enabled for"
-msgstr ""
+msgstr "WÅ‚Ä…czono anti-affinity dla"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html:30
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_details.html:56
msgid "no processes"
-msgstr ""
+msgstr "brak procesów"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html:34
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:46
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_details.html:60
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:54
msgid "Node Configurations"
-msgstr ""
+msgstr "Konfiguracje węzła"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html:46
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:58
@@ -6014,12 +6079,12 @@ msgstr ""
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:66
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_service_confs.html:17
msgid "No configurations"
-msgstr ""
+msgstr "Brak konfiguracji"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html:51
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_details.html:77
msgid "Cluster configurations are not specified"
-msgstr ""
+msgstr "Nie podano konfiguracji klastra"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:7
msgid "Node Group"
@@ -6027,7 +6092,7 @@ msgstr "Grupa węzłów"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:8
msgid "Nodes Count"
-msgstr ""
+msgstr "Liczba węzłów"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:11
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:14
@@ -6042,46 +6107,46 @@ msgstr "Odmiana"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:12
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:15
msgid "Flavor is not specified"
-msgstr ""
+msgstr "Nie podano odmiany"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:18
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_details.html:34
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:26
msgid "Template not specified"
-msgstr ""
+msgstr "Nie podano szablonu"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:21
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:29
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:31
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:101
msgid "Auto Security Group"
-msgstr ""
+msgstr "Automatyczna grupa zabezpieczeń"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:33
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:41
#: dashboards/project/data_processing/nodegroup_templates/tables.py:86
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:47
msgid "Node Processes"
-msgstr ""
+msgstr "Procesy węzła"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:43
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:51
msgid "Node processes are not specified"
-msgstr ""
+msgstr "Nie podano procesów węzła"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:63
#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:71
msgid "Node configurations are not specified"
-msgstr ""
+msgstr "Nie podano konfiguracji węzła"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_upload_file.html:22
#: dashboards/project/volumes/templates/volumes/volumes/_upload_to_image.html:40
msgid "Upload"
-msgstr ""
+msgstr "Wyślij"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/cluster_node_groups_template.html:95
msgid "Select a Node Group Template to add"
-msgstr ""
+msgstr "Wybór grupy węzłów do dodania"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/cluster_templates.html:6
msgid "Data Processing - Cluster Templates"
@@ -6098,30 +6163,30 @@ msgstr "Dodaj grupę węzłów"
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:80
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:225
msgid "Create Cluster Template"
-msgstr ""
+msgstr "Utwórz szablon klastra"
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/details.html:3
#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/details.html:6
msgid "Cluster Template Details"
-msgstr ""
+msgstr "Szczegółu szablonu klastra"
#: dashboards/project/data_processing/cluster_templates/workflows/copy.py:32
#, python-format
msgid "Cluster Template copy %s created"
-msgstr ""
+msgstr "Utworzono kopiÄ™ szablonu klastra %s."
#: dashboards/project/data_processing/cluster_templates/workflows/copy.py:96
msgid "Unable to fetch template to copy."
-msgstr ""
+msgstr "Nie można pobrać szablonu do skopiowania."
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:49
msgid "Unable to fetch plugin list."
-msgstr ""
+msgstr "Nie można pobrać listy wtyczek."
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:53
#: dashboards/project/data_processing/jobs/workflows/launch.py:354
msgid "Plugin name"
-msgstr ""
+msgstr "Nazwa wtyczki"
#: dashboards/project/data_processing/cluster_templates/workflows/create.py:69
msgid "Select plugin and hadoop version for cluster template"
@@ -6331,27 +6396,27 @@ msgstr "Skaluj"
#: dashboards/project/data_processing/clusters/workflows/scale.py:50
msgid "Scaled cluster successfully started."
-msgstr ""
+msgstr "Rozpoczęto skalowanie klastra."
#: dashboards/project/data_processing/clusters/workflows/scale.py:107
msgid "Unable to fetch cluster to scale"
-msgstr ""
+msgstr "Nie można pobrać klastra do skalowania"
#: dashboards/project/data_processing/clusters/workflows/scale.py:162
msgid "Unable to fetch cluster to scale."
-msgstr ""
+msgstr "Nie można pobrać klastra do skalowania."
#: dashboards/project/data_processing/clusters/workflows/scale.py:172
msgid "Scale cluster operation failed"
-msgstr ""
+msgstr "Operacja skalowania klastra się nie powiodła"
#: dashboards/project/data_processing/data_image_registry/forms.py:45
msgid "Successfully updated image."
-msgstr ""
+msgstr "Zaktualizowano obraz."
#: dashboards/project/data_processing/data_image_registry/forms.py:50
msgid "Failed to update image."
-msgstr ""
+msgstr "Nie można zaktualizować obrazu."
#: dashboards/project/data_processing/data_image_registry/forms.py:59
#: dashboards/project/data_processing/data_image_registry/tables.py:76
@@ -6374,42 +6439,42 @@ msgstr "Brak dostępnych obrazów."
#: dashboards/project/data_processing/data_image_registry/forms.py:83
#, python-format
msgid "Unable to retrieve images with filter %s."
-msgstr ""
+msgstr "Nie można pobrać obrazów z filtrem %s."
#: dashboards/project/data_processing/data_image_registry/forms.py:110
msgid "Unable to fetch available images."
-msgstr ""
+msgstr "Nie można pobrać dostępnych obrazów."
#: dashboards/project/data_processing/data_image_registry/panel.py:22
#: dashboards/project/data_processing/data_image_registry/tables.py:84
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/image_registry.html:6
msgid "Image Registry"
-msgstr ""
+msgstr "Rejestr obrazów"
#: dashboards/project/data_processing/data_image_registry/tables.py:30
msgid "Edit Tags"
-msgstr ""
+msgstr "Edytuj etykiety"
#: dashboards/project/data_processing/data_image_registry/tables.py:44
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_register_image.html:10
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/register_image.html:3
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/register_image.html:6
msgid "Register Image"
-msgstr ""
+msgstr "Zarejestruj obraz"
#: dashboards/project/data_processing/data_image_registry/tables.py:54
msgid "Unregister Image"
msgid_plural "Unregister Images"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyrejestruj obraz"
+msgstr[1] "Wyrejestruj obrazy"
+msgstr[2] "Wyrejestruj obrazy"
#: dashboards/project/data_processing/data_image_registry/tables.py:62
msgid "Unregistered Image"
msgid_plural "Unregistered Images"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyrejestrowano obraz"
+msgstr[1] "Wyrejestrowano obrazy"
+msgstr[2] "Wyrejestrowano obrazy"
#: dashboards/project/data_processing/data_image_registry/tables.py:80
msgid "Tags"
@@ -6422,7 +6487,7 @@ msgstr "Nie można pobrać listy obrazów"
#: dashboards/project/data_processing/data_image_registry/views.py:57
#: dashboards/project/data_processing/data_image_registry/views.py:72
msgid "Unable to process plugin tags"
-msgstr ""
+msgstr "Nie można przetworzyć etykiet wtyczek"
#: dashboards/project/data_processing/data_image_registry/views.py:98
msgid "Unable to fetch the image details"
@@ -6432,47 +6497,47 @@ msgstr "Nie można pobrać szczegółów obrazu"
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/edit_tags.html:3
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/edit_tags.html:6
msgid "Edit Image Tags"
-msgstr ""
+msgstr "Edycja etykiet obrazów"
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_edit_tags.html:27
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_register_image.html:25
msgid "Done"
-msgstr ""
+msgstr "Wykonano"
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_help.html:3
msgid "Image Registry tool:"
-msgstr ""
+msgstr "Narzędzie rejestr obrazów:"
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_help.html:6
msgid ""
"Image Registry is used to provide additional information about images for "
"Data Processing."
-msgstr ""
+msgstr "Rejestr obrazów jest wykorzystywany do dostarczania dodatkowych informacji o obrazach dla przetwarzania danych."
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_help.html:9
msgid ""
"Specified User Name will be used by Data Processing to apply configs and "
"manage processes on instances."
-msgstr ""
+msgstr "Podana nazwa użytkownika będzie wykorzystana przez przetwarzanie danych do nałożenia konfiguracji i zarządzanie procesami na instancjach."
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_help.html:12
msgid ""
"Tags are used for filtering images suitable for each plugin and each Data Processing version.\n"
" To add required tags, select a plugin and a Data Processing version and click &quot;Add plugin tags&quot; button."
-msgstr ""
+msgstr "Etykiety są używane do filtrowania obrazów odpowiednich dla każdej wtyczki i każdej wersji przetwarzania danych.\nW celu dodania wymaganych etykiet, należy wybrać wtyczkę i wersję przetwarzania danych, a następnie kliknąć przycisk &quot;Dodaj etykiety wtyczki&quot;."
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_help.html:16
msgid "You may also add any custom tag."
-msgstr ""
+msgstr "Można dodać dowolną własną etykietę."
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_help.html:19
msgid "Unnecessary tags may be removed by clicking a cross near tag's name."
-msgstr ""
+msgstr "Zbędne etykiety mogą zostać usunięte poprzez kliknięcie na krzyżyk w pobliżu nazwy etykiety."
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_tag_form.html:5
msgid ""
"Register tags required for the Plugin with specified Data Processing Version"
-msgstr ""
+msgstr "Rejestracja etykiet wymaganych dla wtyczki z podanÄ… wersjÄ… przetwarzania danych"
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_tag_form.html:8
msgid "Version"
@@ -6480,11 +6545,11 @@ msgstr "Wersja"
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_tag_form.html:30
msgid "Add plugin tags"
-msgstr ""
+msgstr "Dodaj etykiety wtyczki"
#: dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_tag_form.html:38
msgid "Add custom tag"
-msgstr ""
+msgstr "Dodaj własną etykietę"
#: dashboards/project/data_processing/data_plugins/panel.py:22
#: dashboards/project/data_processing/data_plugins/tables.py:39
@@ -6499,7 +6564,7 @@ msgstr "Tytuł"
#: dashboards/project/data_processing/data_plugins/tables.py:30
#: dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html:15
msgid "Supported Versions"
-msgstr ""
+msgstr "Wspierane wersje"
#: dashboards/project/data_processing/data_plugins/tabs.py:39
msgid "Unable to retrieve plugin."
@@ -6507,20 +6572,20 @@ msgstr "Nie można pobrać wtyczki."
#: dashboards/project/data_processing/data_plugins/views.py:40
msgid "Unable to retrieve data processing plugins."
-msgstr ""
+msgstr "Nie można pobrać wtyczek przetwarzania danych."
#: dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html:3
msgid "Data Processing Plugin Overview"
-msgstr ""
+msgstr "PrzeglÄ…d wtyczek przetwarzania danych"
#: dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html:3
#: dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html:6
msgid "Data Processing Plugin Details"
-msgstr ""
+msgstr "Szczegóły wtyczki przetwarzania danych"
#: dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/plugins.html:6
msgid "Data Processing Plugins"
-msgstr ""
+msgstr "Wtyczki przetwarzania danych"
#: dashboards/project/data_processing/data_sources/panel.py:22
#: dashboards/project/data_processing/data_sources/tables.py:69
@@ -6552,32 +6617,32 @@ msgstr[2] "Usunięto źródła danych"
#: dashboards/project/data_processing/data_sources/tabs.py:38
msgid "Unable to retrieve data source details"
-msgstr ""
+msgstr "Nie można pobrać szczegółów źródła danych"
#: dashboards/project/data_processing/data_sources/views.py:45
#: dashboards/project/data_processing/jobs/workflows/launch.py:75
msgid "Unable to fetch data sources."
-msgstr ""
+msgstr "Nie można pobrać źródeł danych."
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_create_data_source_help.html:4
msgid "Create a Data Source with a specified name."
-msgstr ""
+msgstr "Utworzenie źródła danych o podanej nazwie."
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_create_data_source_help.html:7
msgid "Select the type of your Data Source."
-msgstr ""
+msgstr "Wybór typu źródła danych."
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_create_data_source_help.html:10
msgid "You may need to enter the username and password for your Data Source."
-msgstr ""
+msgstr "Może być wymagane podanie nazwy użytkownika i hasła dla źródła danych."
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_create_data_source_help.html:13
msgid "You may also enter an optional description for your Data Source."
-msgstr ""
+msgstr "Można podać opis dla źródła danych."
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:2
msgid "Data Source Overview"
-msgstr ""
+msgstr "Przegląd źródła danych"
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html:11
#: dashboards/project/data_processing/data_sources/workflows/create.py:35
@@ -6599,35 +6664,35 @@ msgstr "Czas utworzenia"
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/details.html:3
#: dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/details.html:6
msgid "Data Source Details"
-msgstr ""
+msgstr "Szczegóły źródła danych"
#: dashboards/project/data_processing/data_sources/workflows/create.py:31
msgid "Data Source Type"
-msgstr ""
+msgstr "Typ źródła danych"
#: dashboards/project/data_processing/data_sources/workflows/create.py:37
msgid "Source username"
-msgstr ""
+msgstr "Nazwa użytkownika źródła"
#: dashboards/project/data_processing/data_sources/workflows/create.py:42
msgid "Source password"
-msgstr ""
+msgstr "Hasło źródła"
#: dashboards/project/data_processing/data_sources/workflows/create.py:80
msgid "Data source created"
-msgstr ""
+msgstr "Utworzono źródło danych"
#: dashboards/project/data_processing/data_sources/workflows/create.py:81
msgid "Could not create data source"
-msgstr ""
+msgstr "Nie można utworzyć źródła danych"
#: dashboards/project/data_processing/job_binaries/forms.py:50
msgid "Storage type"
-msgstr ""
+msgstr "Typ pamięci masowej"
#: dashboards/project/data_processing/job_binaries/forms.py:55
msgid "Internal binary"
-msgstr ""
+msgstr "Wewnętrzny plik binarny"
#: dashboards/project/data_processing/job_binaries/forms.py:58
msgid "Upload File"
@@ -6647,12 +6712,12 @@ msgstr "Nazwa użytkownika"
#: dashboards/project/data_processing/job_binaries/forms.py:98
msgid "Failed to get list of internal binaries."
-msgstr ""
+msgstr "Nie można pobrać listy wewnętrznych bibliotek."
#: dashboards/project/data_processing/job_binaries/forms.py:128
#: dashboards/project/data_processing/job_binaries/forms.py:171
msgid "Unable to create job binary"
-msgstr ""
+msgstr "Nie można utworzyć pliku binarnego zadania"
#: dashboards/project/data_processing/job_binaries/forms.py:143
#: dashboards/project/data_processing/job_binaries/tables.py:31
@@ -6660,39 +6725,39 @@ msgstr ""
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/create.html:3
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/create.html:6
msgid "Create Job Binary"
-msgstr ""
+msgstr "Utwórz plik binarny zadania"
#: dashboards/project/data_processing/job_binaries/forms.py:160
msgid "Unable to upload job binary"
-msgstr ""
+msgstr "Nie można przesłać pliku binarnego zadania"
#: dashboards/project/data_processing/job_binaries/forms.py:193
msgid "Failed to fetch internal binary list"
-msgstr ""
+msgstr "Nie można pobrać listy wewnętrznych plików binarnych"
#: dashboards/project/data_processing/job_binaries/panel.py:22
#: dashboards/project/data_processing/job_binaries/tables.py:90
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/job_binaries.html:6
msgid "Job Binaries"
-msgstr ""
+msgstr "Pliki binarne zadania"
#: dashboards/project/data_processing/job_binaries/tables.py:41
msgid "Delete Job binary"
msgid_plural "Delete Job binaries"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń pliki binarny zadania"
+msgstr[1] "Usuń pliki binarne zadania"
+msgstr[2] "Usuń pliki binarne zadania"
#: dashboards/project/data_processing/job_binaries/tables.py:49
msgid "Deleted Job binary"
msgid_plural "Deleted Job binaries"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto pliki binarny zadania"
+msgstr[1] "Usunięto pliki binarne zadania"
+msgstr[2] "Usunięto pliki binarne zadania"
#: dashboards/project/data_processing/job_binaries/tables.py:74
msgid "Download Job Binary"
-msgstr ""
+msgstr "Pobierz plik binarny zadania"
#: dashboards/project/data_processing/job_binaries/tables.py:84
msgid "Url"
@@ -6700,97 +6765,97 @@ msgstr "Url"
#: dashboards/project/data_processing/job_binaries/tabs.py:38
msgid "Unable to fetch job binary."
-msgstr ""
+msgstr "Nie można pobrać pliku binarnego zadania."
#: dashboards/project/data_processing/job_binaries/views.py:51
msgid "Unable to fetch job binary list."
-msgstr ""
+msgstr "Nie można pobrać listy plików binarnych zadania."
#: dashboards/project/data_processing/job_binaries/views.py:85
#, python-format
msgid "Unable to fetch job binary: %(exc)s"
-msgstr ""
+msgstr "Nie można pobrać pliku binarnego zadania: %(exc)s"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:4
msgid ""
"<b>Important</b>: The name that you give your job binary will be the name used in your job execution.\n"
" If your binary requires a particular name or extension (ie: \".jar\"), be sure to include it here."
-msgstr ""
+msgstr "<b>Ważne</b>: Nazwa nadana plikowi binarnemu zadania bÄ™dzie nazwÄ… wykorzystanÄ… podczas wykonywania zadania.\nJeÅ›li plik binarny wymaga specyficznej nazwy lub rozszerzenia (np. „.jarâ€), należy upewnić siÄ™ że zostaÅ‚a tutaj podana."
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:8
msgid "Select the storage type for your job binary."
-msgstr ""
+msgstr "Wybór typu pamięci masowej dla pliku binarnego zadania."
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:10
msgid "Data Processing internal database"
-msgstr ""
+msgstr "Wewnętrzna baza danych przetwarzania danych"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:15
msgid ""
"For Data Processing internal job binaries, you may choose from the "
"following:"
-msgstr ""
+msgstr "Dla wewnętrznych plików binarnych przetwarzania danych, można wybrać:"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:17
msgid "Choose an existing file"
-msgstr ""
+msgstr "IstniejÄ…cy plik"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:18
msgid "Upload a new file"
-msgstr ""
+msgstr "Przesłać nowy plik"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:19
msgid "Create a script to be uploaded dynamically"
-msgstr ""
+msgstr "Utworzyć skrypt, który zostanie automatycznie przesłany"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:23
msgid "For Object Store job binaries, you must:"
-msgstr ""
+msgstr "Dla plików binarnych w przechowywaniu obiektów, należy:"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:25
msgid "Enter the URL for the file"
-msgstr ""
+msgstr "Należy podać adres URL do pliku"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:26
msgid "Enter the username and password required to access that file"
-msgstr ""
+msgstr "Należy podać nazwę użytkownika i hasło wymagane do dostępu do pliku"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:30
msgid "You may also enter an optional description for your job binary."
-msgstr ""
+msgstr "Można podać opis pliku binarnego zadania."
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_details.html:2
msgid "Job Binary Overview"
-msgstr ""
+msgstr "PrzeglÄ…d pliku binarnego zadania"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_details.html:16
msgid "Download job binary"
-msgstr ""
+msgstr "Pobierz plik binarny zadania"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/details.html:3
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/details.html:6
msgid "Job Binary Details"
-msgstr ""
+msgstr "Szczegóły pliku binarnego zadania"
#: dashboards/project/data_processing/job_executions/panel.py:22
#: dashboards/project/data_processing/job_executions/tables.py:161
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/job_executions.html:6
msgid "Job Executions"
-msgstr ""
+msgstr "Wykonania zadań"
#: dashboards/project/data_processing/job_executions/tables.py:34
msgid "Delete Job execution"
msgid_plural "Delete Job executions"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń wykonanie zadania"
+msgstr[1] "Usuń wykonania zadań"
+msgstr[2] "Usuń wykonania zadań"
#: dashboards/project/data_processing/job_executions/tables.py:42
msgid "Deleted Job execution"
msgid_plural "Deleted Job executions"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto wykonanie zadania"
+msgstr[1] "Usunięto wykonania zadań"
+msgstr[2] "Usunięto wykonania zadań"
#: dashboards/project/data_processing/job_executions/tables.py:58
#: dashboards/project/data_processing/job_executions/tables.py:87
@@ -6804,9 +6869,9 @@ msgstr[2] ""
#: dashboards/project/data_processing/jobs/workflows/launch.py:415
msgid "Launch Job"
msgid_plural "Launch Jobs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Uruchom zadanie"
+msgstr[1] "Uruchom zadania"
+msgstr[2] "Uruchom zadania"
#: dashboards/project/data_processing/job_executions/tables.py:66
#: dashboards/project/data_processing/job_executions/tables.py:95
@@ -6815,17 +6880,17 @@ msgstr[2] ""
#: dashboards/project/data_processing/jobs/tables.py:130
msgid "Launched Job"
msgid_plural "Launched Jobs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Uruchomiono zadanie"
+msgstr[1] "Uruchomiono zadania"
+msgstr[2] "Uruchomiono zadania"
#: dashboards/project/data_processing/job_executions/tables.py:72
msgid "Relaunch On Existing Cluster"
-msgstr ""
+msgstr "Uruchom ponownie na istniejÄ…cym klastrze"
#: dashboards/project/data_processing/job_executions/tables.py:101
msgid "Relaunch On New Cluster"
-msgstr ""
+msgstr "Uruchom ponownie na nowym klastrze"
#: dashboards/project/data_processing/job_executions/tables.py:143
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:10
@@ -6834,7 +6899,7 @@ msgstr ""
#: dashboards/project/data_processing/jobs/workflows/launch.py:97
#: dashboards/project/data_processing/jobs/workflows/launch.py:122
msgid "Job"
-msgstr ""
+msgstr "Zadanie"
#: dashboards/project/data_processing/job_executions/tables.py:147
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:16
@@ -6844,19 +6909,19 @@ msgstr "Klaster"
#: dashboards/project/data_processing/job_executions/views.py:43
msgid "Unable to fetch job executions."
-msgstr ""
+msgstr "Nie można pobrać wykonań zadań."
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:3
msgid "Job Execution Overview"
-msgstr ""
+msgstr "PrzeglÄ…d wykonania zadania"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:12
msgid "Input Data Source"
-msgstr ""
+msgstr "Wejściowe źródło danych"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:14
msgid "Output Data Source"
-msgstr ""
+msgstr "Wyjściowe źródło danych"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:18
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:24
@@ -6876,11 +6941,11 @@ msgstr "Zakończono"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:24
msgid "Return Code"
-msgstr ""
+msgstr "Kod wyjścia"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:26
msgid "Oozie Job ID"
-msgstr ""
+msgstr "ID zadania Ooozie"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:28
msgctxt "Created time"
@@ -6889,18 +6954,18 @@ msgstr "Utworzono"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:30
msgid "Job Configuration"
-msgstr ""
+msgstr "Konfiguracja zadania"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/details.html:3
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/details.html:6
msgid "Job Execution Details"
-msgstr ""
+msgstr "Szczegóły wykonania zadania"
#: dashboards/project/data_processing/jobs/panel.py:22
#: dashboards/project/data_processing/jobs/tables.py:156
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/jobs.html:6
msgid "Jobs"
-msgstr ""
+msgstr "Zadania"
#: dashboards/project/data_processing/jobs/tables.py:30
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/create.html:3
@@ -6913,16 +6978,16 @@ msgstr "Utwórz zadanie"
#: dashboards/project/data_processing/jobs/tables.py:40
msgid "Delete Job"
msgid_plural "Delete Jobs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń zadanie"
+msgstr[1] "Usuń zadania"
+msgstr[2] "Usuń zadania"
#: dashboards/project/data_processing/jobs/tables.py:48
msgid "Deleted Job"
msgid_plural "Deleted Jobs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto zadanie"
+msgstr[1] "Usunięto zadania"
+msgstr[2] "Usunięto zadania"
#: dashboards/project/data_processing/jobs/tables.py:78
msgid "Launch On Existing Cluster"
@@ -6931,7 +6996,7 @@ msgstr "Uruchom na istniejÄ…cym klastrze"
#: dashboards/project/data_processing/jobs/tables.py:107
#: dashboards/project/data_processing/jobs/tables.py:136
msgid "Launch On New Cluster"
-msgstr ""
+msgstr "Uruchom na nowym klastrze"
#: dashboards/project/data_processing/jobs/views.py:48
#: dashboards/project/data_processing/jobs/workflows/launch.py:89
@@ -6940,7 +7005,7 @@ msgstr "Nie można pobrać zadań."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html:4
msgid "Create a job with a specified name."
-msgstr ""
+msgstr "Utworzenie zadania o podanej nazwie."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html:7
msgid "Select the type of your job:"
@@ -6969,104 +7034,104 @@ msgstr "MapReduce"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html:13
#: dashboards/project/data_processing/jobs/workflows/create.py:74
msgid "Java Action"
-msgstr ""
+msgstr "Akcja Java"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html:17
msgid ""
"Choose or create your main binary. Additional libraries can be added from "
"the \"Libs\" tab."
-msgstr ""
+msgstr "Wybór lub utworzenie pliku głównego. Dodatkowe biblioteki mogÄ… zostać dodane w zakÅ‚adce „Bibliotekiâ€."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html:20
msgid "For Spark jobs, only a main is required, \"libs\" are optional."
-msgstr ""
+msgstr "Dla zadań Spark wymagany jest jedynie plik główny, biblioteki są opcjonalne."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html:23
msgid ""
"For MapReduce or Java Action jobs, \"mains\" are not applicable. You are required to add one\n"
" or more \"libs\" for these jobs."
-msgstr ""
+msgstr "„Pliki gówne†nie dotyczÄ… zadaÅ„ typu MapReduce lub Java. Dla tych zadaÅ„\nnależy podać „bibliotekÄ™â€."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html:27
msgid "You may also enter an optional description for your job."
-msgstr ""
+msgstr "Można podać opis dla zadania."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_libs_help.html:4
msgid "Add libraries to your job."
-msgstr ""
+msgstr "Dodanie bibliotek do zadania."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_libs_help.html:7
msgid ""
"Choose from the list of binaries and click \"choose\" to add the library to "
"your job. This can be repeated for additional libraries."
-msgstr ""
+msgstr "Należy wybrać pozycję z listy plików binarnych, a następnie kliknąć „wybierz†by dodać bibliotekę do zadania. Czynność może zostać powtórzona dla dodatkowych bibliotek."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_details.html:12
msgid "Mains"
-msgstr ""
+msgstr "Pliki główne"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_details.html:18
#: dashboards/project/data_processing/jobs/workflows/create.py:48
msgid "Libs"
-msgstr ""
+msgstr "Biblioteki"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_launch_job_configure_help.html:4
msgid "Enter any custom configuration required for your job's execution."
-msgstr ""
+msgstr "Podanie dodatkowej konfiguracji wymaganej do uruchomienia zadania."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_launch_job_help.html:4
msgid "Launch the given job on a cluster."
-msgstr ""
+msgstr "Uruchom podane zadanie na klastrze."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_launch_job_help.html:7
msgid "Choose the cluster to use for the job execution."
-msgstr ""
+msgstr "Wybór klastra do wykonania zadania."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_launch_job_help.html:10
msgid "Choose the Input Data Source (n/a for Java jobs)."
-msgstr ""
+msgstr "Wybór wejściowego źródła danych (niedostępne dla zadań Java)."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/_launch_job_help.html:13
msgid "Choose the Output Data Source (n/a for Java jobs)."
-msgstr ""
+msgstr "Wybór wyjściowego źródła danych (niedostępne dla zadań Java)."
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/config_template.html:5
msgid "Select property name"
-msgstr ""
+msgstr "Wybór nazwy właściwości"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/config_template.html:220
msgid "Configuration"
-msgstr ""
+msgstr "Konfiguracja"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/config_template.html:223
msgid "Parameters"
-msgstr ""
+msgstr "Parametry"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/config_template.html:226
msgid "Arguments"
-msgstr ""
+msgstr "Argumenty"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/details.html:3
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/details.html:6
msgid "Job Details"
-msgstr ""
+msgstr "Szczegóły zadania"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/library_template.html:86
msgid "Choose"
-msgstr ""
+msgstr "Wybierz"
#: dashboards/project/data_processing/jobs/templates/data_processing.jobs/library_template.html:98
msgid "Chosen Libraries"
-msgstr ""
+msgstr "Wybrane biblioteki"
#: dashboards/project/data_processing/jobs/workflows/create.py:31
msgid "Choose libraries"
-msgstr ""
+msgstr "Wybierz biblioteki"
#: dashboards/project/data_processing/jobs/workflows/create.py:43
#: dashboards/project/data_processing/jobs/workflows/create.py:82
msgid "-- not selected --"
-msgstr ""
+msgstr "-- nie wybrano --"
#: dashboards/project/data_processing/jobs/workflows/create.py:57
msgid "Job Type"
@@ -7074,23 +7139,23 @@ msgstr "Typ zadania"
#: dashboards/project/data_processing/jobs/workflows/create.py:59
msgid "Choose a main binary"
-msgstr ""
+msgstr "Wybierz główny plik binarny"
#: dashboards/project/data_processing/jobs/workflows/create.py:61
msgid "Choose the binary which should be used in this Job."
-msgstr ""
+msgstr "Należy wybrać plik binarny, który ma zostać wykorzystany w zadaniu."
#: dashboards/project/data_processing/jobs/workflows/create.py:73
msgid "Streaming MapReduce"
-msgstr ""
+msgstr "Streaming MapReduce"
#: dashboards/project/data_processing/jobs/workflows/create.py:120
msgid "Job created"
-msgstr ""
+msgstr "Utworzono zadanie"
#: dashboards/project/data_processing/jobs/workflows/create.py:121
msgid "Could not create job"
-msgstr ""
+msgstr "Nie można utworzyć zadania"
#: dashboards/project/data_processing/jobs/workflows/launch.py:40
msgid "Input"
@@ -7102,7 +7167,7 @@ msgstr "Wyjście"
#: dashboards/project/data_processing/jobs/workflows/launch.py:114
msgid "Unable to fetch clusters."
-msgstr ""
+msgstr "Nie można pobrać klastrów."
#: dashboards/project/data_processing/jobs/workflows/launch.py:154
msgid "Main Class"
@@ -7122,11 +7187,11 @@ msgstr "Reducer"
#: dashboards/project/data_processing/jobs/workflows/launch.py:230
msgid "Configure"
-msgstr ""
+msgstr "Konfiguruj"
#: dashboards/project/data_processing/jobs/workflows/launch.py:308
msgid "Persist cluster after job exit"
-msgstr ""
+msgstr "Pozostaw klaster po zakończeniu zadania"
#: dashboards/project/data_processing/jobs/workflows/launch.py:331
#: dashboards/project/data_processing/jobs/workflows/launch.py:416
@@ -7165,11 +7230,11 @@ msgstr "Execution ID zadania"
#: dashboards/project/data_processing/jobs/workflows/launch.py:449
msgid "Unable to create new cluster for job."
-msgstr ""
+msgstr "Nie można utworzyć nowego klastra dla zadania."
#: dashboards/project/data_processing/jobs/workflows/launch.py:462
msgid "Unable to launch job."
-msgstr ""
+msgstr "Nie można uruchomić zadania."
#: dashboards/project/data_processing/nodegroup_templates/panel.py:22
#: dashboards/project/data_processing/nodegroup_templates/tables.py:92
@@ -7179,7 +7244,7 @@ msgstr "Szablony grup węzłów"
#: dashboards/project/data_processing/nodegroup_templates/tables.py:37
msgid "Configure Template"
-msgstr ""
+msgstr "Konfiguruj szablon"
#: dashboards/project/data_processing/nodegroup_templates/tables.py:70
#: dashboards/project/loadbalancers/tables.py:75
@@ -7198,16 +7263,16 @@ msgstr "Nie można pobrać szablonu grupy węzłów."
#: dashboards/project/data_processing/nodegroup_templates/tabs.py:49
msgid "Unable to fetch flavor for template."
-msgstr ""
+msgstr "Nie można pobrać odmiany dla szablonu."
#: dashboards/project/data_processing/nodegroup_templates/tabs.py:58
msgid "Unable to fetch floating ip pools."
-msgstr ""
+msgstr "Nie można pobrać pul pływających adresów IP."
#: dashboards/project/data_processing/nodegroup_templates/tabs.py:71
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_service_confs.html:2
msgid "Service Configurations"
-msgstr ""
+msgstr "Konfiguracje usług"
#: dashboards/project/data_processing/nodegroup_templates/views.py:48
msgid "Unable to fetch node group template list."
@@ -7215,29 +7280,29 @@ msgstr "Nie można pobrać listy szablonów grup węzłów."
#: dashboards/project/data_processing/nodegroup_templates/views.py:103
msgid "Unable to fetch template object."
-msgstr ""
+msgstr "Nie można pobrać obiektu szablonu."
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_configure_general_help.html:4
msgid "This Node Group Template will be created for:"
-msgstr ""
+msgstr "Szablon grupy węzłów zostanie utworzony dla:"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_configure_general_help.html:12
msgid ""
"The Node Group Template object should specify processes that will be "
"launched on each instance. Also an OpenStack flavor is required to boot VMs."
-msgstr ""
+msgstr "Obiekt szablonu grupy węzłów powinien określać procesy, które zostaną uruchomione na każdej instancji. Dodatkowo wymagane jest podanie odmiany OpenStack by uruchomić każdą VM."
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_configure_general_help.html:15
msgid ""
"Data Processing provides different storage location options. You may choose "
"Ephemeral Drive or a Cinder Volume to be attached to instances."
-msgstr ""
+msgstr "Przetwarzanie danych dostarcza różne opcje położenia danych. Można wykorzystać ulotny napęd lub wolumen Cinder dołączony do instancji."
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_configure_general_help.html:18
msgid ""
"When processes are selected, you may set <b>node</b> scoped Hadoop "
"configurations on corresponding tabs."
-msgstr ""
+msgstr "Jeśli wybrano procesu, można ustawić konfiguracje Hadoop <b>w obrębie węzła</b> na odpowiednich zakładkach."
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_create_general_help.html:3
msgid "Select a plugin and Hadoop version for a new Node group template."
@@ -7245,7 +7310,7 @@ msgstr "Należy wybrać wtyczkÄ™ i wersjÄ™ Hadoop dla nowego szablonu grup wÄ™zÅ
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:57
msgid "HDFS placement"
-msgstr ""
+msgstr "Ułożenie HDFS"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:59
msgid "Cinder volumes"
@@ -7270,11 +7335,11 @@ msgstr "Filtr"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_fields_help.html:4
msgid "Show full configuration"
-msgstr ""
+msgstr "Pokaż pełną konfigurację"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_fields_help.html:5
msgid "Hide full configuration"
-msgstr ""
+msgstr "Ukryj pełną konfigurację"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/configure.html:3
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/configure.html:6
@@ -7283,56 +7348,56 @@ msgstr ""
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:174
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:302
msgid "Create Node Group Template"
-msgstr ""
+msgstr "Utwórz szablon grupy węzłów"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/details.html:3
msgid "Nodegroup Template Details"
-msgstr ""
+msgstr "Szczegóły szablonu grupy węzłów"
#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/details.html:6
msgid "Node Group Template Details"
-msgstr ""
+msgstr "Szczegóły szablonu grupy węzłów"
#: dashboards/project/data_processing/nodegroup_templates/workflows/copy.py:29
#, python-format
msgid "Node Group Template copy %s created"
-msgstr ""
+msgstr "Utworzono kopię szablonu grupy węzłów %s."
#: dashboards/project/data_processing/nodegroup_templates/workflows/copy.py:77
msgid "Unable to fetch plugin details."
-msgstr ""
+msgstr "Nie można pobrać szczegółów wtyczki."
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:43
msgid "OpenStack Flavor"
-msgstr ""
+msgstr "Odmiana OpenStack"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:46
msgid "Storage location"
-msgstr ""
+msgstr "Położenie danych"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:47
msgid "Choose a storage location"
-msgstr ""
+msgstr "Wybór położenia danych"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:60
msgid "Volumes size (GB)"
-msgstr ""
+msgstr "Rozmiar wolumenu (GB)"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:88
msgid "Unable to generate process choices."
-msgstr ""
+msgstr "Nie można utworzyć wyboru procesów."
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:96
msgid "Floating IP pool"
-msgstr ""
+msgstr "Pula pływających adresów IP."
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:103
msgid "Create security group for this Node Group."
-msgstr ""
+msgstr "Utwórz grupę zabezpieczeń dla tej grupy węzłów."
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:111
msgid "Launch instances in these security groups."
-msgstr ""
+msgstr "Uruchomienie instancji z podanymi grupami zabezpieczeń."
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:116
msgid "Processes"
@@ -7340,16 +7405,16 @@ msgstr "Procesy"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:118
msgid "Processes to be launched in node group"
-msgstr ""
+msgstr "Procesy do uruchomienia w grupie węzłów"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:150
msgid "Configure Node Group Template"
-msgstr ""
+msgstr "Konfiguracja szablonu grupy węzłów"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:176
#, python-format
msgid "Created Node Group Template %s"
-msgstr ""
+msgstr "Utworzono szablon grupy węzłów %s"
#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:283
msgid "Select plugin and hadoop version"
@@ -7357,15 +7422,15 @@ msgstr "Należy wybrać wtyczkę i wersję Hadoop"
#: dashboards/project/data_processing/utils/anti_affinity.py:31
msgid "Use anti-affinity groups for: "
-msgstr ""
+msgstr "Wykorzystaj grupy anti-affinity dla:"
#: dashboards/project/data_processing/utils/anti_affinity.py:33
msgid "Use anti-affinity groups for processes"
-msgstr ""
+msgstr "Wykorzystaj grupy anti-affinity dla procesów."
#: dashboards/project/data_processing/utils/anti_affinity.py:66
msgid "Unable to populate anti-affinity processes."
-msgstr ""
+msgstr "Nie można wypełnić procesów anti-affinity."
#: dashboards/project/data_processing/utils/neutron_support.py:32
#: dashboards/project/databases/workflows/create_instance.py:161
@@ -7375,11 +7440,11 @@ msgstr "Nie można pobrać sieci."
#: dashboards/project/data_processing/utils/workflow_helpers.py:111
msgid "Node group cluster"
-msgstr ""
+msgstr "Klaster grupy węzłów"
#: dashboards/project/data_processing/utils/workflow_helpers.py:115
msgid "Count"
-msgstr ""
+msgstr "Ilość"
#: dashboards/project/data_processing/utils/workflow_helpers.py:168
msgid "Plugin Name"
@@ -7433,19 +7498,19 @@ msgstr "Niedostępne "
#: dashboards/project/databases/templates/databases/_detail_overview.html:13
#: dashboards/project/databases/workflows/create_instance.py:42
msgid "Datastore"
-msgstr ""
+msgstr "Datastore"
#: dashboards/project/database_backups/tables.py:135
#: dashboards/project/database_backups/templates/database_backups/details.html:27
#: dashboards/project/databases/tables.py:202
#: dashboards/project/databases/templates/databases/_detail_overview.html:15
msgid "Datastore Version"
-msgstr ""
+msgstr "Wersja datastore"
#: dashboards/project/database_backups/tables.py:141
#: dashboards/project/databases/tables.py:271
msgid "Incremental"
-msgstr ""
+msgstr "Przyrostowy"
#: dashboards/project/database_backups/views.py:48
msgid "Not Found"
@@ -7463,18 +7528,18 @@ msgstr "Nie można pobrać szczegółów kopii zapasowej: %s"
#: dashboards/project/database_backups/views.py:96
#, python-format
msgid "Unable to retrieve details for parent backup: %s"
-msgstr ""
+msgstr "Nie można pobrać szczegółów nadrzędnej kopii zapasowej: %s"
#: dashboards/project/database_backups/templates/database_backups/_backup_details_help.html:3
msgid "Specify the details for the database backup."
-msgstr ""
+msgstr "Szczegóły kopii zapasowej bazy danych."
#: dashboards/project/database_backups/templates/database_backups/_backup_details_help.html:4
msgid ""
"You can perform an incremental backup by specifying a parent backup. "
"<strong>However,</strong> not all databases support incremental backups in "
"which case this operation will result in an error."
-msgstr ""
+msgstr "Można utworzyć przyrostową kopię zapasową poprzez podanie nadrzędnej kopii zapasowej. Jednakże <strong>nie wszystkie</strong> bazy danych wspierają kopie przyrostowe - w takich przypadkach zostanie wygenerowany błąd."
#: dashboards/project/database_backups/templates/database_backups/backup.html:3
#: dashboards/project/database_backups/templates/database_backups/backup.html:6
@@ -7484,11 +7549,11 @@ msgstr "Utwórz kopię zapasową bazy danych"
#: dashboards/project/database_backups/templates/database_backups/details.html:3
msgid "Backup Details"
-msgstr ""
+msgstr "Szczegóły kopii zapasowej"
#: dashboards/project/database_backups/templates/database_backups/details.html:6
msgid "Backup Details: "
-msgstr ""
+msgstr "Szczegóły kopii zapasowej: "
#: dashboards/project/database_backups/templates/database_backups/details.html:12
msgid "Backup Overview"
@@ -7515,12 +7580,12 @@ msgstr "Czas trwania kopii zapasowej"
#: dashboards/project/database_backups/templates/database_backups/details.html:47
msgid "Incremental Backup"
-msgstr ""
+msgstr "Przyrostowa kopia zapasowa"
#: dashboards/project/database_backups/templates/database_backups/details.html:50
#: dashboards/project/database_backups/workflows/create_backup.py:38
msgid "Parent Backup"
-msgstr ""
+msgstr "Nadrzędna kopia zapasowa"
#: dashboards/project/database_backups/templates/database_backups/details.html:61
msgid "Database Info"
@@ -7540,24 +7605,24 @@ msgstr "Opcjonalny opis kopii zapasowej"
#: dashboards/project/database_backups/workflows/create_backup.py:40
msgid "Optional parent backup"
-msgstr ""
+msgstr "Opcjonalna nadrzędna kopia zapasowa"
#: dashboards/project/database_backups/workflows/create_backup.py:53
msgid "Unable to list database instances to backup."
-msgstr ""
+msgstr "Nie można pobrać listy instancji bazy danych celem utworzenia kopii zapasowej."
#: dashboards/project/database_backups/workflows/create_backup.py:65
msgid "Unable to list database backups for parent."
-msgstr ""
+msgstr "Nie można pobrać listy kopii zapasowych dla nadrzędnej kopii."
#: dashboards/project/database_backups/workflows/create_backup.py:69
msgid "Select parent backup"
-msgstr ""
+msgstr "Wybierz nadrzędną kopię zapasową"
#: dashboards/project/database_backups/workflows/create_backup.py:71
#: dashboards/project/databases/workflows/create_instance.py:248
msgid "No backups available"
-msgstr ""
+msgstr "Brak dostępnych kopii zapasowych"
#: dashboards/project/database_backups/workflows/create_backup.py:84
#, python-format
@@ -7593,7 +7658,7 @@ msgstr "Nowy rozmiar (GB)"
#: dashboards/project/databases/forms.py:39
msgid "New size for volume must be greater than current size."
-msgstr ""
+msgstr "Nowy rozmiar wolumenu musi być większy od bieżącego wolumenu."
#: dashboards/project/databases/forms.py:50
#, python-format
@@ -7789,7 +7854,7 @@ msgstr "<strong>Uwaga:</strong> Wartość podana w polu rozmiar wolumenu powinna
#: dashboards/project/databases/templates/databases/_launch_initialize_help.html:3
#: dashboards/project/databases/workflows/create_instance.py:189
msgid "Initial Databases"
-msgstr ""
+msgstr "PoczÄ…tkowe bazy danych"
#: dashboards/project/databases/templates/databases/_launch_initialize_help.html:4
msgid "Optionally provide a comma separated list of databases to create:"
@@ -7854,17 +7919,17 @@ msgstr "Utwórz bazę danych z poprzedniej kopii zapasowej."
#: dashboards/project/databases/templates/databases/resize_volume.html:3
#: dashboards/project/databases/templates/databases/resize_volume.html:6
msgid "Resize Database Volume"
-msgstr ""
+msgstr "Zmień rozmiar wolumenu bazodanowego"
#: dashboards/project/databases/templates/databases/_resize_volume.html:18
msgid "Specify the new volume size for the database instance."
-msgstr ""
+msgstr "Należy podać nowy rozmiar wolumenu dla instancji bazy danych."
#: dashboards/project/databases/templates/databases/_resize_volume.html:19
msgid ""
"<strong>Please note:</strong> The new value must be greater than the "
"existing volume size."
-msgstr ""
+msgstr "<strong>Uwaga:</strong> Nowa wartość musi być większa niż obecny rozmiar wolumenu."
#: dashboards/project/databases/templates/databases/detail.html:3
#: dashboards/project/instances/templates/instances/detail.html:3
@@ -7898,19 +7963,19 @@ msgstr "Rozmiar wolumenu w GB."
#: dashboards/project/databases/workflows/create_instance.py:44
msgid "Type and version of datastore."
-msgstr ""
+msgstr "Typ i wersja datastore."
#: dashboards/project/databases/workflows/create_instance.py:52
msgid "You must select a datastore type and version."
-msgstr ""
+msgstr "Należy wybrać typ datastore oraz wersję."
#: dashboards/project/databases/workflows/create_instance.py:64
msgid "Unable to obtain flavors."
-msgstr ""
+msgstr "Nie można pobrać odmian."
#: dashboards/project/databases/workflows/create_instance.py:115
msgid "Select datastore type and version"
-msgstr ""
+msgstr "Wybór typu datastore oraz wersji"
#: dashboards/project/databases/workflows/create_instance.py:135
#: dashboards/project/instances/workflows/create_instance.py:644
@@ -8186,23 +8251,23 @@ msgstr "Utwórz zaporę ogniową"
#: dashboards/project/firewalls/tables.py:66
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Dodano do kolejki usunięcie reguły"
+msgstr[1] "Dodano do kolejki usunięcie reguł"
+msgstr[2] "Dodano do kolejki usunięcie reguł"
#: dashboards/project/firewalls/tables.py:80
msgid "Delete Policy"
msgid_plural "Delete Policies"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń politykę"
+msgstr[1] "Usuń polityki"
+msgstr[2] "Usuń polityki"
#: dashboards/project/firewalls/tables.py:88
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Dodano do kolejki usunięcie polityki"
+msgstr[1] "Dodano do kolejki usunięcie polityk"
+msgstr[2] "Dodano do kolejki usunięcie polityk"
#: dashboards/project/firewalls/tables.py:103
msgid "Delete Firewall"
@@ -8214,9 +8279,9 @@ msgstr[2] "Usuń zapory ogniowe"
#: dashboards/project/firewalls/tables.py:111
msgid "Scheduled deletion of Firewall"
msgid_plural "Scheduled deletion of Firewalls"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Dodano do kolejki usunięcie zapory ogniowej"
+msgstr[1] "Dodano do kolejki usunięcie zapór ogniowych"
+msgstr[2] "Dodano do kolejki usunięcie zapór ogniowych"
#: dashboards/project/firewalls/tables.py:121
#: dashboards/project/firewalls/templates/firewalls/_updaterule.html:8
@@ -8332,7 +8397,7 @@ msgstr "Nie można usunąć reguły. %s"
#: dashboards/project/firewalls/views.py:75
#, python-format
msgid "Deleted policy %s"
-msgstr ""
+msgstr "Usunięto politykę %s"
#: dashboards/project/firewalls/views.py:78
#, python-format
@@ -8342,7 +8407,7 @@ msgstr "Nie można usunąć zasady. %s"
#: dashboards/project/firewalls/views.py:84
#, python-format
msgid "Deleted firewall %s"
-msgstr ""
+msgstr "Usunięto zaporę ogniową %s"
#: dashboards/project/firewalls/views.py:87
#, python-format
@@ -8607,7 +8672,7 @@ msgstr "Minimalny rozmiar dysku wymagany do uruchomienia obrazu. Jeśli nie zost
#: dashboards/project/images/images/forms.py:93
#: dashboards/project/images/images/forms.py:229
msgid "Minimum RAM (MB)"
-msgstr ""
+msgstr "Minimalna ilość RAM (MB)"
#: dashboards/project/images/images/forms.py:95
#: dashboards/project/images/images/forms.py:231
@@ -8667,9 +8732,9 @@ msgstr[2] "Usuń obrazy"
#: dashboards/project/images/images/tables.py:71
msgid "Deleted Image"
msgid_plural "Deleted Images"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto obraz"
+msgstr[1] "Usunięto obrazy"
+msgstr[2] "Usunięto obrazy"
#: dashboards/project/images/images/tables.py:119
#: dashboards/project/volumes/snapshots/tables.py:93
@@ -8716,7 +8781,7 @@ msgstr "Nie można pobrać instancji."
msgid ""
"Images can be provided via an HTTP URL or be uploaded from your local file "
"system. Compressed image binaries are supported (.zip and .tar.gz.)"
-msgstr ""
+msgstr "Obrazy mogą być pobierane z adresów URL HTTP lub przesyłane bezpośrednio z komputera. Wspierane są skompresowane pliki binarne obrazów (.zip oraz .tar.gz)."
#: dashboards/project/images/templates/images/images/_create.html:30
msgid ""
@@ -8724,7 +8789,7 @@ msgid ""
"valid and direct URL to the image binary; it must also be accessible to the "
"Image Service. URLs that redirect or serve error pages will result in "
"unusable images."
-msgstr ""
+msgstr "Po wybraniu obrazu poprzez adres URL HTTP, pole Położenie obrazu musi być poprawnym i bezpośrednim adresem URL do pliku binarnego obrazu. Ponadto musi być dostępne z usługi obrazów. Adresy URL, które są przekierowaniami lub stronami błędów spowodują powstanie błędnych obrazów."
#: dashboards/project/images/templates/images/images/_detail_overview.html:3
msgid "Image Overview"
@@ -8793,7 +8858,7 @@ msgstr "Utwórz migawkę"
#: dashboards/project/instances/audit_tables.py:24
msgid "Request ID"
-msgstr ""
+msgstr "ID żądania"
#: dashboards/project/instances/audit_tables.py:26
msgid "Start Time"
@@ -8806,16 +8871,16 @@ msgstr "Wiadomość"
#: dashboards/project/instances/audit_tables.py:33
msgid "Instance Action List"
-msgstr ""
+msgstr "Lista akcji instancji"
#: dashboards/project/instances/console.py:41
#, python-format
msgid "Console type \"%s\" not supported."
-msgstr ""
+msgstr "Niewspierany typ konsoli „%sâ€."
#: dashboards/project/instances/console.py:66
msgid "No available console found."
-msgstr ""
+msgstr "Nie znaleziono dostępnej konsoli."
#: dashboards/project/instances/forms.py:42
msgid "Rebuild Password"
@@ -8891,44 +8956,44 @@ msgstr "Nie można pobrać hasła instancji."
#: dashboards/project/instances/tables.py:90
msgid "Terminate Instance"
msgid_plural "Terminate Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Zniszcz instancjÄ™"
+msgstr[1] "Zniszcz instancje"
+msgstr[2] "Zniszcz instancje"
#: dashboards/project/instances/tables.py:98
msgid "Scheduled termination of Instance"
msgid_plural "Scheduled termination of Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Zakolejkowano zniszczenie instancji"
+msgstr[1] "Zakolejkowano zniszczenie instancji"
+msgstr[2] "Zakolejkowano zniszczenie instancji"
#: dashboards/project/instances/tables.py:119
msgid "Hard Reboot Instance"
msgid_plural "Hard Reboot Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Twardo zrestartuj instancjÄ™"
+msgstr[1] "Twardo zrestartuj instancje"
+msgstr[2] "Twardo zrestartuj instancje"
#: dashboards/project/instances/tables.py:127
msgid "Hard Rebooted Instance"
msgid_plural "Hard Rebooted Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Twardo zrestartowano instancjÄ™"
+msgstr[1] "Twardo zrestartowano instancje"
+msgstr[2] "Twardo zrestartowano instancje"
#: dashboards/project/instances/tables.py:150
msgid "Soft Reboot Instance"
msgid_plural "Soft Reboot Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Miękko zrestartuj instancję"
+msgstr[1] "Miękko zrestartuj instancje"
+msgstr[2] "Miękko zrestartuj instancje"
#: dashboards/project/instances/tables.py:158
msgid "Soft Rebooted Instance"
msgid_plural "Soft Rebooted Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Miękko zrestartowano instancję"
+msgstr[1] "Miękko zrestartowano instancje"
+msgstr[2] "Miękko zrestartowano instancje"
#: dashboards/project/instances/tables.py:175
msgid "Pause Instance"
@@ -8963,20 +9028,20 @@ msgstr[2] "Wznowiono instancje"
#: dashboards/project/instances/tables.py:242
msgid "Suspend Instance"
msgid_plural "Suspend Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Uśpij instancję"
+msgstr[1] "Uśpij instancje"
+msgstr[2] "Uśpij instancje"
#: dashboards/project/instances/tables.py:257
msgid "Suspended Instance"
msgid_plural "Suspended Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wstrzymano instancjÄ™"
+msgstr[1] "Wstrzymano instancje"
+msgstr[2] "Wstrzymano instancje"
#: dashboards/project/instances/tables.py:370
msgid "Edit Security Groups"
-msgstr "Modyfikacja grup zabezpieczeń"
+msgstr "Modyfikuj grupy zabezpieczeń"
#: dashboards/project/instances/tables.py:396
#: dashboards/project/instances/tabs.py:58
@@ -9073,17 +9138,17 @@ msgstr[2] "Uruchomione instancje"
msgctxt "Action to perform (the instance is currently running)"
msgid "Shut Off Instance"
msgid_plural "Shut Off Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyłącz instancję"
+msgstr[1] "Wyłącz instancje"
+msgstr[2] "Wyłącz instancje"
#: dashboards/project/instances/tables.py:696
msgctxt "Past action (the instance is currently already Shut Off)"
msgid "Shut Off Instance"
msgid_plural "Shut Off Instances"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyłącz instancję"
+msgstr[1] "Wyłącz instancje"
+msgstr[2] "Wyłącz instancje"
#: dashboards/project/instances/tables.py:723
#, python-format
@@ -9164,32 +9229,32 @@ msgstr "W trakcie migracji"
#: dashboards/project/instances/tables.py:767
msgctxt "Current status of an Instance"
msgid "Build"
-msgstr "Zbuduj"
+msgstr "Budowanie"
#: dashboards/project/instances/tables.py:768
msgctxt "Current status of an Instance"
msgid "Rescue"
-msgstr ""
+msgstr "Ratuj"
#: dashboards/project/instances/tables.py:771
msgctxt "Current status of an Instance"
msgid "Soft Deleted"
-msgstr ""
+msgstr "Miękko usunięta"
#: dashboards/project/instances/tables.py:772
msgctxt "Current status of an Instance"
msgid "Shelved"
-msgstr ""
+msgstr "Odłożona na półkę"
#: dashboards/project/instances/tables.py:774
msgctxt "Current status of an Instance"
msgid "Shelved Offloaded"
-msgstr ""
+msgstr "Odłożona na półkę - Offloaded"
#: dashboards/project/instances/tables.py:780
msgctxt "Task status of an Instance"
msgid "Scheduling"
-msgstr ""
+msgstr "Kolejkowanie"
#: dashboards/project/instances/tables.py:782
msgctxt "Task status of an Instance"
@@ -9204,7 +9269,7 @@ msgstr "Sieć"
#: dashboards/project/instances/tables.py:785
msgctxt "Task status of an Instance"
msgid "Spawning"
-msgstr ""
+msgstr "Uruchamianie"
#: dashboards/project/instances/tables.py:787
msgctxt "Task status of an Instance"
@@ -9305,12 +9370,12 @@ msgstr "WÅ‚Ä…czanie"
#: dashboards/project/instances/tables.py:822
msgctxt "Task status of an Instance"
msgid "Rescuing"
-msgstr ""
+msgstr "Ratowanie"
#: dashboards/project/instances/tables.py:824
msgctxt "Task status of an Instance"
msgid "Unrescuing"
-msgstr ""
+msgstr "Kończenie ratowania"
#: dashboards/project/instances/tables.py:826
msgctxt "Task status of an Instance"
@@ -9325,7 +9390,7 @@ msgstr "Przebuduj mapowanie urzÄ…dzenia blokowego"
#: dashboards/project/instances/tables.py:830
msgctxt "Task status of an Instance"
msgid "Rebuild Spawning"
-msgstr ""
+msgstr "Przebudowywanie/Uruchamianie"
#: dashboards/project/instances/tables.py:831
msgctxt "Task status of an Instance"
@@ -9350,27 +9415,27 @@ msgstr "Przywracanie"
#: dashboards/project/instances/tables.py:836
msgctxt "Task status of an Instance"
msgid "Shelving"
-msgstr ""
+msgstr "Odkładanie na półkę"
#: dashboards/project/instances/tables.py:838
msgctxt "Task status of an Instance"
msgid "Shelving Image Pending Upload"
-msgstr ""
+msgstr "Odkładanie na półkę: oczekiwanie na przesłanie obrazu"
#: dashboards/project/instances/tables.py:840
msgctxt "Task status of an Instance"
msgid "Shelving Image Uploading"
-msgstr ""
+msgstr "Odkładanie na półkę: przesyłanie obrazu"
#: dashboards/project/instances/tables.py:842
msgctxt "Task status of an Instance"
msgid "Shelving Offloading"
-msgstr ""
+msgstr "Odkładanie na półkę: rozładowanie"
#: dashboards/project/instances/tables.py:844
msgctxt "Task status of an Instance"
msgid "Unshelving"
-msgstr ""
+msgstr "Przywracanie z półki"
#: dashboards/project/instances/tables.py:848
msgctxt "Power state of an Instance"
@@ -9380,7 +9445,7 @@ msgstr "Bez stanu"
#: dashboards/project/instances/tables.py:849
msgctxt "Power state of an Instance"
msgid "Running"
-msgstr ""
+msgstr "Pracuje"
#: dashboards/project/instances/tables.py:850
msgctxt "Power state of an Instance"
@@ -9405,7 +9470,7 @@ msgstr "Wyłącz"
#: dashboards/project/instances/tables.py:854
msgctxt "Power state of an Instance"
msgid "Crashed"
-msgstr ""
+msgstr "Uległa awarii"
#: dashboards/project/instances/tables.py:855
msgctxt "Power state of an Instance"
@@ -9439,11 +9504,11 @@ msgstr "Nie można pobrać logu dla instancji „%sâ€."
#: dashboards/project/instances/tabs.py:81
msgid "Action Log"
-msgstr ""
+msgstr "Log akcji"
#: dashboards/project/instances/tabs.py:94
msgid "Unable to retrieve instance action list."
-msgstr ""
+msgstr "Nie można pobrać listy akcji instancji."
#: dashboards/project/instances/utils.py:31
msgid "Unable to retrieve instance flavors."
@@ -9657,17 +9722,17 @@ msgstr "Żadna z odmian nie spełnia wymaganych kryteriów dla wybranego obrazu.
#: dashboards/project/instances/templates/instances/_launch_advanced_help.html:2
msgid "Specify advanced options to use when launching an instance."
-msgstr ""
+msgstr "Zaawansowane opcje podczas uruchamiania instancji."
#: dashboards/project/instances/templates/instances/_launch_customize_help.html:2
msgid ""
"You can customize your instance after it has launched using the options "
"available here."
-msgstr ""
+msgstr "Można dostosować instancję po jej uruchomieniu wykorzystując dostępne w tym miejscu opcje."
#: dashboards/project/instances/templates/instances/_launch_customize_help.html:3
msgid "\"Customization Script\" is analogous to \"User Data\" in other systems."
-msgstr ""
+msgstr "„Skrypt dostosowujący†jest odpowiednikiem „danych użytkownika†w innych systemach."
#: dashboards/project/instances/templates/instances/_launch_details_help.html:6
msgid ""
@@ -9679,7 +9744,7 @@ msgstr "Poniższy wykres obrazuje wykorzystanie zasobów względem jego limitów
msgid ""
"Choose network from Available networks to Selected networks by push button "
"or drag and drop, you may change NIC order by drag and drop as well. "
-msgstr ""
+msgstr "Należy wybrać sieć z listy dostępnych sieci, poprzez kliknięcie przycisku lub przeciągnięcie i upuszczenie na listę wybranych sieci. Można też zmienić kolejność kart sieciowych poprzez przeciąganie i upuszczanie."
#: dashboards/project/instances/templates/instances/_launch_volumes_help.html:3
msgid ""
@@ -9784,26 +9849,26 @@ msgid ""
msgid_plural ""
"The requested %(req)i instances cannot be launched as you only have "
"%(avail)i of your quota available."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Żądane instancja nie może zostać uruchomiona, ponieważ pozostało tylko %(avail)i dostępnych limitów."
+msgstr[1] "Żądane %(req)i instancje nie mogą zostać uruchomione, ponieważ pozostało tylko %(avail)i dostępnych limitów."
+msgstr[2] "Żądane %(req)i instancji nie może zostać uruchomione, ponieważ pozostało tylko %(avail)i dostępnych limitów."
#: dashboards/project/instances/workflows/create_instance.py:197
#, python-format
msgid "Cores(Available: %(avail)s, Requested: %(req)s)"
-msgstr ""
+msgstr "Rdzenie (Dostępne: %(avail)s, Żądane: %(req)s)"
#: dashboards/project/instances/workflows/create_instance.py:204
#, python-format
msgid "RAM(Available: %(avail)s, Requested: %(req)s)"
-msgstr ""
+msgstr "RAM (Dostępna: %(avail)s, Żądana: %(req)s)"
#: dashboards/project/instances/workflows/create_instance.py:211
#, python-format
msgid ""
"The requested instance cannot be launched. The following requested "
"resource(s) exceed quota(s): %s."
-msgstr ""
+msgstr "Nie można uruchomić żądanej instancji. Następujące limit/y zostały przekroczony/e: %s."
#: dashboards/project/instances/workflows/create_instance.py:225
msgid "You must set volume size"
@@ -9864,7 +9929,7 @@ msgstr "Dowolna strefa dostępności"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "Nie można pobrać informacji o limitach."
@@ -9957,11 +10022,11 @@ msgstr "Po uruchomieniu"
#: dashboards/project/instances/workflows/create_instance.py:564
#: dashboards/project/stacks/forms.py:57
msgid "Direct Input"
-msgstr "bezpośrednie"
+msgstr "Bezpośrednio"
#: dashboards/project/instances/workflows/create_instance.py:568
msgid "Customization Script Source"
-msgstr ""
+msgstr "Źródło skryptu dostosowującego"
#: dashboards/project/instances/workflows/create_instance.py:572
msgid ""
@@ -9972,16 +10037,16 @@ msgstr "Skrypt lub zestaw poleceń, który należy wykonać po zbudowaniu instan
#: dashboards/project/instances/workflows/create_instance.py:576
#: dashboards/project/instances/workflows/create_instance.py:581
msgid "Script File"
-msgstr ""
+msgstr "Plik skryptu"
#: dashboards/project/instances/workflows/create_instance.py:585
#: dashboards/project/instances/workflows/create_instance.py:590
msgid "Script Data"
-msgstr ""
+msgstr "Dane skryptu"
#: dashboards/project/instances/workflows/create_instance.py:617
msgid "File exceeds maximum size (16kb)"
-msgstr ""
+msgstr "Plik przekracza dozwolony rozmiar (16kb)"
#: dashboards/project/instances/workflows/create_instance.py:625
#: dashboards/project/stacks/forms.py:186
@@ -10001,17 +10066,17 @@ msgstr "Uruchom instancjÄ™ z tym profilem zasad"
msgid ""
"Automatic: The entire disk is a single partition and automatically resizes. "
"Manual: Results in faster build times but requires manual partitioning."
-msgstr ""
+msgstr "Automatyczne: Cały dysk jest jedną partycją i zmienia rozmiar automatycznie.\nRęczne: Pozwala na krótsze czasy budowania, jednakże wymaga ręcznego partycjonowania."
#: dashboards/project/instances/workflows/create_instance.py:731
msgid "Configuration Drive"
-msgstr ""
+msgstr "Dysk konfiguracyjny"
#: dashboards/project/instances/workflows/create_instance.py:732
msgid ""
"Configure OpenStack to write metadata to a special configuration drive that "
"attaches to the instance when it boots."
-msgstr ""
+msgstr "Pozwala skonfigurować OpenStack by zapisywał metadane do specjalnego dysku konfiguracyjnego, który jest dołączany do instancji podczas uruchamiania."
#: dashboards/project/instances/workflows/create_instance.py:758
msgid "Advanced Options"
@@ -10045,7 +10110,7 @@ msgstr "Wybór odmiany"
#: dashboards/project/instances/workflows/resize_instance.py:52
msgid "Please choose a new flavor that is not the same as the old one."
-msgstr ""
+msgstr "Należy wybrać nową odmianę, która nie jest taka sama jak obecna."
#: dashboards/project/instances/workflows/resize_instance.py:61
msgid "Select a New Flavor"
@@ -10077,7 +10142,7 @@ msgstr "Nie można pobrać listy grup zabezpieczeń. Proszę spróbować późni
msgid ""
"Add and remove security groups to this project from the list of available "
"security groups."
-msgstr ""
+msgstr "Dodanie lub usunięcie grup zabezpieczeń do tego projektu z listy dostępnych grup zabezpieczeń."
#: dashboards/project/instances/workflows/update_instance.py:88
msgid "All Security Groups"
@@ -10097,7 +10162,7 @@ msgstr "Nie włączono grup zabezpieczeń."
#: dashboards/project/instances/workflows/update_instance.py:121
msgid "Edit the instance details."
-msgstr ""
+msgstr "Edycja szczegółów instancji."
#: dashboards/project/instances/workflows/update_instance.py:134
#, python-format
@@ -10448,7 +10513,7 @@ msgstr "Nie można pobrać szczegółów monitora stanu."
msgid ""
"%(type)s: url:%(url_path)s method:%(http_method)s codes:%(expected_codes)s "
"delay:%(delay)d retries:%(max_retries)d timeout:%(timeout)d"
-msgstr ""
+msgstr "%(type)s: url:%(url_path)s metoda:%(http_method)s kody:%(expected_codes)s opóźnienie:%(delay)d powtórzenie:%(max_retries)d timeout:%(timeout)d"
#: dashboards/project/loadbalancers/utils.py:27
#, python-format
@@ -10592,11 +10657,11 @@ msgstr "Nie można dodać puli „%sâ€."
#: dashboards/project/loadbalancers/workflows.py:159
msgid "VIP Subnet"
-msgstr ""
+msgstr "Podsieć VIP"
#: dashboards/project/loadbalancers/workflows.py:162
msgid "Specify a free IP address from the selected subnet"
-msgstr ""
+msgstr "Należy podać wolny adres IP z wybranej podsieci."
#: dashboards/project/loadbalancers/workflows.py:214
msgid "No Session Persistence"
@@ -10611,7 +10676,7 @@ msgid ""
"Create a VIP for this pool. Assign a name, description, IP address, port, "
"and maximum connections allowed for the VIP. Choose the protocol and session"
" persistence method for the VIP. Admin State is UP (checked) by default."
-msgstr ""
+msgstr "Tworzenie VIP dla tej puli. Należy podać nazwę, opis, adres IP, port oraz maksymalną liczbę połączeń dozwoloną dla tego VIP. Trzeba też wybrać protokół oraz metodę przypinania sesji dla VIP. Stan administracyjny jest domyślnie UP (zaznaczony)."
#: dashboards/project/loadbalancers/workflows.py:260
#, python-format
@@ -10630,16 +10695,16 @@ msgstr "Nie można pobrać podanej puli. Nie można dodać VIP-a „%sâ€."
#: dashboards/project/loadbalancers/workflows.py:302
msgid "Member Source"
-msgstr ""
+msgstr "Źródło członka"
#: dashboards/project/loadbalancers/workflows.py:303
msgid "Select from active instances"
-msgstr ""
+msgstr "Wybierz z aktywnych instancji"
#: dashboards/project/loadbalancers/workflows.py:304
#: dashboards/project/loadbalancers/workflows.py:321
msgid "Specify member IP address"
-msgstr ""
+msgstr "Należy podać adres IP członka."
#: dashboards/project/loadbalancers/workflows.py:311
#: dashboards/project/loadbalancers/workflows.py:317
@@ -10653,19 +10718,19 @@ msgstr "Wybierz członków z tej puli"
#: dashboards/project/loadbalancers/workflows.py:320
#: dashboards/project/loadbalancers/workflows.py:326
msgid "Member address"
-msgstr ""
+msgstr "Adres członka"
#: dashboards/project/loadbalancers/workflows.py:332
msgid ""
"Relative part of requests this pool member serves compared to others. \n"
"The same weight will be applied to all the selected members and can be modified later. Weight must be in the range 1 to 256."
-msgstr ""
+msgstr "Względna część żądań, którą ten członek będzie obsługiwał w porównaniu do innych.\nTa sama waga zostanie aplikowana do wszystkich wybranych członków i może zostać zmieniona później. Waga musi być z zakresu 1 do 256."
#: dashboards/project/loadbalancers/workflows.py:339
msgid ""
"Enter an integer value between 1 and 65535. The same port will be used for "
"all the selected members and can be modified later."
-msgstr ""
+msgstr "Należy podać wartość całkowitą pomiędzy 1 a 65535. Ten sam port zostanie wykorzystany dla wszystkich członków i może być zmieniony później."
#: dashboards/project/loadbalancers/workflows.py:351
msgid "Select a Pool"
@@ -10687,7 +10752,7 @@ msgstr "Należy podać przynajmniej jednego członka"
#: dashboards/project/loadbalancers/workflows.py:395
msgid "Member IP address must be specified"
-msgstr ""
+msgstr "Adres IP członka musi zostać podany."
#: dashboards/project/loadbalancers/workflows.py:400
msgid "Add New Member"
@@ -10700,7 +10765,7 @@ msgid ""
"Choose one or more listed instances to be added to the pool as member(s). Assign a numeric weight and port number for the selected member(s) to operate(s) on; e.g., 80. \n"
"\n"
"Only one port can be associated with each instance."
-msgstr ""
+msgstr "Dodanie członków do wybranej puli.\n\nNależy wybrać jedną lub więcej instancji, które mają zostać dodane do puli jako członkowie.\nWymagane są również waga i numer portu, na którym pracują wybrani członkowie, np. 80.\n\nTylko jeden port może być powiązany z każdą instancją."
#: dashboards/project/loadbalancers/workflows.py:426
msgid "Added member(s)."
@@ -10873,7 +10938,7 @@ msgstr "Pozwala zmodyfikować atrybuty monitora stanu: opóźnienie, limit czasu
msgid ""
"You may update pool attributes here: edit name, description, load balancing "
"method or admin state."
-msgstr ""
+msgstr "Aktualizacja atrybutów puli: nazwy, opisu, metody równoważenia ruchu lub stanu administracyjnego."
#: dashboards/project/loadbalancers/templates/loadbalancers/_updatevip.html:18
msgid ""
@@ -10944,13 +11009,13 @@ msgstr "Nie można pobrać szczegółów sieci."
#: dashboards/project/networks/workflows.py:50
msgid "The state to start the network in."
-msgstr ""
+msgstr "Stan, w którym należy uruchomić sieć."
#: dashboards/project/networks/workflows.py:79
msgid ""
"Create a new network. In addition a subnet associated with the network can "
"be created in the next panel."
-msgstr ""
+msgstr "Tworzenie nowej sieci. Można też utworzyć podsieć powiązana z tą siecią w następnym panelu."
#: dashboards/project/networks/workflows.py:93
msgid "Subnet Name"
@@ -10972,7 +11037,7 @@ msgid ""
" of the network address (e.g. 192.168.0.1 for 192.168.0.0/24, 2001:DB8::1 "
"for 2001:DB8::/48). If you use the default, leave blank. If you do not want "
"to use a gateway, check 'Disable Gateway' below."
-msgstr ""
+msgstr "Adres IP bramki (np. 192.168.0.254). Domyślną wartością jest pierwszy adres IP sieci (np. 192.168.0.1 dla 192.168.0.0/24, 2001:DB8::1 dla 2001:DB8::/48).\nNależy pozostawić puste, by skorzystać z domyślnej wartości. Jeśli nie ma być używana bramka, należy zaznaczy pole wyboru \"Wyłącz bramkę\" poniżej."
#: dashboards/project/networks/workflows.py:122
#: dashboards/project/networks/subnets/workflows.py:111
@@ -10984,7 +11049,7 @@ msgid ""
"Create a subnet associated with the new network, in which case \"Network "
"Address\" must be specified. If you wish to create a network without a "
"subnet, uncheck the \"Create Subnet\" checkbox."
-msgstr ""
+msgstr "Utworzenie podsieci powiÄ…zanej z nowÄ… sieciÄ… wymaga by zostaÅ‚ podany „Adres sieciâ€. Celem utworzenia sieci bez podsieci, należy odznaczyć pole wyboru „Utwórz podsiećâ€."
#: dashboards/project/networks/workflows.py:146
msgid "Specify \"Network Address\" or clear \"Create Subnet\" checkbox."
@@ -11015,7 +11080,7 @@ msgstr "WÅ‚Ä…cz DHCP"
#: dashboards/project/networks/workflows.py:191
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:32
msgid "IPv6 Address Configuration Mode"
-msgstr ""
+msgstr "Tryb konfiguracji adresu IPv6"
#: dashboards/project/networks/workflows.py:195
msgid ""
@@ -11023,7 +11088,7 @@ msgid ""
"can specify SLAAC/DHCPv6 stateful/DHCPv6 stateless provided by OpenStack, or"
" specify no option. 'No option selected' means addresses are configured "
"manually or configured by non-OpenStack system."
-msgstr ""
+msgstr "Określa jak jest ustawiany adres IPv6 oraz dodatkowe informacje. Można wybrać SLAAC/DHCPv6 stateful/DHCPv6 stateless dostarczane przez OpenStack, lub nie podać żadnej opcji. „Nie wybrano opcji†oznacza, że adresy są konfigurowane ręcznie lub przez system spoza środowiska OpenStack."
#: dashboards/project/networks/workflows.py:203
msgid "Allocation Pools"
@@ -11033,7 +11098,7 @@ msgstr "Pule przydziałów"
msgid ""
"IP address allocation pools. Each entry is: start_ip_address,end_ip_address "
"(e.g., 192.168.1.100,192.168.1.120) and one entry per line."
-msgstr ""
+msgstr "Pule alokacji adresów IP. Każdy wpis w osobnej linii w postaci: początkowy_adres_IP,końcowy_adres_IP (np. 192.168.1.100,192.168.1.120)"
#: dashboards/project/networks/workflows.py:211
msgid "DNS Name Servers"
@@ -11053,7 +11118,7 @@ msgid ""
"Additional routes announced to the hosts. Each entry is: "
"destination_cidr,nexthop (e.g., 192.168.200.0/24,10.56.1.254) and one entry "
"per line."
-msgstr ""
+msgstr "Dodatkowe routery rozgłaszane do hostów. Każdy wpis powinien być w osobnej linii w postaci:\ndocelowy_cidr,nexthop (np. 192.168.200.0/24,10.56.1.254)."
#: dashboards/project/networks/workflows.py:225
#: dashboards/project/networks/subnets/workflows.py:149
@@ -11065,12 +11130,12 @@ msgstr "Szczegóły podsieci"
#: dashboards/project/networks/workflows.py:226
#: dashboards/project/networks/subnets/workflows.py:150
msgid "Specify additional attributes for the subnet."
-msgstr ""
+msgstr "Dodatkowe atrybuty dla podsieci."
#: dashboards/project/networks/workflows.py:229
#, python-format
msgid "%s (Default)"
-msgstr ""
+msgstr "%s (Domyślnie)"
#: dashboards/project/networks/workflows.py:238
#, python-format
@@ -11162,21 +11227,21 @@ msgstr "Nie można pobrać szczegółów podsieci."
#: dashboards/project/networks/subnets/utils.py:20
msgid "No options specified"
-msgstr ""
+msgstr "Nie podano opcji"
#: dashboards/project/networks/subnets/utils.py:22
msgid "SLAAC: Address discovered from Openstack Router"
-msgstr ""
+msgstr "SLAAC: Adres wykrywany z routera Openstack"
#: dashboards/project/networks/subnets/utils.py:24
msgid "DHCPv6 stateful: Address discovered from Openstack DHCP"
-msgstr ""
+msgstr "DHCPv6 stateful: Adres jest wykrywany z DHCP Openstack"
#: dashboards/project/networks/subnets/utils.py:26
msgid ""
"DHCPv6 stateless: Address discovered from Openstack Router and info from "
"Openstack DHCP"
-msgstr ""
+msgstr "DHCPv6 stateless: Adres jest wykrywany z routera Openstack a informacje z serwera DHCP Openstack"
#: dashboards/project/networks/subnets/views.py:66
msgid "Unable to retrieve subnet details"
@@ -11186,7 +11251,7 @@ msgstr "Nie można pobrać szczegółów podsieci"
msgid ""
"Create a subnet associated with the network. Advanced configuration is "
"available by clicking on the \"Subnet Detail\" tab."
-msgstr ""
+msgstr "Tworzenie podsieci powiÄ…zanej z sieciÄ…. Zaawansowana konfiguracja dostÄ™pna jest w zakÅ‚adce „Szczegóły podsieciâ€."
#: dashboards/project/networks/subnets/workflows.py:57
#, python-format
@@ -11211,13 +11276,13 @@ msgid ""
"IP address of Gateway (e.g. 192.168.0.254). Specify an explicit address to "
"set the gateway. If you do not want to use a gateway, check 'Disable "
"Gateway' below."
-msgstr ""
+msgstr "Adres IP bramki (np. 192.168.0.254). Należy podać adres jeśli ma być ustawiona bramka, w przeciwnym wypadku należy zaznaczyć pole wyboru „Wyłącz bramkę†poniżej."
#: dashboards/project/networks/subnets/workflows.py:116
msgid ""
"Update a subnet associated with the network. Advanced configuration are "
"available at \"Subnet Detail\" tab."
-msgstr ""
+msgstr "Aktualizacja podsieci powiÄ…zanej z sieciÄ…. Zaawansowane opcje dostÄ™pne sÄ… w zakÅ‚adce „Szczegóły podsieciâ€."
#: dashboards/project/networks/subnets/workflows.py:161
#, python-format
@@ -11319,7 +11384,7 @@ msgid ""
"\n"
" Other IPv6 modes: ipv6_ra_mode=%(ra_mode)s, ipv6_address_mode=%(addr_mode)s\n"
" "
-msgstr ""
+msgstr "\nInne tryby IPv6: ipv6_ra_mode=%(ra_mode)s, ipv6_address_mode=%(addr_mode)s"
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:41
msgid "Additional routes"
@@ -11341,7 +11406,7 @@ msgstr "Serwer nazw DNS"
#: dashboards/project/overview/views.py:34
msgid "Uptime (Seconds)"
-msgstr ""
+msgstr "Uptime (w sekundach)"
#: dashboards/project/routers/forms.py:35
#: dashboards/project/routers/ports/forms.py:35
@@ -11350,39 +11415,48 @@ msgid "Router Name"
msgstr "Nazwa routera"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "Typ routera"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
-msgstr ""
+msgstr "Użyj domyślnej wartości serwera"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
-msgstr ""
+msgstr "Scentralizowane"
+
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr "WÅ‚Ä…cz tryb HA"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr "Wyłącz tryb HA"
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "Utworzono router %s."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
-msgstr ""
+msgstr "Przekroczono limity dla zasobu router."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "Nie można utworzyć routera „%sâ€."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "Zaktualizowano router %s."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "Nie można zaktualizować routera %s"
@@ -11390,16 +11464,16 @@ msgstr "Nie można zaktualizować routera %s"
#: dashboards/project/routers/tables.py:36
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:44
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:58
#: dashboards/project/routers/tables.py:64
@@ -11418,24 +11492,29 @@ msgstr "Ustaw bramÄ™"
#: dashboards/project/routers/tables.py:108
msgid "Clear Gateway"
msgid_plural "Clear Gateways"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyczyść bramkę"
+msgstr[1] "Wyczyść bramki"
+msgstr[2] "Wyczyść bramki"
#: dashboards/project/routers/tables.py:116
msgid "Cleared Gateway"
msgid_plural "Cleared Gateways"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Wyczyszczono bramkÄ™"
+msgstr[1] "Wyczyszczono bramki"
+msgstr[2] "Wyczyszczono bramki"
#: dashboards/project/routers/tables.py:132
#, python-format
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "Nie można usunąć bramy dla routera: „%(name)sâ€: „%(msg)sâ€"
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr "Tryb wysokiej dostępności (HA)"
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "Nie można pobrać szczegółów routera."
@@ -11449,14 +11528,14 @@ msgstr "Nie można pobrać listy zewnÄ™trznych sieci „%sâ€."
msgid ""
"External network \"%(ext_net_id)s\" expected but not found for router "
"\"%(router_id)s\"."
-msgstr ""
+msgstr "Spodziewano siÄ™ zewnÄ™trznej sieci „%(ext_net_id)sâ€, jednakże nie znaleziono jej dla routera „%(router_id)sâ€."
#. Translators: The usage is "<UUID of ext_net> (Not Found)"
#: dashboards/project/routers/views.py:94
#, python-format
msgctxt "External network not found"
msgid "%s (Not Found)"
-msgstr ""
+msgstr "%s (nie znaleziono)"
#: dashboards/project/routers/views.py:109
#, python-format
@@ -11514,16 +11593,16 @@ msgstr "Dodaj regułę routera"
#: dashboards/project/routers/extensions/routerrules/tables.py:47
msgid "Delete Router Rule"
msgid_plural "Delete Router Rules"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń regułę routera"
+msgstr[1] "Usuń reguły routera"
+msgstr[2] "Usuń reguły routera"
#: dashboards/project/routers/extensions/routerrules/tables.py:55
msgid "Deleted Router Rule"
msgid_plural "Deleted Router Rules"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto regułę routera"
+msgstr[1] "Usunięto reguły routera"
+msgstr[2] "Usunięto reguły routera"
#: dashboards/project/routers/extensions/routerrules/tabs.py:59
msgid "Router Rules Grid"
@@ -11540,7 +11619,7 @@ msgstr "Adres IP (niewymagany)"
#: dashboards/project/routers/ports/forms.py:32
msgid "Specify an IP address for the interface created (e.g. 192.168.0.254)."
-msgstr ""
+msgstr "Należy podać adres IP dla utworzonego interfejsu (np. 192.168.0.254)."
#: dashboards/project/routers/ports/forms.py:54
#: dashboards/project/routers/ports/forms.py:165
@@ -11716,7 +11795,7 @@ msgstr "Wybór szablonu"
#: dashboards/project/stacks/forms.py:52
msgid "Select a template to launch a stack."
-msgstr ""
+msgstr "Należy wybrać szablon do uruchomienia stosu."
#: dashboards/project/stacks/forms.py:60
msgid "Template Source"
@@ -11791,7 +11870,7 @@ msgstr "Edycja szablonu"
#: dashboards/project/stacks/forms.py:227
msgid "Select a new template to re-launch a stack."
-msgstr ""
+msgstr "Należy wybrać szablon do ponownego uruchomienia stosu."
#: dashboards/project/stacks/forms.py:228
#: dashboards/project/stacks/forms.py:358
@@ -11881,16 +11960,16 @@ msgstr "Zmień szablon stosu"
#: dashboards/project/stacks/tables.py:54
msgid "Delete Stack"
msgid_plural "Delete Stacks"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń stos"
+msgstr[1] "Usuń stosy"
+msgstr[2] "Usuń stosy"
#: dashboards/project/stacks/tables.py:62
msgid "Deleted Stack"
msgid_plural "Deleted Stacks"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto stos"
+msgstr[1] "Usunięto stosy"
+msgstr[2] "Usunięto stosy"
#: dashboards/project/stacks/tables.py:139
#: dashboards/project/stacks/tables.py:184
@@ -11973,7 +12052,7 @@ msgstr "Nie można pobrać metadanych."
msgid ""
"Use one of the available template source options to specify the template to "
"be used in creating this stack."
-msgstr "Należy wybrać jedno ze typu źródeł szablonów, by podać szablon do wykorzystania przy jego tworzeniu."
+msgstr "Należy wybrać jeden z typów źródeł szablonów, aby zdefiniować szablon do wykorzystania przy jego tworzeniu."
#: dashboards/project/stacks/templates/stacks/_change_template.html:25
#: dashboards/project/stacks/templates/stacks/_select_template.html:25
@@ -12029,7 +12108,7 @@ msgid ""
"Update a stack with the provided values. Please note that any encrypted "
"parameters, such as passwords, will be reset to default if you do not change"
" them here."
-msgstr ""
+msgstr "Aktualizuje stos podanymi wartościami. Zaszyfrowane parametry, takie jak hasła, zostaną ustawione na domyślne, jeśli nie zostaną tutaj ponownie podane."
#: dashboards/project/stacks/templates/stacks/_update.html:24
msgid "Update"
@@ -12097,51 +12176,51 @@ msgstr "Nie można odszukać informacji o wolumenach lub ich kopiach."
#: dashboards/project/volumes/backups/forms.py:85
msgid "Create a New Volume"
-msgstr ""
+msgstr "Utwórz nowy wolumen"
#: dashboards/project/volumes/backups/forms.py:102
#, python-format
msgid ""
"Successfully restored backup %(backup_name)s to volume with id: "
"%(volume_id)s"
-msgstr ""
+msgstr "Przywrócono kopię zapasową %(backup_name)s na wolumen o nazwie: %(volume_id)s"
#: dashboards/project/volumes/backups/forms.py:108
msgid "Unable to restore backup."
-msgstr ""
+msgstr "Nie można przywrócić kopii zapasowej."
#: dashboards/project/volumes/backups/tables.py:47
#: dashboards/project/volumes/templates/volumes/backups/_create_backup.html:18
msgid "Volume Backup"
-msgstr ""
+msgstr "Kopia zapasowa wolumenu"
#: dashboards/project/volumes/backups/tabs.py:41
#: dashboards/project/volumes/backups/views.py:61
msgid "Unable to retrieve backup details."
-msgstr ""
+msgstr "Nie można pobrać szczegółów kopii zapasowej."
#: dashboards/project/volumes/snapshots/forms.py:37
#, python-format
msgid "Updating volume snapshot \"%s\""
-msgstr ""
+msgstr "Aktualizacja migawki wolumenu „%sâ€"
#: dashboards/project/volumes/snapshots/forms.py:43
msgid "Unable to update volume snapshot."
-msgstr ""
+msgstr "Nie można zaktualizować migawki wolumenu."
#: dashboards/project/volumes/snapshots/tables.py:56
msgid "Delete Volume Snapshot"
msgid_plural "Delete Volume Snapshots"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń migawkę wolumenu"
+msgstr[1] "Usuń migawki wolumenu"
+msgstr[2] "Usuń migawki wolumenu"
#: dashboards/project/volumes/snapshots/tables.py:64
msgid "Scheduled deletion of Volume Snapshot"
msgid_plural "Scheduled deletion of Volume Snapshots"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Skolejkowano usunięcie migawki wolumenu"
+msgstr[1] "Skolejkowano usunięcie migawek wolumenów"
+msgstr[2] "Skolejkowano usunięcie migawek wolumenów"
#: dashboards/project/volumes/snapshots/tables.py:79
#: dashboards/project/volumes/templates/volumes/snapshots/_update.html:9
@@ -12149,7 +12228,7 @@ msgstr[2] ""
#: dashboards/project/volumes/templates/volumes/snapshots/update.html:3
#: dashboards/project/volumes/templates/volumes/snapshots/update.html:6
msgid "Edit Snapshot"
-msgstr ""
+msgstr "Edytuj migawkÄ™"
#: dashboards/project/volumes/snapshots/tabs.py:36
#: dashboards/project/volumes/snapshots/views.py:77
@@ -12160,65 +12239,65 @@ msgstr "Nie można pobrać szczegółów migawki."
#: dashboards/project/volumes/templates/volumes/backups/_create_backup.html:24
#: dashboards/project/volumes/templates/volumes/backups/create_backup.html:3
msgid "Create Volume Backup"
-msgstr ""
+msgstr "Utwórz kopię zapasową wolumenu"
#: dashboards/project/volumes/templates/volumes/backups/_create_backup.html:18
msgid ""
"Volume Backups are stored using the Object Storage service. You must have "
"this service activated in order to create a backup."
-msgstr ""
+msgstr "Kopie zapasowe wolumenów są przechowywane za pomocą usługi przechowywania obiektów. Usługa ta musi być aktywna, aby można było utworzyć kopię zapasową."
#: dashboards/project/volumes/templates/volumes/backups/_create_backup.html:19
msgid ""
"If no container name is provided, a default container named volumebackups "
"will be provisioned for you. Backups will be the same size as the volume "
"they originate from."
-msgstr ""
+msgstr "Jeśli nie zostanie podana nazwa kontenera, domyślny kontener o nazwie volumebackups zostanie automatycznie utworzony. Kopie zapasowe będą miały ten sam rozmiar, co wolumen z którego zostaną utworzone."
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:4
msgid "Volume Backup Overview"
-msgstr ""
+msgstr "PrzeglÄ…d kopii zapasowych wolumenu"
#: dashboards/project/volumes/templates/volumes/backups/_restore_backup.html:9
#: dashboards/project/volumes/templates/volumes/backups/restore_backup.html:3
msgid "Restore Volume Backup"
-msgstr ""
+msgstr "Przywróć kopię zapasową wolumenu"
#: dashboards/project/volumes/templates/volumes/backups/_restore_backup.html:18
msgid "Select a volume to restore to."
-msgstr ""
+msgstr "Wybór wolumenu do przywrócenia."
#: dashboards/project/volumes/templates/volumes/backups/_restore_backup.html:19
msgid "Optionally, you may choose to create a new volume."
-msgstr ""
+msgstr "Dodatkowo pozwala na utworzenie nowego wolumenu."
#: dashboards/project/volumes/templates/volumes/backups/_restore_backup.html:24
msgid "Restore Backup to Volume"
-msgstr ""
+msgstr "Przywróć wolumen z kopii zapasowej"
#: dashboards/project/volumes/templates/volumes/backups/create_backup.html:6
msgid "Create a Volume Backup"
-msgstr ""
+msgstr "Utwórz kopię zapasową wolumenu"
#: dashboards/project/volumes/templates/volumes/backups/detail.html:3
msgid "Volume Backup Details"
-msgstr ""
+msgstr "Szczegóły kopii zapasowej wolumenu"
#: dashboards/project/volumes/templates/volumes/backups/detail.html:6
msgid "Volume Backup Details: "
-msgstr ""
+msgstr "Szczegóły kopii zapasowej wolumenu: "
#: dashboards/project/volumes/templates/volumes/backups/detail.html:6
msgid "Volume Backup Details:"
-msgstr ""
+msgstr "Szczegóły kopii zapasowej wolumenu:"
#: dashboards/project/volumes/templates/volumes/backups/restore_backup.html:6
msgid "Restore a Volume Backup"
-msgstr ""
+msgstr "Przywróć kopię zapasową wolumenu"
#: dashboards/project/volumes/templates/volumes/snapshots/_update.html:19
msgid "Modify the name and description of a snapshot."
-msgstr ""
+msgstr "Zmiana nazwy i opisu migawki."
#: dashboards/project/volumes/templates/volumes/snapshots/detail.html:3
msgid "Volume Snapshot Details"
@@ -12284,7 +12363,7 @@ msgstr "Rozszerz wolumen"
#: dashboards/project/volumes/templates/volumes/volumes/_extend_limits.html:5
msgid "Extend the size of a volume."
-msgstr ""
+msgstr "Rozszerzanie rozmiaru wolumenu."
#: dashboards/project/volumes/templates/volumes/volumes/_extend_limits.html:7
#: dashboards/project/volumes/templates/volumes/volumes/_limits.html:7
@@ -12310,7 +12389,7 @@ msgstr "Liczba wolumenów"
#: dashboards/project/volumes/templates/volumes/volumes/retype.html:6
#: dashboards/project/volumes/volumes/tables.py:238
msgid "Change Volume Type"
-msgstr ""
+msgstr "Zmień typ wolumenu"
#: dashboards/project/volumes/templates/volumes/volumes/_retype.html:19
msgid ""
@@ -12318,14 +12397,14 @@ msgid ""
" Change the volume type of a volume after its creation.\n"
" This is equivalent to the <tt>cinder retype</tt> command.\n"
" "
-msgstr ""
+msgstr "\nZmiana typu wolumenu po jego utworzeniu.\nJest to odpowiednik polecenia <tt>cinder retype</tt>."
#: dashboards/project/volumes/templates/volumes/volumes/_retype.html:24
msgid ""
"\n"
" The \"Volume Type\" selected must be different from the current volume type.\n"
" "
-msgstr ""
+msgstr "\nWybrany typ wolumenu musi być inny niż obecny typ wolumenu."
#: dashboards/project/volumes/templates/volumes/volumes/_retype.html:28
msgid ""
@@ -12335,19 +12414,19 @@ msgid ""
" perform volume migration. Note that migration may take a significant\n"
" amount of time to complete, in some cases hours.\n"
" "
-msgstr ""
+msgstr "\n„Polityka migracji†jest wykorzystywana jedynie, jeżeli nie można zmienić typu wolumenu.\nJeÅ›li „polityka migracji†jest ustawiona na „na żądanieâ€, backend dokona migracji wolumenu. Należy zwrócić uwagÄ™, że migracja wolumenu może zająć dużo czasu, w niektórych przypadkach liczonego w godzinach."
#: dashboards/project/volumes/templates/volumes/volumes/_snapshot_limits.html:5
msgid "From here you can create a snapshot of a volume."
-msgstr ""
+msgstr "Pozwala na utworzenie migawki wolumenu."
#: dashboards/project/volumes/templates/volumes/volumes/_snapshot_limits.html:9
msgid "Snapshot Limits"
-msgstr ""
+msgstr "Ograniczenia migawek"
#: dashboards/project/volumes/templates/volumes/volumes/_snapshot_limits.html:21
msgid "Number of Snapshots"
-msgstr ""
+msgstr "Ilość migawek"
#: dashboards/project/volumes/templates/volumes/volumes/_update.html:9
#: dashboards/project/volumes/templates/volumes/volumes/_update.html:24
@@ -12359,13 +12438,13 @@ msgstr "Edytuj wolumen"
#: dashboards/project/volumes/templates/volumes/volumes/_update.html:19
msgid "Modify name and description of a volume."
-msgstr ""
+msgstr "Zmiana nazwy i opisu wolumenu."
#: dashboards/project/volumes/templates/volumes/volumes/_upload_to_image.html:9
#: dashboards/project/volumes/templates/volumes/volumes/upload_to_image.html:3
#: dashboards/project/volumes/templates/volumes/volumes/upload_to_image.html:6
msgid "Upload Volume to Image"
-msgstr ""
+msgstr "Prześlij wolumen do obrazu"
#: dashboards/project/volumes/templates/volumes/volumes/_upload_to_image.html:19
msgid ""
@@ -12373,7 +12452,7 @@ msgid ""
" Upload the volume to the Image Service as an image.\n"
" This is equivalent to the <tt>cinder upload-to-image</tt> command.\n"
" "
-msgstr ""
+msgstr "\nPrzesłanie wolumenów do usługi obrazów jako obraz.\nJest to odpowiednikiem polecenia <tt>cinder upload-to-image</tt>."
#: dashboards/project/volumes/templates/volumes/volumes/_upload_to_image.html:24
msgid ""
@@ -12381,7 +12460,7 @@ msgid ""
" Choose \"Disk Format\" for the image. The volume images are created with\n"
" the QEMU disk image utility.\n"
" "
-msgstr ""
+msgstr "\nNalezy wybrać „Format dysku†dla obrazy. Obrazy wolumenów są tworzone\nprzez narzędzie obrazów dysków QEMU,"
#: dashboards/project/volumes/templates/volumes/volumes/_upload_to_image.html:30
msgid ""
@@ -12389,7 +12468,7 @@ msgid ""
" When the volume status is \"in-use\", you can use \"Force\" to upload the\n"
" volume to an image.\n"
" "
-msgstr ""
+msgstr "\nJeżeli stan wolumenu jest „w użyciu†mozna wykorzystać przycisk „WymuÅ›â€,\naby przesÅ‚ać wolumen do obrazu."
#: dashboards/project/volumes/templates/volumes/volumes/create.html:6
msgid "Create a Volume"
@@ -12474,15 +12553,15 @@ msgstr "Brak źródła, pusty wolumen"
#: dashboards/project/volumes/volumes/forms.py:240
msgid "Image source must be specified"
-msgstr ""
+msgstr "Źródło obrazu musi być podane"
#: dashboards/project/volumes/volumes/forms.py:244
msgid "Snapshot source must be specified"
-msgstr ""
+msgstr "Źródło migawki musi być podane"
#: dashboards/project/volumes/volumes/forms.py:248
msgid "Volume source must be specified"
-msgstr ""
+msgstr "Źródło wolumenu musi być podane"
#: dashboards/project/volumes/volumes/forms.py:257
msgid "Unable to determine if availability zones extension is supported."
@@ -12540,7 +12619,7 @@ msgstr "Wybierz instancję do której dołączyć."
msgid ""
"Actual device name may differ due to hypervisor settings. If not specified, "
"then hypervisor will select a device name."
-msgstr ""
+msgstr "Rzeczywista nazwa urządzenia może być inna, ze względu na ustawienia hipernadzorcy. Jeśli nie podano nazwy, zostanie ona wybrana przez hipernadzorcę."
#: dashboards/project/volumes/volumes/forms.py:448
msgid "Unknown instance (None)"
@@ -12586,7 +12665,7 @@ msgstr "WymuÅ›"
#: dashboards/project/volumes/volumes/forms.py:575
#, python-format
msgid "Successfully sent the request to upload volume to image for volume: \"%s\""
-msgstr ""
+msgstr "PrzesÅ‚ano żądanie przekazania wolumenu do obrazu dla wolumenu: „%sâ€"
#: dashboards/project/volumes/volumes/forms.py:582
#, python-format
@@ -12653,16 +12732,16 @@ msgstr "Uruchom jako InstancjÄ™"
#: dashboards/project/volumes/volumes/tables.py:67
msgid "Delete Volume"
msgid_plural "Delete Volumes"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń wolumen"
+msgstr[1] "Usuń wolumeny"
+msgstr[2] "Usuń wolumeny"
#: dashboards/project/volumes/volumes/tables.py:75
msgid "Scheduled deletion of Volume"
msgid_plural "Scheduled deletion of Volumes"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Skolejkowano usunięcie wolumenu"
+msgstr[1] "Skolejkowano usunięcie wolumenów"
+msgstr[2] "Skolejkowano usunięcie wolumenów"
#: dashboards/project/volumes/volumes/tables.py:88
#, python-format
@@ -12679,7 +12758,7 @@ msgstr "Nie można pobrać limitów projektu."
#: dashboards/project/volumes/volumes/tables.py:210
msgid "Upload to Image"
-msgstr ""
+msgstr "Prześlij do obrazu"
#: dashboards/project/volumes/volumes/tables.py:272
#: dashboards/project/volumes/volumes/views.py:244
@@ -12701,7 +12780,7 @@ msgstr "Tak"
#: dashboards/project/volumes/volumes/tables.py:364
msgid "Bootable"
-msgstr ""
+msgstr "Uruchamialny"
#: dashboards/project/volumes/volumes/tables.py:367
msgid "Encrypted"
@@ -12736,7 +12815,7 @@ msgstr "Wolumen jest obecnie dołączony do instancji. W niektórych przypadkach
#: dashboards/project/volumes/volumes/views.py:293
#, python-format
msgid "Unable to retrieve volume information for volume: \"%s\""
-msgstr ""
+msgstr "Nie można pobrać informacji o wolumenie dla wolumenu: „%sâ€"
#: dashboards/project/volumes/volumes/views.py:196
msgid "Unable to retrieve volume."
@@ -12946,7 +13025,7 @@ msgstr "Rozmiar Maximum Transmission Unit dla połączenia"
msgid ""
"Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater"
" than 1280 if the local subnet is IPv6."
-msgstr ""
+msgstr "Większe lub równe 68, jeśli lokalna podsieć jest IPv4. Większe lub równe 1280, jeżeli lokalna podsieć jest IPv6."
#: dashboards/project/vpn/forms.py:243 dashboards/project/vpn/workflows.py:409
msgid "Dead peer detection actions"
@@ -13212,7 +13291,7 @@ msgstr "Nie można pobrać szczegółów połączenia tunelowego IPSec. %s"
#: dashboards/project/vpn/workflows.py:36
#: dashboards/project/vpn/workflows.py:422
msgid "The state to start in."
-msgstr ""
+msgstr "Stan, w którym rozpocząć."
#: dashboards/project/vpn/workflows.py:57
msgid "Select a Router"
@@ -13231,7 +13310,7 @@ msgid ""
"Create VPN Service for current project.\n"
"\n"
"Specify a name, description, router, and subnet for the VPN Service. Admin State is Up (checked) by default."
-msgstr ""
+msgstr "Tworzenie usługi VPN dla bieżącego projektu.\n\nNależy podać nazwę, opis, router oraz podsieć dla usługi VPN. Domyślny stan administracyjny jest UP (zaznaczone)."
#: dashboards/project/vpn/workflows.py:95
#, python-format
@@ -13460,7 +13539,7 @@ msgstr "Rozmiar segmentu"
#: dashboards/router/nexus1000v/forms.py:88
msgid "1-4093 for VLAN; 5000 and above for Overlay"
-msgstr ""
+msgstr "1-4093 dla VLAN; 5000 i więcej dla Overlay"
#: dashboards/router/nexus1000v/forms.py:91
#: dashboards/router/nexus1000v/forms.py:98
@@ -13470,7 +13549,7 @@ msgstr "Przedział adresów IP Multicast"
#: dashboards/router/nexus1000v/forms.py:99
msgid "Multicast IPv4 range(e.g. 224.0.1.0-224.0.1.100)"
-msgstr ""
+msgstr "Zakres adresów multicast IPv4 (np. 224.0.1.0-224.0.1.100)"
#: dashboards/router/nexus1000v/forms.py:103
#: dashboards/router/nexus1000v/forms.py:110
@@ -13516,16 +13595,16 @@ msgstr "Utwórz profil sieciowy"
#: dashboards/router/nexus1000v/tables.py:42
msgid "Delete Network Profile"
msgid_plural "Delete Network Profiles"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usuń profil sieciowy"
+msgstr[1] "Usuń profile sieciowe"
+msgstr[2] "Usuń profile sieciowe"
#: dashboards/router/nexus1000v/tables.py:50
msgid "Deleted Network Profile"
msgid_plural "Deleted Network Profiles"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Usunięto profil sieciowy"
+msgstr[1] "Usunięto profile sieciowe"
+msgstr[2] "Usunięto profile sieciowe"
#: dashboards/router/nexus1000v/tables.py:59
#, python-format
@@ -13553,7 +13632,7 @@ msgstr "Nie można pobrać szczegółów profilu sieciowego."
#: dashboards/router/nexus1000v/views.py:142
msgid "Failed to obtain network profile binding"
-msgstr ""
+msgstr "Nie można pobrać powiązania profilu sieciowego"
#: dashboards/router/nexus1000v/templates/nexus1000v/_create_network_profile.html:19
msgid " Select a name for your network profile."
@@ -13585,7 +13664,7 @@ msgstr "Zakresy segmentów dla VLAN to 1-4093 oraz powyżej 5000 dla rozszerzone
msgid ""
"Edit the network profile to update name, segment range or multicast IP "
"range."
-msgstr ""
+msgstr "Edycja profilu sieciowego celem modyfikacji nazwy, zakresu segmentu lub zakresu adresów IP multicast."
#: dashboards/router/nexus1000v/templates/nexus1000v/index.html:3
#: dashboards/router/nexus1000v/templates/nexus1000v/network_profile/index.html:3
@@ -13637,7 +13716,7 @@ msgstr "Zmiana hasła"
#: dashboards/settings/password/templates/password/_change.html:19
msgid "Change your password. We highly recommend you create a strong one. "
-msgstr ""
+msgstr "Zmień hasło. Zalecamy wykorzystanie silnego hasła."
#: dashboards/settings/password/templates/password/_change.html:24
msgid "Change"
@@ -13672,7 +13751,7 @@ msgstr "Ustawienia użytkowników"
#: dashboards/settings/user/templates/user/_settings.html:19
msgid "Modify dashboard settings for your user."
-msgstr ""
+msgstr "Modyfikacja ustawień tablicy dla użytkownika."
#: templates/403.html:5 templates/403.html.py:10
msgid "Forbidden"
@@ -13736,28 +13815,28 @@ msgstr "Regiony:"
msgid "Invalid date format: Using today as default."
msgstr "Błędny format daty: ustawiono dzień dzisiejszy jako domyślny."
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "Nie można pobrać informacji o limitach sieci."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "Nie można pobrać informacji o limitach wolumenów."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "Nie można pobrać informacji o limitach."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "Nie można pobrać informacji o wykorzystaniu."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "Nieprawidłowy przedział czasowy. Data końcowa powinna być nowsza od daty początkowej."
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
index adf7ec48a..1feb570cf 100644
--- a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
@@ -15,9 +15,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-29 14:21+0000\n"
-"Last-Translator: Fernando Pimenta <fernando.c.pimenta@gmail.com>\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -25,55 +25,55 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "Selecione o formato"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Imagem de Kernel da Amazon"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Imagem de máquina Amazon"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Imagem de Ramdisk Amazon"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - Imagem de Disco Óptico"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - Emulador QEMU"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "Tudo TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "Tudo UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "Tudo ICMP"
@@ -329,16 +329,26 @@ msgstr "Não é possível conectar ao Neutron."
msgid "Unable to parse IP address %s."
msgstr "Não é possível interpretar o endereço IP %s"
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "O parâmetro 'operação' para get_dvr_permission não é válido.Deveria ser um entre %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr "A função solicitada '%(feature)s' não é conhecida. Por favor tenha a certeza de especificar uma função definida na FEATURE_MAP."
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "Falha ao verificar Neutron extenção \"dvr\"não é suportada."
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr "O parâmetro 'operação' para get_feature_permission '%(feature)s' é inválido. Ele deve ser um dos %(allowed)s"
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr "Falha para checar a extensão Neutron '%s' não suportada"
#: api/nova.py:211
#, python-format
@@ -370,12 +380,12 @@ msgstr "Falha ao modificar %(num_groups_to_modify)d instancias de grupos de segu
msgid "Failed to modify %d instance security groups"
msgstr "Falha ao modificar %d instancias dos grupos de segurança"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "Nome: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "Falhou ao evacuar instâncias: %s"
@@ -484,7 +494,7 @@ msgstr "Admin"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -992,6 +1002,230 @@ msgstr "Atualiza Metadata do Agregado"
msgid "Manage Hosts Aggregate"
msgstr "Gerenciar Agregados de Host"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "Padrões"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "Atualizar Padrões"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "Bytes do Conteúdo do Arquivo Injetado"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "Tamanho do Caminho do Arquivo Injetado"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "Ãtens de Metadados"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "vCPUs"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "Instâncias"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "Arquivos Injetados"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "Volumes"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "Snapshots de Volume"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "Tamanho total de Volumes e Snapshots (GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "RAM (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "IPs Flutuantes"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "Grupos de Segurança"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "Regras do Grupo de Segurança"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "Pares de Chave"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "IPs Fixos"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "Volumes LUKS"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "Snapshots de Volumes LUKS "
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "Tamanho total de volumes LUKS e Snapshots (GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "Nome de Cota"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "Limite"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "Cotas"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "Cotas Padrão"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "Não foi possível obter informações de cota"
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "Não é possível recuperar valores de cota padrão."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "A partir daqui você pode atualizar as cotas padrão (limites máximos)."
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "Atualizar Cotas Padrão"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "O padrão de quotas foi atualizado."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "Não é possível atualizar cotas padrão."
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "Não é possível atualizar os metadados do flavor,"
@@ -1051,18 +1285,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "Nome do Flavor"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "vCPUs"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1125,7 +1347,7 @@ msgstr "Disco de Swap"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1180,13 +1402,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "Nome pode conter apenas letras, números, sublinhados, pontos e hífens."
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "RAM (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "Disco Raíz (GB)"
@@ -1357,28 +1572,6 @@ msgstr "Armazenamento (utilizado)"
msgid "Storage (total)"
msgstr "Armazenamento (total)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "Instâncias"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1564,7 +1757,7 @@ msgid "Compute Host"
msgstr "Compute Host"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "Não é possível obter a lista de serviços nova."
@@ -1802,7 +1995,7 @@ msgstr "Desabilitado"
msgid "Service"
msgstr "Serviço"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "Serviços"
@@ -1812,11 +2005,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "Última Atualização"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "Serviços de Computação"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "Serviços de Armazenamento de Volumes"
@@ -1830,153 +2023,22 @@ msgstr "Ativo"
msgid "Down"
msgstr "Inativo"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "Agentes de Rede"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "Bytes do Conteúdo do Arquivo Injetado"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "Tamanho do Caminho do Arquivo Injetado"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "Ãtens de Metadados"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "Arquivos Injetados"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "Volumes"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "Snapshots de Volume"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "Tamanho total de Volumes e Snapshots (GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "IPs Flutuantes"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "Grupos de Segurança"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "Regras do Grupo de Segurança"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "Pares de Chave"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "IPs Fixos"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "Volumes LUKS"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "Snapshots de Volumes LUKS "
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "Tamanho total de volumes LUKS e Snapshots (GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "Nome de Cota"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "Limite"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "Cotas"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "Não foi possível ler a lista de serviços do Cinder"
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "Não foi possível ler as informações dos agentes de rede."
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "Não foi possível obter lista de agentes de rede."
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "Cotas Padrão"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "Não foi possível obter informações de cota"
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "Não foi possível ler as informações da versão."
@@ -2475,7 +2537,7 @@ msgstr "ID de Segmentação"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2504,7 +2566,7 @@ msgstr "Compartilhado"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "Rede Externa"
@@ -3083,7 +3145,7 @@ msgstr "Monitorando"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3209,21 +3271,28 @@ msgid "Project ID"
msgstr "ID do Projeto"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "Distribuido"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr "Modo Alta Disponibilidade"
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "Informação de Gateway Externo"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "Rede Externa Conectada"
@@ -4355,10 +4424,6 @@ msgstr "Nível de privilégios insuficiente para visualizar informações do pro
msgid "Unable to retrieve default Neutron quota values."
msgstr "Não foi possivel obter os valores de cota padrão do Neutron."
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "Não é possível recuperar valores de cota padrão."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4747,7 +4812,7 @@ msgstr "Acesso e Segurança"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "Não é possível recuperar grupos de segurança"
@@ -4757,7 +4822,7 @@ msgstr "Não foi possível obter a lista de pares de chave."
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "Não foi possível obter o endereço IP flutuante."
@@ -9791,7 +9856,7 @@ msgstr "Qualquer Zona de Disponibilidade"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "Não foi possível obter informações de cota."
@@ -11277,39 +11342,48 @@ msgid "Router Name"
msgstr "Nome do Roteador"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "Tipo de Roteador"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "Usar Servidor Padrão"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "Centralizado"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr "Habilitar modo HA"
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr "Desabilitar modo HA"
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "Roteador %s criado com sucesso."
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "Quota excedida para router de recursos."
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "Falha ao criar roteador \"%s\"."
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "Router%s foi atualizado com sucesso."
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "Falha ao atualizar o roteador %s"
@@ -11357,8 +11431,13 @@ msgstr[1] "Gateways limpos"
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "Não foi possível limpar o gateway para o roteador \"%(name)s\": \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr "Modo HA"
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "Não foi possível recuperar detalhes do roteador."
@@ -13647,28 +13726,28 @@ msgstr "Regiões:"
msgid "Invalid date format: Using today as default."
msgstr "Formato de data inválido: Utilizando hoje como padrão."
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "Não foi possível obter informações de cota de rede."
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "Não foi possível obter informações de limite de volume."
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "Não foi possível recuperar informações de limite."
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "Não foi possível obter informações de utilização."
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "Período de tempo inválido. A data final deve ser mais recente que a data inicial."
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po
index 4ca115cfb..be9d4edc2 100644
--- a/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po
@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-30 06:10+0000\n"
-"Last-Translator: Ying Chun Guo <daisy.ycguo@gmail.com>\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,55 +22,55 @@ msgstr ""
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "选择镜åƒæ ¼å¼"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - 亚马逊内核镜åƒ"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon Machine é•œåƒ"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk é•œåƒ"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - 光盘镜åƒ"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU 模拟器"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "所有TCPåè®®"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "所有UDPåè®®"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "所有ICMPåè®®"
@@ -326,16 +326,26 @@ msgstr "无法连接到Neutron."
msgid "Unable to parse IP address %s."
msgstr "无法解æžIPåœ°å€ %s."
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
-msgstr "get_dvr_permissionçš„å‚æ•°'operation'无效。应该是%s中的一个。"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
+msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
-msgstr "检查Neutron \"dvr\"失败, 扩展ä¸æ”¯æŒ"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
+msgstr ""
#: api/nova.py:211
#, python-format
@@ -367,12 +377,12 @@ msgstr "修改 %(num_groups_to_modify)d 实例安全组失败: %(err)s"
msgid "Failed to modify %d instance security groups"
msgstr "修改 %d 实例安全组失败"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "å称: %(name)s ID: %(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "ç–散云主机 %s 失败"
@@ -481,7 +491,7 @@ msgstr "管ç†å‘˜"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -987,6 +997,230 @@ msgstr "æ›´æ–°èšåˆå…ƒæ•°æ®"
msgid "Manage Hosts Aggregate"
msgstr "管ç†ä¸»æœºé›†åˆ"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "默认值"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "更新默认值"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "注入的文件内容字节数"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "注入文件路径的长度"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "元数æ®æ¡ç›®"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "虚拟内核"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "实例"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "注入的文件"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "云硬盘"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "云硬盘快照"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "å·å’Œå¿«ç…§çš„总大å°(GB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "内存 (MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "浮动IP"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "安全组"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "安全组规则"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "密钥对"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "固定IP"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS å·"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "LUKS å·å¿«ç…§"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "LUKSå·å’Œå¿«ç…§çš„总大å°(GB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm加密模å—"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "é…é¢å称"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "é™åˆ¶"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "é…é¢"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "默认é…é¢"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "无法得到é…é¢ä¿¡æ¯ã€‚"
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "无法获å–默认é…é¢."
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "在这里你å¯ä»¥æ›´æ–°é»˜è®¤é…é¢(最大值)。"
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "更新默认é…é¢"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "默认é…é¢å·²æ›´æ–°."
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "无法更新默认é…é¢ã€‚"
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "无法更新云主机类型元数æ®"
@@ -1044,18 +1278,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "云主机类型å称"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "虚拟内核"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1118,7 +1340,7 @@ msgstr "交æ¢ç›˜ç©ºé—´"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1173,13 +1395,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "åå­—åªèƒ½åŒ…å«å­—æ¯ã€æ•°å­—ã€ä¸‹åˆ’线ã€ç‚¹å·ï¼ˆ.)和连字符。"
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "内存 (MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "æ ¹ç£ç›˜(GB)"
@@ -1350,28 +1565,6 @@ msgstr "存储(已使用)"
msgid "Storage (total)"
msgstr "存储(总计)"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "实例"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1555,7 +1748,7 @@ msgid "Compute Host"
msgstr "计算主机"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "无法查询novaæœåŠ¡åˆ—表。"
@@ -1793,7 +1986,7 @@ msgstr "已关闭"
msgid "Service"
msgstr "æœåŠ¡"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "æœåŠ¡"
@@ -1803,11 +1996,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "最近更新"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "计算æœåŠ¡"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "å—存储æœåŠ¡"
@@ -1821,153 +2014,22 @@ msgstr "å‘上"
msgid "Down"
msgstr "å‘下"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "网络代ç†"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "注入的文件内容字节数"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "注入文件路径的长度"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "元数æ®æ¡ç›®"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "注入的文件"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "云硬盘"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "云硬盘快照"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "å·å’Œå¿«ç…§çš„总大å°(GB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "浮动IP"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "安全组"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "安全组规则"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "密钥对"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "固定IP"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS å·"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "LUKS å·å¿«ç…§"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "LUKSå·å’Œå¿«ç…§çš„总大å°(GB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm加密模å—"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "é…é¢å称"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "é™åˆ¶"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "é…é¢"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "无法获å–CinderæœåŠ¡åˆ—表"
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "无法获å–网络agentsä¿¡æ¯ã€‚"
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "无法获å–网络代ç†åˆ—表。"
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "默认é…é¢"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "无法得到é…é¢ä¿¡æ¯ã€‚"
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "无法获å–版本信æ¯"
@@ -2466,7 +2528,7 @@ msgstr "段ID"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2495,7 +2557,7 @@ msgstr "共享的"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "外部网络"
@@ -3066,7 +3128,7 @@ msgstr "监控"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3192,21 +3254,28 @@ msgid "Project ID"
msgstr "项目ID"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr "分布å¼çš„"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "外部网关信æ¯"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "已连接外部网络"
@@ -4332,10 +4401,6 @@ msgstr "查看项目信æ¯æƒé™ä¸è¶³ã€‚"
msgid "Unable to retrieve default Neutron quota values."
msgstr "无法获å–缺çœNeutroné…é¢ã€‚"
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "无法获å–默认é…é¢."
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4718,7 +4783,7 @@ msgstr "访问 & 安全"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "找ä¸åˆ°å®‰å…¨ç»„"
@@ -4728,7 +4793,7 @@ msgstr "找ä¸åˆ°å¯†é’¥å¯¹åˆ—表。"
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "找ä¸åˆ°æµ®åŠ¨IP。"
@@ -9710,7 +9775,7 @@ msgstr "任何å¯ç”¨åŸŸ"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "无法获å–é…é¢ä¿¡æ¯ã€‚"
@@ -11196,39 +11261,48 @@ msgid "Router Name"
msgstr "路由å称"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr "路由类型"
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr "使用默认æœåŠ¡"
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr "集中"
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "路由器 %s 创建æˆåŠŸã€‚"
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr "路由器资æºè¶…出é…é¢"
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "新建路由\"%s\"失败"
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr "路由 %s æˆåŠŸæ›´æ–°"
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr "更新路由 %s 失败"
@@ -11272,8 +11346,13 @@ msgstr[0] "已清除网关"
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "无法清除路由\"%(name)s\"的网关: \"%(msg)s\""
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "无法获å–路由详情"
@@ -13550,28 +13629,28 @@ msgstr "Regions:"
msgid "Invalid date format: Using today as default."
msgstr "无效的日期格å¼ï¼šé»˜è®¤ä¸ºä»Šå¤©ã€‚"
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "无法获å–网络é…é¢ä¿¡æ¯ã€‚"
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "无法获å–云硬盘é™åˆ¶ä¿¡æ¯ã€‚"
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "无法获å–é™åˆ¶ä¿¡æ¯ã€‚"
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "无法获å–使用信æ¯ã€‚"
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "无效的时间范围。结æŸæ—¥æœŸå¿…须在开始日期之åŽã€‚"
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po
index a49b48bda..e4f5a67bb 100644
--- a/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-09-29 22:50-0500\n"
-"PO-Revision-Date: 2014-09-30 04:00+0000\n"
-"Last-Translator: Zhang Xiaowei <zero00072@gmail.com>\n"
+"POT-Creation-Date: 2014-10-02 00:15-0500\n"
+"PO-Revision-Date: 2014-10-02 05:39+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"
@@ -19,55 +19,55 @@ msgstr ""
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: settings.py:101
+#: settings.py:103
msgid "Select format"
msgstr "é¸æ“‡æŽ¥å£"
-#: settings.py:102
+#: settings.py:104
msgid "AKI - Amazon Kernel Image"
msgstr "AKI - Amazon 核心映åƒæª”"
-#: settings.py:103
+#: settings.py:105
msgid "AMI - Amazon Machine Image"
msgstr "AMI - Amazon 機器映åƒæª”"
-#: settings.py:104
+#: settings.py:106
msgid "ARI - Amazon Ramdisk Image"
msgstr "ARI - Amazon Ramdisk 映åƒæª”"
-#: settings.py:105
+#: settings.py:107
msgid "ISO - Optical Disk Image"
msgstr "ISO - 光碟映åƒæª”"
-#: settings.py:106
+#: settings.py:108
msgid "QCOW2 - QEMU Emulator"
msgstr "QCOW2 - QEMU 模擬器"
-#: settings.py:107
+#: settings.py:109
msgid "Raw"
msgstr "Raw"
-#: settings.py:108
+#: settings.py:110
msgid "VDI"
msgstr "VDI - 微軟虛擬桌é¢åŸºç¤Žçµæ§‹"
-#: settings.py:109
+#: settings.py:111
msgid "VHD"
msgstr "VHD - 微軟虛擬硬碟"
-#: settings.py:110
+#: settings.py:112
msgid "VMDK"
msgstr "VMDK - VMware 虛擬機器硬碟"
-#: settings.py:283
+#: settings.py:298
msgid "All TCP"
msgstr "所有的 TCP"
-#: settings.py:289
+#: settings.py:304
msgid "All UDP"
msgstr "所有的 UDP"
-#: settings.py:295
+#: settings.py:310
msgid "All ICMP"
msgstr "所有的 ICMP"
@@ -323,15 +323,25 @@ msgstr "無法與 Neutron 連線。"
msgid "Unable to parse IP address %s."
msgstr "ç„¡æ³•åˆ†æž IP ä½å€ %s。"
-#: api/neutron.py:958
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:993
#, python-format
msgid ""
-"The 'operation' parameter for get_dvr_permission is invalid. It should be "
-"one of %s"
+"The requested feature '%(feature)s' is unknown. Please make sure to specify "
+"a feature defined in FEATURE_MAP."
msgstr ""
-#: api/neutron.py:971
-msgid "Failed to check Neutron \"dvr\" extension is not supported"
+#. Translators: Only used inside Horizon code and invisible to users
+#: api/neutron.py:1011
+#, python-format
+msgid ""
+"The 'operation' parameter for get_feature_permission '%(feature)s' is "
+"invalid. It should be one of %(allowed)s"
+msgstr ""
+
+#: api/neutron.py:1026
+#, python-format
+msgid "Failed to check Neutron '%s' extension is not supported"
msgstr ""
#: api/nova.py:211
@@ -364,12 +374,12 @@ msgstr "更改 %(num_groups_to_modify)d 個執行實例的安全性群組時失æ
msgid "Failed to modify %d instance security groups"
msgstr "更改 %d 個執行實例的安全性群組時失敗"
-#: api/nova.py:748
+#: api/nova.py:752
#, python-format
msgid "Name: %(name)s ID: %(uuid)s"
msgstr "å稱:%(name)s 識別號:%(uuid)s"
-#: api/nova.py:753
+#: api/nova.py:757
#, python-format
msgid "Failed to evacuate instances: %s"
msgstr "撤離執行實例時失敗:%s"
@@ -478,7 +488,7 @@ msgstr "管ç†å“¡"
#: dashboards/project/networks/templates/networks/_detail_overview.html:7
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:10
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:9
-#: dashboards/project/routers/forms.py:73
+#: dashboards/project/routers/forms.py:85
#: dashboards/project/routers/tables.py:165
#: dashboards/project/routers/ports/tables.py:94
#: dashboards/project/routers/templates/routers/_detail_overview.html:7
@@ -984,6 +994,230 @@ msgstr "æ›´æ–°èšåˆæ述資料"
msgid "Manage Hosts Aggregate"
msgstr "管ç†ä¸»æ©Ÿèšåˆ"
+#: dashboards/admin/defaults/panel.py:23
+#: dashboards/admin/defaults/templates/defaults/index.html:3
+#: dashboards/admin/defaults/templates/defaults/index.html:6
+msgid "Defaults"
+msgstr "é è¨­å€¼"
+
+#: dashboards/admin/defaults/tables.py:34
+#: dashboards/admin/defaults/workflows.py:80
+msgid "Update Defaults"
+msgstr "æ›´æ–°é è¨­å€¼"
+
+#: dashboards/admin/defaults/tables.py:41
+#: dashboards/admin/defaults/workflows.py:31 usage/quotas.py:66
+msgid "Injected File Content Bytes"
+msgstr "已注入的資料內容ä½å…ƒçµ„"
+
+#: dashboards/admin/defaults/tables.py:42
+#: dashboards/admin/defaults/workflows.py:32
+msgid "Length of Injected File Path"
+msgstr "已注入的資料路徑長度"
+
+#: dashboards/admin/defaults/tables.py:43
+#: dashboards/admin/defaults/workflows.py:36
+#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
+msgid "Metadata Items"
+msgstr "æ述資料的項目"
+
+#: dashboards/admin/defaults/tables.py:44
+#: dashboards/admin/defaults/workflows.py:47
+#: dashboards/admin/flavors/tables.py:122
+#: dashboards/admin/flavors/workflows.py:46
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:47
+#: dashboards/project/instances/templates/instances/_detail_overview.html:50
+#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
+#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
+#: dashboards/project/overview/views.py:32 usage/quotas.py:63
+#: usage/tables.py:33
+msgid "VCPUs"
+msgstr "虛擬 CPU 數"
+
+#: dashboards/admin/defaults/tables.py:45
+#: dashboards/admin/defaults/workflows.py:42
+#: dashboards/admin/hypervisors/tables.py:57
+#: dashboards/admin/instances/panel.py:27
+#: dashboards/admin/instances/tables.py:37
+#: dashboards/admin/instances/tables.py:159
+#: dashboards/admin/instances/templates/instances/index.html:3
+#: dashboards/identity/projects/workflows.py:48
+#: dashboards/project/data_processing/clusters/tabs.py:149
+#: dashboards/project/databases/panel.py:23
+#: dashboards/project/databases/tables.py:37
+#: dashboards/project/databases/tables.py:50
+#: dashboards/project/databases/tables.py:219
+#: dashboards/project/databases/templates/databases/index.html:3
+#: dashboards/project/databases/templates/databases/index.html:6
+#: dashboards/project/instances/panel.py:23
+#: dashboards/project/instances/tables.py:921
+#: dashboards/project/instances/templates/instances/index.html:3
+#: dashboards/project/instances/templates/instances/index.html:6
+#: dashboards/project/network_topology/instances/tables.py:23
+#: usage/quotas.py:64
+msgid "Instances"
+msgstr "執行實例"
+
+#: dashboards/admin/defaults/tables.py:46
+#: dashboards/admin/defaults/workflows.py:46
+#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
+msgid "Injected Files"
+msgstr "已注入的資料"
+
+#: dashboards/admin/defaults/tables.py:47
+#: dashboards/admin/defaults/workflows.py:53
+#: dashboards/admin/volumes/panel.py:21 dashboards/admin/volumes/tabs.py:35
+#: dashboards/admin/volumes/templates/volumes/index.html:3
+#: dashboards/admin/volumes/templates/volumes/index.html:6
+#: dashboards/admin/volumes/volumes/tables.py:48
+#: dashboards/identity/projects/workflows.py:53
+#: dashboards/project/volumes/panel.py:23
+#: dashboards/project/volumes/tabs.py:62
+#: dashboards/project/volumes/templates/volumes/index.html:3
+#: dashboards/project/volumes/templates/volumes/index.html:6
+#: dashboards/project/volumes/volumes/tables.py:371
+#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
+msgid "Volumes"
+msgstr "儲存空間"
+
+#: dashboards/admin/defaults/tables.py:48
+#: dashboards/admin/defaults/workflows.py:52
+#: dashboards/admin/volumes/tabs.py:93
+#: dashboards/admin/volumes/snapshots/tables.py:68
+#: dashboards/identity/projects/workflows.py:54
+#: dashboards/project/volumes/tabs.py:76
+#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
+msgid "Volume Snapshots"
+msgstr "儲存空間å³æ™‚存檔"
+
+#: dashboards/admin/defaults/tables.py:49
+#: dashboards/admin/defaults/workflows.py:51
+#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
+msgid "Total Size of Volumes and Snapshots (GB)"
+msgstr "儲存空間與å³æ™‚存檔的全部容é‡ï¼ˆGB)"
+
+#: dashboards/admin/defaults/tables.py:50
+#: dashboards/admin/defaults/workflows.py:37
+#: dashboards/admin/flavors/workflows.py:48
+#: dashboards/admin/overview/views.py:33
+#: dashboards/identity/projects/workflows.py:57
+#: dashboards/project/overview/views.py:32 usage/quotas.py:67
+msgid "RAM (MB)"
+msgstr "隨機存å–記憶體(MB)"
+
+#: dashboards/admin/defaults/tables.py:51
+#: dashboards/admin/defaults/workflows.py:38
+#: dashboards/identity/projects/workflows.py:58
+#: dashboards/identity/projects/workflows.py:70
+#: dashboards/project/access_and_security/tabs.py:80
+#: dashboards/project/access_and_security/floating_ips/tables.py:197
+#: usage/quotas.py:68 usage/quotas.py:81
+msgid "Floating IPs"
+msgstr "浮動 IP"
+
+#: dashboards/admin/defaults/tables.py:52
+#: dashboards/admin/defaults/workflows.py:49
+#: dashboards/identity/projects/workflows.py:61
+#: dashboards/identity/projects/workflows.py:67
+#: dashboards/project/access_and_security/tabs.py:43
+#: dashboards/project/access_and_security/security_groups/tables.py:130
+#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
+#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
+#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
+#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
+#: dashboards/project/instances/templates/instances/_detail_overview.html:77
+#: dashboards/project/instances/workflows/create_instance.py:489
+#: dashboards/project/instances/workflows/update_instance.py:80
+#: usage/quotas.py:70 usage/quotas.py:82
+msgid "Security Groups"
+msgstr "安全性群組"
+
+#: dashboards/admin/defaults/tables.py:53
+#: dashboards/admin/defaults/workflows.py:44
+#: dashboards/identity/projects/workflows.py:63
+#: dashboards/identity/projects/workflows.py:69
+#: dashboards/project/access_and_security/security_groups/tables.py:258
+#: usage/quotas.py:71 usage/quotas.py:83
+msgid "Security Group Rules"
+msgstr "安全性群組è¦å‰‡"
+
+#: dashboards/admin/defaults/tables.py:54
+#: dashboards/admin/defaults/workflows.py:39
+#: dashboards/project/access_and_security/tabs.py:63
+#: dashboards/project/access_and_security/keypairs/tables.py:90
+#: usage/quotas.py:72
+msgid "Key Pairs"
+msgstr "密鑰å°"
+
+#: dashboards/admin/defaults/tables.py:55
+#: dashboards/admin/networks/ports/tables.py:94
+#: dashboards/admin/routers/ports/tables.py:29
+#: dashboards/identity/projects/workflows.py:59
+#: dashboards/project/networks/ports/tables.py:57
+#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
+msgid "Fixed IPs"
+msgstr "固定 IP"
+
+#: dashboards/admin/defaults/tables.py:56
+msgid "LUKS Volumes"
+msgstr "LUKS 加密儲存空間"
+
+#: dashboards/admin/defaults/tables.py:57
+msgid "LUKS Volume Snapshots"
+msgstr "LUKS 加密儲存空間å³æ™‚存檔"
+
+#: dashboards/admin/defaults/tables.py:59
+msgid "Total Size of LUKS Volumes and Snapshots (GB)"
+msgstr "LUKS 加密儲存空間與å³æ™‚存檔的全部容é‡ï¼ˆGB)"
+
+#: dashboards/admin/defaults/tables.py:60
+msgid "dm-crypt"
+msgstr "dm-crypt"
+
+#: dashboards/admin/defaults/tables.py:66
+msgid "Quota Name"
+msgstr "é…é¡å稱"
+
+#: dashboards/admin/defaults/tables.py:67
+msgid "Limit"
+msgstr "é™åˆ¶"
+
+#: dashboards/admin/defaults/tables.py:74
+msgid "Quotas"
+msgstr "é…é¡"
+
+#: dashboards/admin/defaults/tabs.py:27
+#: dashboards/admin/defaults/workflows.py:66
+msgid "Default Quotas"
+msgstr "é è¨­é…é¡"
+
+#: dashboards/admin/defaults/tabs.py:37
+msgid "Unable to get quota info."
+msgstr "無法ç²å¾—é…é¡è³‡è¨Šã€‚"
+
+#: dashboards/admin/defaults/views.py:44
+#: dashboards/identity/projects/views.py:159
+msgid "Unable to retrieve default quota values."
+msgstr "無法å–回é è¨­çš„é…é¡æ•¸å€¼ã€‚"
+
+#: dashboards/admin/defaults/workflows.py:68
+msgid "From here you can update the default quotas (max limits)."
+msgstr "您å¯ä»¥åœ¨æ­¤æ›´æ–°é è¨­çš„é…é¡ï¼ˆæœ€å¤§é™åˆ¶ï¼‰ã€‚"
+
+#: dashboards/admin/defaults/workflows.py:79
+msgid "Update Default Quotas"
+msgstr "æ›´æ–°é è¨­é…é¡"
+
+#: dashboards/admin/defaults/workflows.py:81
+msgid "Default quotas updated."
+msgstr "已更新é è¨­é…é¡ã€‚"
+
+#: dashboards/admin/defaults/workflows.py:82
+#: dashboards/admin/defaults/workflows.py:99
+msgid "Unable to update default quotas."
+msgstr "無法更新é è¨­çš„é…é¡ã€‚"
+
#: dashboards/admin/flavors/forms.py:48
msgid "Unable to update the flavor metadata."
msgstr "無法更新虛擬硬體樣æ¿æ述資料。"
@@ -1041,18 +1275,6 @@ msgstr "%sGB"
msgid "Flavor Name"
msgstr "虛擬硬體樣æ¿å稱"
-#: dashboards/admin/flavors/tables.py:122
-#: dashboards/admin/flavors/workflows.py:46
-#: dashboards/admin/info/tables.py:208 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:47
-#: dashboards/project/instances/templates/instances/_detail_overview.html:50
-#: dashboards/project/instances/templates/instances/_flavors_and_quotas.html:10
-#: dashboards/project/instances/templates/instances/_instance_flavor.html:4
-#: dashboards/project/overview/views.py:32 usage/quotas.py:63
-#: usage/tables.py:33
-msgid "VCPUs"
-msgstr "虛擬 CPU 數"
-
#: dashboards/admin/flavors/tables.py:124
#: dashboards/project/databases/templates/databases/_detail_overview.html:28
#: dashboards/project/instances/templates/instances/_detail_overview.html:48
@@ -1115,7 +1337,7 @@ msgstr "Swap 硬碟"
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:12
#: dashboards/project/networks/templates/networks/ports/_update.html:13
#: dashboards/project/networks/templates/networks/subnets/_detail_overview.html:11
-#: dashboards/project/routers/forms.py:77
+#: dashboards/project/routers/forms.py:89
#: dashboards/project/routers/templates/routers/_detail_overview.html:9
#: dashboards/project/stacks/templates/stacks/_detail_overview.html:11
#: dashboards/project/volumes/templates/volumes/backups/_detail_overview.html:12
@@ -1170,13 +1392,6 @@ msgid ""
"Name may only contain letters, numbers, underscores, periods and hyphens."
msgstr "å稱åªèƒ½åŒ…å«è‹±æ–‡å­—æ¯ã€æ•¸å­—ã€åº•ç·šã€å¥é»žå’Œé€£å­—號。"
-#: dashboards/admin/flavors/workflows.py:48
-#: dashboards/admin/info/tables.py:214 dashboards/admin/overview/views.py:33
-#: dashboards/identity/projects/workflows.py:57
-#: dashboards/project/overview/views.py:32 usage/quotas.py:67
-msgid "RAM (MB)"
-msgstr "隨機存å–記憶體(MB)"
-
#: dashboards/admin/flavors/workflows.py:50
msgid "Root Disk (GB)"
msgstr "根硬碟(GB)"
@@ -1347,28 +1562,6 @@ msgstr "儲存容é‡ï¼ˆä½¿ç”¨ä¸­ï¼‰"
msgid "Storage (total)"
msgstr "儲存容é‡ï¼ˆç¸½å…±ï¼‰"
-#: dashboards/admin/hypervisors/tables.py:57
-#: dashboards/admin/info/tables.py:209 dashboards/admin/instances/panel.py:27
-#: dashboards/admin/instances/tables.py:37
-#: dashboards/admin/instances/tables.py:159
-#: dashboards/admin/instances/templates/instances/index.html:3
-#: dashboards/identity/projects/workflows.py:48
-#: dashboards/project/data_processing/clusters/tabs.py:149
-#: dashboards/project/databases/panel.py:23
-#: dashboards/project/databases/tables.py:37
-#: dashboards/project/databases/tables.py:50
-#: dashboards/project/databases/tables.py:219
-#: dashboards/project/databases/templates/databases/index.html:3
-#: dashboards/project/databases/templates/databases/index.html:6
-#: dashboards/project/instances/panel.py:23
-#: dashboards/project/instances/tables.py:921
-#: dashboards/project/instances/templates/instances/index.html:3
-#: dashboards/project/instances/templates/instances/index.html:6
-#: dashboards/project/network_topology/instances/tables.py:23
-#: usage/quotas.py:64
-msgid "Instances"
-msgstr "執行實例"
-
#: dashboards/admin/hypervisors/tables.py:70
#: dashboards/project/databases/tables.py:198
#: dashboards/project/databases/workflows/create_instance.py:35
@@ -1552,7 +1745,7 @@ msgid "Compute Host"
msgstr "é‹ç®—主機"
#: dashboards/admin/hypervisors/compute/tabs.py:34
-#: dashboards/admin/info/tabs.py:56
+#: dashboards/admin/info/tabs.py:55
msgid "Unable to get nova services list."
msgstr "無法ç²å¾— Nova 伺æœå™¨åˆ—表。"
@@ -1790,7 +1983,7 @@ msgstr "已關閉"
msgid "Service"
msgstr "伺æœå™¨"
-#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:31
+#: dashboards/admin/info/tables.py:74 dashboards/admin/info/tabs.py:30
msgid "Services"
msgstr "伺æœå™¨"
@@ -1800,11 +1993,11 @@ msgctxt "Time since the last update"
msgid "Last Updated"
msgstr "最近一次更新"
-#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:47
+#: dashboards/admin/info/tables.py:112 dashboards/admin/info/tabs.py:46
msgid "Compute Services"
msgstr "é‹ç®—伺æœå™¨"
-#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:65
+#: dashboards/admin/info/tables.py:137 dashboards/admin/info/tabs.py:64
msgid "Block Storage Services"
msgstr "å€å¡Šé¡žåž‹å„²å­˜ä¼ºæœå™¨"
@@ -1818,153 +2011,22 @@ msgstr "上線"
msgid "Down"
msgstr "離線"
-#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:83
+#: dashboards/admin/info/tables.py:186 dashboards/admin/info/tabs.py:82
msgid "Network Agents"
msgstr "網路媒介"
-#: dashboards/admin/info/tables.py:205 usage/quotas.py:66
-msgid "Injected File Content Bytes"
-msgstr "已注入的資料內容ä½å…ƒçµ„"
-
-#: dashboards/admin/info/tables.py:206
-msgid "Length of Injected File Path"
-msgstr "已注入的資料路徑長度"
-
-#: dashboards/admin/info/tables.py:207
-#: dashboards/identity/projects/workflows.py:46 usage/quotas.py:62
-msgid "Metadata Items"
-msgstr "æ述資料的項目"
-
-#: dashboards/admin/info/tables.py:210
-#: dashboards/identity/projects/workflows.py:50 usage/quotas.py:65
-msgid "Injected Files"
-msgstr "已注入的資料"
-
-#: dashboards/admin/info/tables.py:211 dashboards/admin/volumes/panel.py:21
-#: dashboards/admin/volumes/tabs.py:35
-#: dashboards/admin/volumes/templates/volumes/index.html:3
-#: dashboards/admin/volumes/templates/volumes/index.html:6
-#: dashboards/admin/volumes/volumes/tables.py:48
-#: dashboards/identity/projects/workflows.py:53
-#: dashboards/project/volumes/panel.py:23
-#: dashboards/project/volumes/tabs.py:62
-#: dashboards/project/volumes/templates/volumes/index.html:3
-#: dashboards/project/volumes/templates/volumes/index.html:6
-#: dashboards/project/volumes/volumes/tables.py:371
-#: dashboards/project/volumes/volumes/tables.py:385 usage/quotas.py:74
-msgid "Volumes"
-msgstr "儲存空間"
-
-#: dashboards/admin/info/tables.py:212 dashboards/admin/volumes/tabs.py:93
-#: dashboards/admin/volumes/snapshots/tables.py:68
-#: dashboards/identity/projects/workflows.py:54
-#: dashboards/project/volumes/tabs.py:76
-#: dashboards/project/volumes/snapshots/tables.py:147 usage/quotas.py:75
-msgid "Volume Snapshots"
-msgstr "儲存空間å³æ™‚存檔"
-
-#: dashboards/admin/info/tables.py:213
-#: dashboards/identity/projects/workflows.py:56 usage/quotas.py:76
-msgid "Total Size of Volumes and Snapshots (GB)"
-msgstr "儲存空間與å³æ™‚存檔的全部容é‡ï¼ˆGB)"
-
-#: dashboards/admin/info/tables.py:215
-#: dashboards/identity/projects/workflows.py:58
-#: dashboards/identity/projects/workflows.py:70
-#: dashboards/project/access_and_security/tabs.py:80
-#: dashboards/project/access_and_security/floating_ips/tables.py:197
-#: usage/quotas.py:68 usage/quotas.py:81
-msgid "Floating IPs"
-msgstr "浮動 IP"
-
-#: dashboards/admin/info/tables.py:216
-#: dashboards/identity/projects/workflows.py:61
-#: dashboards/identity/projects/workflows.py:67
-#: dashboards/project/access_and_security/tabs.py:43
-#: dashboards/project/access_and_security/security_groups/tables.py:130
-#: dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html:24
-#: dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html:32
-#: dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html:36
-#: dashboards/project/data_processing/nodegroup_templates/workflows/create.py:109
-#: dashboards/project/instances/templates/instances/_detail_overview.html:77
-#: dashboards/project/instances/workflows/create_instance.py:489
-#: dashboards/project/instances/workflows/update_instance.py:80
-#: usage/quotas.py:70 usage/quotas.py:82
-msgid "Security Groups"
-msgstr "安全性群組"
-
-#: dashboards/admin/info/tables.py:217
-#: dashboards/identity/projects/workflows.py:63
-#: dashboards/identity/projects/workflows.py:69
-#: dashboards/project/access_and_security/security_groups/tables.py:258
-#: usage/quotas.py:71 usage/quotas.py:83
-msgid "Security Group Rules"
-msgstr "安全性群組è¦å‰‡"
-
-#: dashboards/admin/info/tables.py:218
-#: dashboards/project/access_and_security/tabs.py:63
-#: dashboards/project/access_and_security/keypairs/tables.py:90
-#: usage/quotas.py:72
-msgid "Key Pairs"
-msgstr "密鑰å°"
-
-#: dashboards/admin/info/tables.py:219
-#: dashboards/admin/networks/ports/tables.py:94
-#: dashboards/admin/routers/ports/tables.py:29
-#: dashboards/identity/projects/workflows.py:59
-#: dashboards/project/networks/ports/tables.py:57
-#: dashboards/project/routers/ports/tables.py:97 usage/quotas.py:69
-msgid "Fixed IPs"
-msgstr "固定 IP"
-
-#: dashboards/admin/info/tables.py:220
-msgid "LUKS Volumes"
-msgstr "LUKS 加密儲存空間"
-
-#: dashboards/admin/info/tables.py:221
-msgid "LUKS Volume Snapshots"
-msgstr "LUKS 加密儲存空間å³æ™‚存檔"
-
-#: dashboards/admin/info/tables.py:223
-msgid "Total Size of LUKS Volumes and Snapshots (GB)"
-msgstr "LUKS 加密儲存空間與å³æ™‚存檔的全部容é‡ï¼ˆGB)"
-
-#: dashboards/admin/info/tables.py:224
-msgid "dm-crypt"
-msgstr "dm-crypt"
-
-#: dashboards/admin/info/tables.py:230
-msgid "Quota Name"
-msgstr "é…é¡å稱"
-
-#: dashboards/admin/info/tables.py:231
-msgid "Limit"
-msgstr "é™åˆ¶"
-
-#: dashboards/admin/info/tables.py:238
-msgid "Quotas"
-msgstr "é…é¡"
-
-#: dashboards/admin/info/tabs.py:74
+#: dashboards/admin/info/tabs.py:73
msgid "Unable to get cinder services list."
msgstr "無法ç²å¾— Cinder 伺æœå™¨åˆ—表。"
-#: dashboards/admin/info/tabs.py:92
+#: dashboards/admin/info/tabs.py:91
msgid "Unable to get network agents info."
msgstr "無法ç²å¾—網路媒介資訊。"
-#: dashboards/admin/info/tabs.py:99
+#: dashboards/admin/info/tabs.py:98
msgid "Unable to get network agents list."
msgstr "無法ç²å¾—網路媒介列表。"
-#: dashboards/admin/info/tabs.py:108
-msgid "Default Quotas"
-msgstr "é è¨­é…é¡"
-
-#: dashboards/admin/info/tabs.py:119
-msgid "Unable to get quota info."
-msgstr "無法ç²å¾—é…é¡è³‡è¨Šã€‚"
-
#: dashboards/admin/info/views.py:39
msgid "Unable to retrieve version information."
msgstr "無法å–回版本資訊。"
@@ -2463,7 +2525,7 @@ msgstr "分段識別號"
#: dashboards/project/networks/ports/tables.py:61
#: dashboards/project/networks/templates/networks/_detail_overview.html:15
#: dashboards/project/networks/templates/networks/ports/_detail_overview.html:34
-#: dashboards/project/routers/forms.py:76
+#: dashboards/project/routers/forms.py:88
#: dashboards/project/routers/ports/tables.py:102
#: dashboards/project/routers/templates/routers/_detail_overview.html:13
#: dashboards/project/vpn/forms.py:41 dashboards/project/vpn/forms.py:263
@@ -2492,7 +2554,7 @@ msgstr "已分享"
#: dashboards/admin/networks/forms.py:81
#: dashboards/admin/networks/forms.py:240
#: dashboards/project/networks/templates/networks/_detail_overview.html:19
-#: dashboards/project/routers/tables.py:175
+#: dashboards/project/routers/tables.py:179
#: dashboards/project/routers/ports/forms.py:146
msgid "External Network"
msgstr "å°å¤–網路"
@@ -3063,7 +3125,7 @@ msgstr "監視"
#: dashboards/identity/projects/workflows.py:73
#: dashboards/project/network_topology/routers/tables.py:27
#: dashboards/project/routers/panel.py:24
-#: dashboards/project/routers/tables.py:191
+#: dashboards/project/routers/tables.py:197
#: dashboards/project/routers/templates/routers/index.html:3
#: dashboards/project/routers/templates/routers/index.html:6
#: usage/quotas.py:80
@@ -3189,21 +3251,28 @@ msgid "Project ID"
msgstr "專案識別號"
#: dashboards/admin/routers/templates/routers/_detail_overview.html:18
-#: dashboards/project/routers/forms.py:46
-#: dashboards/project/routers/forms.py:92
-#: dashboards/project/routers/forms.py:98
+#: dashboards/project/routers/forms.py:47
+#: dashboards/project/routers/forms.py:105
+#: dashboards/project/routers/forms.py:111
#: dashboards/project/routers/tables.py:173
#: dashboards/project/routers/templates/routers/_detail_overview.html:16
msgid "Distributed"
msgstr ""
#: dashboards/admin/routers/templates/routers/_detail_overview.html:22
+#: dashboards/project/routers/forms.py:37
+#: dashboards/project/routers/forms.py:92
#: dashboards/project/routers/templates/routers/_detail_overview.html:20
+msgid "High Availability Mode"
+msgstr ""
+
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:26
+#: dashboards/project/routers/templates/routers/_detail_overview.html:24
msgid "External Gateway Information"
msgstr "å°å¤–é–˜é“資訊"
-#: dashboards/admin/routers/templates/routers/_detail_overview.html:23
-#: dashboards/project/routers/templates/routers/_detail_overview.html:21
+#: dashboards/admin/routers/templates/routers/_detail_overview.html:27
+#: dashboards/project/routers/templates/routers/_detail_overview.html:25
msgid "Connected External Network"
msgstr "已連接å°å¤–網路"
@@ -4329,10 +4398,6 @@ msgstr "權é™çš„等級ä¸è¶³ä»¥æª¢è¦–專案資訊。"
msgid "Unable to retrieve default Neutron quota values."
msgstr "無法å–回é è¨­çš„ Neutron é…é¡å€¼ã€‚"
-#: dashboards/identity/projects/views.py:159
-msgid "Unable to retrieve default quota values."
-msgstr "無法å–回é è¨­çš„é…é¡æ•¸å€¼ã€‚"
-
#: dashboards/identity/projects/views.py:189
#: dashboards/identity/users/views.py:110
msgid "Unable to retrieve project domain."
@@ -4715,7 +4780,7 @@ msgstr "å­˜å–權以åŠå®‰å…¨æ€§"
#: dashboards/project/access_and_security/tabs.py:57
#: dashboards/project/access_and_security/security_groups/views.py:120
-#: usage/base.py:109
+#: usage/base.py:116
msgid "Unable to retrieve security groups."
msgstr "無法å–回安全性群組。"
@@ -4725,7 +4790,7 @@ msgstr "無法å–回密鑰å°åˆ—表。"
#: dashboards/project/access_and_security/tabs.py:94
#: dashboards/project/access_and_security/floating_ips/workflows.py:71
-#: usage/base.py:104
+#: usage/base.py:111
msgid "Unable to retrieve floating IP addresses."
msgstr "無法å–回浮動 IP ä½å€ã€‚"
@@ -6534,7 +6599,7 @@ msgstr "儲存空間類型"
#: dashboards/project/data_processing/job_binaries/forms.py:55
msgid "Internal binary"
-msgstr "內部二進ä½"
+msgstr "內部程å¼"
#: dashboards/project/data_processing/job_binaries/forms.py:58
msgid "Upload File"
@@ -6554,12 +6619,12 @@ msgstr "使用者å稱"
#: dashboards/project/data_processing/job_binaries/forms.py:98
msgid "Failed to get list of internal binaries."
-msgstr "ç²å¾—內部二進ä½åˆ—表時失敗。"
+msgstr "ç²å¾—內部程å¼åˆ—表時失敗。"
#: dashboards/project/data_processing/job_binaries/forms.py:128
#: dashboards/project/data_processing/job_binaries/forms.py:171
msgid "Unable to create job binary"
-msgstr "無法新增工作二進ä½"
+msgstr "無法新增工作程å¼"
#: dashboards/project/data_processing/job_binaries/forms.py:143
#: dashboards/project/data_processing/job_binaries/tables.py:31
@@ -6567,35 +6632,35 @@ msgstr "無法新增工作二進ä½"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/create.html:3
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/create.html:6
msgid "Create Job Binary"
-msgstr "新增工作二進ä½"
+msgstr "新增工作程å¼"
#: dashboards/project/data_processing/job_binaries/forms.py:160
msgid "Unable to upload job binary"
-msgstr "無法上傳工作二進ä½"
+msgstr "無法上傳工作程å¼"
#: dashboards/project/data_processing/job_binaries/forms.py:193
msgid "Failed to fetch internal binary list"
-msgstr "å–得內部二進ä½åˆ—表時失敗"
+msgstr "å–得內部程å¼åˆ—表時失敗"
#: dashboards/project/data_processing/job_binaries/panel.py:22
#: dashboards/project/data_processing/job_binaries/tables.py:90
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/job_binaries.html:6
msgid "Job Binaries"
-msgstr "工作二進ä½"
+msgstr "工作程å¼"
#: dashboards/project/data_processing/job_binaries/tables.py:41
msgid "Delete Job binary"
msgid_plural "Delete Job binaries"
-msgstr[0] "刪除工作二進ä½"
+msgstr[0] "刪除工作程å¼"
#: dashboards/project/data_processing/job_binaries/tables.py:49
msgid "Deleted Job binary"
msgid_plural "Deleted Job binaries"
-msgstr[0] "已刪除工作二進ä½"
+msgstr[0] "已刪除工作程å¼"
#: dashboards/project/data_processing/job_binaries/tables.py:74
msgid "Download Job Binary"
-msgstr "下載工作二進ä½"
+msgstr "下載工作程å¼"
#: dashboards/project/data_processing/job_binaries/tables.py:84
msgid "Url"
@@ -6603,16 +6668,16 @@ msgstr "網å€"
#: dashboards/project/data_processing/job_binaries/tabs.py:38
msgid "Unable to fetch job binary."
-msgstr "無法å–得工作二進ä½ã€‚"
+msgstr "無法å–得工作程å¼ã€‚"
#: dashboards/project/data_processing/job_binaries/views.py:51
msgid "Unable to fetch job binary list."
-msgstr "無法å–得工作二進ä½åˆ—表。"
+msgstr "無法å–得工作程å¼åˆ—表。"
#: dashboards/project/data_processing/job_binaries/views.py:85
#, python-format
msgid "Unable to fetch job binary: %(exc)s"
-msgstr "無法å–得工作二進ä½ï¼š%(exc)s"
+msgstr "無法å–得工作程å¼ï¼š%(exc)s"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:4
msgid ""
@@ -6622,7 +6687,7 @@ msgstr ""
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:8
msgid "Select the storage type for your job binary."
-msgstr "為您的工作二進ä½é¸æ“‡å„²å­˜ç©ºé–“類型。"
+msgstr "為您的工作程å¼é¸æ“‡å„²å­˜ç©ºé–“類型。"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html:10
msgid "Data Processing internal database"
@@ -6664,32 +6729,32 @@ msgstr ""
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_details.html:2
msgid "Job Binary Overview"
-msgstr "工作二進ä½æ¦‚觀"
+msgstr "工作程å¼æ¦‚觀"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_details.html:16
msgid "Download job binary"
-msgstr "下載工作二進ä½"
+msgstr "下載工作程å¼"
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/details.html:3
#: dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/details.html:6
msgid "Job Binary Details"
-msgstr "工作二進ä½è©³ç´°è³‡è¨Š"
+msgstr "工作程å¼è©³ç´°è³‡è¨Š"
#: dashboards/project/data_processing/job_executions/panel.py:22
#: dashboards/project/data_processing/job_executions/tables.py:161
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/job_executions.html:6
msgid "Job Executions"
-msgstr "工作執行"
+msgstr "工作執行任務"
#: dashboards/project/data_processing/job_executions/tables.py:34
msgid "Delete Job execution"
msgid_plural "Delete Job executions"
-msgstr[0] "刪除工作執行"
+msgstr[0] "刪除工作執行任務"
#: dashboards/project/data_processing/job_executions/tables.py:42
msgid "Deleted Job execution"
msgid_plural "Deleted Job executions"
-msgstr[0] "已刪除工作執行"
+msgstr[0] "已刪除工作執行任務"
#: dashboards/project/data_processing/job_executions/tables.py:58
#: dashboards/project/data_processing/job_executions/tables.py:87
@@ -6739,11 +6804,11 @@ msgstr "å¢é›†"
#: dashboards/project/data_processing/job_executions/views.py:43
msgid "Unable to fetch job executions."
-msgstr "無法å–得工作執行。"
+msgstr "無法å–得工作執行任務。"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:3
msgid "Job Execution Overview"
-msgstr "工作執行概觀"
+msgstr "工作執行任務概觀"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html:12
msgid "Input Data Source"
@@ -6789,7 +6854,7 @@ msgstr "工作設置"
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/details.html:3
#: dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/details.html:6
msgid "Job Execution Details"
-msgstr "工作執行詳細資訊"
+msgstr "工作執行任務詳細資訊"
#: dashboards/project/data_processing/jobs/panel.py:22
#: dashboards/project/data_processing/jobs/tables.py:156
@@ -6965,7 +7030,7 @@ msgstr "工作類型"
#: dashboards/project/data_processing/jobs/workflows/create.py:59
msgid "Choose a main binary"
-msgstr "é¸æ“‡ä¸»è¦çš„二進ä½"
+msgstr "é¸æ“‡ä¸»è¦çš„程å¼"
#: dashboards/project/data_processing/jobs/workflows/create.py:61
msgid "Choose the binary which should be used in this Job."
@@ -7052,7 +7117,7 @@ msgstr ""
#: dashboards/project/data_processing/jobs/workflows/launch.py:373
msgid "Job Execution ID"
-msgstr ""
+msgstr "工作執行任務識別號"
#: dashboards/project/data_processing/jobs/workflows/launch.py:449
msgid "Unable to create new cluster for job."
@@ -9707,7 +9772,7 @@ msgstr "任何å¯ç”¨å€åŸŸ"
#: dashboards/project/instances/workflows/create_instance.py:350
#: dashboards/project/instances/workflows/resize_instance.py:76
-#: usage/base.py:230
+#: usage/base.py:237
msgid "Unable to retrieve quota information."
msgstr "無法å–回é…é¡è³‡è¨Šã€‚"
@@ -11193,39 +11258,48 @@ msgid "Router Name"
msgstr "路由器å稱"
#: dashboards/project/routers/forms.py:36
-#: dashboards/project/routers/forms.py:79
+#: dashboards/project/routers/forms.py:91
msgid "Router Type"
msgstr ""
-#: dashboards/project/routers/forms.py:44
+#: dashboards/project/routers/forms.py:45
+#: dashboards/project/routers/forms.py:55
msgid "Use Server Default"
msgstr ""
-#: dashboards/project/routers/forms.py:45
-#: dashboards/project/routers/forms.py:97
+#: dashboards/project/routers/forms.py:46
+#: dashboards/project/routers/forms.py:110
msgid "Centralized"
msgstr ""
-#: dashboards/project/routers/forms.py:58
+#: dashboards/project/routers/forms.py:56
+msgid "Enable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:57
+msgid "Disable HA mode"
+msgstr ""
+
+#: dashboards/project/routers/forms.py:70
#, python-format
msgid "Router %s was successfully created."
msgstr "å·²æˆåŠŸæ–°å¢žè·¯ç”±å™¨ %s。"
-#: dashboards/project/routers/forms.py:63
+#: dashboards/project/routers/forms.py:75
msgid "Quota exceeded for resource router."
msgstr ""
-#: dashboards/project/routers/forms.py:65
+#: dashboards/project/routers/forms.py:77
#, python-format
msgid "Failed to create router \"%s\"."
msgstr "新增路由器「%sã€æ™‚失敗。"
-#: dashboards/project/routers/forms.py:109
+#: dashboards/project/routers/forms.py:129
#, python-format
msgid "Router %s was successfully updated."
msgstr ""
-#: dashboards/project/routers/forms.py:114
+#: dashboards/project/routers/forms.py:134
#, python-format
msgid "Failed to update router %s"
msgstr ""
@@ -11269,8 +11343,13 @@ msgstr[0] ""
msgid "Unable to clear gateway for router \"%(name)s\": \"%(msg)s\""
msgstr "無法清除路由器「%(name)sã€çš„é–˜é“:「%(msg)sã€"
+#. Translators: High Availability mode of Neutron router
+#: dashboards/project/routers/tables.py:177
+msgid "HA mode"
+msgstr ""
+
#: dashboards/project/routers/tabs.py:54
-#: dashboards/project/routers/views.py:161
+#: dashboards/project/routers/views.py:163
msgid "Unable to retrieve router details."
msgstr "無法å–回路由器詳細資訊。"
@@ -13547,28 +13626,28 @@ msgstr ""
msgid "Invalid date format: Using today as default."
msgstr "無效的日期格å¼ï¼šé è¨­ä½¿ç”¨ä»Šæ—¥ã€‚"
-#: usage/base.py:164
+#: usage/base.py:171
msgid "Unable to retrieve network quota information."
msgstr "無法å–回網路é…é¡è³‡è¨Šã€‚"
-#: usage/base.py:179 usage/quotas.py:292
+#: usage/base.py:186 usage/quotas.py:292
msgid "Unable to retrieve volume limit information."
msgstr "無法å–回儲存空間é™åˆ¶è³‡è¨Šã€‚"
-#: usage/base.py:189
+#: usage/base.py:196
msgid "Unable to retrieve limit information."
msgstr "無法å–回é™åˆ¶è³‡è¨Šã€‚"
-#: usage/base.py:209 usage/views.py:54
+#: usage/base.py:216 usage/views.py:54
msgid "Unable to retrieve usage information."
msgstr "無法å–回使用é‡è³‡è¨Šã€‚"
-#: usage/base.py:212
+#: usage/base.py:219
msgid ""
"Invalid time period. The end date should be more recent than the start date."
msgstr "無效的時段。çµæŸæ—¥æœŸæ‡‰è©²è¦æ¯”開始日期還è¦æŽ¥è¿‘ç¾åœ¨ã€‚"
-#: usage/base.py:216
+#: usage/base.py:223
msgid ""
"Invalid time period. You are requesting data from the future which may not "
"exist."
diff --git a/openstack_dashboard/settings.py b/openstack_dashboard/settings.py
index 311a82b00..146702e78 100644
--- a/openstack_dashboard/settings.py
+++ b/openstack_dashboard/settings.py
@@ -27,6 +27,7 @@ import xstatic.pkg.angular
import xstatic.pkg.angular_cookies
import xstatic.pkg.angular_mock
import xstatic.pkg.bootstrap_datepicker
+import xstatic.pkg.bootstrap_scss
import xstatic.pkg.d3
import xstatic.pkg.font_awesome
import xstatic.pkg.hogan
@@ -35,6 +36,7 @@ import xstatic.pkg.jquery
import xstatic.pkg.jquery_migrate
import xstatic.pkg.jquery_quicksearch
import xstatic.pkg.jquery_tablesorter
+import xstatic.pkg.jquery_ui
import xstatic.pkg.jsencrypt
import xstatic.pkg.qunit
import xstatic.pkg.rickshaw
@@ -145,12 +147,12 @@ TEMPLATE_DIRS = (
)
STATICFILES_FINDERS = (
- 'compressor.finders.CompressorFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
+ 'compressor.finders.CompressorFinder',
)
-STATICFILES_DIRS = (
+STATICFILES_DIRS = [
('horizon/lib/angular',
xstatic.main.XStatic(xstatic.pkg.angular).base_dir),
('horizon/lib/angular',
@@ -159,6 +161,8 @@ STATICFILES_DIRS = (
xstatic.main.XStatic(xstatic.pkg.angular_mock).base_dir),
('horizon/lib/bootstrap_datepicker',
xstatic.main.XStatic(xstatic.pkg.bootstrap_datepicker).base_dir),
+ ('bootstrap',
+ xstatic.main.XStatic(xstatic.pkg.bootstrap_scss).base_dir),
('horizon/lib',
xstatic.main.XStatic(xstatic.pkg.d3).base_dir),
('horizon/lib',
@@ -183,7 +187,17 @@ STATICFILES_DIRS = (
xstatic.main.XStatic(xstatic.pkg.rickshaw).base_dir),
('horizon/lib',
xstatic.main.XStatic(xstatic.pkg.spin).base_dir),
-)
+]
+
+
+if xstatic.main.XStatic(xstatic.pkg.jquery_ui).version.startswith('1.10.'):
+ # The 1.10.x versions already contain the 'ui' directory.
+ STATICFILES_DIRS.append(('horizon/lib/jquery-ui',
+ xstatic.main.XStatic(xstatic.pkg.jquery_ui).base_dir))
+else:
+ # Newer versions dropped the directory, add it to keep the path the same.
+ STATICFILES_DIRS.append(('horizon/lib/jquery-ui/ui',
+ xstatic.main.XStatic(xstatic.pkg.jquery_ui).base_dir))
COMPRESS_PRECOMPILERS = (
('text/scss', 'django_pyscss.compressor.DjangoScssFilter'),
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot
deleted file mode 100644
index 4a4ca865d..000000000
--- a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot
+++ /dev/null
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg
deleted file mode 100644
index e3e2dc739..000000000
--- a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph />
-<glyph />
-<glyph unicode="&#xd;" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
-<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
-<glyph unicode="&#xa0;" />
-<glyph unicode="&#x2000;" horiz-adv-x="652" />
-<glyph unicode="&#x2001;" horiz-adv-x="1304" />
-<glyph unicode="&#x2002;" horiz-adv-x="652" />
-<glyph unicode="&#x2003;" horiz-adv-x="1304" />
-<glyph unicode="&#x2004;" horiz-adv-x="434" />
-<glyph unicode="&#x2005;" horiz-adv-x="326" />
-<glyph unicode="&#x2006;" horiz-adv-x="217" />
-<glyph unicode="&#x2007;" horiz-adv-x="217" />
-<glyph unicode="&#x2008;" horiz-adv-x="163" />
-<glyph unicode="&#x2009;" horiz-adv-x="260" />
-<glyph unicode="&#x200a;" horiz-adv-x="72" />
-<glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="326" />
-<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
-<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
-<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
-<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
-<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
-<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
-<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
-<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
-<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
-<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
-<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
-<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
-<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
-<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
-<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
-<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
-<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
-<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
-<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
-<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
-<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
-<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
-<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
-<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
-<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
-<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
-<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
-<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
-<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
-<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
-<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
-<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
-<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
-<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
-<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
-<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
-<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
-<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
-<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
-<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
-<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
-<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
-<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
-<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
-<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
-<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
-<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
-<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
-<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
-<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
-<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
-<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
-<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
-<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
-<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
-<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
-<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
-<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
-<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
-<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
-<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
-<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
-<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
-<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
-<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
-<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
-<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
-<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
-<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
-<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
-<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
-<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
-<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
-<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
-<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
-<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
-<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
-<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
-<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
-<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
-<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
-<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
-<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
-<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
-<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
-<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
-<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
-<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
-<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
-<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
-<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
-<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
-<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
-<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
-<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
-<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
-<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
-<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
-<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
-<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
-<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
-<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
-<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
-<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
-<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
-<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
-<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
-<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
-<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
-<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
-<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
-<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
-<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
-<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
-<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
-<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
-<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
-<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
-<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
-<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
-<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
-<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
-<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
-<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
-<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
-<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
-<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
-<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
-<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
-<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
-<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
-<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
-<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
-<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
-<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
-<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
-<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
-<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
-<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
-<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
-<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
-<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
-<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
-<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
-<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
-<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
-<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
-<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
-<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
-<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
-<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
-<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
-<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
-<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
-<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
-<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
-<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
-<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
-<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
-<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
-<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
-<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
-<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
-<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
-<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
-<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
-<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 67fa00bf8..000000000
--- a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff
deleted file mode 100644
index 8c54182aa..000000000
--- a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff
+++ /dev/null
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss b/openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss
deleted file mode 100644
index 34132501f..000000000
--- a/openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-// Mincer asset helper functions
-//
-// This must be imported into a .css.ejs.scss file.
-// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
-
-
-@function twbs-font-path($path) {
- // do something like following
- // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
- // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
- // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
- @return "<%- asset_path('#{$path}'.replace(/[#?].*$/, '')) + '#{$path}'.replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
-}
-
-@function twbs-image-path($file) {
- @return "<%- asset_path('#{$file}') %>";
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap.scss
deleted file mode 100644
index 65204aad1..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-// Core variables and mixins
-@import "bootstrap/variables";
-@import "bootstrap/mixins";
-
-// Reset and dependencies
-@import "bootstrap/normalize";
-@import "bootstrap/print";
-@import "bootstrap/glyphicons";
-
-// Core CSS
-@import "bootstrap/scaffolding";
-@import "bootstrap/type";
-@import "bootstrap/code";
-@import "bootstrap/grid";
-@import "bootstrap/tables";
-@import "bootstrap/forms";
-@import "bootstrap/buttons";
-
-// Components
-@import "bootstrap/component-animations";
-@import "bootstrap/dropdowns";
-@import "bootstrap/button-groups";
-@import "bootstrap/input-groups";
-@import "bootstrap/navs";
-@import "bootstrap/navbar";
-@import "bootstrap/breadcrumbs";
-@import "bootstrap/pagination";
-@import "bootstrap/pager";
-@import "bootstrap/labels";
-@import "bootstrap/badges";
-@import "bootstrap/jumbotron";
-@import "bootstrap/thumbnails";
-@import "bootstrap/alerts";
-@import "bootstrap/progress-bars";
-@import "bootstrap/media";
-@import "bootstrap/list-group";
-@import "bootstrap/panels";
-@import "bootstrap/responsive-embed";
-@import "bootstrap/wells";
-@import "bootstrap/close";
-
-// Components w/ JavaScript
-@import "bootstrap/modals";
-@import "bootstrap/tooltip";
-@import "bootstrap/popovers";
-@import "bootstrap/carousel";
-
-// Utility classes
-@import "bootstrap/utilities";
-@import "bootstrap/responsive-utilities";
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss
deleted file mode 100644
index 4685ac3a9..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// Alerts
-// --------------------------------------------------
-
-
-// Base styles
-// -------------------------
-
-.alert {
- padding: $alert-padding;
- margin-bottom: $line-height-computed;
- border: 1px solid transparent;
- border-radius: $alert-border-radius;
-
- // Headings for larger alerts
- h4 {
- margin-top: 0;
- // Specified for the h4 to prevent conflicts of changing $headings-color
- color: inherit;
- }
- // Provide class for links that match alerts
- .alert-link {
- font-weight: $alert-link-font-weight;
- }
-
- // Improve alignment and spacing of inner content
- > p,
- > ul {
- margin-bottom: 0;
- }
- > p + p {
- margin-top: 5px;
- }
-}
-
-// Dismissable alerts
-//
-// Expand the right padding and account for the close button's positioning.
-
-.alert-dismissable {
- padding-right: ($alert-padding + 20);
-
- // Adjust close link position
- .close {
- position: relative;
- top: -2px;
- right: -21px;
- color: inherit;
- }
-}
-
-// Alternate styles
-//
-// Generate contextual modifier classes for colorizing the alert.
-
-.alert-success {
- @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
-}
-.alert-info {
- @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
-}
-.alert-warning {
- @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
-}
-.alert-danger {
- @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss
deleted file mode 100644
index 02394ae7f..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Badges
-// --------------------------------------------------
-
-
-// Base class
-.badge {
- display: inline-block;
- min-width: 10px;
- padding: 3px 7px;
- font-size: $font-size-small;
- font-weight: $badge-font-weight;
- color: $badge-color;
- line-height: $badge-line-height;
- vertical-align: baseline;
- white-space: nowrap;
- text-align: center;
- background-color: $badge-bg;
- border-radius: $badge-border-radius;
-
- // Empty badges collapse automatically (not available in IE8)
- &:empty {
- display: none;
- }
-
- // Quick fix for badges in buttons
- .btn & {
- position: relative;
- top: -1px;
- }
- .btn-xs & {
- top: 0;
- padding: 1px 5px;
- }
-
- // [converter] extracted a& to a.badge
-
- // Account for badges in navs
- a.list-group-item.active > &,
- .nav-pills > .active > a > & {
- color: $badge-active-color;
- background-color: $badge-active-bg;
- }
- .nav-pills > li > a > & {
- margin-left: 3px;
- }
-}
-
-// Hover state, but only for links
-a.badge {
- &:hover,
- &:focus {
- color: $badge-link-hover-color;
- text-decoration: none;
- cursor: pointer;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss
deleted file mode 100644
index 3641e333b..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Breadcrumbs
-// --------------------------------------------------
-
-
-.breadcrumb {
- padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
- margin-bottom: $line-height-computed;
- list-style: none;
- background-color: $breadcrumb-bg;
- border-radius: $border-radius-base;
-
- > li {
- display: inline-block;
-
- + li:before {
- content: "#{$breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
- padding: 0 5px;
- color: $breadcrumb-color;
- }
- }
-
- > .active {
- color: $breadcrumb-active-color;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss
deleted file mode 100644
index d765ff206..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss
+++ /dev/null
@@ -1,236 +0,0 @@
-//
-// Button groups
-// --------------------------------------------------
-
-// Make the div behave like a button
-.btn-group,
-.btn-group-vertical {
- position: relative;
- display: inline-block;
- vertical-align: middle; // match .btn alignment given font-size hack above
- > .btn {
- position: relative;
- float: left;
- // Bring the "active" button to the front
- &:hover,
- &:focus,
- &:active,
- &.active {
- z-index: 2;
- }
- &:focus {
- // Remove focus outline when dropdown JS adds it after closing the menu
- outline: 0;
- }
- }
-}
-
-// Prevent double borders when buttons are next to each other
-.btn-group {
- .btn + .btn,
- .btn + .btn-group,
- .btn-group + .btn,
- .btn-group + .btn-group {
- margin-left: -1px;
- }
-}
-
-// Optional: Group multiple button groups together for a toolbar
-.btn-toolbar {
- margin-left: -5px; // Offset the first child's margin
- @include clearfix();
-
- .btn-group,
- .input-group {
- float: left;
- }
- > .btn,
- > .btn-group,
- > .input-group {
- margin-left: 5px;
- }
-}
-
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
- border-radius: 0;
-}
-
-// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
-.btn-group > .btn:first-child {
- margin-left: 0;
- &:not(:last-child):not(.dropdown-toggle) {
- @include border-right-radius(0);
- }
-}
-// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
- @include border-left-radius(0);
-}
-
-// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
-.btn-group > .btn-group {
- float: left;
-}
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
- border-radius: 0;
-}
-.btn-group > .btn-group:first-child {
- > .btn:last-child,
- > .dropdown-toggle {
- @include border-right-radius(0);
- }
-}
-.btn-group > .btn-group:last-child > .btn:first-child {
- @include border-left-radius(0);
-}
-
-// On active and open, don't show outline
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-
-
-// Sizing
-//
-// Remix the default button sizing classes into new ones for easier manipulation.
-
-.btn-group-xs > .btn { @extend .btn-xs; }
-.btn-group-sm > .btn { @extend .btn-sm; }
-.btn-group-lg > .btn { @extend .btn-lg; }
-
-
-// Split button dropdowns
-// ----------------------
-
-// Give the line between buttons some depth
-.btn-group > .btn + .dropdown-toggle {
- padding-left: 8px;
- padding-right: 8px;
-}
-.btn-group > .btn-lg + .dropdown-toggle {
- padding-left: 12px;
- padding-right: 12px;
-}
-
-// The clickable button for toggling the menu
-// Remove the gradient and set the same inset shadow as the :active state
-.btn-group.open .dropdown-toggle {
- @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-
- // Show no shadow for `.btn-link` since it has no other button styles.
- &.btn-link {
- @include box-shadow(none);
- }
-}
-
-
-// Reposition the caret
-.btn .caret {
- margin-left: 0;
-}
-// Carets in other button sizes
-.btn-lg .caret {
- border-width: $caret-width-large $caret-width-large 0;
- border-bottom-width: 0;
-}
-// Upside down carets for .dropup
-.dropup .btn-lg .caret {
- border-width: 0 $caret-width-large $caret-width-large;
-}
-
-
-// Vertical button groups
-// ----------------------
-
-.btn-group-vertical {
- > .btn,
- > .btn-group,
- > .btn-group > .btn {
- display: block;
- float: none;
- width: 100%;
- max-width: 100%;
- }
-
- // Clear floats so dropdown menus can be properly placed
- > .btn-group {
- @include clearfix();
- > .btn {
- float: none;
- }
- }
-
- > .btn + .btn,
- > .btn + .btn-group,
- > .btn-group + .btn,
- > .btn-group + .btn-group {
- margin-top: -1px;
- margin-left: 0;
- }
-}
-
-.btn-group-vertical > .btn {
- &:not(:first-child):not(:last-child) {
- border-radius: 0;
- }
- &:first-child:not(:last-child) {
- border-top-right-radius: $border-radius-base;
- @include border-bottom-radius(0);
- }
- &:last-child:not(:first-child) {
- border-bottom-left-radius: $border-radius-base;
- @include border-top-radius(0);
- }
-}
-.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
- border-radius: 0;
-}
-.btn-group-vertical > .btn-group:first-child:not(:last-child) {
- > .btn:last-child,
- > .dropdown-toggle {
- @include border-bottom-radius(0);
- }
-}
-.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
- @include border-top-radius(0);
-}
-
-
-
-// Justified button groups
-// ----------------------
-
-.btn-group-justified {
- display: table;
- width: 100%;
- table-layout: fixed;
- border-collapse: separate;
- > .btn,
- > .btn-group {
- float: none;
- display: table-cell;
- width: 1%;
- }
- > .btn-group .btn {
- width: 100%;
- }
-}
-
-
-// Checkbox and radio options
-//
-// In order to support the browser's form validation feedback, powered by the
-// `required` attribute, we have to "hide" the inputs via `opacity`. We cannot
-// use `display: none;` or `visibility: hidden;` as that also hides the popover.
-// This way, we ensure a DOM element is visible to position the popover from.
-//
-// See https://github.com/twbs/bootstrap/pull/12794 for more.
-
-[data-toggle="buttons"] > .btn > input[type="radio"],
-[data-toggle="buttons"] > .btn > input[type="checkbox"] {
- position: absolute;
- z-index: -1;
- opacity: 0;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss
deleted file mode 100644
index 28110b651..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-// Buttons
-// --------------------------------------------------
-
-
-// Base styles
-// --------------------------------------------------
-
-.btn {
- display: inline-block;
- margin-bottom: 0; // For input.btn
- font-weight: $btn-font-weight;
- text-align: center;
- vertical-align: middle;
- cursor: pointer;
- background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
- border: 1px solid transparent;
- white-space: nowrap;
- @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $border-radius-base);
- @include user-select(none);
-
- &,
- &:active,
- &.active {
- &:focus {
- @include tab-focus();
- }
- }
-
- &:hover,
- &:focus {
- color: $btn-default-color;
- text-decoration: none;
- }
-
- &:active,
- &.active {
- outline: 0;
- background-image: none;
- @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
- }
-
- &.disabled,
- &[disabled],
- fieldset[disabled] & {
- cursor: not-allowed;
- pointer-events: none; // Future-proof disabling of clicks
- @include opacity(.65);
- @include box-shadow(none);
- }
-}
-
-
-// Alternate buttons
-// --------------------------------------------------
-
-.btn-default {
- @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
-}
-.btn-primary {
- @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
-}
-// Success appears as green
-.btn-success {
- @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
-}
-// Info appears as blue-green
-.btn-info {
- @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
-}
-// Warning appears as orange
-.btn-warning {
- @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
-}
-// Danger and error appear as red
-.btn-danger {
- @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
-}
-
-
-// Link buttons
-// -------------------------
-
-// Make a button look and behave like a link
-.btn-link {
- color: $link-color;
- font-weight: normal;
- cursor: pointer;
- border-radius: 0;
-
- &,
- &:active,
- &[disabled],
- fieldset[disabled] & {
- background-color: transparent;
- @include box-shadow(none);
- }
- &,
- &:hover,
- &:focus,
- &:active {
- border-color: transparent;
- }
- &:hover,
- &:focus {
- color: $link-hover-color;
- text-decoration: underline;
- background-color: transparent;
- }
- &[disabled],
- fieldset[disabled] & {
- &:hover,
- &:focus {
- color: $btn-link-disabled-color;
- text-decoration: none;
- }
- }
-}
-
-
-// Button Sizes
-// --------------------------------------------------
-
-.btn-lg {
- // line-height: ensure even-numbered height of button next to large input
- @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
-}
-.btn-sm {
- // line-height: ensure proper height of button next to small input
- @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
-}
-.btn-xs {
- @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $border-radius-small);
-}
-
-
-// Block button
-// --------------------------------------------------
-
-.btn-block {
- display: block;
- width: 100%;
- padding-left: 0;
- padding-right: 0;
-}
-
-// Vertically space out multiple block buttons
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-
-// Specificity overrides
-input[type="submit"],
-input[type="reset"],
-input[type="button"] {
- &.btn-block {
- width: 100%;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss
deleted file mode 100644
index 9325c1a55..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss
+++ /dev/null
@@ -1,241 +0,0 @@
-//
-// Carousel
-// --------------------------------------------------
-
-
-// Wrapper for the slide container and indicators
-.carousel {
- position: relative;
-}
-
-.carousel-inner {
- position: relative;
- overflow: hidden;
- width: 100%;
-
- > .item {
- display: none;
- position: relative;
- @include transition(.6s ease-in-out left);
-
- // Account for jankitude on images
- > img,
- > a > img {
- @include img-responsive();
- line-height: 1;
- }
- }
-
- > .active,
- > .next,
- > .prev { display: block; }
-
- > .active {
- left: 0;
- }
-
- > .next,
- > .prev {
- position: absolute;
- top: 0;
- width: 100%;
- }
-
- > .next {
- left: 100%;
- }
- > .prev {
- left: -100%;
- }
- > .next.left,
- > .prev.right {
- left: 0;
- }
-
- > .active.left {
- left: -100%;
- }
- > .active.right {
- left: 100%;
- }
-
-}
-
-// Left/right controls for nav
-// ---------------------------
-
-.carousel-control {
- position: absolute;
- top: 0;
- left: 0;
- bottom: 0;
- width: $carousel-control-width;
- @include opacity($carousel-control-opacity);
- font-size: $carousel-control-font-size;
- color: $carousel-control-color;
- text-align: center;
- text-shadow: $carousel-text-shadow;
- // We can't have this transition here because WebKit cancels the carousel
- // animation if you trip this while in the middle of another animation.
-
- // Set gradients for backgrounds
- &.left {
- @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
- }
- &.right {
- left: auto;
- right: 0;
- @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
- }
-
- // Hover/focus state
- &:hover,
- &:focus {
- outline: 0;
- color: $carousel-control-color;
- text-decoration: none;
- @include opacity(.9);
- }
-
- // Toggles
- .icon-prev,
- .icon-next,
- .glyphicon-chevron-left,
- .glyphicon-chevron-right {
- position: absolute;
- top: 50%;
- z-index: 5;
- display: inline-block;
- }
- .icon-prev,
- .glyphicon-chevron-left {
- left: 50%;
- margin-left: -10px;
- }
- .icon-next,
- .glyphicon-chevron-right {
- right: 50%;
- margin-right: -10px;
- }
- .icon-prev,
- .icon-next {
- width: 20px;
- height: 20px;
- margin-top: -10px;
- font-family: serif;
- }
-
-
- .icon-prev {
- &:before {
- content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
- }
- }
- .icon-next {
- &:before {
- content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
- }
- }
-}
-
-// Optional indicator pips
-//
-// Add an unordered list with the following class and add a list item for each
-// slide your carousel holds.
-
-.carousel-indicators {
- position: absolute;
- bottom: 10px;
- left: 50%;
- z-index: 15;
- width: 60%;
- margin-left: -30%;
- padding-left: 0;
- list-style: none;
- text-align: center;
-
- li {
- display: inline-block;
- width: 10px;
- height: 10px;
- margin: 1px;
- text-indent: -999px;
- border: 1px solid $carousel-indicator-border-color;
- border-radius: 10px;
- cursor: pointer;
-
- // IE8-9 hack for event handling
- //
- // Internet Explorer 8-9 does not support clicks on elements without a set
- // `background-color`. We cannot use `filter` since that's not viewed as a
- // background color by the browser. Thus, a hack is needed.
- //
- // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
- // set alpha transparency for the best results possible.
- background-color: #000 \9; // IE8
- background-color: rgba(0,0,0,0); // IE9
- }
- .active {
- margin: 0;
- width: 12px;
- height: 12px;
- background-color: $carousel-indicator-active-bg;
- }
-}
-
-// Optional captions
-// -----------------------------
-// Hidden by default for smaller viewports
-.carousel-caption {
- position: absolute;
- left: 15%;
- right: 15%;
- bottom: 20px;
- z-index: 10;
- padding-top: 20px;
- padding-bottom: 20px;
- color: $carousel-caption-color;
- text-align: center;
- text-shadow: $carousel-text-shadow;
- & .btn {
- text-shadow: none; // No shadow for button elements in carousel-caption
- }
-}
-
-
-// Scale up controls for tablets and up
-@media screen and (min-width: $screen-sm-min) {
-
- // Scale up the controls a smidge
- .carousel-control {
- .glyphicon-chevron-left,
- .glyphicon-chevron-right,
- .icon-prev,
- .icon-next {
- width: 30px;
- height: 30px;
- margin-top: -15px;
- font-size: 30px;
- }
- .glyphicon-chevron-left,
- .icon-prev {
- margin-left: -15px;
- }
- .glyphicon-chevron-right,
- .icon-next {
- margin-right: -15px;
- }
- }
-
- // Show and left align the captions
- .carousel-caption {
- left: 20%;
- right: 20%;
- padding-bottom: 30px;
- }
-
- // Move up the indicators
- .carousel-indicators {
- bottom: 20px;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss
deleted file mode 100644
index 62ce30fa3..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Close icons
-// --------------------------------------------------
-
-
-.close {
- float: right;
- font-size: ($font-size-base * 1.5);
- font-weight: $close-font-weight;
- line-height: 1;
- color: $close-color;
- text-shadow: $close-text-shadow;
- @include opacity(.2);
-
- &:hover,
- &:focus {
- color: $close-color;
- text-decoration: none;
- cursor: pointer;
- @include opacity(.5);
- }
-
- // [converter] extracted button& to button.close
-}
-
-// Additional properties for button version
-// iOS requires the button element instead of an anchor tag.
-// If you want the anchor version, it requires `href="#"`.
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss
deleted file mode 100644
index dacaa58a5..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Code (inline and block)
-// --------------------------------------------------
-
-
-// Inline and block code styles
-code,
-kbd,
-pre,
-samp {
- font-family: $font-family-monospace;
-}
-
-// Inline code
-code {
- padding: 2px 4px;
- font-size: 90%;
- color: $code-color;
- background-color: $code-bg;
- border-radius: $border-radius-base;
-}
-
-// User input typically entered via keyboard
-kbd {
- padding: 2px 4px;
- font-size: 90%;
- color: $kbd-color;
- background-color: $kbd-bg;
- border-radius: $border-radius-small;
- box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
-}
-
-// Blocks of code
-pre {
- display: block;
- padding: (($line-height-computed - 1) / 2);
- margin: 0 0 ($line-height-computed / 2);
- font-size: ($font-size-base - 1); // 14px to 13px
- line-height: $line-height-base;
- word-break: break-all;
- word-wrap: break-word;
- color: $pre-color;
- background-color: $pre-bg;
- border: 1px solid $pre-border-color;
- border-radius: $border-radius-base;
-
- // Account for some code outputs that place code tags in pre tags
- code {
- padding: 0;
- font-size: inherit;
- color: inherit;
- white-space: pre-wrap;
- background-color: transparent;
- border-radius: 0;
- }
-}
-
-// Enable scrollable blocks of code
-.pre-scrollable {
- max-height: $pre-scrollable-max-height;
- overflow-y: scroll;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss
deleted file mode 100644
index 8c3fd07a2..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Component animations
-// --------------------------------------------------
-
-// Heads up!
-//
-// We don't use the `.opacity()` mixin here since it causes a bug with text
-// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
-
-.fade {
- opacity: 0;
- @include transition(opacity .15s linear);
- &.in {
- opacity: 1;
- }
-}
-
-.collapse {
- display: none;
-
- &.in { display: block; }
- // [converter] extracted tr&.in to tr.collapse.in
- // [converter] extracted tbody&.in to tbody.collapse.in
-}
-
-tr.collapse.in { display: table-row; }
-
-tbody.collapse.in { display: table-row-group; }
-
-.collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- @include transition(height .35s ease);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss
deleted file mode 100644
index 803a798f6..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss
+++ /dev/null
@@ -1,214 +0,0 @@
-//
-// Dropdown menus
-// --------------------------------------------------
-
-
-// Dropdown arrow/caret
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- margin-left: 2px;
- vertical-align: middle;
- border-top: $caret-width-base solid;
- border-right: $caret-width-base solid transparent;
- border-left: $caret-width-base solid transparent;
-}
-
-// The dropdown wrapper (div)
-.dropdown {
- position: relative;
-}
-
-// Prevent the focus on the dropdown toggle when closing dropdowns
-.dropdown-toggle:focus {
- outline: 0;
-}
-
-// The dropdown menu (ul)
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: $zindex-dropdown;
- display: none; // none by default, but block on "open" of the menu
- float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0; // override default ul
- list-style: none;
- font-size: $font-size-base;
- text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
- background-color: $dropdown-bg;
- border: 1px solid $dropdown-fallback-border; // IE8 fallback
- border: 1px solid $dropdown-border;
- border-radius: $border-radius-base;
- @include box-shadow(0 6px 12px rgba(0,0,0,.175));
- background-clip: padding-box;
-
- // Aligns the dropdown menu to right
- //
- // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
- &.pull-right {
- right: 0;
- left: auto;
- }
-
- // Dividers (basically an hr) within the dropdown
- .divider {
- @include nav-divider($dropdown-divider-bg);
- }
-
- // Links within the dropdown menu
- > li > a {
- display: block;
- padding: 3px 20px;
- clear: both;
- font-weight: normal;
- line-height: $line-height-base;
- color: $dropdown-link-color;
- white-space: nowrap; // prevent links from randomly breaking onto new lines
- }
-}
-
-// Hover/Focus state
-.dropdown-menu > li > a {
- &:hover,
- &:focus {
- text-decoration: none;
- color: $dropdown-link-hover-color;
- background-color: $dropdown-link-hover-bg;
- }
-}
-
-// Active state
-.dropdown-menu > .active > a {
- &,
- &:hover,
- &:focus {
- color: $dropdown-link-active-color;
- text-decoration: none;
- outline: 0;
- background-color: $dropdown-link-active-bg;
- }
-}
-
-// Disabled state
-//
-// Gray out text and ensure the hover/focus state remains gray
-
-.dropdown-menu > .disabled > a {
- &,
- &:hover,
- &:focus {
- color: $dropdown-link-disabled-color;
- }
-}
-// Nuke hover/focus effects
-.dropdown-menu > .disabled > a {
- &:hover,
- &:focus {
- text-decoration: none;
- background-color: transparent;
- background-image: none; // Remove CSS gradient
- @include reset-filter();
- cursor: not-allowed;
- }
-}
-
-// Open state for the dropdown
-.open {
- // Show the menu
- > .dropdown-menu {
- display: block;
- }
-
- // Remove the outline when :focus is triggered
- > a {
- outline: 0;
- }
-}
-
-// Menu positioning
-//
-// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
-// menu with the parent.
-.dropdown-menu-right {
- left: auto; // Reset the default from `.dropdown-menu`
- right: 0;
-}
-// With v3, we enabled auto-flipping if you have a dropdown within a right
-// aligned nav component. To enable the undoing of that, we provide an override
-// to restore the default dropdown menu alignment.
-//
-// This is only for left-aligning a dropdown menu within a `.navbar-right` or
-// `.pull-right` nav component.
-.dropdown-menu-left {
- left: 0;
- right: auto;
-}
-
-// Dropdown section headers
-.dropdown-header {
- display: block;
- padding: 3px 20px;
- font-size: $font-size-small;
- line-height: $line-height-base;
- color: $dropdown-header-color;
-}
-
-// Backdrop to catch body clicks on mobile, etc.
-.dropdown-backdrop {
- position: fixed;
- left: 0;
- right: 0;
- bottom: 0;
- top: 0;
- z-index: ($zindex-dropdown - 10);
-}
-
-// Right aligned dropdowns
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-
-// Allow for dropdowns to go bottom up (aka, dropup-menu)
-//
-// Just add .dropup after the standard .dropdown class and you're set, bro.
-// TODO: abstract this so that the navbar fixed styles are not placed here?
-
-.dropup,
-.navbar-fixed-bottom .dropdown {
- // Reverse the caret
- .caret {
- border-top: 0;
- border-bottom: $caret-width-base solid;
- content: "";
- }
- // Different positioning for bottom up menu
- .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
- }
-}
-
-
-// Component alignment
-//
-// Reiterate per navbar.less and the modified component alignment there.
-
-@media (min-width: $grid-float-breakpoint) {
- .navbar-right {
- .dropdown-menu {
- right: 0; left: auto;
- }
- // Necessary for overrides of the default right aligned menu.
- // Will remove come v4 in all likelihood.
- .dropdown-menu-left {
- left: 0; right: auto;
- }
- }
-}
-
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss
deleted file mode 100644
index 310c24dd3..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss
+++ /dev/null
@@ -1,478 +0,0 @@
-//
-// Forms
-// --------------------------------------------------
-
-
-// Normalize non-controls
-//
-// Restyle and baseline non-control form elements.
-
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
- // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,
- // so we reset that to ensure it behaves more like a standard block element.
- // See https://github.com/twbs/bootstrap/issues/12359.
- min-width: 0;
-}
-
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: $line-height-computed;
- font-size: ($font-size-base * 1.5);
- line-height: inherit;
- color: $legend-color;
- border: 0;
- border-bottom: 1px solid $legend-border-color;
-}
-
-label {
- display: inline-block;
- max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
- margin-bottom: 5px;
- font-weight: bold;
-}
-
-
-// Normalize form controls
-//
-// While most of our form styles require extra classes, some basic normalization
-// is required to ensure optimum display with or without those classes to better
-// address browser inconsistencies.
-
-// Override content-box in Normalize (* isn't specific enough)
-input[type="search"] {
- @include box-sizing(border-box);
-}
-
-// Position radios and checkboxes better
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px \9; // IE8-9
- line-height: normal;
-}
-
-// Set the height of file controls to match text inputs
-input[type="file"] {
- display: block;
-}
-
-// Make range inputs behave like textual form controls
-input[type="range"] {
- display: block;
- width: 100%;
-}
-
-// Make multiple select elements height not fixed
-select[multiple],
-select[size] {
- height: auto;
-}
-
-// Focus for file, radio, and checkbox
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- @include tab-focus();
-}
-
-// Adjust output element
-output {
- display: block;
- padding-top: ($padding-base-vertical + 1);
- font-size: $font-size-base;
- line-height: $line-height-base;
- color: $input-color;
-}
-
-
-// Common form controls
-//
-// Shared size and type resets for form controls. Apply `.form-control` to any
-// of the following form controls:
-//
-// select
-// textarea
-// input[type="text"]
-// input[type="password"]
-// input[type="datetime"]
-// input[type="datetime-local"]
-// input[type="date"]
-// input[type="month"]
-// input[type="time"]
-// input[type="week"]
-// input[type="number"]
-// input[type="email"]
-// input[type="url"]
-// input[type="search"]
-// input[type="tel"]
-// input[type="color"]
-
-.form-control {
- display: block;
- width: 100%;
- height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
- padding: $padding-base-vertical $padding-base-horizontal;
- font-size: $font-size-base;
- line-height: $line-height-base;
- color: $input-color;
- background-color: $input-bg;
- background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
- border: 1px solid $input-border;
- border-radius: $input-border-radius;
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
- @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
-
- // Customize the `:focus` state to imitate native WebKit styles.
- @include form-control-focus();
-
- // Placeholder
- @include placeholder();
-
- // Disabled and read-only inputs
- //
- // HTML5 says that controls under a fieldset > legend:first-child won't be
- // disabled if the fieldset is disabled. Due to implementation difficulty, we
- // don't honor that edge case; we style them as disabled anyway.
- &[disabled],
- &[readonly],
- fieldset[disabled] & {
- cursor: not-allowed;
- background-color: $input-bg-disabled;
- opacity: 1; // iOS fix for unreadable disabled content
- }
-
- // [converter] extracted textarea& to textarea.form-control
-}
-
-// Reset height for `textarea`s
-textarea.form-control {
- height: auto;
-}
-
-
-// Search inputs in iOS
-//
-// This overrides the extra rounded corners on search inputs in iOS so that our
-// `.form-control` class can properly style them. Note that this cannot simply
-// be added to `.form-control` as it's not specific enough. For details, see
-// https://github.com/twbs/bootstrap/issues/11586.
-
-input[type="search"] {
- -webkit-appearance: none;
-}
-
-
-// Special styles for iOS date input
-//
-// In Mobile Safari, date inputs require a pixel line-height that matches the
-// given height of the input. Since this fucks up everything else, we have to
-// appropriately reset it for Internet Explorer and the size variations.
-
-input[type="date"],
-input[type="time"],
-input[type="datetime-local"],
-input[type="month"] {
- line-height: $input-height-base;
- // IE8+ misaligns the text within date inputs, so we reset
- line-height: $line-height-base #{\0};
-
- &.input-sm {
- line-height: $input-height-small;
- }
- &.input-lg {
- line-height: $input-height-large;
- }
-}
-
-
-// Form groups
-//
-// Designed to help with the organization and spacing of vertical forms. For
-// horizontal forms, use the predefined grid classes.
-
-.form-group {
- margin-bottom: 15px;
-}
-
-
-// Checkboxes and radios
-//
-// Indent the labels to position radios/checkboxes as hanging controls.
-
-.radio,
-.checkbox {
- display: block;
- min-height: $line-height-computed; // clear the floating input if there is no label text
- margin-top: 10px;
- margin-bottom: 10px;
-
- label {
- padding-left: 20px;
- margin-bottom: 0;
- font-weight: normal;
- cursor: pointer;
- }
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
- float: left;
- margin-left: -20px;
-}
-.radio + .radio,
-.checkbox + .checkbox {
- margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
-}
-
-// Radios and checkboxes on same line
-.radio-inline,
-.checkbox-inline {
- display: inline-block;
- padding-left: 20px;
- margin-bottom: 0;
- vertical-align: middle;
- font-weight: normal;
- cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
- margin-top: 0;
- margin-left: 10px; // space out consecutive inline controls
-}
-
-// Apply same disabled cursor tweak as for inputs
-//
-// Note: Neither radios nor checkboxes can be readonly.
-input[type="radio"],
-input[type="checkbox"],
-.radio,
-.radio-inline,
-.checkbox,
-.checkbox-inline {
- &[disabled],
- fieldset[disabled] & {
- cursor: not-allowed;
- }
-}
-
-
-// Form control sizing
-//
-// Build on `.form-control` with modifier classes to decrease or increase the
-// height and font-size of form controls.
-
-@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
-
-@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
-
-
-// Form control feedback states
-//
-// Apply contextual and semantic states to individual form controls.
-
-.has-feedback {
- // Enable absolute positioning
- position: relative;
-
- // Ensure icons don't overlap text
- .form-control {
- padding-right: ($input-height-base * 1.25);
- }
-}
-// Feedback icon (requires .glyphicon classes)
-.form-control-feedback {
- position: absolute;
- top: ($line-height-computed + 5); // Height of the `label` and its margin
- right: 0;
- z-index: 2; // Ensure icon is above input groups
- display: block;
- width: $input-height-base;
- height: $input-height-base;
- line-height: $input-height-base;
- text-align: center;
-}
-.input-lg + .form-control-feedback {
- width: $input-height-large;
- height: $input-height-large;
- line-height: $input-height-large;
-}
-.input-sm + .form-control-feedback {
- width: $input-height-small;
- height: $input-height-small;
- line-height: $input-height-small;
-}
-
-// Feedback states
-.has-success {
- @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
-}
-.has-warning {
- @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
-}
-.has-error {
- @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
-}
-
-
-// Static form control text
-//
-// Apply class to a `p` element to make any string of text align with labels in
-// a horizontal form layout.
-
-.form-control-static {
- margin-bottom: 0; // Remove default margin from `p`
-}
-
-
-// Help text
-//
-// Apply to any element you wish to create light text for placement immediately
-// below a form control. Use for general help, formatting, or instructional text.
-
-.help-block {
- display: block; // account for any element using help-block
- margin-top: 5px;
- margin-bottom: 10px;
- color: lighten($text-color, 25%); // lighten the text some for contrast
-}
-
-
-
-// Inline forms
-//
-// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
-// forms begin stacked on extra small (mobile) devices and then go inline when
-// viewports reach <768px.
-//
-// Requires wrapping inputs and labels with `.form-group` for proper display of
-// default HTML form controls and our custom form controls (e.g., input groups).
-//
-// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
-
-.form-inline {
-
- // Kick in the inline
- @media (min-width: $screen-sm-min) {
- // Inline-block all the things for "inline"
- .form-group {
- display: inline-block;
- margin-bottom: 0;
- vertical-align: middle;
- }
-
- // In navbar-form, allow folks to *not* use `.form-group`
- .form-control {
- display: inline-block;
- width: auto; // Prevent labels from stacking above inputs in `.form-group`
- vertical-align: middle;
- }
-
- .input-group {
- display: inline-table;
- vertical-align: middle;
-
- .input-group-addon,
- .input-group-btn,
- .form-control {
- width: auto;
- }
- }
-
- // Input groups need that 100% width though
- .input-group > .form-control {
- width: 100%;
- }
-
- .control-label {
- margin-bottom: 0;
- vertical-align: middle;
- }
-
- // Remove default margin on radios/checkboxes that were used for stacking, and
- // then undo the floating of radios and checkboxes to match (which also avoids
- // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
- .radio,
- .checkbox {
- display: inline-block;
- margin-top: 0;
- margin-bottom: 0;
- padding-left: 0;
- vertical-align: middle;
- }
- .radio input[type="radio"],
- .checkbox input[type="checkbox"] {
- float: none;
- margin-left: 0;
- }
-
- // Validation states
- //
- // Reposition the icon because it's now within a grid column and columns have
- // `position: relative;` on them. Also accounts for the grid gutter padding.
- .has-feedback .form-control-feedback {
- top: 0;
- }
- }
-}
-
-
-// Horizontal forms
-//
-// Horizontal forms are built on grid classes and allow you to create forms with
-// labels on the left and inputs on the right.
-
-.form-horizontal {
-
- // Consistent vertical alignment of radios and checkboxes
- //
- // Labels also get some reset styles, but that is scoped to a media query below.
- .radio,
- .checkbox,
- .radio-inline,
- .checkbox-inline {
- margin-top: 0;
- margin-bottom: 0;
- padding-top: ($padding-base-vertical + 1); // Default padding plus a border
- }
- // Account for padding we're adding to ensure the alignment and of help text
- // and other content below items
- .radio,
- .checkbox {
- min-height: ($line-height-computed + ($padding-base-vertical + 1));
- }
-
- // Make form groups behave like rows
- .form-group {
- @include make-row();
- }
-
- .form-control-static {
- padding-top: ($padding-base-vertical + 1);
- padding-bottom: ($padding-base-vertical + 1);
- }
-
- // Reset spacing and right align labels, but scope to media queries so that
- // labels on narrow viewports stack the same as a default form example.
- @media (min-width: $screen-sm-min) {
- .control-label {
- text-align: right;
- margin-bottom: 0;
- padding-top: ($padding-base-vertical + 1); // Default padding plus a border
- }
- }
-
- // Validation states
- //
- // Reposition the icon because it's now within a grid column and columns have
- // `position: relative;` on them. Also accounts for the grid gutter padding.
- .has-feedback .form-control-feedback {
- top: 0;
- right: ($grid-gutter-width / 2);
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss
deleted file mode 100644
index 3faf5472a..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss
+++ /dev/null
@@ -1,237 +0,0 @@
-//= depend_on_asset "bootstrap/glyphicons-halflings-regular.eot"
-//= depend_on_asset "bootstrap/glyphicons-halflings-regular.svg"
-//= depend_on_asset "bootstrap/glyphicons-halflings-regular.ttf"
-//= depend_on_asset "bootstrap/glyphicons-halflings-regular.woff"
-//
-// Glyphicons for Bootstrap
-//
-// Since icons are fonts, they can be placed anywhere text is placed and are
-// thus automatically sized to match the surrounding child. To use, create an
-// inline element with the appropriate classes, like so:
-//
-// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
-
-// Import the fonts
-@font-face {
- font-family: 'Glyphicons Halflings';
- src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
- src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
- url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
- url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
- url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
-}
-
-// Catchall baseclass
-.glyphicon {
- position: relative;
- top: 1px;
- display: inline-block;
- font-family: 'Glyphicons Halflings';
- font-style: normal;
- font-weight: normal;
- line-height: 1;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-// Individual icons
-.glyphicon-asterisk { &:before { content: "\2a"; } }
-.glyphicon-plus { &:before { content: "\2b"; } }
-.glyphicon-euro { &:before { content: "\20ac"; } }
-.glyphicon-minus { &:before { content: "\2212"; } }
-.glyphicon-cloud { &:before { content: "\2601"; } }
-.glyphicon-envelope { &:before { content: "\2709"; } }
-.glyphicon-pencil { &:before { content: "\270f"; } }
-.glyphicon-glass { &:before { content: "\e001"; } }
-.glyphicon-music { &:before { content: "\e002"; } }
-.glyphicon-search { &:before { content: "\e003"; } }
-.glyphicon-heart { &:before { content: "\e005"; } }
-.glyphicon-star { &:before { content: "\e006"; } }
-.glyphicon-star-empty { &:before { content: "\e007"; } }
-.glyphicon-user { &:before { content: "\e008"; } }
-.glyphicon-film { &:before { content: "\e009"; } }
-.glyphicon-th-large { &:before { content: "\e010"; } }
-.glyphicon-th { &:before { content: "\e011"; } }
-.glyphicon-th-list { &:before { content: "\e012"; } }
-.glyphicon-ok { &:before { content: "\e013"; } }
-.glyphicon-remove { &:before { content: "\e014"; } }
-.glyphicon-zoom-in { &:before { content: "\e015"; } }
-.glyphicon-zoom-out { &:before { content: "\e016"; } }
-.glyphicon-off { &:before { content: "\e017"; } }
-.glyphicon-signal { &:before { content: "\e018"; } }
-.glyphicon-cog { &:before { content: "\e019"; } }
-.glyphicon-trash { &:before { content: "\e020"; } }
-.glyphicon-home { &:before { content: "\e021"; } }
-.glyphicon-file { &:before { content: "\e022"; } }
-.glyphicon-time { &:before { content: "\e023"; } }
-.glyphicon-road { &:before { content: "\e024"; } }
-.glyphicon-download-alt { &:before { content: "\e025"; } }
-.glyphicon-download { &:before { content: "\e026"; } }
-.glyphicon-upload { &:before { content: "\e027"; } }
-.glyphicon-inbox { &:before { content: "\e028"; } }
-.glyphicon-play-circle { &:before { content: "\e029"; } }
-.glyphicon-repeat { &:before { content: "\e030"; } }
-.glyphicon-refresh { &:before { content: "\e031"; } }
-.glyphicon-list-alt { &:before { content: "\e032"; } }
-.glyphicon-lock { &:before { content: "\e033"; } }
-.glyphicon-flag { &:before { content: "\e034"; } }
-.glyphicon-headphones { &:before { content: "\e035"; } }
-.glyphicon-volume-off { &:before { content: "\e036"; } }
-.glyphicon-volume-down { &:before { content: "\e037"; } }
-.glyphicon-volume-up { &:before { content: "\e038"; } }
-.glyphicon-qrcode { &:before { content: "\e039"; } }
-.glyphicon-barcode { &:before { content: "\e040"; } }
-.glyphicon-tag { &:before { content: "\e041"; } }
-.glyphicon-tags { &:before { content: "\e042"; } }
-.glyphicon-book { &:before { content: "\e043"; } }
-.glyphicon-bookmark { &:before { content: "\e044"; } }
-.glyphicon-print { &:before { content: "\e045"; } }
-.glyphicon-camera { &:before { content: "\e046"; } }
-.glyphicon-font { &:before { content: "\e047"; } }
-.glyphicon-bold { &:before { content: "\e048"; } }
-.glyphicon-italic { &:before { content: "\e049"; } }
-.glyphicon-text-height { &:before { content: "\e050"; } }
-.glyphicon-text-width { &:before { content: "\e051"; } }
-.glyphicon-align-left { &:before { content: "\e052"; } }
-.glyphicon-align-center { &:before { content: "\e053"; } }
-.glyphicon-align-right { &:before { content: "\e054"; } }
-.glyphicon-align-justify { &:before { content: "\e055"; } }
-.glyphicon-list { &:before { content: "\e056"; } }
-.glyphicon-indent-left { &:before { content: "\e057"; } }
-.glyphicon-indent-right { &:before { content: "\e058"; } }
-.glyphicon-facetime-video { &:before { content: "\e059"; } }
-.glyphicon-picture { &:before { content: "\e060"; } }
-.glyphicon-map-marker { &:before { content: "\e062"; } }
-.glyphicon-adjust { &:before { content: "\e063"; } }
-.glyphicon-tint { &:before { content: "\e064"; } }
-.glyphicon-edit { &:before { content: "\e065"; } }
-.glyphicon-share { &:before { content: "\e066"; } }
-.glyphicon-check { &:before { content: "\e067"; } }
-.glyphicon-move { &:before { content: "\e068"; } }
-.glyphicon-step-backward { &:before { content: "\e069"; } }
-.glyphicon-fast-backward { &:before { content: "\e070"; } }
-.glyphicon-backward { &:before { content: "\e071"; } }
-.glyphicon-play { &:before { content: "\e072"; } }
-.glyphicon-pause { &:before { content: "\e073"; } }
-.glyphicon-stop { &:before { content: "\e074"; } }
-.glyphicon-forward { &:before { content: "\e075"; } }
-.glyphicon-fast-forward { &:before { content: "\e076"; } }
-.glyphicon-step-forward { &:before { content: "\e077"; } }
-.glyphicon-eject { &:before { content: "\e078"; } }
-.glyphicon-chevron-left { &:before { content: "\e079"; } }
-.glyphicon-chevron-right { &:before { content: "\e080"; } }
-.glyphicon-plus-sign { &:before { content: "\e081"; } }
-.glyphicon-minus-sign { &:before { content: "\e082"; } }
-.glyphicon-remove-sign { &:before { content: "\e083"; } }
-.glyphicon-ok-sign { &:before { content: "\e084"; } }
-.glyphicon-question-sign { &:before { content: "\e085"; } }
-.glyphicon-info-sign { &:before { content: "\e086"; } }
-.glyphicon-screenshot { &:before { content: "\e087"; } }
-.glyphicon-remove-circle { &:before { content: "\e088"; } }
-.glyphicon-ok-circle { &:before { content: "\e089"; } }
-.glyphicon-ban-circle { &:before { content: "\e090"; } }
-.glyphicon-arrow-left { &:before { content: "\e091"; } }
-.glyphicon-arrow-right { &:before { content: "\e092"; } }
-.glyphicon-arrow-up { &:before { content: "\e093"; } }
-.glyphicon-arrow-down { &:before { content: "\e094"; } }
-.glyphicon-share-alt { &:before { content: "\e095"; } }
-.glyphicon-resize-full { &:before { content: "\e096"; } }
-.glyphicon-resize-small { &:before { content: "\e097"; } }
-.glyphicon-exclamation-sign { &:before { content: "\e101"; } }
-.glyphicon-gift { &:before { content: "\e102"; } }
-.glyphicon-leaf { &:before { content: "\e103"; } }
-.glyphicon-fire { &:before { content: "\e104"; } }
-.glyphicon-eye-open { &:before { content: "\e105"; } }
-.glyphicon-eye-close { &:before { content: "\e106"; } }
-.glyphicon-warning-sign { &:before { content: "\e107"; } }
-.glyphicon-plane { &:before { content: "\e108"; } }
-.glyphicon-calendar { &:before { content: "\e109"; } }
-.glyphicon-random { &:before { content: "\e110"; } }
-.glyphicon-comment { &:before { content: "\e111"; } }
-.glyphicon-magnet { &:before { content: "\e112"; } }
-.glyphicon-chevron-up { &:before { content: "\e113"; } }
-.glyphicon-chevron-down { &:before { content: "\e114"; } }
-.glyphicon-retweet { &:before { content: "\e115"; } }
-.glyphicon-shopping-cart { &:before { content: "\e116"; } }
-.glyphicon-folder-close { &:before { content: "\e117"; } }
-.glyphicon-folder-open { &:before { content: "\e118"; } }
-.glyphicon-resize-vertical { &:before { content: "\e119"; } }
-.glyphicon-resize-horizontal { &:before { content: "\e120"; } }
-.glyphicon-hdd { &:before { content: "\e121"; } }
-.glyphicon-bullhorn { &:before { content: "\e122"; } }
-.glyphicon-bell { &:before { content: "\e123"; } }
-.glyphicon-certificate { &:before { content: "\e124"; } }
-.glyphicon-thumbs-up { &:before { content: "\e125"; } }
-.glyphicon-thumbs-down { &:before { content: "\e126"; } }
-.glyphicon-hand-right { &:before { content: "\e127"; } }
-.glyphicon-hand-left { &:before { content: "\e128"; } }
-.glyphicon-hand-up { &:before { content: "\e129"; } }
-.glyphicon-hand-down { &:before { content: "\e130"; } }
-.glyphicon-circle-arrow-right { &:before { content: "\e131"; } }
-.glyphicon-circle-arrow-left { &:before { content: "\e132"; } }
-.glyphicon-circle-arrow-up { &:before { content: "\e133"; } }
-.glyphicon-circle-arrow-down { &:before { content: "\e134"; } }
-.glyphicon-globe { &:before { content: "\e135"; } }
-.glyphicon-wrench { &:before { content: "\e136"; } }
-.glyphicon-tasks { &:before { content: "\e137"; } }
-.glyphicon-filter { &:before { content: "\e138"; } }
-.glyphicon-briefcase { &:before { content: "\e139"; } }
-.glyphicon-fullscreen { &:before { content: "\e140"; } }
-.glyphicon-dashboard { &:before { content: "\e141"; } }
-.glyphicon-paperclip { &:before { content: "\e142"; } }
-.glyphicon-heart-empty { &:before { content: "\e143"; } }
-.glyphicon-link { &:before { content: "\e144"; } }
-.glyphicon-phone { &:before { content: "\e145"; } }
-.glyphicon-pushpin { &:before { content: "\e146"; } }
-.glyphicon-usd { &:before { content: "\e148"; } }
-.glyphicon-gbp { &:before { content: "\e149"; } }
-.glyphicon-sort { &:before { content: "\e150"; } }
-.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } }
-.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } }
-.glyphicon-sort-by-order { &:before { content: "\e153"; } }
-.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } }
-.glyphicon-sort-by-attributes { &:before { content: "\e155"; } }
-.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
-.glyphicon-unchecked { &:before { content: "\e157"; } }
-.glyphicon-expand { &:before { content: "\e158"; } }
-.glyphicon-collapse-down { &:before { content: "\e159"; } }
-.glyphicon-collapse-up { &:before { content: "\e160"; } }
-.glyphicon-log-in { &:before { content: "\e161"; } }
-.glyphicon-flash { &:before { content: "\e162"; } }
-.glyphicon-log-out { &:before { content: "\e163"; } }
-.glyphicon-new-window { &:before { content: "\e164"; } }
-.glyphicon-record { &:before { content: "\e165"; } }
-.glyphicon-save { &:before { content: "\e166"; } }
-.glyphicon-open { &:before { content: "\e167"; } }
-.glyphicon-saved { &:before { content: "\e168"; } }
-.glyphicon-import { &:before { content: "\e169"; } }
-.glyphicon-export { &:before { content: "\e170"; } }
-.glyphicon-send { &:before { content: "\e171"; } }
-.glyphicon-floppy-disk { &:before { content: "\e172"; } }
-.glyphicon-floppy-saved { &:before { content: "\e173"; } }
-.glyphicon-floppy-remove { &:before { content: "\e174"; } }
-.glyphicon-floppy-save { &:before { content: "\e175"; } }
-.glyphicon-floppy-open { &:before { content: "\e176"; } }
-.glyphicon-credit-card { &:before { content: "\e177"; } }
-.glyphicon-transfer { &:before { content: "\e178"; } }
-.glyphicon-cutlery { &:before { content: "\e179"; } }
-.glyphicon-header { &:before { content: "\e180"; } }
-.glyphicon-compressed { &:before { content: "\e181"; } }
-.glyphicon-earphone { &:before { content: "\e182"; } }
-.glyphicon-phone-alt { &:before { content: "\e183"; } }
-.glyphicon-tower { &:before { content: "\e184"; } }
-.glyphicon-stats { &:before { content: "\e185"; } }
-.glyphicon-sd-video { &:before { content: "\e186"; } }
-.glyphicon-hd-video { &:before { content: "\e187"; } }
-.glyphicon-subtitles { &:before { content: "\e188"; } }
-.glyphicon-sound-stereo { &:before { content: "\e189"; } }
-.glyphicon-sound-dolby { &:before { content: "\e190"; } }
-.glyphicon-sound-5-1 { &:before { content: "\e191"; } }
-.glyphicon-sound-6-1 { &:before { content: "\e192"; } }
-.glyphicon-sound-7-1 { &:before { content: "\e193"; } }
-.glyphicon-copyright-mark { &:before { content: "\e194"; } }
-.glyphicon-registration-mark { &:before { content: "\e195"; } }
-.glyphicon-cloud-download { &:before { content: "\e197"; } }
-.glyphicon-cloud-upload { &:before { content: "\e198"; } }
-.glyphicon-tree-conifer { &:before { content: "\e199"; } }
-.glyphicon-tree-deciduous { &:before { content: "\e200"; } }
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss
deleted file mode 100644
index f71f8b901..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-// Grid system
-// --------------------------------------------------
-
-
-// Container widths
-//
-// Set the container width, and override it for fixed navbars in media queries.
-
-.container {
- @include container-fixed();
-
- @media (min-width: $screen-sm-min) {
- width: $container-sm;
- }
- @media (min-width: $screen-md-min) {
- width: $container-md;
- }
- @media (min-width: $screen-lg-min) {
- width: $container-lg;
- }
-}
-
-
-// Fluid container
-//
-// Utilizes the mixin meant for fixed width containers, but without any defined
-// width for fluid, full width layouts.
-
-.container-fluid {
- @include container-fixed();
-}
-
-
-// Row
-//
-// Rows contain and clear the floats of your columns.
-
-.row {
- @include make-row();
-}
-
-
-// Columns
-//
-// Common styles for small and large grid columns
-
-@include make-grid-columns();
-
-
-// Extra small grid
-//
-// Columns, offsets, pushes, and pulls for extra small devices like
-// smartphones.
-
-@include make-grid(xs);
-
-
-// Small grid
-//
-// Columns, offsets, pushes, and pulls for the small device range, from phones
-// to tablets.
-
-@media (min-width: $screen-sm-min) {
- @include make-grid(sm);
-}
-
-
-// Medium grid
-//
-// Columns, offsets, pushes, and pulls for the desktop device range.
-
-@media (min-width: $screen-md-min) {
- @include make-grid(md);
-}
-
-
-// Large grid
-//
-// Columns, offsets, pushes, and pulls for the large desktop device range.
-
-@media (min-width: $screen-lg-min) {
- @include make-grid(lg);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss
deleted file mode 100644
index 6c26c1dd6..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss
+++ /dev/null
@@ -1,162 +0,0 @@
-//
-// Input groups
-// --------------------------------------------------
-
-// Base styles
-// -------------------------
-.input-group {
- position: relative; // For dropdowns
- display: table;
- border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
-
- // Undo padding and float of grid classes
- &[class*="col-"] {
- float: none;
- padding-left: 0;
- padding-right: 0;
- }
-
- .form-control {
- // Ensure that the input is always above the *appended* addon button for
- // proper border colors.
- position: relative;
- z-index: 2;
-
- // IE9 fubars the placeholder attribute in text inputs and the arrows on
- // select elements in input groups. To fix it, we float the input. Details:
- // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
- float: left;
-
- width: 100%;
- margin-bottom: 0;
- }
-}
-
-// Sizing options
-//
-// Remix the default form control sizing classes into new ones for easier
-// manipulation.
-
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn { @extend .input-lg; }
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn { @extend .input-sm; }
-
-
-// Display as table-cell
-// -------------------------
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
- display: table-cell;
-
- &:not(:first-child):not(:last-child) {
- border-radius: 0;
- }
-}
-// Addon and addon wrapper for buttons
-.input-group-addon,
-.input-group-btn {
- width: 1%;
- white-space: nowrap;
- vertical-align: middle; // Match the inputs
-}
-
-// Text input groups
-// -------------------------
-.input-group-addon {
- padding: $padding-base-vertical $padding-base-horizontal;
- font-size: $font-size-base;
- font-weight: normal;
- line-height: 1;
- color: $input-color;
- text-align: center;
- background-color: $input-group-addon-bg;
- border: 1px solid $input-group-addon-border-color;
- border-radius: $border-radius-base;
-
- // Sizing
- &.input-sm {
- padding: $padding-small-vertical $padding-small-horizontal;
- font-size: $font-size-small;
- border-radius: $border-radius-small;
- }
- &.input-lg {
- padding: $padding-large-vertical $padding-large-horizontal;
- font-size: $font-size-large;
- border-radius: $border-radius-large;
- }
-
- // Nuke default margins from checkboxes and radios to vertically center within.
- input[type="radio"],
- input[type="checkbox"] {
- margin-top: 0;
- }
-}
-
-// Reset rounded corners
-.input-group .form-control:first-child,
-.input-group-addon:first-child,
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group > .btn,
-.input-group-btn:first-child > .dropdown-toggle,
-.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
- @include border-right-radius(0);
-}
-.input-group-addon:first-child {
- border-right: 0;
-}
-.input-group .form-control:last-child,
-.input-group-addon:last-child,
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group > .btn,
-.input-group-btn:last-child > .dropdown-toggle,
-.input-group-btn:first-child > .btn:not(:first-child),
-.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
- @include border-left-radius(0);
-}
-.input-group-addon:last-child {
- border-left: 0;
-}
-
-// Button input groups
-// -------------------------
-.input-group-btn {
- position: relative;
- // Jankily prevent input button groups from wrapping with `white-space` and
- // `font-size` in combination with `inline-block` on buttons.
- font-size: 0;
- white-space: nowrap;
-
- // Negative margin for spacing, position for bringing hovered/focused/actived
- // element above the siblings.
- > .btn {
- position: relative;
- + .btn {
- margin-left: -1px;
- }
- // Bring the "active" button to the front
- &:hover,
- &:focus,
- &:active {
- z-index: 2;
- }
- }
-
- // Negative margin to only have a 1px border between the two
- &:first-child {
- > .btn,
- > .btn-group {
- margin-right: -1px;
- }
- }
- &:last-child {
- > .btn,
- > .btn-group {
- margin-left: -1px;
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss
deleted file mode 100644
index 75efe64e0..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// Jumbotron
-// --------------------------------------------------
-
-
-.jumbotron {
- padding: $jumbotron-padding;
- margin-bottom: $jumbotron-padding;
- color: $jumbotron-color;
- background-color: $jumbotron-bg;
-
- h1,
- .h1 {
- color: $jumbotron-heading-color;
- }
- p {
- margin-bottom: ($jumbotron-padding / 2);
- font-size: $jumbotron-font-size;
- font-weight: 200;
- }
-
- > hr {
- border-top-color: darken($jumbotron-bg, 10%);
- }
-
- .container & {
- border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
- }
-
- .container {
- max-width: 100%;
- }
-
- @media screen and (min-width: $screen-sm-min) {
- padding-top: ($jumbotron-padding * 1.6);
- padding-bottom: ($jumbotron-padding * 1.6);
-
- .container & {
- padding-left: ($jumbotron-padding * 2);
- padding-right: ($jumbotron-padding * 2);
- }
-
- h1,
- .h1 {
- font-size: ($font-size-base * 4.5);
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss
deleted file mode 100644
index 42ed6ea12..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// Labels
-// --------------------------------------------------
-
-.label {
- display: inline;
- padding: .2em .6em .3em;
- font-size: 75%;
- font-weight: bold;
- line-height: 1;
- color: $label-color;
- text-align: center;
- white-space: nowrap;
- vertical-align: baseline;
- border-radius: .25em;
-
- // [converter] extracted a& to a.label
-
- // Empty labels collapse automatically (not available in IE8)
- &:empty {
- display: none;
- }
-
- // Quick fix for labels in buttons
- .btn & {
- position: relative;
- top: -1px;
- }
-}
-
-// Add hover effects, but only for links
-a.label {
- &:hover,
- &:focus {
- color: $label-link-hover-color;
- text-decoration: none;
- cursor: pointer;
- }
-}
-
-// Colors
-// Contextual variations (linked labels get darker on :hover)
-
-.label-default {
- @include label-variant($label-default-bg);
-}
-
-.label-primary {
- @include label-variant($label-primary-bg);
-}
-
-.label-success {
- @include label-variant($label-success-bg);
-}
-
-.label-info {
- @include label-variant($label-info-bg);
-}
-
-.label-warning {
- @include label-variant($label-warning-bg);
-}
-
-.label-danger {
- @include label-variant($label-danger-bg);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss
deleted file mode 100644
index 3338f6354..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss
+++ /dev/null
@@ -1,129 +0,0 @@
-//
-// List groups
-// --------------------------------------------------
-
-
-// Base class
-//
-// Easily usable on <ul>, <ol>, or <div>.
-
-.list-group {
- // No need to set list-style: none; since .list-group-item is block level
- margin-bottom: 20px;
- padding-left: 0; // reset padding because ul and ol
-}
-
-
-// Individual list items
-//
-// Use on `li`s or `div`s within the `.list-group` parent.
-
-.list-group-item {
- position: relative;
- display: block;
- padding: 10px 15px;
- // Place the border on the list items and negative margin up for better styling
- margin-bottom: -1px;
- background-color: $list-group-bg;
- border: 1px solid $list-group-border;
-
- // Round the first and last items
- &:first-child {
- @include border-top-radius($list-group-border-radius);
- }
- &:last-child {
- margin-bottom: 0;
- @include border-bottom-radius($list-group-border-radius);
- }
-
- // Align badges within list items
- > .badge {
- float: right;
- }
- > .badge + .badge {
- margin-right: 5px;
- }
-}
-
-
-// Linked list items
-//
-// Use anchor elements instead of `li`s or `div`s to create linked list items.
-// Includes an extra `.active` modifier class for showing selected items.
-
-a.list-group-item {
- color: $list-group-link-color;
-
- .list-group-item-heading {
- color: $list-group-link-heading-color;
- }
-
- // Hover state
- &:hover,
- &:focus {
- text-decoration: none;
- color: $list-group-link-hover-color;
- background-color: $list-group-hover-bg;
- }
-}
-
-.list-group-item {
- // Disabled state
- &.disabled,
- &.disabled:hover,
- &.disabled:focus {
- background-color: $list-group-disabled-bg;
- color: $list-group-disabled-color;
-
- // Force color to inherit for custom content
- .list-group-item-heading {
- color: inherit;
- }
- .list-group-item-text {
- color: $list-group-disabled-text-color;
- }
- }
-
- // Active class on item itself, not parent
- &.active,
- &.active:hover,
- &.active:focus {
- z-index: 2; // Place active items above their siblings for proper border styling
- color: $list-group-active-color;
- background-color: $list-group-active-bg;
- border-color: $list-group-active-border;
-
- // Force color to inherit for custom content
- .list-group-item-heading {
- color: inherit;
- }
- .list-group-item-text {
- color: $list-group-active-text-color;
- }
- }
-}
-
-
-// Contextual variants
-//
-// Add modifier classes to change text and background color on individual items.
-// Organizationally, this must come after the `:hover` states.
-
-@include list-group-item-variant(success, $state-success-bg, $state-success-text);
-@include list-group-item-variant(info, $state-info-bg, $state-info-text);
-@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
-@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
-
-
-// Custom content options
-//
-// Extra classes for creating well-formatted content within `.list-group-item`s.
-
-.list-group-item-heading {
- margin-top: 0;
- margin-bottom: 5px;
-}
-.list-group-item-text {
- margin-bottom: 0;
- line-height: 1.3;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss
deleted file mode 100644
index 5ad22cd6d..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-// Media objects
-// Source: http://stubbornella.org/content/?p=497
-// --------------------------------------------------
-
-
-// Common styles
-// -------------------------
-
-// Clear the floats
-.media,
-.media-body {
- overflow: hidden;
- zoom: 1;
-}
-
-// Proper spacing between instances of .media
-.media,
-.media .media {
- margin-top: 15px;
-}
-.media:first-child {
- margin-top: 0;
-}
-
-// For images and videos, set to block
-.media-object {
- display: block;
-}
-
-// Reset margins on headings for tighter default spacing
-.media-heading {
- margin: 0 0 5px;
-}
-
-
-// Media image alignment
-// -------------------------
-
-.media {
- > .pull-left {
- margin-right: 10px;
- }
- > .pull-right {
- margin-left: 10px;
- }
-}
-
-
-// Media list variation
-// -------------------------
-
-// Undo default ul/ol styles
-.media-list {
- padding-left: 0;
- list-style: none;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss
deleted file mode 100644
index b565f013a..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss
+++ /dev/null
@@ -1,39 +0,0 @@
-// Mixins
-// --------------------------------------------------
-
-// Utilities
-@import "mixins/hide-text";
-@import "mixins/opacity";
-@import "mixins/image";
-@import "mixins/labels";
-@import "mixins/reset-filter";
-@import "mixins/resize";
-@import "mixins/responsive-visibility";
-@import "mixins/size";
-@import "mixins/tab-focus";
-@import "mixins/text-emphasis";
-@import "mixins/text-overflow";
-@import "mixins/vendor-prefixes";
-
-// Components
-@import "mixins/alerts";
-@import "mixins/buttons";
-@import "mixins/panels";
-@import "mixins/pagination";
-@import "mixins/list-group";
-@import "mixins/nav-divider";
-@import "mixins/forms";
-@import "mixins/progress-bar";
-@import "mixins/table-row";
-
-// Skins
-@import "mixins/background-variant";
-@import "mixins/border-radius";
-@import "mixins/gradients";
-
-// Layout
-@import "mixins/clearfix";
-@import "mixins/center-block";
-@import "mixins/nav-vertical-align";
-@import "mixins/grid-framework";
-@import "mixins/grid";
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss
deleted file mode 100644
index a126c3986..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss
+++ /dev/null
@@ -1,147 +0,0 @@
-//
-// Modals
-// --------------------------------------------------
-
-// .modal-open - body class for killing the scroll
-// .modal - container to scroll within
-// .modal-dialog - positioning shell for the actual modal
-// .modal-content - actual modal w/ bg and corners and shit
-
-// Kill the scroll on the body
-.modal-open {
- overflow: hidden;
-}
-
-// Container that the modal scrolls within
-.modal {
- display: none;
- overflow: auto;
- overflow-y: scroll;
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: $zindex-modal;
- -webkit-overflow-scrolling: touch;
-
- // Prevent Chrome on Windows from adding a focus outline. For details, see
- // https://github.com/twbs/bootstrap/pull/10951.
- outline: 0;
-
- // When fading in the modal, animate it to slide down
- &.fade .modal-dialog {
- @include translate(0, -25%);
- @include transition-transform(0.3s ease-out);
- }
- &.in .modal-dialog { @include translate(0, 0)}
-}
-
-// Shell div to position the modal with bottom padding
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 10px;
-}
-
-// Actual modal
-.modal-content {
- position: relative;
- background-color: $modal-content-bg;
- border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
- border: 1px solid $modal-content-border-color;
- border-radius: $border-radius-large;
- @include box-shadow(0 3px 9px rgba(0,0,0,.5));
- background-clip: padding-box;
- // Remove focus outline from opened modal
- outline: 0;
-}
-
-// Modal background
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: $zindex-modal-background;
- background-color: $modal-backdrop-bg;
- // Fade for backdrop
- &.fade { @include opacity(0); }
- &.in { @include opacity($modal-backdrop-opacity); }
-}
-
-// Modal header
-// Top section of the modal w/ title and dismiss
-.modal-header {
- padding: $modal-title-padding;
- border-bottom: 1px solid $modal-header-border-color;
- min-height: ($modal-title-padding + $modal-title-line-height);
-}
-// Close icon
-.modal-header .close {
- margin-top: -2px;
-}
-
-// Title text within header
-.modal-title {
- margin: 0;
- line-height: $modal-title-line-height;
-}
-
-// Modal body
-// Where all modal content resides (sibling of .modal-header and .modal-footer)
-.modal-body {
- position: relative;
- padding: $modal-inner-padding;
-}
-
-// Footer (for actions)
-.modal-footer {
- padding: $modal-inner-padding;
- text-align: right; // right align buttons
- border-top: 1px solid $modal-footer-border-color;
- @include clearfix(); // clear it in case folks use .pull-* classes on buttons
-
- // Properly space out buttons
- .btn + .btn {
- margin-left: 5px;
- margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
- }
- // but override that for button groups
- .btn-group .btn + .btn {
- margin-left: -1px;
- }
- // and override it for block buttons as well
- .btn-block + .btn-block {
- margin-left: 0;
- }
-}
-
-// Measure scrollbar width for padding body during modal show/hide
-.modal-scrollbar-measure {
- position: absolute;
- top: -9999px;
- width: 50px;
- height: 50px;
- overflow: scroll;
-}
-
-// Scale up the modal
-@media (min-width: $screen-sm-min) {
- // Automatically set modal's width for larger viewports
- .modal-dialog {
- width: $modal-md;
- margin: 30px auto;
- }
- .modal-content {
- @include box-shadow(0 5px 15px rgba(0,0,0,.5));
- }
-
- // Modal sizes
- .modal-sm { width: $modal-sm; }
-}
-
-@media (min-width: $screen-md-min) {
- .modal-lg { width: $modal-lg; }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss
deleted file mode 100644
index 4401803f1..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss
+++ /dev/null
@@ -1,658 +0,0 @@
-//
-// Navbars
-// --------------------------------------------------
-
-
-// Wrapper and base class
-//
-// Provide a static navbar from which we expand to create full-width, fixed, and
-// other navbar variations.
-
-.navbar {
- position: relative;
- min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
- margin-bottom: $navbar-margin-bottom;
- border: 1px solid transparent;
-
- // Prevent floats from breaking the navbar
- @include clearfix();
-
- @media (min-width: $grid-float-breakpoint) {
- border-radius: $navbar-border-radius;
- }
-}
-
-
-// Navbar heading
-//
-// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
-// styling of responsive aspects.
-
-.navbar-header {
- @include clearfix();
-
- @media (min-width: $grid-float-breakpoint) {
- float: left;
- }
-}
-
-
-// Navbar collapse (body)
-//
-// Group your navbar content into this for easy collapsing and expanding across
-// various device sizes. By default, this content is collapsed when <768px, but
-// will expand past that for a horizontal display.
-//
-// To start (on mobile devices) the navbar links, forms, and buttons are stacked
-// vertically and include a `max-height` to overflow in case you have too much
-// content for the user's viewport.
-
-.navbar-collapse {
- overflow-x: visible;
- padding-right: $navbar-padding-horizontal;
- padding-left: $navbar-padding-horizontal;
- border-top: 1px solid transparent;
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
- @include clearfix();
- -webkit-overflow-scrolling: touch;
-
- &.in {
- overflow-y: auto;
- }
-
- @media (min-width: $grid-float-breakpoint) {
- width: auto;
- border-top: 0;
- box-shadow: none;
-
- &.collapse {
- display: block !important;
- height: auto !important;
- padding-bottom: 0; // Override default setting
- overflow: visible !important;
- }
-
- &.in {
- overflow-y: visible;
- }
-
- // Undo the collapse side padding for navbars with containers to ensure
- // alignment of right-aligned contents.
- .navbar-fixed-top &,
- .navbar-static-top &,
- .navbar-fixed-bottom & {
- padding-left: 0;
- padding-right: 0;
- }
- }
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- .navbar-collapse {
- max-height: $navbar-collapse-max-height;
-
- @media (max-width: $screen-xs-min) and (orientation: landscape) {
- max-height: 200px;
- }
- }
-}
-
-
-// Both navbar header and collapse
-//
-// When a container is present, change the behavior of the header and collapse.
-
-.container,
-.container-fluid {
- > .navbar-header,
- > .navbar-collapse {
- margin-right: -$navbar-padding-horizontal;
- margin-left: -$navbar-padding-horizontal;
-
- @media (min-width: $grid-float-breakpoint) {
- margin-right: 0;
- margin-left: 0;
- }
- }
-}
-
-
-//
-// Navbar alignment options
-//
-// Display the navbar across the entirety of the page or fixed it to the top or
-// bottom of the page.
-
-// Static top (unfixed, but 100% wide) navbar
-.navbar-static-top {
- z-index: $zindex-navbar;
- border-width: 0 0 1px;
-
- @media (min-width: $grid-float-breakpoint) {
- border-radius: 0;
- }
-}
-
-// Fix the top/bottom navbars when screen real estate supports it
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: $zindex-navbar-fixed;
-
- // Undo the rounded corners
- @media (min-width: $grid-float-breakpoint) {
- border-radius: 0;
- }
-}
-.navbar-fixed-top {
- top: 0;
- border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
- bottom: 0;
- margin-bottom: 0; // override .navbar defaults
- border-width: 1px 0 0;
-}
-
-
-// Brand/project name
-
-.navbar-brand {
- float: left;
- padding: $navbar-padding-vertical $navbar-padding-horizontal;
- font-size: $font-size-large;
- line-height: $line-height-computed;
- height: $navbar-height;
-
- &:hover,
- &:focus {
- text-decoration: none;
- }
-
- @media (min-width: $grid-float-breakpoint) {
- .navbar > .container &,
- .navbar > .container-fluid & {
- margin-left: -$navbar-padding-horizontal;
- }
- }
-}
-
-
-// Navbar toggle
-//
-// Custom button for toggling the `.navbar-collapse`, powered by the collapse
-// JavaScript plugin.
-
-.navbar-toggle {
- position: relative;
- float: right;
- margin-right: $navbar-padding-horizontal;
- padding: 9px 10px;
- @include navbar-vertical-align(34px);
- background-color: transparent;
- background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
- border: 1px solid transparent;
- border-radius: $border-radius-base;
-
- // We remove the `outline` here, but later compensate by attaching `:hover`
- // styles to `:focus`.
- &:focus {
- outline: 0;
- }
-
- // Bars
- .icon-bar {
- display: block;
- width: 22px;
- height: 2px;
- border-radius: 1px;
- }
- .icon-bar + .icon-bar {
- margin-top: 4px;
- }
-
- @media (min-width: $grid-float-breakpoint) {
- display: none;
- }
-}
-
-
-// Navbar nav links
-//
-// Builds on top of the `.nav` components with its own modifier class to make
-// the nav the full height of the horizontal nav (above 768px).
-
-.navbar-nav {
- margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
-
- > li > a {
- padding-top: 10px;
- padding-bottom: 10px;
- line-height: $line-height-computed;
- }
-
- @media (max-width: $grid-float-breakpoint-max) {
- // Dropdowns get custom display when collapsed
- .open .dropdown-menu {
- position: static;
- float: none;
- width: auto;
- margin-top: 0;
- background-color: transparent;
- border: 0;
- box-shadow: none;
- > li > a,
- .dropdown-header {
- padding: 5px 15px 5px 25px;
- }
- > li > a {
- line-height: $line-height-computed;
- &:hover,
- &:focus {
- background-image: none;
- }
- }
- }
- }
-
- // Uncollapse the nav
- @media (min-width: $grid-float-breakpoint) {
- float: left;
- margin: 0;
-
- > li {
- float: left;
- > a {
- padding-top: $navbar-padding-vertical;
- padding-bottom: $navbar-padding-vertical;
- }
- }
-
- &.navbar-right:last-child {
- margin-right: -$navbar-padding-horizontal;
- }
- }
-}
-
-
-// Component alignment
-//
-// Repurpose the pull utilities as their own navbar utilities to avoid specificity
-// issues with parents and chaining. Only do this when the navbar is uncollapsed
-// though so that navbar contents properly stack and align in mobile.
-
-@media (min-width: $grid-float-breakpoint) {
- .navbar-left {
- float: left !important;
- }
- .navbar-right {
- float: right !important;
- }
-}
-
-
-// Navbar form
-//
-// Extension of the `.form-inline` with some extra flavor for optimum display in
-// our navbars.
-
-.navbar-form {
- margin-left: -$navbar-padding-horizontal;
- margin-right: -$navbar-padding-horizontal;
- padding: 10px $navbar-padding-horizontal;
- border-top: 1px solid transparent;
- border-bottom: 1px solid transparent;
- $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- @include box-shadow($shadow);
-
- // Mixin behavior for optimum display
- @extend .form-inline;
-
- .form-group {
- @media (max-width: $grid-float-breakpoint-max) {
- margin-bottom: 5px;
- }
- }
-
- // Vertically center in expanded, horizontal navbar
- @include navbar-vertical-align($input-height-base);
-
- // Undo 100% width for pull classes
- @media (min-width: $grid-float-breakpoint) {
- width: auto;
- border: 0;
- margin-left: 0;
- margin-right: 0;
- padding-top: 0;
- padding-bottom: 0;
- @include box-shadow(none);
-
- // Outdent the form if last child to line up with content down the page
- &.navbar-right:last-child {
- margin-right: -$navbar-padding-horizontal;
- }
- }
-}
-
-
-// Dropdown menus
-
-// Menu position and menu carets
-.navbar-nav > li > .dropdown-menu {
- margin-top: 0;
- @include border-top-radius(0);
-}
-// Menu position and menu caret support for dropups via extra dropup class
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
- @include border-bottom-radius(0);
-}
-
-
-// Buttons in navbars
-//
-// Vertically center a button within a navbar (when *not* in a form).
-
-.navbar-btn {
- @include navbar-vertical-align($input-height-base);
-
- &.btn-sm {
- @include navbar-vertical-align($input-height-small);
- }
- &.btn-xs {
- @include navbar-vertical-align(22);
- }
-}
-
-
-// Text in navbars
-//
-// Add a class to make any element properly align itself vertically within the navbars.
-
-.navbar-text {
- @include navbar-vertical-align($line-height-computed);
-
- @media (min-width: $grid-float-breakpoint) {
- float: left;
- margin-left: $navbar-padding-horizontal;
- margin-right: $navbar-padding-horizontal;
-
- // Outdent the form if last child to line up with content down the page
- &.navbar-right:last-child {
- margin-right: 0;
- }
- }
-}
-
-// Alternate navbars
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
- background-color: $navbar-default-bg;
- border-color: $navbar-default-border;
-
- .navbar-brand {
- color: $navbar-default-brand-color;
- &:hover,
- &:focus {
- color: $navbar-default-brand-hover-color;
- background-color: $navbar-default-brand-hover-bg;
- }
- }
-
- .navbar-text {
- color: $navbar-default-color;
- }
-
- .navbar-nav {
- > li > a {
- color: $navbar-default-link-color;
-
- &:hover,
- &:focus {
- color: $navbar-default-link-hover-color;
- background-color: $navbar-default-link-hover-bg;
- }
- }
- > .active > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-default-link-active-color;
- background-color: $navbar-default-link-active-bg;
- }
- }
- > .disabled > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-default-link-disabled-color;
- background-color: $navbar-default-link-disabled-bg;
- }
- }
- }
-
- .navbar-toggle {
- border-color: $navbar-default-toggle-border-color;
- &:hover,
- &:focus {
- background-color: $navbar-default-toggle-hover-bg;
- }
- .icon-bar {
- background-color: $navbar-default-toggle-icon-bar-bg;
- }
- }
-
- .navbar-collapse,
- .navbar-form {
- border-color: $navbar-default-border;
- }
-
- // Dropdown menu items
- .navbar-nav {
- // Remove background color from open dropdown
- > .open > a {
- &,
- &:hover,
- &:focus {
- background-color: $navbar-default-link-active-bg;
- color: $navbar-default-link-active-color;
- }
- }
-
- @media (max-width: $grid-float-breakpoint-max) {
- // Dropdowns get custom display when collapsed
- .open .dropdown-menu {
- > li > a {
- color: $navbar-default-link-color;
- &:hover,
- &:focus {
- color: $navbar-default-link-hover-color;
- background-color: $navbar-default-link-hover-bg;
- }
- }
- > .active > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-default-link-active-color;
- background-color: $navbar-default-link-active-bg;
- }
- }
- > .disabled > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-default-link-disabled-color;
- background-color: $navbar-default-link-disabled-bg;
- }
- }
- }
- }
- }
-
-
- // Links in navbars
- //
- // Add a class to ensure links outside the navbar nav are colored correctly.
-
- .navbar-link {
- color: $navbar-default-link-color;
- &:hover {
- color: $navbar-default-link-hover-color;
- }
- }
-
- .btn-link {
- color: $navbar-default-link-color;
- &:hover,
- &:focus {
- color: $navbar-default-link-hover-color;
- }
- &[disabled],
- fieldset[disabled] & {
- &:hover,
- &:focus {
- color: $navbar-default-link-disabled-color;
- }
- }
- }
-}
-
-// Inverse navbar
-
-.navbar-inverse {
- background-color: $navbar-inverse-bg;
- border-color: $navbar-inverse-border;
-
- .navbar-brand {
- color: $navbar-inverse-brand-color;
- &:hover,
- &:focus {
- color: $navbar-inverse-brand-hover-color;
- background-color: $navbar-inverse-brand-hover-bg;
- }
- }
-
- .navbar-text {
- color: $navbar-inverse-color;
- }
-
- .navbar-nav {
- > li > a {
- color: $navbar-inverse-link-color;
-
- &:hover,
- &:focus {
- color: $navbar-inverse-link-hover-color;
- background-color: $navbar-inverse-link-hover-bg;
- }
- }
- > .active > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-inverse-link-active-color;
- background-color: $navbar-inverse-link-active-bg;
- }
- }
- > .disabled > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-inverse-link-disabled-color;
- background-color: $navbar-inverse-link-disabled-bg;
- }
- }
- }
-
- // Darken the responsive nav toggle
- .navbar-toggle {
- border-color: $navbar-inverse-toggle-border-color;
- &:hover,
- &:focus {
- background-color: $navbar-inverse-toggle-hover-bg;
- }
- .icon-bar {
- background-color: $navbar-inverse-toggle-icon-bar-bg;
- }
- }
-
- .navbar-collapse,
- .navbar-form {
- border-color: darken($navbar-inverse-bg, 7%);
- }
-
- // Dropdowns
- .navbar-nav {
- > .open > a {
- &,
- &:hover,
- &:focus {
- background-color: $navbar-inverse-link-active-bg;
- color: $navbar-inverse-link-active-color;
- }
- }
-
- @media (max-width: $grid-float-breakpoint-max) {
- // Dropdowns get custom display
- .open .dropdown-menu {
- > .dropdown-header {
- border-color: $navbar-inverse-border;
- }
- .divider {
- background-color: $navbar-inverse-border;
- }
- > li > a {
- color: $navbar-inverse-link-color;
- &:hover,
- &:focus {
- color: $navbar-inverse-link-hover-color;
- background-color: $navbar-inverse-link-hover-bg;
- }
- }
- > .active > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-inverse-link-active-color;
- background-color: $navbar-inverse-link-active-bg;
- }
- }
- > .disabled > a {
- &,
- &:hover,
- &:focus {
- color: $navbar-inverse-link-disabled-color;
- background-color: $navbar-inverse-link-disabled-bg;
- }
- }
- }
- }
- }
-
- .navbar-link {
- color: $navbar-inverse-link-color;
- &:hover {
- color: $navbar-inverse-link-hover-color;
- }
- }
-
- .btn-link {
- color: $navbar-inverse-link-color;
- &:hover,
- &:focus {
- color: $navbar-inverse-link-hover-color;
- }
- &[disabled],
- fieldset[disabled] & {
- &:hover,
- &:focus {
- color: $navbar-inverse-link-disabled-color;
- }
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss
deleted file mode 100644
index c690072be..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss
+++ /dev/null
@@ -1,242 +0,0 @@
-//
-// Navs
-// --------------------------------------------------
-
-
-// Base class
-// --------------------------------------------------
-
-.nav {
- margin-bottom: 0;
- padding-left: 0; // Override default ul/ol
- list-style: none;
- @include clearfix();
-
- > li {
- position: relative;
- display: block;
-
- > a {
- position: relative;
- display: block;
- padding: $nav-link-padding;
- &:hover,
- &:focus {
- text-decoration: none;
- background-color: $nav-link-hover-bg;
- }
- }
-
- // Disabled state sets text to gray and nukes hover/tab effects
- &.disabled > a {
- color: $nav-disabled-link-color;
-
- &:hover,
- &:focus {
- color: $nav-disabled-link-hover-color;
- text-decoration: none;
- background-color: transparent;
- cursor: not-allowed;
- }
- }
- }
-
- // Open dropdowns
- .open > a {
- &,
- &:hover,
- &:focus {
- background-color: $nav-link-hover-bg;
- border-color: $link-color;
- }
- }
-
- // Nav dividers (deprecated with v3.0.1)
- //
- // This should have been removed in v3 with the dropping of `.nav-list`, but
- // we missed it. We don't currently support this anywhere, but in the interest
- // of maintaining backward compatibility in case you use it, it's deprecated.
- .nav-divider {
- @include nav-divider();
- }
-
- // Prevent IE8 from misplacing imgs
- //
- // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
- > li > a > img {
- max-width: none;
- }
-}
-
-
-// Tabs
-// -------------------------
-
-// Give the tabs something to sit on
-.nav-tabs {
- border-bottom: 1px solid $nav-tabs-border-color;
- > li {
- float: left;
- // Make the list-items overlay the bottom border
- margin-bottom: -1px;
-
- // Actual tabs (as links)
- > a {
- margin-right: 2px;
- line-height: $line-height-base;
- border: 1px solid transparent;
- border-radius: $border-radius-base $border-radius-base 0 0;
- &:hover {
- border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
- }
- }
-
- // Active state, and its :hover to override normal :hover
- &.active > a {
- &,
- &:hover,
- &:focus {
- color: $nav-tabs-active-link-hover-color;
- background-color: $nav-tabs-active-link-hover-bg;
- border: 1px solid $nav-tabs-active-link-hover-border-color;
- border-bottom-color: transparent;
- cursor: default;
- }
- }
- }
- // pulling this in mainly for less shorthand
- &.nav-justified {
- @extend .nav-justified;
- @extend .nav-tabs-justified;
- }
-}
-
-
-// Pills
-// -------------------------
-.nav-pills {
- > li {
- float: left;
-
- // Links rendered as pills
- > a {
- border-radius: $nav-pills-border-radius;
- }
- + li {
- margin-left: 2px;
- }
-
- // Active state
- &.active > a {
- &,
- &:hover,
- &:focus {
- color: $nav-pills-active-link-hover-color;
- background-color: $nav-pills-active-link-hover-bg;
- }
- }
- }
-}
-
-
-// Stacked pills
-.nav-stacked {
- > li {
- float: none;
- + li {
- margin-top: 2px;
- margin-left: 0; // no need for this gap between nav items
- }
- }
-}
-
-
-// Nav variations
-// --------------------------------------------------
-
-// Justified nav links
-// -------------------------
-
-.nav-justified {
- width: 100%;
-
- > li {
- float: none;
- > a {
- text-align: center;
- margin-bottom: 5px;
- }
- }
-
- > .dropdown .dropdown-menu {
- top: auto;
- left: auto;
- }
-
- @media (min-width: $screen-sm-min) {
- > li {
- display: table-cell;
- width: 1%;
- > a {
- margin-bottom: 0;
- }
- }
- }
-}
-
-// Move borders to anchors instead of bottom of list
-//
-// Mixin for adding on top the shared `.nav-justified` styles for our tabs
-.nav-tabs-justified {
- border-bottom: 0;
-
- > li > a {
- // Override margin from .nav-tabs
- margin-right: 0;
- border-radius: $border-radius-base;
- }
-
- > .active > a,
- > .active > a:hover,
- > .active > a:focus {
- border: 1px solid $nav-tabs-justified-link-border-color;
- }
-
- @media (min-width: $screen-sm-min) {
- > li > a {
- border-bottom: 1px solid $nav-tabs-justified-link-border-color;
- border-radius: $border-radius-base $border-radius-base 0 0;
- }
- > .active > a,
- > .active > a:hover,
- > .active > a:focus {
- border-bottom-color: $nav-tabs-justified-active-link-border-color;
- }
- }
-}
-
-
-// Tabbable tabs
-// -------------------------
-
-// Hide tabbable panes to start, show them when `.active`
-.tab-content {
- > .tab-pane {
- display: none;
- }
- > .active {
- display: block;
- }
-}
-
-
-// Dropdowns
-// -------------------------
-
-// Specific dropdowns
-.nav-tabs .dropdown-menu {
- // make dropdown border overlap tab border
- margin-top: -1px;
- // Remove the top rounded corners here since there is a hard edge above the menu
- @include border-top-radius(0);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss
deleted file mode 100644
index ce04b6a2f..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss
+++ /dev/null
@@ -1,425 +0,0 @@
-/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
-
-//
-// 1. Set default font family to sans-serif.
-// 2. Prevent iOS text size adjust after orientation change, without disabling
-// user zoom.
-//
-
-html {
- font-family: sans-serif; // 1
- -ms-text-size-adjust: 100%; // 2
- -webkit-text-size-adjust: 100%; // 2
-}
-
-//
-// Remove default margin.
-//
-
-body {
- margin: 0;
-}
-
-// HTML5 display definitions
-// ==========================================================================
-
-//
-// Correct `block` display not defined for any HTML5 element in IE 8/9.
-// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.
-// Correct `block` display not defined for `main` in IE 11.
-//
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
- display: block;
-}
-
-//
-// 1. Correct `inline-block` display not defined in IE 8/9.
-// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
-//
-
-audio,
-canvas,
-progress,
-video {
- display: inline-block; // 1
- vertical-align: baseline; // 2
-}
-
-//
-// Prevent modern browsers from displaying `audio` without controls.
-// Remove excess height in iOS 5 devices.
-//
-
-audio:not([controls]) {
- display: none;
- height: 0;
-}
-
-//
-// Address `[hidden]` styling not present in IE 8/9/10.
-// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
-//
-
-[hidden],
-template {
- display: none;
-}
-
-// Links
-// ==========================================================================
-
-//
-// Remove the gray background color from active links in IE 10.
-//
-
-a {
- background: transparent;
-}
-
-//
-// Improve readability when focused and also mouse hovered in all browsers.
-//
-
-a:active,
-a:hover {
- outline: 0;
-}
-
-// Text-level semantics
-// ==========================================================================
-
-//
-// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
-//
-
-abbr[title] {
- border-bottom: 1px dotted;
-}
-
-//
-// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
-//
-
-b,
-strong {
- font-weight: bold;
-}
-
-//
-// Address styling not present in Safari and Chrome.
-//
-
-dfn {
- font-style: italic;
-}
-
-//
-// Address variable `h1` font-size and margin within `section` and `article`
-// contexts in Firefox 4+, Safari, and Chrome.
-//
-
-h1 {
- font-size: 2em;
- margin: 0.67em 0;
-}
-
-//
-// Address styling not present in IE 8/9.
-//
-
-mark {
- background: #ff0;
- color: #000;
-}
-
-//
-// Address inconsistent and variable font size in all browsers.
-//
-
-small {
- font-size: 80%;
-}
-
-//
-// Prevent `sub` and `sup` affecting `line-height` in all browsers.
-//
-
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-// Embedded content
-// ==========================================================================
-
-//
-// Remove border when inside `a` element in IE 8/9/10.
-//
-
-img {
- border: 0;
-}
-
-//
-// Correct overflow not hidden in IE 9/10/11.
-//
-
-svg:not(:root) {
- overflow: hidden;
-}
-
-// Grouping content
-// ==========================================================================
-
-//
-// Address margin not present in IE 8/9 and Safari.
-//
-
-figure {
- margin: 1em 40px;
-}
-
-//
-// Address differences between Firefox and other browsers.
-//
-
-hr {
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- height: 0;
-}
-
-//
-// Contain overflow in all browsers.
-//
-
-pre {
- overflow: auto;
-}
-
-//
-// Address odd `em`-unit font size rendering in all browsers.
-//
-
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace;
- font-size: 1em;
-}
-
-// Forms
-// ==========================================================================
-
-//
-// Known limitation: by default, Chrome and Safari on OS X allow very limited
-// styling of `select`, unless a `border` property is set.
-//
-
-//
-// 1. Correct color not being inherited.
-// Known issue: affects color of disabled elements.
-// 2. Correct font properties not being inherited.
-// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
-//
-
-button,
-input,
-optgroup,
-select,
-textarea {
- color: inherit; // 1
- font: inherit; // 2
- margin: 0; // 3
-}
-
-//
-// Address `overflow` set to `hidden` in IE 8/9/10/11.
-//
-
-button {
- overflow: visible;
-}
-
-//
-// Address inconsistent `text-transform` inheritance for `button` and `select`.
-// All other form control elements do not inherit `text-transform` values.
-// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
-// Correct `select` style inheritance in Firefox.
-//
-
-button,
-select {
- text-transform: none;
-}
-
-//
-// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
-// and `video` controls.
-// 2. Correct inability to style clickable `input` types in iOS.
-// 3. Improve usability and consistency of cursor style between image-type
-// `input` and others.
-//
-
-button,
-html input[type="button"], // 1
-input[type="reset"],
-input[type="submit"] {
- -webkit-appearance: button; // 2
- cursor: pointer; // 3
-}
-
-//
-// Re-set default cursor for disabled elements.
-//
-
-button[disabled],
-html input[disabled] {
- cursor: default;
-}
-
-//
-// Remove inner padding and border in Firefox 4+.
-//
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-
-//
-// Address Firefox 4+ setting `line-height` on `input` using `!important` in
-// the UA stylesheet.
-//
-
-input {
- line-height: normal;
-}
-
-//
-// It's recommended that you don't attempt to style these elements.
-// Firefox's implementation doesn't respect box-sizing, padding, or width.
-//
-// 1. Address box sizing set to `content-box` in IE 8/9/10.
-// 2. Remove excess padding in IE 8/9/10.
-//
-
-input[type="checkbox"],
-input[type="radio"] {
- box-sizing: border-box; // 1
- padding: 0; // 2
-}
-
-//
-// Fix the cursor style for Chrome's increment/decrement buttons. For certain
-// `font-size` values of the `input`, it causes the cursor style of the
-// decrement button to change from `default` to `text`.
-//
-
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
- height: auto;
-}
-
-//
-// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
-// 2. Address `box-sizing` set to `border-box` in Safari and Chrome
-// (include `-moz` to future-proof).
-//
-
-input[type="search"] {
- -webkit-appearance: textfield; // 1
- -moz-box-sizing: content-box;
- -webkit-box-sizing: content-box; // 2
- box-sizing: content-box;
-}
-
-//
-// Remove inner padding and search cancel button in Safari and Chrome on OS X.
-// Safari (but not Chrome) clips the cancel button when the search input has
-// padding (and `textfield` appearance).
-//
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-//
-// Define consistent border, margin, and padding.
-//
-
-fieldset {
- border: 1px solid #c0c0c0;
- margin: 0 2px;
- padding: 0.35em 0.625em 0.75em;
-}
-
-//
-// 1. Correct `color` not being inherited in IE 8/9/10/11.
-// 2. Remove padding so people aren't caught out if they zero out fieldsets.
-//
-
-legend {
- border: 0; // 1
- padding: 0; // 2
-}
-
-//
-// Remove default vertical scrollbar in IE 8/9/10/11.
-//
-
-textarea {
- overflow: auto;
-}
-
-//
-// Don't inherit the `font-weight` (applied by a rule above).
-// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
-//
-
-optgroup {
- font-weight: bold;
-}
-
-// Tables
-// ==========================================================================
-
-//
-// Remove most spacing between table cells.
-//
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-td,
-th {
- padding: 0;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss
deleted file mode 100644
index 6531fe6f8..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Pager pagination
-// --------------------------------------------------
-
-
-.pager {
- padding-left: 0;
- margin: $line-height-computed 0;
- list-style: none;
- text-align: center;
- @include clearfix();
- li {
- display: inline;
- > a,
- > span {
- display: inline-block;
- padding: 5px 14px;
- background-color: $pager-bg;
- border: 1px solid $pager-border;
- border-radius: $pager-border-radius;
- }
-
- > a:hover,
- > a:focus {
- text-decoration: none;
- background-color: $pager-hover-bg;
- }
- }
-
- .next {
- > a,
- > span {
- float: right;
- }
- }
-
- .previous {
- > a,
- > span {
- float: left;
- }
- }
-
- .disabled {
- > a,
- > a:hover,
- > a:focus,
- > span {
- color: $pager-disabled-color;
- background-color: $pager-bg;
- cursor: not-allowed;
- }
- }
-
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss
deleted file mode 100644
index 44c12226b..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// Pagination (multiple pages)
-// --------------------------------------------------
-.pagination {
- display: inline-block;
- padding-left: 0;
- margin: $line-height-computed 0;
- border-radius: $border-radius-base;
-
- > li {
- display: inline; // Remove list-style and block-level defaults
- > a,
- > span {
- position: relative;
- float: left; // Collapse white-space
- padding: $padding-base-vertical $padding-base-horizontal;
- line-height: $line-height-base;
- text-decoration: none;
- color: $pagination-color;
- background-color: $pagination-bg;
- border: 1px solid $pagination-border;
- margin-left: -1px;
- }
- &:first-child {
- > a,
- > span {
- margin-left: 0;
- @include border-left-radius($border-radius-base);
- }
- }
- &:last-child {
- > a,
- > span {
- @include border-right-radius($border-radius-base);
- }
- }
- }
-
- > li > a,
- > li > span {
- &:hover,
- &:focus {
- color: $pagination-hover-color;
- background-color: $pagination-hover-bg;
- border-color: $pagination-hover-border;
- }
- }
-
- > .active > a,
- > .active > span {
- &,
- &:hover,
- &:focus {
- z-index: 2;
- color: $pagination-active-color;
- background-color: $pagination-active-bg;
- border-color: $pagination-active-border;
- cursor: default;
- }
- }
-
- > .disabled {
- > span,
- > span:hover,
- > span:focus,
- > a,
- > a:hover,
- > a:focus {
- color: $pagination-disabled-color;
- background-color: $pagination-disabled-bg;
- border-color: $pagination-disabled-border;
- cursor: not-allowed;
- }
- }
-}
-
-// Sizing
-// --------------------------------------------------
-
-// Large
-.pagination-lg {
- @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large);
-}
-
-// Small
-.pagination-sm {
- @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss
deleted file mode 100644
index 42ab5fec9..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-// Panels
-// --------------------------------------------------
-
-
-// Base class
-.panel {
- margin-bottom: $line-height-computed;
- background-color: $panel-bg;
- border: 1px solid transparent;
- border-radius: $panel-border-radius;
- @include box-shadow(0 1px 1px rgba(0,0,0,.05));
-}
-
-// Panel contents
-.panel-body {
- padding: $panel-body-padding;
- @include clearfix();
-}
-
-// Optional heading
-.panel-heading {
- padding: $panel-heading-padding;
- border-bottom: 1px solid transparent;
- @include border-top-radius(($panel-border-radius - 1));
-
- > .dropdown .dropdown-toggle {
- color: inherit;
- }
-}
-
-// Within heading, strip any `h*` tag of its default margins for spacing.
-.panel-title {
- margin-top: 0;
- margin-bottom: 0;
- font-size: ceil(($font-size-base * 1.125));
- color: inherit;
-
- > a {
- color: inherit;
- }
-}
-
-// Optional footer (stays gray in every modifier class)
-.panel-footer {
- padding: $panel-footer-padding;
- background-color: $panel-footer-bg;
- border-top: 1px solid $panel-inner-border;
- @include border-bottom-radius(($panel-border-radius - 1));
-}
-
-
-// List groups in panels
-//
-// By default, space out list group content from panel headings to account for
-// any kind of custom content between the two.
-
-.panel {
- > .list-group {
- margin-bottom: 0;
-
- .list-group-item {
- border-width: 1px 0;
- border-radius: 0;
- }
-
- // Add border top radius for first one
- &:first-child {
- .list-group-item:first-child {
- border-top: 0;
- @include border-top-radius(($panel-border-radius - 1));
- }
- }
- // Add border bottom radius for last one
- &:last-child {
- .list-group-item:last-child {
- border-bottom: 0;
- @include border-bottom-radius(($panel-border-radius - 1));
- }
- }
- }
-}
-// Collapse space between when there's no additional content.
-.panel-heading + .list-group {
- .list-group-item:first-child {
- border-top-width: 0;
- }
-}
-
-
-// Tables in panels
-//
-// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
-// watch it go full width.
-
-.panel {
- > .table,
- > .table-responsive > .table {
- margin-bottom: 0;
- }
- // Add border top radius for first one
- > .table:first-child,
- > .table-responsive:first-child > .table:first-child {
- @include border-top-radius(($panel-border-radius - 1));
-
- > thead:first-child,
- > tbody:first-child {
- > tr:first-child {
- td:first-child,
- th:first-child {
- border-top-left-radius: ($panel-border-radius - 1);
- }
- td:last-child,
- th:last-child {
- border-top-right-radius: ($panel-border-radius - 1);
- }
- }
- }
- }
- // Add border bottom radius for last one
- > .table:last-child,
- > .table-responsive:last-child > .table:last-child {
- @include border-bottom-radius(($panel-border-radius - 1));
-
- > tbody:last-child,
- > tfoot:last-child {
- > tr:last-child {
- td:first-child,
- th:first-child {
- border-bottom-left-radius: ($panel-border-radius - 1);
- }
- td:last-child,
- th:last-child {
- border-bottom-right-radius: ($panel-border-radius - 1);
- }
- }
- }
- }
- > .panel-body + .table,
- > .panel-body + .table-responsive {
- border-top: 1px solid $table-border-color;
- }
- > .table > tbody:first-child > tr:first-child th,
- > .table > tbody:first-child > tr:first-child td {
- border-top: 0;
- }
- > .table-bordered,
- > .table-responsive > .table-bordered {
- border: 0;
- > thead,
- > tbody,
- > tfoot {
- > tr {
- > th:first-child,
- > td:first-child {
- border-left: 0;
- }
- > th:last-child,
- > td:last-child {
- border-right: 0;
- }
- }
- }
- > thead,
- > tbody {
- > tr:first-child {
- > td,
- > th {
- border-bottom: 0;
- }
- }
- }
- > tbody,
- > tfoot {
- > tr:last-child {
- > td,
- > th {
- border-bottom: 0;
- }
- }
- }
- }
- > .table-responsive {
- border: 0;
- margin-bottom: 0;
- }
-}
-
-
-// Collapsable panels (aka, accordion)
-//
-// Wrap a series of panels in `.panel-group` to turn them into an accordion with
-// the help of our collapse JavaScript plugin.
-
-.panel-group {
- margin-bottom: $line-height-computed;
-
- // Tighten up margin so it's only between panels
- .panel {
- margin-bottom: 0;
- border-radius: $panel-border-radius;
- + .panel {
- margin-top: 5px;
- }
- }
-
- .panel-heading {
- border-bottom: 0;
- + .panel-collapse .panel-body {
- border-top: 1px solid $panel-inner-border;
- }
- }
- .panel-footer {
- border-top: 0;
- + .panel-collapse .panel-body {
- border-bottom: 1px solid $panel-inner-border;
- }
- }
-}
-
-
-// Contextual variations
-.panel-default {
- @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
-}
-.panel-primary {
- @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
-}
-.panel-success {
- @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
-}
-.panel-info {
- @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
-}
-.panel-warning {
- @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
-}
-.panel-danger {
- @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss
deleted file mode 100644
index 1cf27aed5..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss
+++ /dev/null
@@ -1,133 +0,0 @@
-//
-// Popovers
-// --------------------------------------------------
-
-
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: $zindex-popover;
- display: none;
- max-width: $popover-max-width;
- padding: 1px;
- text-align: left; // Reset given new insertion method
- background-color: $popover-bg;
- background-clip: padding-box;
- border: 1px solid $popover-fallback-border-color;
- border: 1px solid $popover-border-color;
- border-radius: $border-radius-large;
- @include box-shadow(0 5px 10px rgba(0,0,0,.2));
-
- // Overrides for proper insertion
- white-space: normal;
-
- // Offset the popover to account for the popover arrow
- &.top { margin-top: -$popover-arrow-width; }
- &.right { margin-left: $popover-arrow-width; }
- &.bottom { margin-top: $popover-arrow-width; }
- &.left { margin-left: -$popover-arrow-width; }
-}
-
-.popover-title {
- margin: 0; // reset heading margin
- padding: 8px 14px;
- font-size: $font-size-base;
- font-weight: normal;
- line-height: 18px;
- background-color: $popover-title-bg;
- border-bottom: 1px solid darken($popover-title-bg, 5%);
- border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
-}
-
-.popover-content {
- padding: 9px 14px;
-}
-
-// Arrows
-//
-// .arrow is outer, .arrow:after is inner
-
-.popover > .arrow {
- &,
- &:after {
- position: absolute;
- display: block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- }
-}
-.popover > .arrow {
- border-width: $popover-arrow-outer-width;
-}
-.popover > .arrow:after {
- border-width: $popover-arrow-width;
- content: "";
-}
-
-.popover {
- &.top > .arrow {
- left: 50%;
- margin-left: -$popover-arrow-outer-width;
- border-bottom-width: 0;
- border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
- border-top-color: $popover-arrow-outer-color;
- bottom: -$popover-arrow-outer-width;
- &:after {
- content: " ";
- bottom: 1px;
- margin-left: -$popover-arrow-width;
- border-bottom-width: 0;
- border-top-color: $popover-arrow-color;
- }
- }
- &.right > .arrow {
- top: 50%;
- left: -$popover-arrow-outer-width;
- margin-top: -$popover-arrow-outer-width;
- border-left-width: 0;
- border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
- border-right-color: $popover-arrow-outer-color;
- &:after {
- content: " ";
- left: 1px;
- bottom: -$popover-arrow-width;
- border-left-width: 0;
- border-right-color: $popover-arrow-color;
- }
- }
- &.bottom > .arrow {
- left: 50%;
- margin-left: -$popover-arrow-outer-width;
- border-top-width: 0;
- border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
- border-bottom-color: $popover-arrow-outer-color;
- top: -$popover-arrow-outer-width;
- &:after {
- content: " ";
- top: 1px;
- margin-left: -$popover-arrow-width;
- border-top-width: 0;
- border-bottom-color: $popover-arrow-color;
- }
- }
-
- &.left > .arrow {
- top: 50%;
- right: -$popover-arrow-outer-width;
- margin-top: -$popover-arrow-outer-width;
- border-right-width: 0;
- border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
- border-left-color: $popover-arrow-outer-color;
- &:after {
- content: " ";
- right: 1px;
- border-right-width: 0;
- border-left-color: $popover-arrow-color;
- bottom: -$popover-arrow-width;
- }
- }
-
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss
deleted file mode 100644
index 3655d0395..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Basic print styles
-// --------------------------------------------------
-// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
-
-@media print {
-
- * {
- text-shadow: none !important;
- color: #000 !important; // Black prints faster: h5bp.com/s
- background: transparent !important;
- box-shadow: none !important;
- }
-
- a,
- a:visited {
- text-decoration: underline;
- }
-
- a[href]:after {
- content: " (" attr(href) ")";
- }
-
- abbr[title]:after {
- content: " (" attr(title) ")";
- }
-
- // Don't show links for images, or javascript/internal links
- a[href^="javascript:"]:after,
- a[href^="#"]:after {
- content: "";
- }
-
- pre,
- blockquote {
- border: 1px solid #999;
- page-break-inside: avoid;
- }
-
- thead {
- display: table-header-group; // h5bp.com/t
- }
-
- tr,
- img {
- page-break-inside: avoid;
- }
-
- img {
- max-width: 100% !important;
- }
-
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
-
- h2,
- h3 {
- page-break-after: avoid;
- }
-
- // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245
- // Once fixed, we can just straight up remove this.
- select {
- background: #fff !important;
- }
-
- // Bootstrap components
- .navbar {
- display: none;
- }
- .table {
- td,
- th {
- background-color: #fff !important;
- }
- }
- .btn,
- .dropup > .btn {
- > .caret {
- border-top-color: #000 !important;
- }
- }
- .label {
- border: 1px solid #000;
- }
-
- .table {
- border-collapse: collapse !important;
- }
- .table-bordered {
- th,
- td {
- border: 1px solid #ddd !important;
- }
- }
-
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss
deleted file mode 100644
index d22ec954f..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-// Progress bars
-// --------------------------------------------------
-
-
-// Bar animations
-// -------------------------
-
-@keyframes progress-bar-stripes {
- from { background-position: 40px 0; }
- to { background-position: 0 0; }
-}
-
-
-
-// Bar itself
-// -------------------------
-
-// Outer container
-.progress {
- overflow: hidden;
- height: $line-height-computed;
- margin-bottom: $line-height-computed;
- background-color: $progress-bg;
- border-radius: $border-radius-base;
- @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
-}
-
-// Bar of progress
-.progress-bar {
- float: left;
- width: 0%;
- height: 100%;
- font-size: $font-size-small;
- line-height: $line-height-computed;
- color: $progress-bar-color;
- text-align: center;
- background-color: $progress-bar-bg;
- @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
- @include transition(width .6s ease);
-}
-
-// Striped bars
-.progress-striped .progress-bar {
- @include gradient-striped();
- background-size: 40px 40px;
-}
-
-// Call animation for the active one
-.progress.active .progress-bar {
- @include animation(progress-bar-stripes 2s linear infinite);
-}
-
-// Account for lower percentages
-.progress-bar {
- &[aria-valuenow="1"],
- &[aria-valuenow="2"] {
- min-width: 30px;
- }
-
- &[aria-valuenow="0"] {
- color: $gray-light;
- min-width: 30px;
- background-color: transparent;
- background-image: none;
- box-shadow: none;
- }
-}
-
-
-
-// Variations
-// -------------------------
-
-.progress-bar-success {
- @include progress-bar-variant($progress-bar-success-bg);
-}
-
-.progress-bar-info {
- @include progress-bar-variant($progress-bar-info-bg);
-}
-
-.progress-bar-warning {
- @include progress-bar-variant($progress-bar-warning-bg);
-}
-
-.progress-bar-danger {
- @include progress-bar-variant($progress-bar-danger-bg);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss
deleted file mode 100644
index a884d49fe..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-// Embeds responsive
-//
-// Credit: Nicolas Gallagher and SUIT CSS.
-
-.embed-responsive {
- position: relative;
- display: block;
- height: 0;
- padding: 0;
- overflow: hidden;
-
- .embed-responsive-item,
- iframe,
- embed,
- object {
- position: absolute;
- top: 0;
- left: 0;
- bottom: 0;
- height: 100%;
- width: 100%;
- border: 0;
- }
-
- // Modifier class for 16:9 aspect ratio
- &.embed-responsive-16by9 {
- padding-bottom: 56.25%;
- }
-
- // Modifier class for 4:3 aspect ratio
- &.embed-responsive-4by3 {
- padding-bottom: 75%;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss
deleted file mode 100644
index f7fd55f42..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-// Responsive: Utility classes
-// --------------------------------------------------
-
-
-// IE10 in Windows (Phone) 8
-//
-// Support for responsive views via media queries is kind of borked in IE10, for
-// Surface/desktop in split view and for Windows Phone 8. This particular fix
-// must be accompanied by a snippet of JavaScript to sniff the user agent and
-// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
-// our Getting Started page for more information on this bug.
-//
-// For more information, see the following:
-//
-// Issue: https://github.com/twbs/bootstrap/issues/10497
-// Docs: http://getbootstrap.com/getting-started/#browsers
-// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
-
-@-ms-viewport {
- width: device-width;
-}
-
-
-// Visibility utilities
-// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
-
-@include responsive-invisibility('.visible-xs, .visible-sm, .visible-md, .visible-lg');
-
-.visible-xs-block,
-.visible-xs-inline,
-.visible-xs-inline-block,
-.visible-sm-block,
-.visible-sm-inline,
-.visible-sm-inline-block,
-.visible-md-block,
-.visible-md-inline,
-.visible-md-inline-block,
-.visible-lg-block,
-.visible-lg-inline,
-.visible-lg-inline-block {
- display: none !important;
-}
-
-@media (max-width: $screen-xs-max) {
- @include responsive-visibility('.visible-xs');
-}
-.visible-xs-block {
- @media (max-width: $screen-xs-max) {
- display: block !important;
- }
-}
-.visible-xs-inline {
- @media (max-width: $screen-xs-max) {
- display: inline !important;
- }
-}
-.visible-xs-inline-block {
- @media (max-width: $screen-xs-max) {
- display: inline-block !important;
- }
-}
-
-@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
- @include responsive-visibility('.visible-sm');
-}
-.visible-sm-block {
- @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
- display: block !important;
- }
-}
-.visible-sm-inline {
- @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
- display: inline !important;
- }
-}
-.visible-sm-inline-block {
- @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
- display: inline-block !important;
- }
-}
-
-@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
- @include responsive-visibility('.visible-md');
-}
-.visible-md-block {
- @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
- display: block !important;
- }
-}
-.visible-md-inline {
- @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
- display: inline !important;
- }
-}
-.visible-md-inline-block {
- @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
- display: inline-block !important;
- }
-}
-
-@media (min-width: $screen-lg-min) {
- @include responsive-visibility('.visible-lg');
-}
-.visible-lg-block {
- @media (min-width: $screen-lg-min) {
- display: block !important;
- }
-}
-.visible-lg-inline {
- @media (min-width: $screen-lg-min) {
- display: inline !important;
- }
-}
-.visible-lg-inline-block {
- @media (min-width: $screen-lg-min) {
- display: inline-block !important;
- }
-}
-
-@media (max-width: $screen-xs-max) {
- @include responsive-invisibility('.hidden-xs');
-}
-
-@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
- @include responsive-invisibility('.hidden-sm');
-}
-
-@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
- @include responsive-invisibility('.hidden-md');
-}
-
-@media (min-width: $screen-lg-min) {
- @include responsive-invisibility('.hidden-lg');
-}
-
-
-// Print utilities
-//
-// Media queries are placed on the inside to be mixin-friendly.
-
-// Note: Deprecated .visible-print as of v3.2.0
-
-@include responsive-invisibility('.visible-print');
-
-@media print {
- @include responsive-visibility('.visible-print');
-}
-.visible-print-block {
- display: none !important;
-
- @media print {
- display: block !important;
- }
-}
-.visible-print-inline {
- display: none !important;
-
- @media print {
- display: inline !important;
- }
-}
-.visible-print-inline-block {
- display: none !important;
-
- @media print {
- display: inline-block !important;
- }
-}
-
-@media print {
- @include responsive-invisibility('.hidden-print');
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss
deleted file mode 100644
index 06c893dbd..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-// Scaffolding
-// --------------------------------------------------
-
-
-// Reset the box-sizing
-//
-// Heads up! This reset may cause conflicts with some third-party widgets.
-// For recommendations on resolving such conflicts, see
-// http://getbootstrap.com/getting-started/#third-box-sizing
-* {
- @include box-sizing(border-box);
-}
-*:before,
-*:after {
- @include box-sizing(border-box);
-}
-
-
-// Body reset
-
-html {
- font-size: 62.5%;
- -webkit-tap-highlight-color: rgba(0,0,0,0);
-}
-
-body {
- font-family: $font-family-base;
- font-size: $font-size-base;
- line-height: $line-height-base;
- color: $text-color;
- background-color: $body-bg;
-}
-
-// Reset fonts for relevant elements
-input,
-button,
-select,
-textarea {
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-
-
-// Links
-
-a {
- color: $link-color;
- text-decoration: none;
-
- &:hover,
- &:focus {
- color: $link-hover-color;
- text-decoration: underline;
- }
-
- &:focus {
- @include tab-focus();
- }
-}
-
-
-// Figures
-//
-// We reset this here because previously Normalize had no `figure` margins. This
-// ensures we don't break anyone's use of the element.
-
-figure {
- margin: 0;
-}
-
-
-// Images
-
-img {
- vertical-align: middle;
-}
-
-// Responsive images (ensure images don't scale beyond their parents)
-.img-responsive {
- @include img-responsive();
-}
-
-// Rounded corners
-.img-rounded {
- border-radius: $border-radius-large;
-}
-
-// Image thumbnails
-//
-// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
-.img-thumbnail {
- padding: $thumbnail-padding;
- line-height: $line-height-base;
- background-color: $thumbnail-bg;
- border: 1px solid $thumbnail-border;
- border-radius: $thumbnail-border-radius;
- @include transition(all .2s ease-in-out);
-
- // Keep them at most 100% wide
- @include img-responsive(inline-block);
-}
-
-// Perfect circle
-.img-circle {
- border-radius: 50%; // set radius in percents
-}
-
-
-// Horizontal rules
-
-hr {
- margin-top: $line-height-computed;
- margin-bottom: $line-height-computed;
- border: 0;
- border-top: 1px solid $hr-border;
-}
-
-
-// Only display content to screen readers
-//
-// See: http://a11yproject.com/posts/how-to-hide-content/
-
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- margin: -1px;
- padding: 0;
- overflow: hidden;
- clip: rect(0,0,0,0);
- border: 0;
-}
-
-// Use in conjunction with .sr-only to only display content when it's focused.
-// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
-// Credit: HTML5 Boilerplate
-
-.sr-only-focusable {
- &:active,
- &:focus {
- position: static;
- width: auto;
- height: auto;
- margin: 0;
- overflow: visible;
- clip: auto;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss
deleted file mode 100644
index 382984972..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss
+++ /dev/null
@@ -1,235 +0,0 @@
-//
-// Tables
-// --------------------------------------------------
-
-
-table {
- max-width: 100%;
- background-color: $table-bg;
-}
-th {
- text-align: left;
-}
-
-
-// Baseline styles
-
-.table {
- width: 100%;
- margin-bottom: $line-height-computed;
- // Cells
- > thead,
- > tbody,
- > tfoot {
- > tr {
- > th,
- > td {
- padding: $table-cell-padding;
- line-height: $line-height-base;
- vertical-align: top;
- border-top: 1px solid $table-border-color;
- }
- }
- }
- // Bottom align for column headings
- > thead > tr > th {
- vertical-align: bottom;
- border-bottom: 2px solid $table-border-color;
- }
- // Remove top border from thead by default
- > caption + thead,
- > colgroup + thead,
- > thead:first-child {
- > tr:first-child {
- > th,
- > td {
- border-top: 0;
- }
- }
- }
- // Account for multiple tbody instances
- > tbody + tbody {
- border-top: 2px solid $table-border-color;
- }
-
- // Nesting
- .table {
- background-color: $body-bg;
- }
-}
-
-
-// Condensed table w/ half padding
-
-.table-condensed {
- > thead,
- > tbody,
- > tfoot {
- > tr {
- > th,
- > td {
- padding: $table-condensed-cell-padding;
- }
- }
- }
-}
-
-
-// Bordered version
-//
-// Add borders all around the table and between all the columns.
-
-.table-bordered {
- border: 1px solid $table-border-color;
- > thead,
- > tbody,
- > tfoot {
- > tr {
- > th,
- > td {
- border: 1px solid $table-border-color;
- }
- }
- }
- > thead > tr {
- > th,
- > td {
- border-bottom-width: 2px;
- }
- }
-}
-
-
-// Zebra-striping
-//
-// Default zebra-stripe styles (alternating gray and transparent backgrounds)
-
-.table-striped {
- > tbody > tr:nth-child(odd) {
- > td,
- > th {
- background-color: $table-bg-accent;
- background-clip: padding-box;
- }
- }
-}
-
-
-// Hover effect
-//
-// Placed here since it has to come after the potential zebra striping
-
-.table-hover {
- > tbody > tr:hover {
- > td,
- > th {
- background-color: $table-bg-hover;
- background-clip: padding-box;
- }
- }
-}
-
-
-// Table cell sizing
-//
-// Reset default table behavior
-
-table col[class*="col-"] {
- position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
- float: none;
- display: table-column;
-}
-table {
- td,
- th {
- &[class*="col-"] {
- position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
- float: none;
- display: table-cell;
- }
- }
-}
-
-
-// Table backgrounds
-//
-// Exact selectors below required to override `.table-striped` and prevent
-// inheritance to nested tables.
-
-// Generate the contextual variants
-@include table-row-variant('active', $table-bg-active);
-@include table-row-variant('success', $state-success-bg);
-@include table-row-variant('info', $state-info-bg);
-@include table-row-variant('warning', $state-warning-bg);
-@include table-row-variant('danger', $state-danger-bg);
-
-
-// Responsive tables
-//
-// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
-// by enabling horizontal scrolling. Only applies <768px. Everything above that
-// will display normally.
-
-.table-responsive {
- @media screen and (max-width: $screen-xs-max) {
- width: 100%;
- margin-bottom: ($line-height-computed * 0.75);
- overflow-y: hidden;
- overflow-x: scroll;
- -ms-overflow-style: -ms-autohiding-scrollbar;
- border: 1px solid $table-border-color;
- -webkit-overflow-scrolling: touch;
-
- // Tighten up spacing
- > .table {
- margin-bottom: 0;
-
- // Ensure the content doesn't wrap
- > thead,
- > tbody,
- > tfoot {
- > tr {
- > th,
- > td {
- white-space: nowrap;
- }
- }
- }
- }
-
- // Special overrides for the bordered tables
- > .table-bordered {
- border: 0;
-
- // Nuke the appropriate borders so that the parent can handle them
- > thead,
- > tbody,
- > tfoot {
- > tr {
- > th:first-child,
- > td:first-child {
- border-left: 0;
- }
- > th:last-child,
- > td:last-child {
- border-right: 0;
- }
- }
- }
-
- // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
- // chances are there will be only one `tr` in a `thead` and that would
- // remove the border altogether.
- > tbody,
- > tfoot {
- > tr:last-child {
- > th,
- > td {
- border-bottom: 0;
- }
- }
- }
-
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss
deleted file mode 100644
index d8f7bc2fb..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss
+++ /dev/null
@@ -1,247 +0,0 @@
-
-//
-// Load core variables and mixins
-// --------------------------------------------------
-
-@import "variables";
-@import "mixins";
-
-
-
-//
-// Buttons
-// --------------------------------------------------
-
-// Common styles
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
- text-shadow: 0 -1px 0 rgba(0,0,0,.2);
- $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
- @include box-shadow($shadow);
-
- // Reset the shadow
- &:active,
- &.active {
- @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
- }
-}
-
-// Mixin for generating new styles
-@mixin btn-styles($btn-color: #555) {
- @include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%));
- @include reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners
- background-repeat: repeat-x;
- border-color: darken($btn-color, 14%);
-
- &:hover,
- &:focus {
- background-color: darken($btn-color, 12%);
- background-position: 0 -15px;
- }
-
- &:active,
- &.active {
- background-color: darken($btn-color, 12%);
- border-color: darken($btn-color, 14%);
- }
-}
-
-// Common styles
-.btn {
- // Remove the gradient for the pressed/active state
- &:active,
- &.active {
- background-image: none;
- }
-}
-
-// Apply the mixin to the buttons
-.btn-default { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
-.btn-primary { @include btn-styles($btn-primary-bg); }
-.btn-success { @include btn-styles($btn-success-bg); }
-.btn-info { @include btn-styles($btn-info-bg); }
-.btn-warning { @include btn-styles($btn-warning-bg); }
-.btn-danger { @include btn-styles($btn-danger-bg); }
-
-
-
-//
-// Images
-// --------------------------------------------------
-
-.thumbnail,
-.img-thumbnail {
- @include box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-
-
-
-//
-// Dropdowns
-// --------------------------------------------------
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
- @include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%));
- background-color: darken($dropdown-link-hover-bg, 5%);
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
- @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
- background-color: darken($dropdown-link-active-bg, 5%);
-}
-
-
-
-//
-// Navbar
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
- @include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg);
- @include reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
- border-radius: $navbar-border-radius;
- $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
- @include box-shadow($shadow);
-
- .navbar-nav > .active > a {
- @include gradient-vertical($start-color: darken($navbar-default-bg, 5%), $end-color: darken($navbar-default-bg, 2%));
- @include box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
- }
-}
-.navbar-brand,
-.navbar-nav > li > a {
- text-shadow: 0 1px 0 rgba(255,255,255,.25);
-}
-
-// Inverted navbar
-.navbar-inverse {
- @include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg);
- @include reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
-
- .navbar-nav > .active > a {
- @include gradient-vertical($start-color: $navbar-inverse-bg, $end-color: lighten($navbar-inverse-bg, 2.5%));
- @include box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
- }
-
- .navbar-brand,
- .navbar-nav > li > a {
- text-shadow: 0 -1px 0 rgba(0,0,0,.25);
- }
-}
-
-// Undo rounded corners in static and fixed navbars
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- border-radius: 0;
-}
-
-
-
-//
-// Alerts
-// --------------------------------------------------
-
-// Common styles
-.alert {
- text-shadow: 0 1px 0 rgba(255,255,255,.2);
- $shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
- @include box-shadow($shadow);
-}
-
-// Mixin for generating new styles
-@mixin alert-styles($color) {
- @include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%));
- border-color: darken($color, 15%);
-}
-
-// Apply the mixin to the alerts
-.alert-success { @include alert-styles($alert-success-bg); }
-.alert-info { @include alert-styles($alert-info-bg); }
-.alert-warning { @include alert-styles($alert-warning-bg); }
-.alert-danger { @include alert-styles($alert-danger-bg); }
-
-
-
-//
-// Progress bars
-// --------------------------------------------------
-
-// Give the progress background some depth
-.progress {
- @include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
-}
-
-// Mixin for generating new styles
-@mixin progress-bar-styles($color) {
- @include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
-}
-
-// Apply the mixin to the progress bars
-.progress-bar { @include progress-bar-styles($progress-bar-bg); }
-.progress-bar-success { @include progress-bar-styles($progress-bar-success-bg); }
-.progress-bar-info { @include progress-bar-styles($progress-bar-info-bg); }
-.progress-bar-warning { @include progress-bar-styles($progress-bar-warning-bg); }
-.progress-bar-danger { @include progress-bar-styles($progress-bar-danger-bg); }
-
-
-
-//
-// List groups
-// --------------------------------------------------
-
-.list-group {
- border-radius: $border-radius-base;
- @include box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
- text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%);
- @include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%));
- border-color: darken($list-group-active-border, 7.5%);
-}
-
-
-
-//
-// Panels
-// --------------------------------------------------
-
-// Common styles
-.panel {
- @include box-shadow(0 1px 2px rgba(0,0,0,.05));
-}
-
-// Mixin for generating new styles
-@mixin panel-heading-styles($color) {
- @include gradient-vertical($start-color: $color, $end-color: darken($color, 5%));
-}
-
-// Apply the mixin to the panel headings only
-.panel-default > .panel-heading { @include panel-heading-styles($panel-default-heading-bg); }
-.panel-primary > .panel-heading { @include panel-heading-styles($panel-primary-heading-bg); }
-.panel-success > .panel-heading { @include panel-heading-styles($panel-success-heading-bg); }
-.panel-info > .panel-heading { @include panel-heading-styles($panel-info-heading-bg); }
-.panel-warning > .panel-heading { @include panel-heading-styles($panel-warning-heading-bg); }
-.panel-danger > .panel-heading { @include panel-heading-styles($panel-danger-heading-bg); }
-
-
-
-//
-// Wells
-// --------------------------------------------------
-
-.well {
- @include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg);
- border-color: darken($well-bg, 10%);
- $shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
- @include box-shadow($shadow);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss
deleted file mode 100644
index 3d5ed86d0..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Thumbnails
-// --------------------------------------------------
-
-
-// Mixin and adjust the regular image class
-.thumbnail {
- display: block;
- padding: $thumbnail-padding;
- margin-bottom: $line-height-computed;
- line-height: $line-height-base;
- background-color: $thumbnail-bg;
- border: 1px solid $thumbnail-border;
- border-radius: $thumbnail-border-radius;
- @include transition(all .2s ease-in-out);
-
- > img,
- a > img {
- @include img-responsive();
- margin-left: auto;
- margin-right: auto;
- }
-
- // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
-
- // Image captions
- .caption {
- padding: $thumbnail-caption-padding;
- color: $thumbnail-caption-color;
- }
-}
-
-// Add a hover state for linked versions only
-a.thumbnail:hover,
-a.thumbnail:focus,
-a.thumbnail.active {
- border-color: $link-color;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss
deleted file mode 100644
index dec674cb4..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Tooltips
-// --------------------------------------------------
-
-
-// Base class
-.tooltip {
- position: absolute;
- z-index: $zindex-tooltip;
- display: block;
- visibility: visible;
- font-size: $font-size-small;
- line-height: 1.4;
- @include opacity(0);
-
- &.in { @include opacity($tooltip-opacity); }
- &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; }
- &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; }
- &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; }
- &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; }
-}
-
-// Wrapper for the tooltip content
-.tooltip-inner {
- max-width: $tooltip-max-width;
- padding: 3px 8px;
- color: $tooltip-color;
- text-align: center;
- text-decoration: none;
- background-color: $tooltip-bg;
- border-radius: $border-radius-base;
-}
-
-// Arrows
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.tooltip {
- &.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -$tooltip-arrow-width;
- border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
- border-top-color: $tooltip-arrow-color;
- }
- &.top-left .tooltip-arrow {
- bottom: 0;
- left: $tooltip-arrow-width;
- border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
- border-top-color: $tooltip-arrow-color;
- }
- &.top-right .tooltip-arrow {
- bottom: 0;
- right: $tooltip-arrow-width;
- border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
- border-top-color: $tooltip-arrow-color;
- }
- &.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -$tooltip-arrow-width;
- border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
- border-right-color: $tooltip-arrow-color;
- }
- &.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -$tooltip-arrow-width;
- border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
- border-left-color: $tooltip-arrow-color;
- }
- &.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -$tooltip-arrow-width;
- border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
- border-bottom-color: $tooltip-arrow-color;
- }
- &.bottom-left .tooltip-arrow {
- top: 0;
- left: $tooltip-arrow-width;
- border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
- border-bottom-color: $tooltip-arrow-color;
- }
- &.bottom-right .tooltip-arrow {
- top: 0;
- right: $tooltip-arrow-width;
- border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
- border-bottom-color: $tooltip-arrow-color;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss
deleted file mode 100644
index bfdf2bb19..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss
+++ /dev/null
@@ -1,294 +0,0 @@
-//
-// Typography
-// --------------------------------------------------
-
-
-// Headings
-// -------------------------
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
- font-family: $headings-font-family;
- font-weight: $headings-font-weight;
- line-height: $headings-line-height;
- color: $headings-color;
-
- small,
- .small {
- font-weight: normal;
- line-height: 1;
- color: $headings-small-color;
- }
-}
-
-h1, .h1,
-h2, .h2,
-h3, .h3 {
- margin-top: $line-height-computed;
- margin-bottom: ($line-height-computed / 2);
-
- small,
- .small {
- font-size: 65%;
- }
-}
-h4, .h4,
-h5, .h5,
-h6, .h6 {
- margin-top: ($line-height-computed / 2);
- margin-bottom: ($line-height-computed / 2);
-
- small,
- .small {
- font-size: 75%;
- }
-}
-
-h1, .h1 { font-size: $font-size-h1; }
-h2, .h2 { font-size: $font-size-h2; }
-h3, .h3 { font-size: $font-size-h3; }
-h4, .h4 { font-size: $font-size-h4; }
-h5, .h5 { font-size: $font-size-h5; }
-h6, .h6 { font-size: $font-size-h6; }
-
-
-// Body text
-// -------------------------
-
-p {
- margin: 0 0 ($line-height-computed / 2);
-}
-
-.lead {
- margin-bottom: $line-height-computed;
- font-size: floor(($font-size-base * 1.15));
- font-weight: 200;
- line-height: 1.4;
-
- @media (min-width: $screen-sm-min) {
- font-size: ($font-size-base * 1.5);
- }
-}
-
-
-// Emphasis & misc
-// -------------------------
-
-// Ex: 14px base font * 85% = about 12px
-small,
-.small { font-size: 85%; }
-
-// Undo browser default styling
-cite { font-style: normal; }
-
-mark,
-.mark {
- background-color: $state-warning-bg;
- padding: .2em;
-}
-
-// Alignment
-.text-left { text-align: left; }
-.text-right { text-align: right; }
-.text-center { text-align: center; }
-.text-justify { text-align: justify; }
-
-// Contextual colors
-.text-muted {
- color: $text-muted;
-}
-
-@include text-emphasis-variant('.text-primary', $brand-primary);
-
-@include text-emphasis-variant('.text-success', $state-success-text);
-
-@include text-emphasis-variant('.text-info', $state-info-text);
-
-@include text-emphasis-variant('.text-warning', $state-warning-text);
-
-@include text-emphasis-variant('.text-danger', $state-danger-text);
-
-// Contextual backgrounds
-// For now we'll leave these alongside the text classes until v4 when we can
-// safely shift things around (per SemVer rules).
-.bg-primary {
- // Given the contrast here, this is the only class to have its color inverted
- // automatically.
- color: #fff;
-}
-@include bg-variant('.bg-primary', $brand-primary);
-
-@include bg-variant('.bg-success', $state-success-bg);
-
-@include bg-variant('.bg-info', $state-info-bg);
-
-@include bg-variant('.bg-warning', $state-warning-bg);
-
-@include bg-variant('.bg-danger', $state-danger-bg);
-
-
-// Page header
-// -------------------------
-
-.page-header {
- padding-bottom: (($line-height-computed / 2) - 1);
- margin: ($line-height-computed * 2) 0 $line-height-computed;
- border-bottom: 1px solid $page-header-border-color;
-}
-
-
-// Lists
-// -------------------------
-
-// Unordered and Ordered lists
-ul,
-ol {
- margin-top: 0;
- margin-bottom: ($line-height-computed / 2);
- ul,
- ol {
- margin-bottom: 0;
- }
-}
-
-// List options
-
-// Unstyled keeps list items block level, just removes default browser padding and list-style
-.list-unstyled {
- padding-left: 0;
- list-style: none;
-}
-
-// Inline turns list items into inline-block
-.list-inline {
- @extend .list-unstyled;
- margin-left: -5px;
-
- > li {
- display: inline-block;
- padding-left: 5px;
- padding-right: 5px;
- }
-}
-
-// Description Lists
-dl {
- margin-top: 0; // Remove browser default
- margin-bottom: $line-height-computed;
-}
-dt,
-dd {
- line-height: $line-height-base;
-}
-dt {
- font-weight: bold;
-}
-dd {
- margin-left: 0; // Undo browser default
-}
-
-// Horizontal description lists
-//
-// Defaults to being stacked without any of the below styles applied, until the
-// grid breakpoint is reached (default of ~768px).
-
-.dl-horizontal {
- dd {
- @include clearfix(); // Clear the floated `dt` if an empty `dd` is present
- }
-
- @media (min-width: $grid-float-breakpoint) {
- dt {
- float: left;
- width: ($component-offset-horizontal - 20);
- clear: left;
- text-align: right;
- @include text-overflow();
- }
- dd {
- margin-left: $component-offset-horizontal;
- }
- }
-}
-
-
-// Misc
-// -------------------------
-
-// Abbreviations and acronyms
-abbr[title],
-// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
-abbr[data-original-title] {
- cursor: help;
- border-bottom: 1px dotted $abbr-border-color;
-}
-.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-
-// Blockquotes
-blockquote {
- padding: ($line-height-computed / 2) $line-height-computed;
- margin: 0 0 $line-height-computed;
- font-size: $blockquote-font-size;
- border-left: 5px solid $blockquote-border-color;
-
- p,
- ul,
- ol {
- &:last-child {
- margin-bottom: 0;
- }
- }
-
- // Note: Deprecated small and .small as of v3.1.0
- // Context: https://github.com/twbs/bootstrap/issues/11660
- footer,
- small,
- .small {
- display: block;
- font-size: 80%; // back to default font-size
- line-height: $line-height-base;
- color: $blockquote-small-color;
-
- &:before {
- content: '\2014 \00A0'; // em dash, nbsp
- }
- }
-}
-
-// Opposite alignment of blockquote
-//
-// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
-.blockquote-reverse,
-blockquote.pull-right {
- padding-right: 15px;
- padding-left: 0;
- border-right: 5px solid $blockquote-border-color;
- border-left: 0;
- text-align: right;
-
- // Account for citation
- footer,
- small,
- .small {
- &:before { content: ''; }
- &:after {
- content: '\00A0 \2014'; // nbsp, em dash
- }
- }
-}
-
-// Quotes
-blockquote:before,
-blockquote:after {
- content: "";
-}
-
-// Addresses
-address {
- margin-bottom: $line-height-computed;
- font-style: normal;
- line-height: $line-height-base;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss
deleted file mode 100644
index 85cb62ea7..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// Utility classes
-// --------------------------------------------------
-
-
-// Floats
-// -------------------------
-
-.clearfix {
- @include clearfix();
-}
-.center-block {
- @include center-block();
-}
-.pull-right {
- float: right !important;
-}
-.pull-left {
- float: left !important;
-}
-
-
-// Toggling content
-// -------------------------
-
-// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
-.hide {
- display: none !important;
-}
-.show {
- display: block !important;
-}
-.invisible {
- visibility: hidden;
-}
-.text-hide {
- @include text-hide();
-}
-
-
-// Hide from screenreaders and browsers
-//
-// Credit: HTML5 Boilerplate
-
-.hidden {
- display: none !important;
- visibility: hidden !important;
-}
-
-
-// For Affix plugin
-// -------------------------
-
-.affix {
- position: fixed;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss
deleted file mode 100644
index 4f4f3ac50..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss
+++ /dev/null
@@ -1,853 +0,0 @@
-// a flag to toggle asset pipeline / compass integration
-// defaults to true if twbs-font-path function is present (no function => twbs-font-path('') parsed as string == right side)
-// in Sass 3.3 this can be improved with: function-exists(twbs-font-path)
-$bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")')) !default;
-//
-// Variables
-// --------------------------------------------------
-
-
-//== Colors
-//
-//## Gray and brand colors for use across Bootstrap.
-
-$gray-darker: lighten(#000, 13.5%) !default; // #222
-$gray-dark: lighten(#000, 20%) !default; // #333
-$gray: lighten(#000, 33.5%) !default; // #555
-$gray-light: lighten(#000, 60%) !default; // #999
-$gray-lighter: lighten(#000, 93.5%) !default; // #eee
-
-$brand-primary: #428bca !default;
-$brand-success: #5cb85c !default;
-$brand-info: #5bc0de !default;
-$brand-warning: #f0ad4e !default;
-$brand-danger: #d9534f !default;
-
-
-//== Scaffolding
-//
-//## Settings for some of the most global styles.
-
-//** Background color for `<body>`.
-$body-bg: #fff !default;
-//** Global text color on `<body>`.
-$text-color: $gray-dark !default;
-
-//** Global textual link color.
-$link-color: $brand-primary !default;
-//** Link hover color set via `darken()` function.
-$link-hover-color: darken($link-color, 15%) !default;
-
-
-//== Typography
-//
-//## Font, line-height, and color for body text, headings, and more.
-
-$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default;
-$font-family-serif: Georgia, "Times New Roman", Times, serif !default;
-//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
-$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace !default;
-$font-family-base: $font-family-sans-serif !default;
-
-$font-size-base: 14px !default;
-$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
-$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px
-
-$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px
-$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px
-$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px
-$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px
-$font-size-h5: $font-size-base !default;
-$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px
-
-//** Unit-less `line-height` for use in components like buttons.
-$line-height-base: 1.428571429 !default; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px
-
-//** By default, this inherits from the `<body>`.
-$headings-font-family: inherit !default;
-$headings-font-weight: 500 !default;
-$headings-line-height: 1.1 !default;
-$headings-color: inherit !default;
-
-
-//== Iconography
-//
-//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-//** Load fonts from this directory.
-$icon-font-path: "bootstrap/" !default;
-//** File name for all font files.
-$icon-font-name: "glyphicons-halflings-regular" !default;
-//** Element ID within SVG icon file.
-$icon-font-svg-id: "glyphicons_halflingsregular" !default;
-
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-$padding-base-vertical: 6px !default;
-$padding-base-horizontal: 12px !default;
-
-$padding-large-vertical: 10px !default;
-$padding-large-horizontal: 16px !default;
-
-$padding-small-vertical: 5px !default;
-$padding-small-horizontal: 10px !default;
-
-$padding-xs-vertical: 1px !default;
-$padding-xs-horizontal: 5px !default;
-
-$line-height-large: 1.33 !default;
-$line-height-small: 1.5 !default;
-
-$border-radius-base: 4px !default;
-$border-radius-large: 6px !default;
-$border-radius-small: 3px !default;
-
-//** Global color for active items (e.g., navs or dropdowns).
-$component-active-color: #fff !default;
-//** Global background color for active items (e.g., navs or dropdowns).
-$component-active-bg: $brand-primary !default;
-
-//** Width of the `border` for generating carets that indicator dropdowns.
-$caret-width-base: 4px !default;
-//** Carets increase slightly in size for larger components.
-$caret-width-large: 5px !default;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for `<th>`s and `<td>`s.
-$table-cell-padding: 8px !default;
-//** Padding for cells in `.table-condensed`.
-$table-condensed-cell-padding: 5px !default;
-
-//** Default background color used for all tables.
-$table-bg: transparent !default;
-//** Background color used for `.table-striped`.
-$table-bg-accent: #f9f9f9 !default;
-//** Background color used for `.table-hover`.
-$table-bg-hover: #f5f5f5 !default;
-$table-bg-active: $table-bg-hover !default;
-
-//** Border color for table and cell borders.
-$table-border-color: #ddd !default;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-$btn-font-weight: normal !default;
-
-$btn-default-color: #333 !default;
-$btn-default-bg: #fff !default;
-$btn-default-border: #ccc !default;
-
-$btn-primary-color: #fff !default;
-$btn-primary-bg: $brand-primary !default;
-$btn-primary-border: darken($btn-primary-bg, 5%) !default;
-
-$btn-success-color: #fff !default;
-$btn-success-bg: $brand-success !default;
-$btn-success-border: darken($btn-success-bg, 5%) !default;
-
-$btn-info-color: #fff !default;
-$btn-info-bg: $brand-info !default;
-$btn-info-border: darken($btn-info-bg, 5%) !default;
-
-$btn-warning-color: #fff !default;
-$btn-warning-bg: $brand-warning !default;
-$btn-warning-border: darken($btn-warning-bg, 5%) !default;
-
-$btn-danger-color: #fff !default;
-$btn-danger-bg: $brand-danger !default;
-$btn-danger-border: darken($btn-danger-bg, 5%) !default;
-
-$btn-link-disabled-color: $gray-light !default;
-
-
-//== Forms
-//
-//##
-
-//** `<input>` background color
-$input-bg: #fff !default;
-//** `<input disabled>` background color
-$input-bg-disabled: $gray-lighter !default;
-
-//** Text color for `<input>`s
-$input-color: $gray !default;
-//** `<input>` border color
-$input-border: #ccc !default;
-//** `<input>` border radius
-$input-border-radius: $border-radius-base !default;
-//** Border color for inputs on focus
-$input-border-focus: #66afe9 !default;
-
-//** Placeholder text color
-$input-color-placeholder: $gray-light !default;
-
-//** Default `.form-control` height
-$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
-//** Large `.form-control` height
-$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
-//** Small `.form-control` height
-$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
-
-$legend-color: $gray-dark !default;
-$legend-border-color: #e5e5e5 !default;
-
-//** Background color for textual input addons
-$input-group-addon-bg: $gray-lighter !default;
-//** Border color for textual input addons
-$input-group-addon-border-color: $input-border !default;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-$dropdown-bg: #fff !default;
-//** Dropdown menu `border-color`.
-$dropdown-border: rgba(0,0,0,.15) !default;
-//** Dropdown menu `border-color` **for IE8**.
-$dropdown-fallback-border: #ccc !default;
-//** Divider color for between dropdown items.
-$dropdown-divider-bg: #e5e5e5 !default;
-
-//** Dropdown link text color.
-$dropdown-link-color: $gray-dark !default;
-//** Hover color for dropdown links.
-$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
-//** Hover background for dropdown links.
-$dropdown-link-hover-bg: #f5f5f5 !default;
-
-//** Active dropdown menu item text color.
-$dropdown-link-active-color: $component-active-color !default;
-//** Active dropdown menu item background color.
-$dropdown-link-active-bg: $component-active-bg !default;
-
-//** Disabled dropdown menu item background color.
-$dropdown-link-disabled-color: $gray-light !default;
-
-//** Text color for headers within dropdown menus.
-$dropdown-header-color: $gray-light !default;
-
-//** Deprecated `$dropdown-caret-color` as of v3.1.0
-$dropdown-caret-color: #000 !default;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-$zindex-navbar: 1000 !default;
-$zindex-dropdown: 1000 !default;
-$zindex-popover: 1060 !default;
-$zindex-tooltip: 1070 !default;
-$zindex-navbar-fixed: 1030 !default;
-$zindex-modal-background: 1040 !default;
-$zindex-modal: 1050 !default;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-//** Deprecated `$screen-xs` as of v3.0.1
-$screen-xs: 480px !default;
-//** Deprecated `$screen-xs-min` as of v3.2.0
-$screen-xs-min: $screen-xs !default;
-//** Deprecated `$screen-phone` as of v3.0.1
-$screen-phone: $screen-xs-min !default;
-
-// Small screen / tablet
-//** Deprecated `$screen-sm` as of v3.0.1
-$screen-sm: 768px !default;
-$screen-sm-min: $screen-sm !default;
-//** Deprecated `$screen-tablet` as of v3.0.1
-$screen-tablet: $screen-sm-min !default;
-
-// Medium screen / desktop
-//** Deprecated `$screen-md` as of v3.0.1
-$screen-md: 992px !default;
-$screen-md-min: $screen-md !default;
-//** Deprecated `$screen-desktop` as of v3.0.1
-$screen-desktop: $screen-md-min !default;
-
-// Large screen / wide desktop
-//** Deprecated `$screen-lg` as of v3.0.1
-$screen-lg: 1200px !default;
-$screen-lg-min: $screen-lg !default;
-//** Deprecated `$screen-lg-desktop` as of v3.0.1
-$screen-lg-desktop: $screen-lg-min !default;
-
-// So media queries don't overlap when required, provide a maximum
-$screen-xs-max: ($screen-sm-min - 1) !default;
-$screen-sm-max: ($screen-md-min - 1) !default;
-$screen-md-max: ($screen-lg-min - 1) !default;
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-$grid-columns: 12 !default;
-//** Padding between columns. Gets divided in half for the left and right.
-$grid-gutter-width: 30px !default;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-$grid-float-breakpoint: $screen-sm-min !default;
-//** Point at which the navbar begins collapsing.
-$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-$container-tablet: ((720px + $grid-gutter-width)) !default;
-//** For `$screen-sm-min` and up.
-$container-sm: $container-tablet !default;
-
-// Medium screen / desktop
-$container-desktop: ((940px + $grid-gutter-width)) !default;
-//** For `$screen-md-min` and up.
-$container-md: $container-desktop !default;
-
-// Large screen / wide desktop
-$container-large-desktop: ((1140px + $grid-gutter-width)) !default;
-//** For `$screen-lg-min` and up.
-$container-lg: $container-large-desktop !default;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-$navbar-height: 50px !default;
-$navbar-margin-bottom: $line-height-computed !default;
-$navbar-border-radius: $border-radius-base !default;
-$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;
-$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;
-$navbar-collapse-max-height: 340px !default;
-
-$navbar-default-color: #777 !default;
-$navbar-default-bg: #f8f8f8 !default;
-$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;
-
-// Navbar links
-$navbar-default-link-color: #777 !default;
-$navbar-default-link-hover-color: #333 !default;
-$navbar-default-link-hover-bg: transparent !default;
-$navbar-default-link-active-color: #555 !default;
-$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;
-$navbar-default-link-disabled-color: #ccc !default;
-$navbar-default-link-disabled-bg: transparent !default;
-
-// Navbar brand label
-$navbar-default-brand-color: $navbar-default-link-color !default;
-$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;
-$navbar-default-brand-hover-bg: transparent !default;
-
-// Navbar toggle
-$navbar-default-toggle-hover-bg: #ddd !default;
-$navbar-default-toggle-icon-bar-bg: #888 !default;
-$navbar-default-toggle-border-color: #ddd !default;
-
-
-// Inverted navbar
-// Reset inverted navbar basics
-$navbar-inverse-color: $gray-light !default;
-$navbar-inverse-bg: #222 !default;
-$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;
-
-// Inverted navbar links
-$navbar-inverse-link-color: $gray-light !default;
-$navbar-inverse-link-hover-color: #fff !default;
-$navbar-inverse-link-hover-bg: transparent !default;
-$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;
-$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;
-$navbar-inverse-link-disabled-color: #444 !default;
-$navbar-inverse-link-disabled-bg: transparent !default;
-
-// Inverted navbar brand label
-$navbar-inverse-brand-color: $navbar-inverse-link-color !default;
-$navbar-inverse-brand-hover-color: #fff !default;
-$navbar-inverse-brand-hover-bg: transparent !default;
-
-// Inverted navbar toggle
-$navbar-inverse-toggle-hover-bg: #333 !default;
-$navbar-inverse-toggle-icon-bar-bg: #fff !default;
-$navbar-inverse-toggle-border-color: #333 !default;
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-$nav-link-padding: 10px 15px !default;
-$nav-link-hover-bg: $gray-lighter !default;
-
-$nav-disabled-link-color: $gray-light !default;
-$nav-disabled-link-hover-color: $gray-light !default;
-
-$nav-open-link-hover-color: #fff !default;
-
-//== Tabs
-$nav-tabs-border-color: #ddd !default;
-
-$nav-tabs-link-hover-border-color: $gray-lighter !default;
-
-$nav-tabs-active-link-hover-bg: $body-bg !default;
-$nav-tabs-active-link-hover-color: $gray !default;
-$nav-tabs-active-link-hover-border-color: #ddd !default;
-
-$nav-tabs-justified-link-border-color: #ddd !default;
-$nav-tabs-justified-active-link-border-color: $body-bg !default;
-
-//== Pills
-$nav-pills-border-radius: $border-radius-base !default;
-$nav-pills-active-link-hover-bg: $component-active-bg !default;
-$nav-pills-active-link-hover-color: $component-active-color !default;
-
-
-//== Pagination
-//
-//##
-
-$pagination-color: $link-color !default;
-$pagination-bg: #fff !default;
-$pagination-border: #ddd !default;
-
-$pagination-hover-color: $link-hover-color !default;
-$pagination-hover-bg: $gray-lighter !default;
-$pagination-hover-border: #ddd !default;
-
-$pagination-active-color: #fff !default;
-$pagination-active-bg: $brand-primary !default;
-$pagination-active-border: $brand-primary !default;
-
-$pagination-disabled-color: $gray-light !default;
-$pagination-disabled-bg: #fff !default;
-$pagination-disabled-border: #ddd !default;
-
-
-//== Pager
-//
-//##
-
-$pager-bg: $pagination-bg !default;
-$pager-border: $pagination-border !default;
-$pager-border-radius: 15px !default;
-
-$pager-hover-bg: $pagination-hover-bg !default;
-
-$pager-active-bg: $pagination-active-bg !default;
-$pager-active-color: $pagination-active-color !default;
-
-$pager-disabled-color: $pagination-disabled-color !default;
-
-
-//== Jumbotron
-//
-//##
-
-$jumbotron-padding: 30px !default;
-$jumbotron-color: inherit !default;
-$jumbotron-bg: $gray-lighter !default;
-$jumbotron-heading-color: inherit !default;
-$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-$state-success-text: #3c763d !default;
-$state-success-bg: #dff0d8 !default;
-$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;
-
-$state-info-text: #31708f !default;
-$state-info-bg: #d9edf7 !default;
-$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;
-
-$state-warning-text: #8a6d3b !default;
-$state-warning-bg: #fcf8e3 !default;
-$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;
-
-$state-danger-text: #a94442 !default;
-$state-danger-bg: #f2dede !default;
-$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-$tooltip-max-width: 200px !default;
-//** Tooltip text color
-$tooltip-color: #fff !default;
-//** Tooltip background color
-$tooltip-bg: #000 !default;
-$tooltip-opacity: .9 !default;
-
-//** Tooltip arrow width
-$tooltip-arrow-width: 5px !default;
-//** Tooltip arrow color
-$tooltip-arrow-color: $tooltip-bg !default;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-$popover-bg: #fff !default;
-//** Popover maximum width
-$popover-max-width: 276px !default;
-//** Popover border color
-$popover-border-color: rgba(0,0,0,.2) !default;
-//** Popover fallback border color
-$popover-fallback-border-color: #ccc !default;
-
-//** Popover title background color
-$popover-title-bg: darken($popover-bg, 3%) !default;
-
-//** Popover arrow width
-$popover-arrow-width: 10px !default;
-//** Popover arrow color
-$popover-arrow-color: #fff !default;
-
-//** Popover outer arrow width
-$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
-//** Popover outer arrow color
-$popover-arrow-outer-color: rgba($popover-border-color, 0.05) !default;
-//** Popover outer arrow fallback color
-$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-$label-default-bg: $gray-light !default;
-//** Primary label background color
-$label-primary-bg: $brand-primary !default;
-//** Success label background color
-$label-success-bg: $brand-success !default;
-//** Info label background color
-$label-info-bg: $brand-info !default;
-//** Warning label background color
-$label-warning-bg: $brand-warning !default;
-//** Danger label background color
-$label-danger-bg: $brand-danger !default;
-
-//** Default label text color
-$label-color: #fff !default;
-//** Default text color of a linked label
-$label-link-hover-color: #fff !default;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-$modal-inner-padding: 15px !default;
-
-//** Padding applied to the modal title
-$modal-title-padding: 15px !default;
-//** Modal title line-height
-$modal-title-line-height: $line-height-base !default;
-
-//** Background color of modal content area
-$modal-content-bg: #fff !default;
-//** Modal content border color
-$modal-content-border-color: rgba(0,0,0,.2) !default;
-//** Modal content border color **for IE8**
-$modal-content-fallback-border-color: #999 !default;
-
-//** Modal backdrop background color
-$modal-backdrop-bg: #000 !default;
-//** Modal backdrop opacity
-$modal-backdrop-opacity: .5 !default;
-//** Modal header border color
-$modal-header-border-color: #e5e5e5 !default;
-//** Modal footer border color
-$modal-footer-border-color: $modal-header-border-color !default;
-
-$modal-lg: 900px !default;
-$modal-md: 600px !default;
-$modal-sm: 300px !default;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-$alert-padding: 15px !default;
-$alert-border-radius: $border-radius-base !default;
-$alert-link-font-weight: bold !default;
-
-$alert-success-bg: $state-success-bg !default;
-$alert-success-text: $state-success-text !default;
-$alert-success-border: $state-success-border !default;
-
-$alert-info-bg: $state-info-bg !default;
-$alert-info-text: $state-info-text !default;
-$alert-info-border: $state-info-border !default;
-
-$alert-warning-bg: $state-warning-bg !default;
-$alert-warning-text: $state-warning-text !default;
-$alert-warning-border: $state-warning-border !default;
-
-$alert-danger-bg: $state-danger-bg !default;
-$alert-danger-text: $state-danger-text !default;
-$alert-danger-border: $state-danger-border !default;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-$progress-bg: #f5f5f5 !default;
-//** Progress bar text color
-$progress-bar-color: #fff !default;
-
-//** Default progress bar color
-$progress-bar-bg: $brand-primary !default;
-//** Success progress bar color
-$progress-bar-success-bg: $brand-success !default;
-//** Warning progress bar color
-$progress-bar-warning-bg: $brand-warning !default;
-//** Danger progress bar color
-$progress-bar-danger-bg: $brand-danger !default;
-//** Info progress bar color
-$progress-bar-info-bg: $brand-info !default;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-$list-group-bg: #fff !default;
-//** `.list-group-item` border color
-$list-group-border: #ddd !default;
-//** List group border radius
-$list-group-border-radius: $border-radius-base !default;
-
-//** Background color of single list items on hover
-$list-group-hover-bg: #f5f5f5 !default;
-//** Text color of active list items
-$list-group-active-color: $component-active-color !default;
-//** Background color of active list items
-$list-group-active-bg: $component-active-bg !default;
-//** Border color of active list elements
-$list-group-active-border: $list-group-active-bg !default;
-//** Text color for content within active list items
-$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
-
-//** Text color of disabled list items
-$list-group-disabled-color: $gray-light !default;
-//** Background color of disabled list items
-$list-group-disabled-bg: $gray-lighter !default;
-//** Text color for content within disabled list items
-$list-group-disabled-text-color: $list-group-disabled-color !default;
-
-$list-group-link-color: #555 !default;
-$list-group-link-hover-color: $list-group-link-color !default;
-$list-group-link-heading-color: #333 !default;
-
-
-//== Panels
-//
-//##
-
-$panel-bg: #fff !default;
-$panel-body-padding: 15px !default;
-$panel-heading-padding: 10px 15px !default;
-$panel-footer-padding: $panel-heading-padding !default;
-$panel-border-radius: $border-radius-base !default;
-
-//** Border color for elements within panels
-$panel-inner-border: #ddd !default;
-$panel-footer-bg: #f5f5f5 !default;
-
-$panel-default-text: $gray-dark !default;
-$panel-default-border: #ddd !default;
-$panel-default-heading-bg: #f5f5f5 !default;
-
-$panel-primary-text: #fff !default;
-$panel-primary-border: $brand-primary !default;
-$panel-primary-heading-bg: $brand-primary !default;
-
-$panel-success-text: $state-success-text !default;
-$panel-success-border: $state-success-border !default;
-$panel-success-heading-bg: $state-success-bg !default;
-
-$panel-info-text: $state-info-text !default;
-$panel-info-border: $state-info-border !default;
-$panel-info-heading-bg: $state-info-bg !default;
-
-$panel-warning-text: $state-warning-text !default;
-$panel-warning-border: $state-warning-border !default;
-$panel-warning-heading-bg: $state-warning-bg !default;
-
-$panel-danger-text: $state-danger-text !default;
-$panel-danger-border: $state-danger-border !default;
-$panel-danger-heading-bg: $state-danger-bg !default;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-$thumbnail-padding: 4px !default;
-//** Thumbnail background color
-$thumbnail-bg: $body-bg !default;
-//** Thumbnail border color
-$thumbnail-border: #ddd !default;
-//** Thumbnail border radius
-$thumbnail-border-radius: $border-radius-base !default;
-
-//** Custom text color for thumbnail captions
-$thumbnail-caption-color: $text-color !default;
-//** Padding around the thumbnail caption
-$thumbnail-caption-padding: 9px !default;
-
-
-//== Wells
-//
-//##
-
-$well-bg: #f5f5f5 !default;
-$well-border: darken($well-bg, 7%) !default;
-
-
-//== Badges
-//
-//##
-
-$badge-color: #fff !default;
-//** Linked badge text color on hover
-$badge-link-hover-color: #fff !default;
-$badge-bg: $gray-light !default;
-
-//** Badge text color in active nav link
-$badge-active-color: $link-color !default;
-//** Badge background color in active nav link
-$badge-active-bg: #fff !default;
-
-$badge-font-weight: bold !default;
-$badge-line-height: 1 !default;
-$badge-border-radius: 10px !default;
-
-
-//== Breadcrumbs
-//
-//##
-
-$breadcrumb-padding-vertical: 8px !default;
-$breadcrumb-padding-horizontal: 15px !default;
-//** Breadcrumb background color
-$breadcrumb-bg: #f5f5f5 !default;
-//** Breadcrumb text color
-$breadcrumb-color: #ccc !default;
-//** Text color of current page in the breadcrumb
-$breadcrumb-active-color: $gray-light !default;
-//** Textual separator for between breadcrumb elements
-$breadcrumb-separator: "/" !default;
-
-
-//== Carousel
-//
-//##
-
-$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;
-
-$carousel-control-color: #fff !default;
-$carousel-control-width: 15% !default;
-$carousel-control-opacity: .5 !default;
-$carousel-control-font-size: 20px !default;
-
-$carousel-indicator-active-bg: #fff !default;
-$carousel-indicator-border-color: #fff !default;
-
-$carousel-caption-color: #fff !default;
-
-
-//== Close
-//
-//##
-
-$close-font-weight: bold !default;
-$close-color: #000 !default;
-$close-text-shadow: 0 1px 0 #fff !default;
-
-
-//== Code
-//
-//##
-
-$code-color: #c7254e !default;
-$code-bg: #f9f2f4 !default;
-
-$kbd-color: #fff !default;
-$kbd-bg: #333 !default;
-
-$pre-bg: #f5f5f5 !default;
-$pre-color: $gray-dark !default;
-$pre-border-color: #ccc !default;
-$pre-scrollable-max-height: 340px !default;
-
-
-//== Type
-//
-//##
-
-//** Text muted color
-$text-muted: $gray-light !default;
-//** Abbreviations and acronyms border color
-$abbr-border-color: $gray-light !default;
-//** Headings small color
-$headings-small-color: $gray-light !default;
-//** Blockquote small color
-$blockquote-small-color: $gray-light !default;
-//** Blockquote font size
-$blockquote-font-size: ($font-size-base * 1.25) !default;
-//** Blockquote border color
-$blockquote-border-color: $gray-lighter !default;
-//** Page header border color
-$page-header-border-color: $gray-lighter !default;
-
-
-//== Miscellaneous
-//
-//##
-
-//** Horizontal line color.
-$hr-border: $gray-lighter !default;
-
-//** Horizontal offset for forms and lists.
-$component-offset-horizontal: 180px !default;
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss
deleted file mode 100644
index b8657118a..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Wells
-// --------------------------------------------------
-
-
-// Base class
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: $well-bg;
- border: 1px solid $well-border;
- border-radius: $border-radius-base;
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
- blockquote {
- border-color: #ddd;
- border-color: rgba(0,0,0,.15);
- }
-}
-
-// Sizes
-.well-lg {
- padding: 24px;
- border-radius: $border-radius-large;
-}
-.well-sm {
- padding: 9px;
- border-radius: $border-radius-small;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss
deleted file mode 100644
index 4d6f8aacf..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-// Core variables and mixins
-@import "variables";
-@import "mixins";
-
-// Reset and dependencies
-@import "normalize";
-@import "print";
-@import "glyphicons";
-
-// Core CSS
-@import "scaffolding";
-@import "type";
-@import "code";
-@import "grid";
-@import "tables";
-@import "forms";
-@import "buttons";
-
-// Components
-@import "component-animations";
-@import "dropdowns";
-@import "button-groups";
-@import "input-groups";
-@import "navs";
-@import "navbar";
-@import "breadcrumbs";
-@import "pagination";
-@import "pager";
-@import "labels";
-@import "badges";
-@import "jumbotron";
-@import "thumbnails";
-@import "alerts";
-@import "progress-bars";
-@import "media";
-@import "list-group";
-@import "panels";
-@import "responsive-embed";
-@import "wells";
-@import "close";
-
-// Components w/ JavaScript
-@import "modals";
-@import "tooltip";
-@import "popovers";
-@import "carousel";
-
-// Utility classes
-@import "utilities";
-@import "responsive-utilities";
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss
deleted file mode 100644
index 3faf0b5a5..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss
+++ /dev/null
@@ -1,14 +0,0 @@
-// Alerts
-
-@mixin alert-variant($background, $border, $text-color) {
- background-color: $background;
- border-color: $border;
- color: $text-color;
-
- hr {
- border-top-color: darken($border, 5%);
- }
- .alert-link {
- color: darken($text-color, 10%);
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss
deleted file mode 100644
index 4993bd2b8..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-// Contextual backgrounds
-
-// [converter] $parent hack
-@mixin bg-variant($parent, $color) {
- #{$parent} {
- background-color: $color;
- }
- a#{$parent}:hover {
- background-color: darken($color, 10%);
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss
deleted file mode 100644
index ce1949987..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-// Single side border-radius
-
-@mixin border-top-radius($radius) {
- border-top-right-radius: $radius;
- border-top-left-radius: $radius;
-}
-@mixin border-right-radius($radius) {
- border-bottom-right-radius: $radius;
- border-top-right-radius: $radius;
-}
-@mixin border-bottom-radius($radius) {
- border-bottom-right-radius: $radius;
- border-bottom-left-radius: $radius;
-}
-@mixin border-left-radius($radius) {
- border-bottom-left-radius: $radius;
- border-top-left-radius: $radius;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss
deleted file mode 100644
index 58ad13e50..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-// Button variants
-//
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-
-@mixin button-variant($color, $background, $border) {
- color: $color;
- background-color: $background;
- border-color: $border;
-
- &:hover,
- &:focus,
- &:active,
- &.active,
- .open > &.dropdown-toggle {
- color: $color;
- background-color: darken($background, 10%);
- border-color: darken($border, 12%);
- }
- &:active,
- &.active,
- .open > &.dropdown-toggle {
- background-image: none;
- }
- &.disabled,
- &[disabled],
- fieldset[disabled] & {
- &,
- &:hover,
- &:focus,
- &:active,
- &.active {
- background-color: $background;
- border-color: $border;
- }
- }
-
- .badge {
- color: $background;
- background-color: $color;
- }
-}
-
-// Button sizes
-@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
- padding: $padding-vertical $padding-horizontal;
- font-size: $font-size;
- line-height: $line-height;
- border-radius: $border-radius;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss
deleted file mode 100644
index e06fb5e27..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// Center-align a block level element
-
-@mixin center-block() {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss
deleted file mode 100644
index dc3e2ab42..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-// Clearfix
-//
-// For modern browsers
-// 1. The space content is one way to avoid an Opera bug when the
-// contenteditable attribute is included anywhere else in the document.
-// Otherwise it causes space to appear at the top and bottom of elements
-// that are clearfixed.
-// 2. The use of `table` rather than `block` is only necessary if using
-// `:before` to contain the top-margins of child elements.
-//
-// Source: http://nicolasgallagher.com/micro-clearfix-hack/
-
-@mixin clearfix() {
- &:before,
- &:after {
- content: " "; // 1
- display: table; // 2
- }
- &:after {
- clear: both;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss
deleted file mode 100644
index ff72f0efc..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss
+++ /dev/null
@@ -1,84 +0,0 @@
-// Form validation states
-//
-// Used in forms.less to generate the form validation CSS for warnings, errors,
-// and successes.
-
-@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
- // Color the label and help text
- .help-block,
- .control-label,
- .radio,
- .checkbox,
- .radio-inline,
- .checkbox-inline {
- color: $text-color;
- }
- // Set the border and box shadow on specific inputs to match
- .form-control {
- border-color: $border-color;
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
- &:focus {
- border-color: darken($border-color, 10%);
- $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
- @include box-shadow($shadow);
- }
- }
- // Set validation states also for addons
- .input-group-addon {
- color: $text-color;
- border-color: $border-color;
- background-color: $background-color;
- }
- // Optional feedback icon
- .form-control-feedback {
- color: $text-color;
- }
-}
-
-
-// Form control focus state
-//
-// Generate a customized focus state and for any input with the specified color,
-// which defaults to the `$input-border-focus` variable.
-//
-// We highly encourage you to not customize the default value, but instead use
-// this to tweak colors on an as-needed basis. This aesthetic change is based on
-// WebKit's default styles, but applicable to a wider range of browsers. Its
-// usability and accessibility should be taken into account with any change.
-//
-// Example usage: change the default blue border and shadow to white for better
-// contrast against a dark gray background.
-@mixin form-control-focus($color: $input-border-focus) {
- $color-rgba: rgba(red($color), green($color), blue($color), .6);
- &:focus {
- border-color: $color;
- outline: 0;
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
- }
-}
-
-// Form control sizing
-//
-// Relative text size, padding, and border-radii changes for form controls. For
-// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
-// element gets special love because it's special, and that's a fact!
-// [converter] $parent hack
-@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
- #{$parent} {
- height: $input-height;
- padding: $padding-vertical $padding-horizontal;
- font-size: $font-size;
- line-height: $line-height;
- border-radius: $border-radius;
- }
-
- select#{$parent} {
- height: $input-height;
- line-height: $input-height;
- }
-
- textarea#{$parent},
- select[multiple]#{$parent} {
- height: auto;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss
deleted file mode 100644
index 743a003a2..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss
+++ /dev/null
@@ -1,58 +0,0 @@
-// Gradients
-
-
-
-// Horizontal gradient, from left to right
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-// Color stops are not available in IE9 and below.
-@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
- background-image: -webkit-linear-gradient(left, color-stop($start-color $start-percent), color-stop($end-color $end-percent)); // Safari 5.1-6, Chrome 10+
- background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12
- background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
-}
-
-// Vertical gradient, from top to bottom
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-// Color stops are not available in IE9 and below.
-@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
- background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
- background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Opera 12
- background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
-}
-
-@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
- background-repeat: repeat-x;
- background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
- background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12
- background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-}
-@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
- background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
- background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
- background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
- background-repeat: no-repeat;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
-}
-@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
- background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
- background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);
- background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
- background-repeat: no-repeat;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
-}
-@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
- background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
- background-image: radial-gradient(circle, $inner-color, $outer-color);
- background-repeat: no-repeat;
-}
-@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
- background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
- background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss
deleted file mode 100644
index 9db502cc6..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss
+++ /dev/null
@@ -1,87 +0,0 @@
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `$grid-columns`.
-
-// [converter] This is defined recursively in LESS, but Sass supports real loops
-@mixin make-grid-columns() {
- $list: '';
- $i: 1;
- $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
- @for $i from (1 + 1) through $grid-columns {
- $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
- }
- #{$list} {
- position: relative;
- // Prevent columns from collapsing when empty
- min-height: 1px;
- // Inner gutter via padding
- padding-left: ($grid-gutter-width / 2);
- padding-right: ($grid-gutter-width / 2);
- }
-}
-
-
-// [converter] This is defined recursively in LESS, but Sass supports real loops
-@mixin float-grid-columns($class) {
- $list: '';
- $i: 1;
- $list: ".col-#{$class}-#{$i}";
- @for $i from (1 + 1) through $grid-columns {
- $list: "#{$list}, .col-#{$class}-#{$i}";
- }
- #{$list} {
- float: left;
- }
-}
-
-
-@mixin calc-grid-column($index, $class, $type) {
- @if ($type == width) and ($index > 0) {
- .col-#{$class}-#{$index} {
- width: percentage(($index / $grid-columns));
- }
- }
- @if ($type == push) and ($index > 0) {
- .col-#{$class}-push-#{$index} {
- left: percentage(($index / $grid-columns));
- }
- }
- @if ($type == push) and ($index == 0) {
- .col-#{$class}-push-0 {
- left: auto;
- }
- }
- @if ($type == pull) and ($index > 0) {
- .col-#{$class}-pull-#{$index} {
- right: percentage(($index / $grid-columns));
- }
- }
- @if ($type == pull) and ($index == 0) {
- .col-#{$class}-pull-0 {
- right: auto;
- }
- }
- @if ($type == offset) {
- .col-#{$class}-offset-#{$index} {
- margin-left: percentage(($index / $grid-columns));
- }
- }
-}
-
-// [converter] This is defined recursively in LESS, but Sass supports real loops
-@mixin loop-grid-columns($columns, $class, $type) {
- @for $i from 0 through $columns {
- @include calc-grid-column($i, $class, $type);
- }
-}
-
-
-// Create grid for specific class
-@mixin make-grid($class) {
- @include float-grid-columns($class);
- @include loop-grid-columns($grid-columns, $class, width);
- @include loop-grid-columns($grid-columns, $class, pull);
- @include loop-grid-columns($grid-columns, $class, push);
- @include loop-grid-columns($grid-columns, $class, offset);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss
deleted file mode 100644
index c33337543..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss
+++ /dev/null
@@ -1,122 +0,0 @@
-// Grid system
-//
-// Generate semantic grid columns with these mixins.
-
-// Centered container element
-@mixin container-fixed() {
- margin-right: auto;
- margin-left: auto;
- padding-left: ($grid-gutter-width / 2);
- padding-right: ($grid-gutter-width / 2);
- @include clearfix();
-}
-
-// Creates a wrapper for a series of columns
-@mixin make-row($gutter: $grid-gutter-width) {
- margin-left: ($gutter / -2);
- margin-right: ($gutter / -2);
- @include clearfix();
-}
-
-// Generate the extra small columns
-@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- float: left;
- width: percentage(($columns / $grid-columns));
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-}
-@mixin make-xs-column-offset($columns) {
- margin-left: percentage(($columns / $grid-columns));
-}
-@mixin make-xs-column-push($columns) {
- left: percentage(($columns / $grid-columns));
-}
-@mixin make-xs-column-pull($columns) {
- right: percentage(($columns / $grid-columns));
-}
-
-// Generate the small columns
-@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-
- @media (min-width: $screen-sm-min) {
- float: left;
- width: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-sm-column-offset($columns) {
- @media (min-width: $screen-sm-min) {
- margin-left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-sm-column-push($columns) {
- @media (min-width: $screen-sm-min) {
- left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-sm-column-pull($columns) {
- @media (min-width: $screen-sm-min) {
- right: percentage(($columns / $grid-columns));
- }
-}
-
-// Generate the medium columns
-@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-
- @media (min-width: $screen-md-min) {
- float: left;
- width: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-md-column-offset($columns) {
- @media (min-width: $screen-md-min) {
- margin-left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-md-column-push($columns) {
- @media (min-width: $screen-md-min) {
- left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-md-column-pull($columns) {
- @media (min-width: $screen-md-min) {
- right: percentage(($columns / $grid-columns));
- }
-}
-
-// Generate the large columns
-@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-
- @media (min-width: $screen-lg-min) {
- float: left;
- width: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-lg-column-offset($columns) {
- @media (min-width: $screen-lg-min) {
- margin-left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-lg-column-push($columns) {
- @media (min-width: $screen-lg-min) {
- left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-lg-column-pull($columns) {
- @media (min-width: $screen-lg-min) {
- right: percentage(($columns / $grid-columns));
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss
deleted file mode 100644
index 5e0697218..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// CSS image replacement
-//
-// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
-// mixins being reused as classes with the same name, this doesn't hold up. As
-// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
-//
-// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
-
-// Deprecated as of v3.0.1 (will be removed in v4)
-@mixin hide-text() {
- font: #{0/0} a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-// New mixin to use as of v3.0.1
-@mixin text-hide() {
- @include hide-text();
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss
deleted file mode 100644
index c8dcf5e9c..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss
+++ /dev/null
@@ -1,33 +0,0 @@
-// Image Mixins
-// - Responsive image
-// - Retina image
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-@mixin img-responsive($display: block) {
- display: $display;
- max-width: 100%; // Part 1: Set a maximum relative to the parent
- height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
-}
-
-
-// Retina image
-//
-// Short retina mixin for setting background-image and -size. Note that the
-// spelling of `min--moz-device-pixel-ratio` is intentional.
-@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
- background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
-
- @media
- only screen and (-webkit-min-device-pixel-ratio: 2),
- only screen and ( min--moz-device-pixel-ratio: 2),
- only screen and ( -o-min-device-pixel-ratio: 2/1),
- only screen and ( min-device-pixel-ratio: 2),
- only screen and ( min-resolution: 192dpi),
- only screen and ( min-resolution: 2dppx) {
- background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
- background-size: $width-1x $height-1x;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss
deleted file mode 100644
index d99a65337..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// Labels
-
-@mixin label-variant($color) {
- background-color: $color;
-
- &[href] {
- &:hover,
- &:focus {
- background-color: darken($color, 10%);
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss
deleted file mode 100644
index 5f05e7ba2..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-// List Groups
-
-@mixin list-group-item-variant($state, $background, $color) {
- .list-group-item-#{$state} {
- color: $color;
- background-color: $background;
-
- // [converter] extracted a& to a.list-group-item-#{$state}
- }
-
- a.list-group-item-#{$state} {
- color: $color;
-
- .list-group-item-heading {
- color: inherit;
- }
-
- &:hover,
- &:focus {
- color: $color;
- background-color: darken($background, 5%);
- }
- &.active,
- &.active:hover,
- &.active:focus {
- color: #fff;
- background-color: $color;
- border-color: $color;
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss
deleted file mode 100644
index 2e6da02a4..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Horizontal dividers
-//
-// Dividers (basically an hr) within dropdowns and nav lists
-
-@mixin nav-divider($color: #e5e5e5) {
- height: 1px;
- margin: (($line-height-computed / 2) - 1) 0;
- overflow: hidden;
- background-color: $color;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss
deleted file mode 100644
index c8fbf1a7d..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// Navbar vertical align
-//
-// Vertically center elements in the navbar.
-// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
-
-@mixin navbar-vertical-align($element-height) {
- margin-top: (($navbar-height - $element-height) / 2);
- margin-bottom: (($navbar-height - $element-height) / 2);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss
deleted file mode 100644
index df088adfe..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Opacity
-
-@mixin opacity($opacity) {
- opacity: $opacity;
- // IE8 filter
- $opacity-ie: ($opacity * 100);
- filter: #{alpha(opacity=$opacity-ie)};
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss
deleted file mode 100644
index 43fff6863..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-// Pagination
-
-@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $border-radius) {
- > li {
- > a,
- > span {
- padding: $padding-vertical $padding-horizontal;
- font-size: $font-size;
- }
- &:first-child {
- > a,
- > span {
- @include border-left-radius($border-radius);
- }
- }
- &:last-child {
- > a,
- > span {
- @include border-right-radius($border-radius);
- }
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss
deleted file mode 100644
index 361aafb82..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// Panels
-
-@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
- border-color: $border;
-
- & > .panel-heading {
- color: $heading-text-color;
- background-color: $heading-bg-color;
- border-color: $heading-border;
-
- + .panel-collapse > .panel-body {
- border-top-color: $border;
- }
- }
- & > .panel-footer {
- + .panel-collapse > .panel-body {
- border-bottom-color: $border;
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss
deleted file mode 100644
index 4303d702a..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Progress bars
-
-@mixin progress-bar-variant($color) {
- background-color: $color;
- .progress-striped & {
- @include gradient-striped();
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss
deleted file mode 100644
index bf7305120..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Reset filters for IE
-//
-// When you need to remove a gradient background, do not forget to use this to reset
-// the IE filter for IE9 and below.
-
-@mixin reset-filter() {
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss
deleted file mode 100644
index 7d55002c5..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Resize anything
-
-@mixin resizable($direction) {
- resize: $direction; // Options: horizontal, vertical, both
- overflow: auto; // Safari fix
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss
deleted file mode 100644
index 9867db013..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// Responsive utilities
-
-//
-// More easily include all the states for responsive-utilities.less.
-// [converter] $parent hack
-@mixin responsive-visibility($parent) {
- #{$parent} {
- display: block !important;
- }
- table#{$parent} { display: table; }
- tr#{$parent} { display: table-row !important; }
- th#{$parent},
- td#{$parent} { display: table-cell !important; }
-}
-
-// [converter] $parent hack
-@mixin responsive-invisibility($parent) {
- #{$parent} {
- display: none !important;
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss
deleted file mode 100644
index abbe2463c..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Sizing shortcuts
-
-@mixin size($width, $height) {
- width: $width;
- height: $height;
-}
-
-@mixin square($size) {
- @include size($size, $size);
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss
deleted file mode 100644
index 7df0ae7ca..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// WebKit-style focus
-
-@mixin tab-focus() {
- // Default
- outline: thin dotted;
- // WebKit
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss
deleted file mode 100644
index 136795081..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-// Tables
-
-@mixin table-row-variant($state, $background) {
- // Exact selectors below required to override `.table-striped` and prevent
- // inheritance to nested tables.
- .table > thead > tr,
- .table > tbody > tr,
- .table > tfoot > tr {
- > td.#{$state},
- > th.#{$state},
- &.#{$state} > td,
- &.#{$state} > th {
- background-color: $background;
- }
- }
-
- // Hover states for `.table-hover`
- // Note: this is not available for cells or rows within `thead` or `tfoot`.
- .table-hover > tbody > tr {
- > td.#{$state}:hover,
- > th.#{$state}:hover,
- &.#{$state}:hover > td,
- &:hover > .#{$state},
- &.#{$state}:hover > th {
- background-color: darken($background, 5%);
- }
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss
deleted file mode 100644
index 1101e0366..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-// Typography
-
-// [converter] $parent hack
-@mixin text-emphasis-variant($parent, $color) {
- #{$parent} {
- color: $color;
- }
- a#{$parent}:hover {
- color: darken($color, 10%);
- }
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss
deleted file mode 100644
index 1593b25ea..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Text overflow
-// Requires inline-block or block for proper styling
-
-@mixin text-overflow() {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss
deleted file mode 100644
index 9f0408b3b..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss
+++ /dev/null
@@ -1,224 +0,0 @@
-// Vendor Prefixes
-//
-// All vendor mixins are deprecated as of v3.2 due to the introduction of
-// Autoprefixer in our Gruntfile. They will be removed in v4.
-
-// - Animations
-// - Backface visibility
-// - Box shadow
-// - Box sizing
-// - Content columns
-// - Hyphens
-// - Placeholder text
-// - Transformations
-// - Transitions
-// - User Select
-
-
-// Animations
-@mixin animation($animation) {
- -webkit-animation: $animation;
- -o-animation: $animation;
- animation: $animation;
-}
-@mixin animation-name($name) {
- -webkit-animation-name: $name;
- animation-name: $name;
-}
-@mixin animation-duration($duration) {
- -webkit-animation-duration: $duration;
- animation-duration: $duration;
-}
-@mixin animation-timing-function($timing-function) {
- -webkit-animation-timing-function: $timing-function;
- animation-timing-function: $timing-function;
-}
-@mixin animation-delay($delay) {
- -webkit-animation-delay: $delay;
- animation-delay: $delay;
-}
-@mixin animation-iteration-count($iteration-count) {
- -webkit-animation-iteration-count: $iteration-count;
- animation-iteration-count: $iteration-count;
-}
-@mixin animation-direction($direction) {
- -webkit-animation-direction: $direction;
- animation-direction: $direction;
-}
-@mixin animation-fill-mode($fill-mode) {
- -webkit-animation-fill-mode: $fill-mode;
- animation-fill-mode: $fill-mode;
-}
-
-// Backface visibility
-// Prevent browsers from flickering when using CSS 3D transforms.
-// Default value is `visible`, but can be changed to `hidden`
-
-@mixin backface-visibility($visibility){
- -webkit-backface-visibility: $visibility;
- -moz-backface-visibility: $visibility;
- backface-visibility: $visibility;
-}
-
-// Drop shadows
-//
-// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
-// supported browsers that have box shadow capabilities now support it.
-
-@mixin box-shadow($shadow...) {
- -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
- box-shadow: $shadow;
-}
-
-// Box sizing
-@mixin box-sizing($boxmodel) {
- -webkit-box-sizing: $boxmodel;
- -moz-box-sizing: $boxmodel;
- box-sizing: $boxmodel;
-}
-
-// CSS3 Content Columns
-@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
- -webkit-column-count: $column-count;
- -moz-column-count: $column-count;
- column-count: $column-count;
- -webkit-column-gap: $column-gap;
- -moz-column-gap: $column-gap;
- column-gap: $column-gap;
-}
-
-// Optional hyphenation
-@mixin hyphens($mode: auto) {
- word-wrap: break-word;
- -webkit-hyphens: $mode;
- -moz-hyphens: $mode;
- -ms-hyphens: $mode; // IE10+
- -o-hyphens: $mode;
- hyphens: $mode;
-}
-
-// Placeholder text
-@mixin placeholder($color: $input-color-placeholder) {
- &::-moz-placeholder { color: $color; // Firefox
- opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
- &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
- &::-webkit-input-placeholder { color: $color; } // Safari and Chrome
-}
-
-// Transformations
-@mixin scale($ratio...) {
- -webkit-transform: scale($ratio);
- -ms-transform: scale($ratio); // IE9 only
- -o-transform: scale($ratio);
- transform: scale($ratio);
-}
-@mixin scale($ratioX, $ratioY...) {
- -webkit-transform: scale($ratioX, $ratioY);
- -ms-transform: scale($ratioX, $ratioY); // IE9 only
- -o-transform: scale($ratioX, $ratioY);
- transform: scale($ratioX, $ratioY);
-}
-@mixin scaleX($ratio) {
- -webkit-transform: scaleX($ratio);
- -ms-transform: scaleX($ratio); // IE9 only
- -o-transform: scaleX($ratio);
- transform: scaleX($ratio);
-}
-@mixin scaleY($ratio) {
- -webkit-transform: scaleY($ratio);
- -ms-transform: scaleY($ratio); // IE9 only
- -o-transform: scaleY($ratio);
- transform: scaleY($ratio);
-}
-@mixin skew($x, $y) {
- -webkit-transform: skew($x, $y);
- -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
- -o-transform: skew($x, $y);
- transform: skew($x, $y);
-}
-@mixin translate($x, $y) {
- -webkit-transform: translate($x, $y);
- -ms-transform: translate($x, $y); // IE9 only
- -o-transform: translate($x, $y);
- transform: translate($x, $y);
-}
-@mixin translate3d($x, $y, $z) {
- -webkit-transform: translate3d($x, $y, $z);
- transform: translate3d($x, $y, $z);
-}
-@mixin rotate($degrees) {
- -webkit-transform: rotate($degrees);
- -ms-transform: rotate($degrees); // IE9 only
- -o-transform: rotate($degrees);
- transform: rotate($degrees);
-}
-@mixin rotateX($degrees) {
- -webkit-transform: rotateX($degrees);
- -ms-transform: rotateX($degrees); // IE9 only
- -o-transform: rotateX($degrees);
- transform: rotateX($degrees);
-}
-@mixin rotateY($degrees) {
- -webkit-transform: rotateY($degrees);
- -ms-transform: rotateY($degrees); // IE9 only
- -o-transform: rotateY($degrees);
- transform: rotateY($degrees);
-}
-@mixin perspective($perspective) {
- -webkit-perspective: $perspective;
- -moz-perspective: $perspective;
- perspective: $perspective;
-}
-@mixin perspective-origin($perspective) {
- -webkit-perspective-origin: $perspective;
- -moz-perspective-origin: $perspective;
- perspective-origin: $perspective;
-}
-@mixin transform-origin($origin) {
- -webkit-transform-origin: $origin;
- -moz-transform-origin: $origin;
- -ms-transform-origin: $origin; // IE9 only
- transform-origin: $origin;
-}
-
-
-// Transitions
-
-@mixin transition($transition...) {
- -webkit-transition: $transition;
- -o-transition: $transition;
- transition: $transition;
-}
-@mixin transition-property($transition-property...) {
- -webkit-transition-property: $transition-property;
- transition-property: $transition-property;
-}
-@mixin transition-delay($transition-delay) {
- -webkit-transition-delay: $transition-delay;
- transition-delay: $transition-delay;
-}
-@mixin transition-duration($transition-duration...) {
- -webkit-transition-duration: $transition-duration;
- transition-duration: $transition-duration;
-}
-@mixin transition-timing-function($timing-function) {
- -webkit-transition-timing-function: $timing-function;
- transition-timing-function: $timing-function;
-}
-@mixin transition-transform($transition...) {
- -webkit-transition: -webkit-transform $transition;
- -moz-transition: -moz-transform $transition;
- -o-transition: -o-transform $transition;
- transition: transform $transition;
-}
-
-
-// User select
-// For selecting text on the page
-
-@mixin user-select($select) {
- -webkit-user-select: $select;
- -moz-user-select: $select;
- -ms-user-select: $select; // IE10+
- user-select: $select;
-}
diff --git a/openstack_dashboard/static/dashboard/scss/horizon.scss b/openstack_dashboard/static/dashboard/scss/horizon.scss
index 613404378..20aadaf4d 100755
--- a/openstack_dashboard/static/dashboard/scss/horizon.scss
+++ b/openstack_dashboard/static/dashboard/scss/horizon.scss
@@ -4,6 +4,7 @@ $font-size-base: 13px;
$modal-md: 732px;
@import "/bootstrap/scss/bootstrap";
+@import "/horizon/lib/bootstrap_datepicker/datepicker.css";
@import "_variables";
@import "_accordion_nav";
diff --git a/openstack_dashboard/templatetags/context_selection.py b/openstack_dashboard/templatetags/context_selection.py
index ebc3aeca9..617eced79 100644
--- a/openstack_dashboard/templatetags/context_selection.py
+++ b/openstack_dashboard/templatetags/context_selection.py
@@ -66,7 +66,8 @@ def show_project_list(context):
if 'request' not in context:
return {}
request = context['request']
- context = {'projects': sorted(context['authorized_tenants']),
+ context = {'projects': sorted(context['authorized_tenants'],
+ key=lambda project: project.name),
'project_id': request.user.project_id,
'request': request}
return context
diff --git a/openstack_dashboard/test/test_plugins/panel_config/_30_admin_default_panel.py b/openstack_dashboard/test/test_plugins/panel_config/_30_admin_default_panel.py
index 23d3773ab..b38ebdaf8 100644
--- a/openstack_dashboard/test/test_plugins/panel_config/_30_admin_default_panel.py
+++ b/openstack_dashboard/test/test_plugins/panel_config/_30_admin_default_panel.py
@@ -1,9 +1,9 @@
# The name of the panel to be added to HORIZON_CONFIG. Required.
-PANEL = 'instances'
+PANEL = 'defaults'
# The name of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'admin'
# The name of the panel group the PANEL is associated with.
PANEL_GROUP = 'admin'
# If set, it will update the default panel of the PANEL_DASHBOARD.
-DEFAULT_PANEL = 'instances'
+DEFAULT_PANEL = 'defaults'
diff --git a/openstack_dashboard/test/test_plugins/panel_tests.py b/openstack_dashboard/test/test_plugins/panel_tests.py
index c68573b2d..7f8c6b4a6 100644
--- a/openstack_dashboard/test/test_plugins/panel_tests.py
+++ b/openstack_dashboard/test/test_plugins/panel_tests.py
@@ -48,4 +48,4 @@ class PanelPluginTests(test.PluginTestCase):
def test_default_panel(self):
dashboard = horizon.get_dashboard("admin")
- self.assertEqual('instances', dashboard.default_panel)
+ self.assertEqual('defaults', dashboard.default_panel)
diff --git a/openstack_dashboard/usage/tables.py b/openstack_dashboard/usage/tables.py
index 4727fbb0c..80b7478e9 100644
--- a/openstack_dashboard/usage/tables.py
+++ b/openstack_dashboard/usage/tables.py
@@ -72,7 +72,7 @@ class ProjectUsageTable(BaseUsageTable):
verbose_name=_("Instance Name"),
link=get_instance_link)
uptime = tables.Column('uptime_at',
- verbose_name=_("Uptime"),
+ verbose_name=_("Time since created"),
filters=(filters.timesince_sortable,),
attrs={'data-type': 'timesince'})
diff --git a/openstack_dashboard/views.py b/openstack_dashboard/views.py
index a5e85c528..4ce55ffdc 100644
--- a/openstack_dashboard/views.py
+++ b/openstack_dashboard/views.py
@@ -38,8 +38,11 @@ def get_user_home(user):
@django.views.decorators.vary.vary_on_cookie
def splash(request):
if request.user.is_authenticated():
- return shortcuts.redirect(horizon.get_user_home(request.user))
- form = forms.Login(request)
- request.session.clear()
- request.session.set_test_cookie()
- return shortcuts.render(request, 'splash.html', {'form': form})
+ response = shortcuts.redirect(horizon.get_user_home(request.user))
+ else:
+ form = forms.Login(request)
+ request.session.clear()
+ request.session.set_test_cookie()
+ response = shortcuts.render(request, 'splash.html', {'form': form})
+ response.delete_cookie('logout_reason')
+ return response
diff --git a/requirements.txt b/requirements.txt
index 5587fa4f0..d5d92c99d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -39,6 +39,7 @@ xstatic-angular>=1.2.1.1 # MIT License
xstatic-angular-cookies>=1.2.1.1 # MIT License
xstatic-angular-mock>=1.2.1.1 # MIT License
xstatic-bootstrap-datepicker>=1.3.1.0 # Apache 2.0 License
+xstatic-bootstrap-scss>=3 # Apache 2.0 License
xstatic-d3>=3.1.6.2 # BSD License (3 clause)
xstatic-hogan>=2.0.0.2 # Apache 2.0 License
xstatic-font-awesome>=4.1.0 # SIL OFL 1.1 License, MIT License
@@ -47,6 +48,7 @@ xstatic-jquery>=1.7.2 # MIT License
xstatic-jquery-migrate>=1.2.1.1 # MIT License
xstatic-jquery.quicksearch>=2.0.3.1 # MIT License
xstatic-jquery.tablesorter>=2.0.5b.0 # MIT License
+xstatic-jquery-ui>=1.10.1 # MIT License
xstatic-jsencrypt>=2.0.0.2 # MIT License
xstatic-qunit>=1.14.0.2 # MIT License
xstatic-rickshaw>=1.5.0 # BSD License (prior)
diff --git a/run_tests.sh b/run_tests.sh
index 2763eb315..1fd6c92ff 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -6,7 +6,7 @@ set -o errexit
# Increment me any time the environment should be rebuilt.
# This includes dependency changes, directory renames, etc.
# Simple integer sequence: 1, 2, 3...
-environment_version=46
+environment_version=47
#--------------------------------------------------------#
function usage {