diff --git a/.tx/config b/.tx/config index 5b652bb6569..478ef0699f1 100644 --- a/.tx/config +++ b/.tx/config @@ -1,7 +1,7 @@ [main] host = https://www.transifex.com -[ckan.2-4] +[ckan.2-8] file_filter = ckan/i18n//LC_MESSAGES/ckan.po source_file = ckan/i18n/ckan.pot source_lang = en diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 58d74d707f0..9500a4bd21e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,11 +7,63 @@ Changelog --------- -v?? (TBA) -========= +v.2.9.0 TBA +================== -Note: This version requires re-running the 'datastore set-permissions' command - (assuming you run DataStore). See: :ref:`datastore-set-permissions` +Deprecations: + * ``c.action`` and ``c.controller`` variables should be avoided. + ``ckan.plugins.toolkit.get_endpoint`` can be used instead. This function + returns tuple of two items(depending on request handler): + 1. Flask blueprint name / Pylons controller name + 2. Flask view name / Pylons action name + In some cases, Flask blueprints have names that are differs from their + Pylons equivalents. For example, 'package' controller is divided between + 'dataset' and 'resource' blueprints. For such cases you may need to perform + additional check of returned value: + + >>> if toolkit.get_endpoint()[0] in ['dataset', 'package']: + >>> do_something() + + In this code snippet, will be called if current request is handled via Flask's + dataset blueprint in CKAN>=2.9, and, in the same time, it's still working for + Pylons package controller in CKAN<2.9 + + +v.2.8.1 2018-07-25 +================== + +General notes: + * Note: This version does not requires a requirements upgrade on source installations + * Note: This version does not requires a database upgrade + * Note: This version does not require a Solr schema upgrade + +Fixes: + + * "Add Filter" Performance Issue (`#4162 `_) + * Error handler update (`#4257 `_) + * "New view" button does not work (`#4260 `_) + * Upload logo is not working (`#4262 `_) + * Unable to pip install ckan (`#4271 `_) + * The "License" Icon in 2.8 is wrong (`#4272 `_) + * Search - input- border color is overly specific in CSS (`#4273 `_) + * Site logo image does not scale down when very large (`#4283 `_) + * Validation Error on datastore_search when sorting timestamp fields (`#4288 `_) + * Undocumented changes breaking error_document_template (`#4303 `_) + * Internal server error when viewing /dashboard when logged out (`#4305 `_) + * Missing c.action attribute in 2.8.0 templates (`#4310 `_) + * [multilingual] AttributeError: '_Globals' object has no attribute 'fields' (`#4338 `_) + * `search` legacy route missing (`#4346 `_) + + +v.2.8.0 2018-05-09 +================== + +General notes: + * This version requires a requirements upgrade on source installations + * This version requires a database upgrade + * This version requires a Solr schema upgrade + * This version requires re-running the ``datastore set-permissions`` command + (assuming you are using the DataStore). See: :ref:`datastore-set-permissions` Otherwise new and updated datasets will not be searchable in DataStore and the logs will contain this error:: @@ -21,6 +73,178 @@ Note: This version requires re-running the 'datastore set-permissions' command CKAN developers should also re-run set-permissions on the test database: :ref:`datastore-test-set-permissions` + * There are several old features being officially deprecated starting from + this version. Check the *Deprecations* section to be prepared. + +Major changes: + * New revamped frontend templates based on Bootstrap 3, see "Changes and deprecations" (#3547) + * Allow datastore_search_sql on private datasets (#2562) + * New Flask blueprints migrated from old Pylons controllers: user, dashboard, feeds, admin and home (#3927, #3870, #3775, #3762) + * Improved support for custom groups and organization types (#4032) + * Hide user details to anonymous users (#3915) + +Minor changes: + * Allow chaining of authentication functions (#3679) + * Show custom dataset types in search pages (#3807) + * Overriding datastore authorization system (#3679) + * Standardize on url_for (#3831) + * Deprecate notify_after_commit (#3633) + * _mail_recipient header override (#3781) + * Restrict access to member forms (#3684) + * Clean up template rendering code (#3923) + * Permission labels are indexed by type text in SOLR (#3863) + * CLI commands require a Flask test request context (#3760) + * Allow IValidator to override existing validators (#3865) + * Shrink datastore_create response size (#3810) + * Stable version URLs CKAN for documentation (#4209) + * API Documentation update (#4136) + * Documentation of Data Dictionary (#3989) + * Remove datastore legacy mode (#4041) + * Map old Pylons routes to Flask ones (#4066) + +Bug fixes: + * File uploads don't work on new Flask based API (#3869) + * {% ckan_extends %} not working on templates served by Flask (#4044) + * Problems in background workers with non-core database relations (#3606) + * Render_datetime can't handle dates before year 1900 (#2228) + * DatapusherPlugin implementation of notify() can call 'datapusher_submit' multiple times (#2334) + * Dataset creation page generates incorrect URLs with Chrome autocomplete (#2501) + * Search buttons need accessible labels (#2550) + * Column name length limit for datastore upload (#2804) + * #2373: Do not validate packages or resources from database to views (#3016) + * Creation of dataset - different behaviour between Web API & CKAN Interface functionality (#3528) + * Redirecting to same page in non-root hosted ckan adds extra root_path to url (#3499) + * Beaker 1.8.0 exception when the code is served from OSX via Vagrant (#3512) + * Add "Add Dataset" button to user's and group's page (#2794) + * Some links in CKAN is not reachable (#2898) + * Exception when specifying a directory in the ckan.i18n_directory option (#3539) + * Resource view filter user filters JS error (#3590) + * Recaptcha v1 will stop working 2018-3-31 (#4061) + * "Testing coding standards" page in docs is missing code snippets (#3635) + * Followers count not updated immediately on UI (#3639) + * Increase jQuery version (#3665) + * Search icon on many pages is not properly vertically aligned (#3654) + * Datatables view can't be used as a default view (#3669) + * Resource URL is not validated on create/update (#3660) + * Upload to Datastore tab shows incorrect time at Upload Log (#3588) + * Filter results button is not working (#3593) + * Broken link in "Upgrading CKAN’s dependencies" doc page (#3637) + * Default logo image not properly saved (#3656) + * Activity test relies on datetime.now() (#3644) + * Info block text for Format field not properly aligned in resource form page (#3663) + * Issue upon creating new organization/group through UI form (#3661) + * In API docs "package_create" lists "owner_org" as optional (#3647) + * Embed modal window not working (#3731) + * Frontent build command does not work on master (#3688) + * Loading image duplicated (#3716) + * Datastore set-up error - logging getting in the way (#3694) + * Registering a new account redirects to an unprefixed url (#3834) + * Exception in search page when not authorized (#4081) + * Datastore full-text-search column is populated by postgres trigger rather than python (#3785) + * Datastore dump results are not the same as data in database (#4150) + * Adding filter at resoruce preview doesn't work while site is setup with ckan.root_path param (#4140) + * No such file or directory: '/usr/lib/ckan/default/src/ckan/requirement-setuptools.txt' during installation from source (#3641) + * Register user form missing required field indicators (#3658) + * Datastore full-text-search column is populated by postgres trigger rather than python (#3786) + * Add missing major changes to change log (#3799) + * Paster/CLI config-tool requires _get_test_app which in turn requires a dev-only dependency (#3806) + * Change log doesn't mention necessary Solr scheme upgrade (#3851) + * TypeError: expected byte string object, value of type unicode found (#3921) + * CKAN's state table clashes with PostGIS generated TIGER state table (#3929) + * [Docker] entrypoint initdb.d sql files copied to root (#3939) + * DataStore status page throws TypeError - Bleach upgrade regression (#3968) + * Source install error with who.ini (#4020) + * making a JSONP call to the CKAN API returns the wrong mime type (#4022) + * Deleting a resource sets datastore_active=False to all resources and overrides their extras (#4042) + * Deleting first Group and Organization custom field is not possible (#4094) + +Changes and deprecations: + * The default templates included in CKAN core have been updated to use Bootstrap 3. Extensions + implementing custom themes are encouraged to update their templates, but they can still + make CKAN load the old Bootstrap 2 templates during the transition using the following + configuration options:: + + ckan.base_public_folder = public-bs2 + ckan.base_templates_folder = templates-bs2 + + * The API versions 1 and 2 (also known as the REST API), ie ``/api/rest/*`` have been + completely removed in favour of the version 3 (action API, ``/api/action/*``). + * The old Celery based background jobs have been removed in CKAN 2.8 in favour of the new RQ based + jobs (http://docs.ckan.org/en/latest/maintaining/background-tasks.html). Extensions can still + of course use Celery but they will need to handle the management themselves. + * `ckan.recaptcha.version` config option is removed, since v2 is the only valid + version now (#4061) + * After introducing dataset blueprint, `h.get_facet_items_dict` takes search_facets as second argument. + This change is aimed to reduce usage of global variables in context. For a while, it has default value + of None, in which case, `c.search_facets` will be used. But all template designers are strongly advised + to specify this argument explicitly, as in future it'll become required. + * The ``ckan.recaptcha.version`` config option is now removed, since v2 is the only valid version now (#4061) + +v2.7.4 2018-05-09 +================= + + * Adding filter at resoruce preview doesn't work while site is setup with ckan.root_path param (#4140) + * Datastore dump results are not the same as data in database (#4150) + +v2.7.3 2018-03-15 +================= + +General notes: + * As with all patch releases this one does not include requirement changes. + However in some scenarios you might encounter the following error while + installing or upgrading this version of CKAN:: + + Error: could not determine PostgreSQL version from '10.2' + + This is due to a bug in the psycopg2 version pinned to the release. To solve + it, upgrade psycopg2 with the following command:: + + pip install --upgrade psycopg2==2.7.3.2 + + * This release does not require a Solr schema upgrade, but if you are having the + issues described in #3863 (datasets wrongly indexed in multilingual setups), + you can upgrade the Solr schema and reindex to solve them. + + * #3422 (implemented in #3425) introduced a major bug where if a resource was + deleted and the DataStore was active extras from all resources on the site where + changed. This is now fixed as part of this release but if your database is already + affected you will need to run a script to restore the extras to their + previous state. Remember, you only need to run the script if all the following are + true: + + 1. You are currently running CKAN 2.7.0 or 2.7.2, and + 2. You have enabled the DataStore, and + 3. One or more resources with data on the DataStore have been deleted (or you + suspect they might have been) + + If all these are true you can run the following script to restore the extras to + their previous state: + + https://github.com/ckan/ckan/blob/dev-v2.7/scripts/4042_fix_resource_extras.py + + This issue is described in #4042 + +Fixes: + * Fix toggle bars header icon (#3880) + * Change CORS header keys and values to string instead of unicode (#3855) + * Fix cors header when all origins are allowed (#3898) + * Update SOLR schema.xml reference in Dockerfile + * Build local SOLR container by default + * Create datastore indexes only if they are not exist + * Properly close file responses + * Use javascript content-type for jsonp responses (#4022) + * Add Data Dictionary documentation (#3989) + * Fix SOLR index delete_package implementation + * Add second half of DataStore set-permissions command(Docs) + * Fix extras overriding for removed resources (#4042) + * Return a 403 if not authorized on the search page (#4081) + * Add support for user/pass for Solr as ENV var + * Change permission_labels type to string in schema.xml (#3863) + * Disallow solr local parameters + * Improve text view rendering + * Update Orgs/Groups logic for custom fields delete and update (#4094) + * Upgrade Solr Docker image + v2.7.2 2017-09-28 ================= @@ -139,6 +363,35 @@ Deprecations: jobs (http://docs.ckan.org/en/latest/maintaining/background-tasks.html). Extensions can still of course use Celery but they will need to handle the management themselves. +v2.6.6 2018-05-09 +================= + +* Adding filter at resoruce preview doesn't work while site is setup with ckan.root_path param (#4140) +* Stable version URLs CKAN for documentation (#4209) +* Add Warning in docs sidebar (#4209) + +v2.6.5 2018-03-15 +================= + +Note: This version requires a database upgrade + +* Activity Time stored in UTC (#2882) +* Migration script to adjust current activity timestamps to UTC +* Change CORS header keys and values to string instead of unicode (#3855) +* Fix cors header when all origins are allowed (#3898) +* Update SOLR schema.xml reference in Dockerfile +* Build local SOLR container by default +* Create datastore indexes only if they don't exist +* Properly close file responses +* Use javascript content-type for jsonp responses (#4022) +* Fix SOLR index delete_package implementation +* Add second half of DataStore set-permissions command (Docs) +* Return a 403 if not authorized on the search page (#4081) +* Add support for user/pass for Solr as ENV var +* Disallow solr local parameters +* Improve text view rendering +* Update Orgs/Groups logic for custom fields delete and update (#4094) + v2.6.4 2017-09-27 ================= @@ -288,6 +541,34 @@ Bug fixes: API changes and deprecations: * Replace `c.__version__` with new helper `h.ckan_version()` (`#3103 `_) +v2.5.9 2018-05-09 +================= + +* Adding filter at resoruce preview doesn't work while site is setup with ckan.root_path param (#4140) +* Add Warning in docs sidebar (#4209) +* Point API docs to stable URL (#4209) + +v2.5.8 2018-03-15 +================= + +Note: This version requires a database upgrade + +* Fix language switcher +* Activity Time stored in UTC (#2882) +* Migration script to adjust current activity timestamps to UTC +* Change CORS header keys and values to string instead of unicode (#3855) +* Fix cors header when all origins are allowed (#3898) +* Create datastore indexes only if they are not exist +* Use javascript content-type for jsonp responses (#4022) +* Fix SOLR index delete_package implementation +* Add second half of DataStore set-permissions command(Docs) +* Update SOLR client (pysolr -> solrpy) +* Return a 403 if not authorized on the search page (#4081) +* Add support for user/pass for Solr as ENV var +* Disallow solr local parameters +* Improve text view rendering +* Update Orgs/Groups logic for custom fields delete and update (#4094) + v2.5.7 2017-09-27 ================= diff --git a/Dockerfile b/Dockerfile index ca4d6d57db9..9a87e5d18ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,6 +45,7 @@ RUN mkdir -p $CKAN_VENV $CKAN_CONFIG $CKAN_STORAGE_PATH && \ # Setup CKAN ADD . $CKAN_VENV/src/ckan/ RUN ckan-pip install -U pip && \ + ckan-pip install --upgrade --no-cache-dir -r $CKAN_VENV/src/ckan/requirement-setuptools.txt && \ ckan-pip install --upgrade --no-cache-dir -r $CKAN_VENV/src/ckan/requirements.txt && \ ckan-pip install -e $CKAN_VENV/src/ckan/ && \ ln -s $CKAN_VENV/src/ckan/ckan/config/who.ini $CKAN_CONFIG/who.ini && \ diff --git a/MANIFEST.in b/MANIFEST.in index 37e122f5903..6f606aeca42 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -19,4 +19,4 @@ include CHANGELOG.txt include ckan/migration/migrate.cfg include ckan/migration/README recursive-include ckan/migration/versions *.sql -recursive-include ckan_deb * +include requirement-setuptools.txt diff --git a/README.rst b/README.rst index 59d3fa969b2..7ca0eff0ddc 100644 --- a/README.rst +++ b/README.rst @@ -35,8 +35,6 @@ See the `CKAN Documentation `_ for installation instructio Support ------- -For general discussion around CKAN, you can write to the `Google Group`_. - If you need help with CKAN or want to ask a question, use either the `ckan-dev`_ mailing list or the `CKAN tag on Stack Overflow`_ (try searching the Stack Overflow and ckan-dev `archives`_ for an answer to your @@ -48,7 +46,6 @@ searching first to see if there's already an issue for your bug). If you find a potential security vulnerability please email security@ckan.org, rather than creating a public issue on GitHub. -.. _Google Group: https://groups.google.com/forum/#!forum/ckan-global-user-group .. _CKAN tag on Stack Overflow: http://stackoverflow.com/questions/tagged/ckan .. _ckan-dev: https://lists.okfn.org/mailman/listinfo/ckan-dev .. _archives: https://www.google.com/search?q=%22%5Bckan-dev%5D%22+site%3Alists.okfn.org. diff --git a/ckan/__init__.py b/ckan/__init__.py index 3a7f3ded3ff..35a5edb097d 100644 --- a/ckan/__init__.py +++ b/ckan/__init__.py @@ -1,6 +1,6 @@ # encoding: utf-8 -__version__ = '2.8.0a' +__version__ = '2.9.0a' __description__ = 'CKAN Software' __long_description__ = \ diff --git a/ckan/authz.py b/ckan/authz.py index b4de6f26d64..8929af8e162 100644 --- a/ckan/authz.py +++ b/ckan/authz.py @@ -197,10 +197,11 @@ def is_authorized(action, context, data_dict=None): # access straight away if not getattr(auth_function, 'auth_allow_anonymous_access', False) \ and not context.get('auth_user_obj'): - return {'success': False, - 'msg': '{0} requires an authenticated user' - .format(auth_function) - } + return { + 'success': False, + 'msg': 'Action {0} requires an authenticated user'.format( + auth_function.__name__) + } return auth_function(context, data_dict) else: diff --git a/ckan/ckan_nose_plugin.py b/ckan/ckan_nose_plugin.py index 0b4816a703e..d45120fbbdf 100644 --- a/ckan/ckan_nose_plugin.py +++ b/ckan/ckan_nose_plugin.py @@ -94,7 +94,7 @@ def wantFunction(self, fn): def finalize(self, report): if self.segments: - print 'Segments: %s' % self.segments + print('Segments: %s' % self.segments) def configure(self, settings, config): CkanNose.settings = settings diff --git a/ckan/common.py b/ckan/common.py index 7341fa25477..6dbdd01fb63 100644 --- a/ckan/common.py +++ b/ckan/common.py @@ -24,6 +24,8 @@ import simplejson as json +current_app = flask.current_app + try: from collections import OrderedDict # from python 2.7 except ImportError: diff --git a/ckan/config/celery-supervisor.conf b/ckan/config/celery-supervisor.conf deleted file mode 100644 index a70ed812803..00000000000 --- a/ckan/config/celery-supervisor.conf +++ /dev/null @@ -1,31 +0,0 @@ -; =============================== -; ckan celeryd supervisor example -; =============================== - -; symlink or copy this file to /etc/supervisr/conf.d -; change the path/to/virtualenv below to the virtualenv ckan is in. - - -[program:celery] -; Full Path to executable, should be path to virtural environment, -; Full path to config file too. - -command=/path/to/pyenv/bin/paster --plugin=ckan celeryd --config=/path/to/config/testing.ini - -; user that owns virtual environment. -user=ckan - -numprocs=1 -stdout_logfile=/var/log/celeryd.log -stderr_logfile=/var/log/celeryd.log -autostart=true -autorestart=true -startsecs=10 - -; Need to wait for currently executing tasks to finish at shutdown. -; Increase this if you have very long running tasks. -stopwaitsecs = 600 - -; if rabbitmq is supervised, set its priority higher -; so it starts first -priority=998 diff --git a/ckan/config/deployment.ini_tmpl b/ckan/config/deployment.ini_tmpl index f5d1f676998..aaa3bf26f9a 100644 --- a/ckan/config/deployment.ini_tmpl +++ b/ckan/config/deployment.ini_tmpl @@ -133,7 +133,6 @@ ckan.display_timezone = server # package_hide_extras = for_search_index_only #package_edit_return_url = http://another.frontend/dataset/ #package_new_return_url = http://another.frontend/dataset/ -#ckan.recaptcha.version = 1 #ckan.recaptcha.publickey = #ckan.recaptcha.privatekey = #licenses_group_url = http://licenses.opendefinition.org/licenses/groups/ckan.json diff --git a/ckan/config/environment.py b/ckan/config/environment.py index 88f73bb0d1d..b53646d4d90 100644 --- a/ckan/config/environment.py +++ b/ckan/config/environment.py @@ -7,7 +7,6 @@ from urlparse import urlparse import pytz -import jinja2 import sqlalchemy from pylons import config as pylons_config import formencode @@ -15,11 +14,13 @@ import ckan.config.routing as routing import ckan.model as model import ckan.plugins as p +import ckan.lib.plugins as lib_plugins import ckan.lib.helpers as helpers import ckan.lib.app_globals as app_globals from ckan.lib.redis import is_redis_available import ckan.lib.render as render import ckan.lib.search as search +import ckan.lib.plugins as lib_plugins import ckan.logic as logic import ckan.authz as authz import ckan.lib.jinja_extensions as jinja_extensions @@ -95,7 +96,7 @@ def find_controller(self, controller): pylons_config.init_app(global_conf, app_conf, package='ckan', paths=paths) # Update the main CKAN config object with the Pylons specific stuff, as it - # quite hard to keep them separated. This should be removed once Pylons + # is quite hard to keep them separated. This should be removed once Pylons # support is dropped config.update(pylons_config) @@ -136,6 +137,8 @@ def find_controller(self, controller): 'ckan.datastore.read_url': 'CKAN_DATASTORE_READ_URL', 'ckan.redis.url': 'CKAN_REDIS_URL', 'solr_url': 'CKAN_SOLR_URL', + 'solr_user': 'CKAN_SOLR_USER', + 'solr_password': 'CKAN_SOLR_PASSWORD', 'ckan.site_id': 'CKAN_SITE_ID', 'ckan.site_url': 'CKAN_SITE_URL', 'ckan.storage_path': 'CKAN_STORAGE_PATH', @@ -144,7 +147,8 @@ def find_controller(self, controller): 'smtp.starttls': 'CKAN_SMTP_STARTTLS', 'smtp.user': 'CKAN_SMTP_USER', 'smtp.password': 'CKAN_SMTP_PASSWORD', - 'smtp.mail_from': 'CKAN_SMTP_MAIL_FROM' + 'smtp.mail_from': 'CKAN_SMTP_MAIL_FROM', + 'ckan.max_resource_size': 'CKAN_MAX_UPLOAD_SIZE_MB' } # End CONFIG_FROM_ENV_VARS @@ -220,6 +224,12 @@ def update_config(): search.check_solr_schema_version() routes_map = routing.make_map() + + lib_plugins.reset_package_plugins() + lib_plugins.set_default_package_plugin() + lib_plugins.reset_group_plugins() + lib_plugins.set_default_group_plugin() + config['routes.map'] = routes_map # The RoutesMiddleware needs its mapper updating if it exists if 'routes.middleware' in config: @@ -267,18 +277,7 @@ def update_config(): # Create Jinja2 environment env = jinja_extensions.Environment( - loader=jinja_extensions.CkanFileSystemLoader(template_paths), - autoescape=True, - extensions=['jinja2.ext.do', 'jinja2.ext.with_', - jinja_extensions.SnippetExtension, - jinja_extensions.CkanExtend, - jinja_extensions.CkanInternationalizationExtension, - jinja_extensions.LinkForExtension, - jinja_extensions.ResourceExtension, - jinja_extensions.UrlForStaticExtension, - jinja_extensions.UrlForExtension], - bytecode_cache=jinja2.FileSystemBytecodeCache() - ) + **jinja_extensions.get_jinja_env_options()) env.install_gettext_callables(_, ungettext, newstyle=True) # custom filters env.filters['empty_and_escape'] = jinja_extensions.empty_and_escape @@ -288,7 +287,7 @@ def update_config(): # any Pylons config options) # Initialize SQLAlchemy - engine = sqlalchemy.engine_from_config(config, client_encoding='utf8') + engine = sqlalchemy.engine_from_config(config) model.init_model(engine) for plugin in p.PluginImplementations(p.IConfigurable): diff --git a/ckan/config/middleware/__init__.py b/ckan/config/middleware/__init__.py index 082372d70d4..73af42fa2f4 100644 --- a/ckan/config/middleware/__init__.py +++ b/ckan/config/middleware/__init__.py @@ -13,6 +13,7 @@ from ckan.config.middleware.flask_app import make_flask_stack from ckan.config.middleware.pylons_app import make_pylons_stack from ckan.common import config + from ckan.lib.i18n import get_locales_from_config import logging diff --git a/ckan/config/middleware/flask_app.py b/ckan/config/middleware/flask_app.py index 24b8276f34c..bbcf285f523 100644 --- a/ckan/config/middleware/flask_app.py +++ b/ckan/config/middleware/flask_app.py @@ -6,13 +6,11 @@ import itertools import pkgutil -from jinja2 import ChoiceLoader - from flask import Flask, Blueprint from flask.ctx import _AppCtxGlobals from flask.sessions import SessionInterface -from werkzeug.exceptions import HTTPException +from werkzeug.exceptions import default_exceptions, HTTPException from werkzeug.routing import Rule from flask_babel import Babel @@ -24,23 +22,52 @@ from repoze.who.middleware import PluggableAuthenticationMiddleware import ckan.model as model +from ckan.lib import base from ckan.lib import helpers from ckan.lib import jinja_extensions -from ckan.lib.render import CkanextTemplateLoader from ckan.common import config, g, request, ungettext import ckan.lib.app_globals as app_globals +import ckan.lib.plugins as lib_plugins + + from ckan.plugins import PluginImplementations -from ckan.plugins.interfaces import IBlueprint, IMiddleware +from ckan.plugins.interfaces import IBlueprint, IMiddleware, ITranslation from ckan.views import (identify_user, set_cors_headers_for_response, check_session_cookie, + set_controller_and_action ) - +import ckan.lib.plugins as lib_plugins import logging log = logging.getLogger(__name__) +class CKANBabel(Babel): + def __init__(self, *pargs, **kwargs): + super(CKANBabel, self).__init__(*pargs, **kwargs) + self._i18n_path_idx = 0 + + @property + def domain(self): + default = super(CKANBabel, self).domain + multiple = self.app.config.get('BABEL_MULTIPLE_DOMAINS') + if not multiple: + return default + domains = multiple.split(';') + try: + return domains[self._i18n_path_idx] + except IndexError: + return default + + @property + def translation_directories(self): + self._i18n_path_idx = 0 + for path in super(CKANBabel, self).translation_directories: + yield path + self._i18n_path_idx += 1 + + def make_flask_stack(conf, **app_conf): """ This has to pass the flask app through all the same middleware that Pylons used """ @@ -48,20 +75,16 @@ def make_flask_stack(conf, **app_conf): root = os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - debug = asbool(app_conf.get('debug', app_conf.get('DEBUG', False))) + debug = asbool(conf.get('debug', conf.get('DEBUG', False))) testing = asbool(app_conf.get('testing', app_conf.get('TESTING', False))) - app = flask_app = CKANFlask(__name__) app.debug = debug app.testing = testing app.template_folder = os.path.join(root, 'templates') app.app_ctx_globals_class = CKAN_AppCtxGlobals app.url_rule_class = CKAN_Rule - app.jinja_loader = ChoiceLoader([ - app.jinja_loader, - CkanextTemplateLoader() - ]) + app.jinja_options = jinja_extensions.get_jinja_env_options() # Update Flask config with the CKAN values. We use the common config # object as values might have been modified on `load_environment` if config: @@ -107,18 +130,6 @@ def save_session(self, app, session, response): app.session_interface = BeakerSessionInterface() # Add Jinja2 extensions and filters - extensions = [ - 'jinja2.ext.do', 'jinja2.ext.with_', - jinja_extensions.SnippetExtension, - jinja_extensions.CkanExtend, - jinja_extensions.CkanInternationalizationExtension, - jinja_extensions.LinkForExtension, - jinja_extensions.ResourceExtension, - jinja_extensions.UrlForStaticExtension, - jinja_extensions.UrlForExtension - ] - for extension in extensions: - app.jinja_env.add_extension(extension) app.jinja_env.filters['empty_and_escape'] = \ jinja_extensions.empty_and_escape @@ -139,10 +150,18 @@ def ungettext_alias(): return dict(ungettext=ungettext) # Babel - app.config[u'BABEL_TRANSLATION_DIRECTORIES'] = os.path.join(root, u'i18n') + pairs = [(os.path.join(root, u'i18n'), 'ckan')] + [ + (p.i18n_directory(), p.i18n_domain()) + for p in PluginImplementations(ITranslation) + ] + + i18n_dirs, i18n_domains = zip(*pairs) + + app.config[u'BABEL_TRANSLATION_DIRECTORIES'] = ';'.join(i18n_dirs) app.config[u'BABEL_DOMAIN'] = 'ckan' + app.config[u'BABEL_MULTIPLE_DOMAINS'] = ';'.join(i18n_domains) - babel = Babel(app) + babel = CKANBabel(app) babel.localeselector(get_locale) @@ -156,12 +175,16 @@ def hello_world_post(): # Auto-register all blueprints defined in the `views` folder _register_core_blueprints(app) + _register_error_handler(app) # Set up each IBlueprint extension as a Flask Blueprint for plugin in PluginImplementations(IBlueprint): if hasattr(plugin, 'get_blueprint'): app.register_extension_blueprint(plugin.get_blueprint()) + lib_plugins.register_group_plugins(app) + lib_plugins.register_package_plugins(app) + # Set flask routes in named_routes for rule in app.url_map.iter_rules(): if '.' not in rule.endpoint: @@ -263,6 +286,10 @@ def ckan_before_request(): # Sets g.user and g.userobj identify_user() + # Provide g.controller and g.action for backward compatibility + # with extensions + set_controller_and_action() + def ckan_after_request(response): u'''Common handler executed after all Flask requests''' @@ -385,3 +412,23 @@ def is_blueprint(mm): for blueprint in inspect.getmembers(module, is_blueprint): app.register_blueprint(blueprint[1]) log.debug(u'Registered core blueprint: {0!r}'.format(blueprint[0])) + + +def _register_error_handler(app): + u'''Register error handler''' + + def error_handler(e): + if isinstance(e, HTTPException): + extra_vars = {u'code': [e.code], u'content': e.description} + # TODO: Remove + g.code = [e.code] + + return base.render( + u'error_document_template.html', extra_vars), e.code + extra_vars = {u'code': [500], u'content': u'Internal server error'} + return base.render(u'error_document_template.html', extra_vars), 500 + + for code in default_exceptions: + app.register_error_handler(code, error_handler) + if not app.debug and not app.testing: + app.register_error_handler(Exception, error_handler) diff --git a/ckan/config/routing.py b/ckan/config/routing.py index de044dc6019..de1b65e8f43 100644 --- a/ckan/config/routing.py +++ b/ckan/config/routing.py @@ -1,5 +1,4 @@ # encoding: utf-8 - """Routes configuration The more specific and detailed routes should be defined first so they @@ -12,7 +11,7 @@ from routes.mapper import SubMapper, Mapper as _Mapper import ckan.plugins as p -from ckan.common import config +from ckan.common import config, current_app named_routes = {} @@ -85,11 +84,9 @@ def make_map(): PUT_POST_DELETE = dict(method=['PUT', 'POST', 'DELETE']) OPTIONS = dict(method=['OPTIONS']) - import ckan.lib.plugins as lib_plugins - lib_plugins.reset_package_plugins() - - map = Mapper(directory=config['pylons.paths']['controllers'], - always_scan=config['debug']) + map = Mapper( + directory=config['pylons.paths']['controllers'], + always_scan=config['debug']) map.minimization = False map.explicit = True @@ -102,8 +99,12 @@ def make_map(): map.connect('/error/{action}', controller='error', ckan_core=True) map.connect('/error/{action}/{id}', controller='error', ckan_core=True) - map.connect('*url', controller='home', action='cors_options', - conditions=OPTIONS, ckan_core=True) + map.connect( + '*url', + controller='home', + action='cors_options', + conditions=OPTIONS, + ckan_core=True) # Mark all routes added from extensions on the `before_map` extension point # as non-core @@ -111,64 +112,27 @@ def make_map(): if not hasattr(route, '_ckan_core'): route._ckan_core = False - map.connect('home', '/', controller='home', action='index') - map.connect('about', '/about', controller='home', action='about') # CKAN API versioned. register_list = [ - 'package', - 'dataset', - 'resource', - 'tag', - 'group', - 'revision', - 'licenses', - 'rating', - 'user', - 'activity' + 'package', 'dataset', 'resource', 'tag', 'group', 'revision', + 'licenses', 'rating', 'user', 'activity' ] register_list_str = '|'.join(register_list) # /api ver 1, 2, 3 or none - with SubMapper(map, controller='api', path_prefix='/api{ver:/1|/2|/3|}', - ver='/1') as m: + with SubMapper( + map, controller='api', path_prefix='/api{ver:/1|/2|/3|}', + ver='/1') as m: m.connect('/search/{register}', action='search') - # /api ver 1, 2 or none - with SubMapper(map, controller='api', path_prefix='/api{ver:/1|/2|}', - ver='/1') as m: - m.connect('/rest', action='index') - - # /api/rest ver 1, 2 or none - with SubMapper(map, controller='api', path_prefix='/api{ver:/1|/2|}', - ver='/1', requirements=dict(register=register_list_str) - ) as m: - - m.connect('/rest/{register}', action='list', conditions=GET) - m.connect('/rest/{register}', action='create', conditions=POST) - m.connect('/rest/{register}/{id}', action='show', conditions=GET) - m.connect('/rest/{register}/{id}', action='update', conditions=PUT) - m.connect('/rest/{register}/{id}', action='update', conditions=POST) - m.connect('/rest/{register}/{id}', action='delete', conditions=DELETE) - m.connect('/rest/{register}/{id}/:subregister', action='list', - conditions=GET) - m.connect('/rest/{register}/{id}/:subregister', action='create', - conditions=POST) - m.connect('/rest/{register}/{id}/:subregister/{id2}', action='create', - conditions=POST) - m.connect('/rest/{register}/{id}/:subregister/{id2}', action='show', - conditions=GET) - m.connect('/rest/{register}/{id}/:subregister/{id2}', action='update', - conditions=PUT) - m.connect('/rest/{register}/{id}/:subregister/{id2}', action='delete', - conditions=DELETE) - - # /api/util ver 1, 2 or none - with SubMapper(map, controller='api', path_prefix='/api{ver:/1|/2|}', - ver='/1') as m: + with SubMapper( + map, controller='api', path_prefix='/api{ver:/1|/2|}', + ver='/1') as m: m.connect('/util/dataset/munge_name', action='munge_package_name') - m.connect('/util/dataset/munge_title_to_name', - action='munge_title_to_package_name') + m.connect( + '/util/dataset/munge_title_to_name', + action='munge_title_to_package_name') m.connect('/util/tag/munge', action='munge_tag') ########### @@ -180,149 +144,14 @@ def make_map(): map.redirect('/package', '/dataset') map.redirect('/package/{url:.*}', '/dataset/{url}') - with SubMapper(map, controller='package') as m: - m.connect('search', '/dataset', action='search', - highlight_actions='index search') - m.connect('dataset_new', '/dataset/new', action='new') - m.connect('/dataset/{action}', - requirements=dict(action='|'.join([ - 'list', - 'autocomplete', - 'search' - ]))) - - m.connect('/dataset/{action}/{id}/{revision}', action='read_ajax', - requirements=dict(action='|'.join([ - 'read', - 'edit', - 'history', - ]))) - m.connect('/dataset/{action}/{id}', - requirements=dict(action='|'.join([ - 'new_resource', - 'history', - 'read_ajax', - 'history_ajax', - 'follow', - 'activity', - 'groups', - 'unfollow', - 'delete', - 'api_data', - ]))) - m.connect('dataset_edit', '/dataset/edit/{id}', action='edit', - ckan_icon='pencil-square-o') - m.connect('dataset_followers', '/dataset/followers/{id}', - action='followers', ckan_icon='users') - m.connect('dataset_activity', '/dataset/activity/{id}', - action='activity', ckan_icon='clock-o') - m.connect('/dataset/activity/{id}/{offset}', action='activity') - m.connect('dataset_groups', '/dataset/groups/{id}', - action='groups', ckan_icon='users') - m.connect('dataset_resources', '/dataset/resources/{id}', - action='resources', ckan_icon='bars') - m.connect('dataset_read', '/dataset/{id}', action='read', - ckan_icon='sitemap') - m.connect('/dataset/{id}/resource/{resource_id}', - action='resource_read') - m.connect('/dataset/{id}/resource_delete/{resource_id}', - action='resource_delete') - m.connect('resource_edit', '/dataset/{id}/resource_edit/{resource_id}', - action='resource_edit', ckan_icon='pencil-square-o') - m.connect('/dataset/{id}/resource/{resource_id}/download', - action='resource_download') - m.connect('/dataset/{id}/resource/{resource_id}/download/{filename}', - action='resource_download') - m.connect('/dataset/{id}/resource/{resource_id}/embed', - action='resource_embedded_dataviewer') - m.connect('/dataset/{id}/resource/{resource_id}/viewer', - action='resource_embedded_dataviewer', width="960", - height="800") - m.connect('/dataset/{id}/resource/{resource_id}/preview', - action='resource_datapreview') - m.connect('views', '/dataset/{id}/resource/{resource_id}/views', - action='resource_views', ckan_icon='bars') - m.connect('new_view', '/dataset/{id}/resource/{resource_id}/new_view', - action='edit_view', ckan_icon='pencil-square-o') - m.connect('edit_view', - '/dataset/{id}/resource/{resource_id}/edit_view/{view_id}', - action='edit_view', ckan_icon='pencil-square-o') - m.connect('resource_view', - '/dataset/{id}/resource/{resource_id}/view/{view_id}', - action='resource_view') - m.connect('/dataset/{id}/resource/{resource_id}/view/', - action='resource_view') - - # group - map.redirect('/groups', '/group') - map.redirect('/groups/{url:.*}', '/group/{url}') - - # These named routes are used for custom group forms which will use the - # names below based on the group.type ('group' is the default type) - with SubMapper(map, controller='group') as m: - m.connect('group_index', '/group', action='index', - highlight_actions='index search') - m.connect('group_list', '/group/list', action='list') - m.connect('group_new', '/group/new', action='new') - m.connect('group_action', '/group/{action}/{id}', - requirements=dict(action='|'.join([ - 'edit', - 'delete', - 'member_new', - 'member_delete', - 'history', - 'followers', - 'follow', - 'unfollow', - 'admins', - 'activity', - ]))) - m.connect('group_about', '/group/about/{id}', action='about', - ckan_icon='info-circle'), - m.connect('group_edit', '/group/edit/{id}', action='edit', - ckan_icon='pencil-square-o') - m.connect('group_members', '/group/members/{id}', action='members', - ckan_icon='users'), - m.connect('group_activity', '/group/activity/{id}/{offset}', - action='activity', ckan_icon='clock-o'), - m.connect('group_read', '/group/{id}', action='read', - ckan_icon='sitemap') - - # organizations these basically end up being the same as groups - with SubMapper(map, controller='organization') as m: - m.connect('organizations_index', '/organization', action='index') - m.connect('/organization/list', action='list') - m.connect('/organization/new', action='new') - m.connect('/organization/{action}/{id}', - requirements=dict(action='|'.join([ - 'delete', - 'admins', - 'member_new', - 'member_delete', - 'history' - ]))) - m.connect('organization_activity', '/organization/activity/{id}/{offset}', - action='activity', ckan_icon='clock-o') - m.connect('organization_read', '/organization/{id}', action='read') - m.connect('organization_about', '/organization/about/{id}', - action='about', ckan_icon='info-circle') - m.connect('organization_read', '/organization/{id}', action='read', - ckan_icon='sitemap') - m.connect('organization_edit', '/organization/edit/{id}', - action='edit', ckan_icon='pencil-square-o') - m.connect('organization_members', '/organization/members/{id}', - action='members', ckan_icon='users') - m.connect('organization_bulk_process', - '/organization/bulk_process/{id}', - action='bulk_process', ckan_icon='sitemap') - lib_plugins.register_package_plugins(map) - lib_plugins.register_group_plugins(map) # tags map.redirect('/tags', '/tag') map.redirect('/tags/{url:.*}', '/tag/{url}') - map.redirect('/tag/read/{url:.*}', '/tag/{url}', - _redirect_code='301 Moved Permanently') + map.redirect( + '/tag/read/{url:.*}', + '/tag/{url}', + _redirect_code='301 Moved Permanently') map.connect('/tag', controller='tag', action='index') map.connect('/tag/{id}', controller='tag', action='read') # users @@ -335,10 +164,6 @@ def make_map(): m.connect('/revision/list', action='list') m.connect('/revision/{id}', action='read') - with SubMapper(map, controller='ckan.controllers.storage:StorageController') as m: - m.connect('storage_file', '/storage/f/{label:.*}', - action='file') - with SubMapper(map, controller='util') as m: m.connect('/i18n/strings_{lang}.js', action='i18n_js_strings') m.connect('/util/redirect', action='redirect') @@ -366,8 +191,7 @@ def make_map(): # the real favicon location. map.redirect('/favicon.ico', config.get('ckan.favicon')) - map.redirect('/*(url)/', '/{url}', - _redirect_code='301 Moved Permanently') + map.redirect('/*(url)/', '/{url}', _redirect_code='301 Moved Permanently') map.connect('/*url', controller='template', action='view', ckan_core=True) return map diff --git a/ckan/controllers/api.py b/ckan/controllers/api.py index b20a2c5c605..0093aed72e8 100644 --- a/ckan/controllers/api.py +++ b/ckan/controllers/api.py @@ -9,6 +9,7 @@ from webob.multidict import UnicodeMultiDict from paste.util.multidict import MultiDict +from six import text_type import ckan.model as model import ckan.logic as logic @@ -38,6 +39,7 @@ 'text': 'text/plain;charset=utf-8', 'html': 'text/html;charset=utf-8', 'json': 'application/json;charset=utf-8', + 'javascript': 'application/javascript;charset=utf-8', } @@ -99,6 +101,7 @@ def _finish(self, status_int, response_data=None, # escape callback to remove '<', '&', '>' chars callback = cgi.escape(request.params['callback']) response_msg = self._wrap_jsonp(callback, response_msg) + response.headers['Content-Type'] = CONTENT_TYPES['javascript'] return response_msg def _finish_ok(self, response_data=None, @@ -215,14 +218,14 @@ def action(self, logic_function, ver=None): 'message': _('Access denied')} return_dict['success'] = False - if unicode(e): + if text_type(e): return_dict['error']['message'] += u': %s' % e return self._finish(403, return_dict, content_type='json') except NotFound as e: return_dict['error'] = {'__type': 'Not Found Error', 'message': _('Not found')} - if unicode(e): + if text_type(e): return_dict['error']['message'] += u': %s' % e return_dict['success'] = False return self._finish(404, return_dict, content_type='json') @@ -268,216 +271,6 @@ def _get_action_from_map(self, action_map, register, subregister): if action: return get_action(action) - def list(self, ver=None, register=None, subregister=None, id=None): - context = {'model': model, 'session': model.Session, - 'user': c.user, 'api_version': ver, - 'auth_user_obj': c.userobj} - log.debug('listing: %s', context) - action_map = { - 'revision': 'revision_list', - 'group': 'group_list', - 'dataset': 'package_list', - 'tag': 'tag_list', - 'licenses': 'license_list', - ('dataset', 'relationships'): 'package_relationships_list', - ('dataset', 'revisions'): 'package_revision_list', - ('dataset', 'activity'): 'package_activity_list', - ('group', 'activity'): 'group_activity_list', - ('user', 'activity'): 'user_activity_list', - ('user', 'dashboard_activity'): 'dashboard_activity_list', - ('activity', 'details'): 'activity_detail_list', - } - - action = self._get_action_from_map(action_map, register, subregister) - if not action: - return self._finish_bad_request( - _('Cannot list entity of this type: %s') % register) - try: - return self._finish_ok(action(context, {'id': id})) - except NotFound as e: - return self._finish_not_found(unicode(e)) - except NotAuthorized as e: - return self._finish_not_authz(unicode(e)) - - def show(self, ver=None, register=None, subregister=None, - id=None, id2=None): - action_map = { - 'revision': 'revision_show', - 'group': 'group_show_rest', - 'tag': 'tag_show_rest', - 'dataset': 'package_show_rest', - ('dataset', 'relationships'): 'package_relationships_list', - } - for type in model.PackageRelationship.get_all_types(): - action_map[('dataset', type)] = 'package_relationships_list' - - context = {'model': model, 'session': model.Session, 'user': c.user, - 'api_version': ver, 'auth_user_obj': c.userobj} - data_dict = {'id': id, 'id2': id2, 'rel': subregister} - - log.debug('show: %s', context) - - action = self._get_action_from_map(action_map, register, subregister) - if not action: - return self._finish_bad_request( - _('Cannot read entity of this type: %s') % register) - try: - return self._finish_ok(action(context, data_dict)) - except NotFound as e: - return self._finish_not_found(unicode(e)) - except NotAuthorized as e: - return self._finish_not_authz(unicode(e)) - - def create(self, ver=None, register=None, subregister=None, - id=None, id2=None): - - action_map = { - 'group': 'group_create_rest', - 'dataset': 'package_create_rest', - 'rating': 'rating_create', - ('dataset', 'relationships'): 'package_relationship_create_rest', - } - for type in model.PackageRelationship.get_all_types(): - action_map[('dataset', type)] = 'package_relationship_create_rest' - - context = {'model': model, 'session': model.Session, 'user': c.user, - 'api_version': ver, 'auth_user_obj': c.userobj} - log.debug('create: %s', (context)) - try: - request_data = self._get_request_data() - data_dict = {'id': id, 'id2': id2, 'rel': subregister} - data_dict.update(request_data) - except ValueError as inst: - return self._finish_bad_request( - _('JSON Error: %s') % inst) - - action = self._get_action_from_map(action_map, register, subregister) - if not action: - return self._finish_bad_request( - _('Cannot create new entity of this type: %s %s') % - (register, subregister)) - - try: - response_data = action(context, data_dict) - location = None - if "id" in data_dict: - location = str('%s/%s' % (request.path.replace('package', - 'dataset'), - data_dict.get("id"))) - return self._finish_ok(response_data, - resource_location=location) - except NotAuthorized as e: - return self._finish_not_authz(unicode(e)) - except NotFound as e: - return self._finish_not_found(unicode(e)) - except ValidationError as e: - # CS: nasty_string ignore - log.info('Validation error (REST create): %r', str(e.error_dict)) - return self._finish(409, e.error_dict, content_type='json') - except DataError as e: - log.info('Format incorrect (REST create): %s - %s', - e.error, request_data) - error_dict = { - 'success': False, - 'error': {'__type': 'Integrity Error', - 'message': e.error, - 'data': request_data}} - return self._finish(400, error_dict, content_type='json') - except search.SearchIndexError: - log.error('Unable to add package to search index: %s', - request_data) - return self._finish(500, - _(u'Unable to add package to search index') % - request_data) - except: - model.Session.rollback() - raise - - def update(self, ver=None, register=None, subregister=None, - id=None, id2=None): - action_map = { - 'dataset': 'package_update_rest', - 'group': 'group_update_rest', - ('dataset', 'relationships'): 'package_relationship_update_rest', - } - for type in model.PackageRelationship.get_all_types(): - action_map[('dataset', type)] = 'package_relationship_update_rest' - - context = {'model': model, 'session': model.Session, 'user': c.user, - 'api_version': ver, 'id': id, 'auth_user_obj': c.userobj} - log.debug('update: %s', context) - try: - request_data = self._get_request_data() - data_dict = {'id': id, 'id2': id2, 'rel': subregister} - data_dict.update(request_data) - except ValueError as inst: - return self._finish_bad_request( - _('JSON Error: %s') % inst) - - action = self._get_action_from_map(action_map, register, subregister) - if not action: - return self._finish_bad_request( - _('Cannot update entity of this type: %s') % - register.encode('utf-8')) - try: - response_data = action(context, data_dict) - return self._finish_ok(response_data) - except NotAuthorized as e: - return self._finish_not_authz(unicode(e)) - except NotFound as e: - return self._finish_not_found(unicode(e)) - except ValidationError as e: - # CS: nasty_string ignore - log.info('Validation error (REST update): %r', str(e.error_dict)) - return self._finish(409, e.error_dict, content_type='json') - except DataError as e: - log.info('Format incorrect (REST update): %s - %s', - e.error, request_data) - error_dict = { - 'success': False, - 'error': {'__type': 'Integrity Error', - 'message': e.error, - 'data': request_data}} - return self._finish(400, error_dict, content_type='json') - except search.SearchIndexError: - log.error('Unable to update search index: %s', request_data) - return self._finish(500, _(u'Unable to update search index') % - request_data) - - def delete(self, ver=None, register=None, subregister=None, - id=None, id2=None): - action_map = { - 'group': 'group_delete', - 'dataset': 'package_delete', - ('dataset', 'relationships'): 'package_relationship_delete_rest', - } - for type in model.PackageRelationship.get_all_types(): - action_map[('dataset', type)] = 'package_relationship_delete_rest' - - context = {'model': model, 'session': model.Session, 'user': c.user, - 'api_version': ver, 'auth_user_obj': c.userobj} - - data_dict = {'id': id, 'id2': id2, 'rel': subregister} - - log.debug('delete %s/%s/%s/%s', register, id, subregister, id2) - - action = self._get_action_from_map(action_map, register, subregister) - if not action: - return self._finish_bad_request( - _('Cannot delete entity of this type: %s %s') % - (register, subregister or '')) - try: - response_data = action(context, data_dict) - return self._finish_ok(response_data) - except NotAuthorized as e: - return self._finish_not_authz(unicode(e)) - except NotFound as e: - return self._finish_not_found(unicode(e)) - except ValidationError as e: - # CS: nasty_string ignore - log.info('Validation error (REST delete): %r', str(e.error_dict)) - return self._finish(409, e.error_dict, content_type='json') - def search(self, ver=None, register=None): log.debug('search %s params: %r', register, request.params) @@ -669,7 +462,7 @@ def dataset_autocomplete(self): def tag_autocomplete(self): q = request.str_params.get('incomplete', '') - q = unicode(urllib.unquote(q), 'utf-8') + q = text_type(urllib.unquote(q), 'utf-8') limit = request.params.get('limit', 10) tag_names = [] if q: @@ -756,7 +549,7 @@ def _get_request_data(cls, try_url_params=False): def make_unicode(entity): '''Cast bare strings and strings in lists or dicts to Unicode. ''' if isinstance(entity, str): - return unicode(entity) + return text_type(entity) elif isinstance(entity, list): new_items = [] for item in entity: diff --git a/ckan/controllers/error.py b/ckan/controllers/error.py index cb962a82f2d..41e5c82fa2d 100644 --- a/ckan/controllers/error.py +++ b/ckan/controllers/error.py @@ -41,12 +41,13 @@ def document(self): if not original_response.charset and original_response.default_charset: original_response.charset = original_response.default_charset # Otherwise, decorate original response with error template. - c.content = literal(original_response.unicode_body) or \ + content = literal(original_response.unicode_body) or \ cgi.escape(request.GET.get('message', '')) - c.prefix = request.environ.get('SCRIPT_NAME', ''), - c.code = cgi.escape(request.GET.get('code', - str(original_response.status_int))), - return render('error_document_template.html') + prefix = request.environ.get('SCRIPT_NAME', ''), + code = cgi.escape(request.GET.get('code', + str(original_response.status_int))), + extra_vars = {'code': code, 'content': content, 'prefix': prefix} + return render('error_document_template.html', extra_vars=extra_vars) def img(self, id): """Serve Pylons' stock images""" diff --git a/ckan/controllers/feed.py b/ckan/controllers/feed.py index ed4bc9dfb16..81f71b8e17e 100644 --- a/ckan/controllers/feed.py +++ b/ckan/controllers/feed.py @@ -24,6 +24,7 @@ import logging import urlparse +from six import text_type import webhelpers.feedgenerator import ckan.lib.base as base @@ -400,8 +401,7 @@ def output_feed(self, results, feed_title, feed_description, feed.add_item( title=pkg.get('title', ''), - link=self.base_url + h.url_for(controller='package', - action='read', + link=self.base_url + h.url_for('dataset.read', id=pkg['id']), description=pkg.get('notes', ''), updated=h.date_str_to_datetime(pkg.get('metadata_modified')), @@ -417,7 +417,7 @@ def output_feed(self, results, feed_title, feed_description, id=pkg['name'], ver='3', qualified=True), - unicode(len(json.dumps(pkg))), # TODO fix this + text_type(len(json.dumps(pkg))), # TODO fix this u'application/json'), **additional_fields ) diff --git a/ckan/controllers/group.py b/ckan/controllers/group.py index c70e4b612c9..3bbe20fbad5 100644 --- a/ckan/controllers/group.py +++ b/ckan/controllers/group.py @@ -5,6 +5,7 @@ from urllib import urlencode from pylons.i18n import get_lang +from six import string_types, text_type import ckan.lib.base as base import ckan.lib.helpers as h @@ -53,6 +54,8 @@ def _db_to_form_schema(self, group_type=None): return lookup_group_plugin(group_type).db_to_form_schema() def _setup_template_variables(self, context, data_dict, group_type=None): + if 'type' not in data_dict: + data_dict['type'] = group_type return lookup_group_plugin(group_type).\ setup_template_variables(context, data_dict) @@ -101,18 +104,6 @@ def _render_template(self, template_name, group_type): return render(self._replace_group_org(template_name), extra_vars={'group_type': group_type}) - def _redirect_to_this_controller(self, *args, **kw): - ''' wrapper around redirect_to but it adds in this request's controller - (so that it works for Organization or other derived controllers)''' - kw['controller'] = request.environ['pylons.routes_dict']['controller'] - return h.redirect_to(*args, **kw) - - def _url_for_this_controller(self, *args, **kw): - ''' wrapper around url_for but it adds in this request's controller - (so that it works for Organization or other derived controllers)''' - kw['controller'] = request.environ['pylons.routes_dict']['controller'] - return h.url_for(*args, **kw) - def _guess_group_type(self, expecting_name=False): """ Guess the type of group from the URL. @@ -234,6 +225,12 @@ def read(self, id, limit=20): except (NotFound, NotAuthorized): abort(404, _('Group not found')) + # if the user specified a group id, redirect to the group name + if data_dict['id'] == c.group_dict['id'] and \ + data_dict['id'] != c.group_dict['name']: + h.redirect_to(controller=group_type, action='read', + id=c.group_dict['name']) + self._read(id, limit, group_type) return render(self._read_template(c.group_dict['type']), extra_vars={'group_type': group_type}) @@ -248,9 +245,9 @@ def _read(self, id, limit, group_type): q = c.q = request.params.get('q', '') # Search within group if c.group_dict.get('is_organization'): - q += ' owner_org:"%s"' % c.group_dict.get('id') + fq = 'owner_org:"%s"' % c.group_dict.get('id') else: - q += ' groups:"%s"' % c.group_dict.get('name') + fq = 'groups:"%s"' % c.group_dict.get('name') c.description_formatted = \ h.render_markdown(c.group_dict.get('description')) @@ -268,7 +265,7 @@ def search_url(params): controller = lookup_group_controller(group_type) action = 'bulk_process' if c.action == 'bulk_process' else 'read' url = h.url_for(controller=controller, action=action, id=id) - params = [(k, v.encode('utf-8') if isinstance(v, basestring) + params = [(k, v.encode('utf-8') if isinstance(v, string_types) else str(v)) for k, v in params] return url + u'?' + urlencode(params) @@ -331,7 +328,7 @@ def pager_url(q=None, page=None): data_dict = { 'q': q, - 'fq': '', + 'fq': fq, 'include_private': True, 'facet.field': facets.keys(), 'rows': limit, @@ -450,7 +447,7 @@ def bulk_process(self, id): get_action(action_functions[action])(context, data_dict) except NotAuthorized: abort(403, _('Not authorized to perform bulk update')) - self._redirect_to_this_controller(action='bulk_process', id=id) + h.redirect_to(group_type + '_bulk_process', id=id) def new(self, data=None, errors=None, error_summary=None): if data and 'type' in data: @@ -469,7 +466,7 @@ def new(self, data=None, errors=None, error_summary=None): except NotAuthorized: abort(403, _('Unauthorized to create a group')) - if context['save'] and not data: + if context['save'] and not data and request.method == 'POST': return self._save_new(context, group_type) data = data or {} @@ -500,7 +497,7 @@ def edit(self, id, data=None, errors=None, error_summary=None): } data_dict = {'id': id, 'include_datasets': False} - if context['save'] and not data: + if context['save'] and not data and request.method == 'POST': return self._save_edit(id, context) try: @@ -613,7 +610,7 @@ def delete(self, id): group_type = self._ensure_controller_matches_group_type(id) if 'cancel' in request.params: - self._redirect_to_this_controller(action='edit', id=id) + h.redirect_to(group_type + '_edit', id=id) context = {'model': model, 'session': model.Session, 'user': c.user} @@ -633,7 +630,7 @@ def delete(self, id): else: h.flash_notice(_('%s has been deleted.') % _(group_type.capitalize())) - self._redirect_to_this_controller(action='index') + h.redirect_to(group_type + '_index') c.group_dict = self._action('group_show')(context, {'id': id}) except NotAuthorized: abort(403, _('Unauthorized to delete group %s') % '') @@ -650,9 +647,14 @@ def members(self, id): context = {'model': model, 'session': model.Session, 'user': c.user} + data_dict = {'id': id} try: - data_dict = {'id': id} check_access('group_edit_permissions', context, data_dict) + except NotAuthorized: + abort(403, + _('User %r not authorized to edit members of %s') % (c.user, + id)) + try: c.members = self._action('member_list')( context, {'id': id, 'object_type': 'user'} ) @@ -660,11 +662,6 @@ def members(self, id): c.group_dict = self._action('group_show')(context, data_dict) except NotFound: abort(404, _('Group not found')) - except NotAuthorized: - abort( - 403, - _('User %r not authorized to edit members of %s') % ( - c.user, id)) return self._render_template('group/members.html', group_type) @@ -707,7 +704,7 @@ def member_new(self, id): c.group_dict = self._action('group_member_create')( context, data_dict) - self._redirect_to_this_controller(action='members', id=id) + h.redirect_to(group_type + '_members', id=id) else: user = request.params.get('user') if user: @@ -729,7 +726,7 @@ def member_delete(self, id): group_type = self._ensure_controller_matches_group_type(id) if 'cancel' in request.params: - self._redirect_to_this_controller(action='members', id=id) + h.redirect_to(group_type + '_members', id=id) context = {'model': model, 'session': model.Session, 'user': c.user} @@ -745,7 +742,7 @@ def member_delete(self, id): self._action('group_member_delete')( context, {'id': id, 'user_id': user_id}) h.flash_notice(_('Group member has been deleted.')) - self._redirect_to_this_controller(action='members', id=id) + h.redirect_to(group_type + '_members', id=id) c.user_dict = self._action('user_show')(context, {'id': user_id}) c.user_id = user_id c.group_id = id @@ -793,12 +790,12 @@ def history(self, id): from webhelpers.feedgenerator import Atom1Feed feed = Atom1Feed( title=_(u'CKAN Group Revision History'), - link=self._url_for_this_controller( - action='read', + link=h.url_for( + group_type + '_read', id=c.group_dict['name']), description=_(u'Recent changes to CKAN Group: ') + c.group_dict['display_name'], - language=unicode(get_lang()), + language=text_type(get_lang()), ) for revision_dict in c.group_revisions: revision_date = h.date_str_to_datetime( @@ -869,6 +866,7 @@ def follow(self, id): group_dict = get_action('group_show')(context, data_dict) h.flash_success(_("You are now following {0}").format( group_dict['title'])) + id = group_dict['name'] except ValidationError as e: error_message = (e.message or e.error_summary or e.error_dict) @@ -889,6 +887,7 @@ def unfollow(self, id): group_dict = get_action('group_show')(context, data_dict) h.flash_success(_("You are no longer following {0}").format( group_dict['title'])) + id = group_dict['name'] except ValidationError as e: error_message = (e.message or e.error_summary or e.error_dict) diff --git a/ckan/controllers/organization.py b/ckan/controllers/organization.py index 1b53d1f01e4..292b8af4f99 100644 --- a/ckan/controllers/organization.py +++ b/ckan/controllers/organization.py @@ -20,9 +20,6 @@ class OrganizationController(group.GroupController): group_types = ['organization'] - def _guess_group_type(self, expecting_name=False): - return 'organization' - def _replace_group_org(self, string): ''' substitute organization for group if this is an org''' return re.sub('^group', 'organization', string) diff --git a/ckan/controllers/package.py b/ckan/controllers/package.py index 2c4a2e85914..fb28d93aac1 100644 --- a/ckan/controllers/package.py +++ b/ckan/controllers/package.py @@ -9,6 +9,7 @@ from ckan.common import config from paste.deploy.converters import asbool import paste.fileapp +from six import string_types, text_type import ckan.logic as logic import ckan.lib.base as base @@ -45,7 +46,7 @@ def _encode_params(params): - return [(k, v.encode('utf-8') if isinstance(v, basestring) else str(v)) + return [(k, v.encode('utf-8') if isinstance(v, string_types) else str(v)) for k, v in params] @@ -310,6 +311,9 @@ def pager_url(q=None, page=None): c.query_error = True c.search_facets = {} c.page = h.Page(collection=[]) + except NotAuthorized: + abort(403, _('Not authorized to see this page')) + c.search_facets_limits = {} for facet in c.search_facets.keys(): try: @@ -461,7 +465,7 @@ def history(self, id): id=c.pkg_dict['name']), description=_(u'Recent changes to CKAN Dataset: ') + (c.pkg_dict['title'] or ''), - language=unicode(i18n.get_lang()), + language=text_type(i18n.get_lang()), ) for revision_dict in c.pkg_revisions: revision_date = h.date_str_to_datetime( @@ -517,7 +521,7 @@ def new(self, data=None, errors=None, error_summary=None): except NotAuthorized: abort(403, _('Unauthorized to create a package')) - if context['save'] and not data: + if context['save'] and not data and request.method == 'POST': return self._save_new(context, package_type=package_type) data = data or clean_dict(dict_fns.unflatten(tuplize_dict(parse_params( @@ -754,7 +758,7 @@ def edit(self, id, data=None, errors=None, error_summary=None): 'user': c.user, 'auth_user_obj': c.userobj, 'save': 'save' in request.params} - if context['save'] and not data: + if context['save'] and not data and request.method == 'POST': return self._save_edit(id, context, package_type=package_type) try: c.pkg_dict = get_action('package_show')(dict(context, @@ -940,9 +944,9 @@ def _save_new(self, context, package_type=None): abort(400, _(u'Integrity Error')) except SearchIndexError as e: try: - exc_str = unicode(repr(e.args)) + exc_str = text_type(repr(e.args)) except Exception: # We don't like bare excepts - exc_str = unicode(str(e)) + exc_str = text_type(str(e)) abort(500, _(u'Unable to add package to search index.') + exc_str) except ValidationError as e: errors = e.error_dict @@ -988,9 +992,9 @@ def _save_edit(self, name_or_id, context, package_type=None): abort(400, _(u'Integrity Error')) except SearchIndexError as e: try: - exc_str = unicode(repr(e.args)) + exc_str = text_type(repr(e.args)) except Exception: # We don't like bare excepts - exc_str = unicode(str(e)) + exc_str = text_type(str(e)) abort(500, _(u'Unable to update search index.') + exc_str) except ValidationError as e: errors = e.error_dict diff --git a/ckan/controllers/revision.py b/ckan/controllers/revision.py index dd3527cc4ea..ace9cb32805 100644 --- a/ckan/controllers/revision.py +++ b/ckan/controllers/revision.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta from pylons.i18n import get_lang +from six import text_type import ckan.logic as logic import ckan.lib.base as base @@ -44,7 +45,7 @@ def list(self): title=_(u'CKAN Repository Revision History'), link=h.url_for(controller='revision', action='list', id=''), description=_(u'Recent changes to the CKAN repository.'), - language=unicode(get_lang()), + language=text_type(get_lang()), ) # TODO: make this configurable? # we do not want the system to fall over! diff --git a/ckan/controllers/storage.py b/ckan/controllers/storage.py deleted file mode 100644 index 536bef679e2..00000000000 --- a/ckan/controllers/storage.py +++ /dev/null @@ -1,98 +0,0 @@ -# encoding: utf-8 - -''' - -Note: This is the old file store controller for CKAN < 2.2. -If you are looking for how the file uploads work, you should check -`lib/uploader.py` and the `resource_download` method of the package -controller. - -''' -import os -import re - -from ofs import get_impl -from paste.fileapp import FileApp - -from ckan.lib.base import BaseController, request, config, h, abort - - -from logging import getLogger -log = getLogger(__name__) - - -BUCKET = config.get('ckan.storage.bucket', 'default') -key_prefix = config.get('ckan.storage.key_prefix', 'file/') - -_eq_re = re.compile(r"^(.*)(=[0-9]*)$") - - -def create_pairtree_marker(folder): - """ Creates the pairtree marker for tests if it doesn't exist """ - if not folder[:-1] == '/': - folder = folder + '/' - - directory = os.path.dirname(folder) - if not os.path.exists(directory): - os.makedirs(directory) - - target = os.path.join(directory, 'pairtree_version0_1') - if os.path.exists(target): - return - - open(target, 'wb').close() - - -def get_ofs(): - """Return a configured instance of the appropriate OFS driver. - """ - storage_backend = config['ofs.impl'] - kw = {} - for k, v in config.items(): - if not k.startswith('ofs.') or k == 'ofs.impl': - continue - kw[k[4:]] = v - - # Make sure we have created the marker file to avoid pairtree issues - if storage_backend == 'pairtree' and 'storage_dir' in kw: - create_pairtree_marker(kw['storage_dir']) - - ofs = get_impl(storage_backend)(**kw) - return ofs - - -class StorageController(BaseController): - '''Upload to storage backend. - ''' - _ofs_impl = None - - @property - def ofs(self): - if not StorageController._ofs_impl: - StorageController._ofs_impl = get_ofs() - return StorageController._ofs_impl - - def file(self, label): - exists = self.ofs.exists(BUCKET, label) - if not exists: - # handle erroneous trailing slash by redirecting to url w/o slash - if label.endswith('/'): - label = label[:-1] - # This may be best being cached_url until we have moved it into - # permanent storage - file_url = h.url_for('storage_file', label=label) - h.redirect_to(file_url) - else: - abort(404) - - file_url = self.ofs.get_url(BUCKET, label) - if file_url.startswith("file://"): - metadata = self.ofs.get_metadata(BUCKET, label) - filepath = file_url[len("file://"):] - headers = { - # 'Content-Disposition':'attachment; filename="%s"' % label, - 'Content-Type': metadata.get('_format', 'text/plain')} - fapp = FileApp(filepath, headers=None, **headers) - return fapp(request.environ, self.start_response) - else: - h.redirect_to(file_url.encode('ascii', 'ignore')) diff --git a/ckan/controllers/tag.py b/ckan/controllers/tag.py index e30b600fdb4..8c7614a4b51 100644 --- a/ckan/controllers/tag.py +++ b/ckan/controllers/tag.py @@ -76,5 +76,5 @@ def read(self, id): if asbool(config.get('ckan.legacy_templates', False)): return base.render('tag/read.html') else: - h.redirect_to(controller='package', action='search', + h.redirect_to('dataset.search', tags=c.tag.get('name')) diff --git a/ckan/controllers/user.py b/ckan/controllers/user.py index 33a1d454015..fc965c59c8f 100644 --- a/ckan/controllers/user.py +++ b/ckan/controllers/user.py @@ -4,6 +4,7 @@ from ckan.common import config from paste.deploy.converters import asbool +from six import text_type import ckan.lib.base as base import ckan.model as model @@ -178,7 +179,7 @@ def new(self, data=None, errors=None, error_summary=None): except NotAuthorized: abort(403, _('Unauthorized to create a user')) - if context['save'] and not data: + if context['save'] and not data and request.method == 'POST': return self._save_new(context) if c.user and not data and not authz.is_sysadmin(c.user): @@ -292,7 +293,7 @@ def edit(self, id=None, data=None, errors=None, error_summary=None): except NotAuthorized: abort(403, _('Unauthorized to edit a user.')) - if (context['save']) and not data: + if context['save'] and not data and request.method == 'POST': return self._save_edit(id, context) try: @@ -499,7 +500,7 @@ def request_reset(self): h.redirect_to('/') except mailer.MailerException as e: h.flash_error(_('Could not send reset link: %s') % - unicode(e)) + text_type(e)) return render('user/request_reset.html') def perform_reset(self, id): @@ -551,7 +552,7 @@ def perform_reset(self, id): except ValidationError as e: h.flash_error(u'%r' % e.error_dict) except ValueError as ve: - h.flash_error(unicode(ve)) + h.flash_error(text_type(ve)) user_dict['state'] = user_state c.user_dict = user_dict diff --git a/ckan/i18n/ar/LC_MESSAGES/ckan.mo b/ckan/i18n/ar/LC_MESSAGES/ckan.mo index 136a9e0e5ed..1a6bc8e22fa 100644 Binary files a/ckan/i18n/ar/LC_MESSAGES/ckan.mo and b/ckan/i18n/ar/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/ar/LC_MESSAGES/ckan.po b/ckan/i18n/ar/LC_MESSAGES/ckan.po index c5d3f2f1477..625fd45cdeb 100644 --- a/ckan/i18n/ar/LC_MESSAGES/ckan.po +++ b/ckan/i18n/ar/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Omar Isbaitan , 2018\n" "Language-Team: Arabic (https://www.transifex.com/okfn/teams/11162/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" @@ -109,6 +109,12 @@ msgstr "" #: ckanext/datastore/controller.py:58 msgid "DataStore resource not found" +msgstr "لم يتم العثور على مصدر مخزن البيانات" + +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" msgstr "" #: ckanext/datastore/backend/postgres.py:1052 @@ -116,6 +122,8 @@ msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" +"البيانات غير صالحة (على سبيل المثال: قيمة رقمية خارج النطاق أو تم إدراجها في" +" حقل نص)." #: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 #: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 @@ -150,7 +158,7 @@ msgstr "" msgid "" "The Data API can be accessed via the following actions of the CKAN action " "API." -msgstr "" +msgstr "بلإمكان الوصول لبيانات ال API عن طريق خطوات ال CKAN الخاصة بال API " #: ckanext/datastore/templates/ajax_snippets/api_info.html:42 msgid "Create" @@ -198,7 +206,11 @@ msgstr "" #: ckanext/datastore/templates/datastore/dictionary.html:16 msgid "Field {num}." -msgstr "" +msgstr "حقل {رقم} " + +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "تجاهل النوع" #: ckanext/datastore/templates/datastore/dictionary.html:18 #: ckanext/datastore/templates/package/resource_read.html:20 @@ -252,6 +264,13 @@ msgstr "" #: ckanext/datastore/templates/package/snippets/data_api_button.html:10 msgid "Data API" +msgstr "واجهة برمجة تطبيقات API البيانات" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" msgstr "" #: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 @@ -2745,6 +2764,19 @@ msgid "" "

Homepage: This is for choosing a predefined layout for " "the modules that appear on your homepage.

" msgstr "" +"

عنوان موقع الكتروني :هذا هو عنوان هذه الحالة CKAN يظهر " +"في أماكن مختلفة في جميع أنحاء CKAN.

نمط : اختر من " +"قائمة من الأشكال البسيطة لنظام الألوان الرئيسي للحصول على سمة مخصصة سريعة " +"للغاية.

Site Tag Logo: هذا هو الشعار الذي يظهر في" +" رأس كل قوالب نماذج CKAN.

حول : سيظهر هذا النص في " +"حالات CKAN هذه حول الصفحة .

نص" +" المقدمة: سيظهر هذا النص في حالات CKAN هذه الصفحة الرئيسية ترحيب بالزوار.

" +"Custom CSS: هذه كتلة من CSS تظهر في <head> " +"علامة من كل صفحة. إذا كنت ترغب في تخصيص القوالب بشكل كامل فإننا نوصي بذلك قراءة الوثائق .

" +"

الصفحة الرئيسية: هذا هو لاختيار تخطيط محدد مسبقا " +"للوحدات التي تظهر على صفحتك الرئيسية.

" #: ckan/templates/admin/confirm_reset.html:3 #: ckan/templates/admin/confirm_reset.html:10 @@ -3010,21 +3042,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3048,6 +3080,9 @@ msgid "" "organization members.

Member: Can add/remove " "datasets from groups

" msgstr "" +"

مشرف: يمكنه تعديل معلومات المجموعة ، وكذلك إدارة أعضاء " +"المؤسسة.

عضو: يمكن إضافة / إزالة جدولة البيانات من " +"المجموعات

" #: ckan/templates/group/new.html:3 ckan/templates/group/new.html:5 #: ckan/templates/group/new.html:7 @@ -3122,6 +3157,10 @@ msgid "" "particular theme, or as a very simple way to help people find and search " "your own published datasets. " msgstr "" +"يمكنك استخدام مجموعات CKAN لإنشاء مجموعات من جدولة البيانات وإدارتها. يمكن " +"أن يكون ذلك لفهرسة مجموعات البيانات لمشروع أو فريق معين ، أو لموضوع معين ، " +"أو كطريقة بسيطة جدًا لمساعدة الأشخاص في البحث عن جدولة البيانات المنشورة " +"الخاصة بك والبحث عنها." #: ckan/templates/group/snippets/history_revisions.html:10 #: ckan/templates/package/snippets/history_revisions.html:10 @@ -3200,6 +3239,24 @@ msgid "" "overview: http://ckan.org/features/

" msgstr "" +"

يعد CKAN منصة البوابة الرئيسية للبيانات المفتوحة المصدر في العالم.

" +"CKAN هو حل برمجي جاهز بالكامل يجعل الوصول إلى البيانات أمرًا قابلاً " +"للاستخدام وقابلاً للاستخدام - من خلال توفير أدوات لتبسيط النشر والمشاركة " +"وإيجاد واستخدام البيانات(بما في ذلك تخزين البيانات وتوفير بيانات قوية APIs)." +" تهدف CKAN إلى ناشري البيانات نظرة عامة على الميزات(الحكومات الوطنية " +"والإقليمية والشركات والمؤسسات) الراغبين في جعل بياناتهم مفتوحة ومتاحة.

" +"

تستخدم CKAN من قبل الحكومات ومجموعات المستخدمين في جميع أنحاء العالم " +"وتمتلك مجموعة متنوعة من بوابات البيانات الرسمية والمجتمعية بما في ذلك بوابات" +" الحكومة المحلية والوطنية والدولية ، مثل المملكة المتحدة data.gov.ukوالاتحاد الأوروبيpublicdata.euوالبرازيلdados.gov.br، بوابات الحكومة الهولندية " +"وهولندا ، فضلا عن مواقع المدينة والبلديات في الولايات المتحدة والمملكة " +"المتحدة والأرجنتين وفنلندا وغيرها.

CKAN: http://ckan.org/
CKAN Tour: http//ckan.org/toue/
نظرة عامة على " +"الميزات:http//ckan.org/features/

" #: ckan/templates/home/snippets/promoted.html:8 msgid "Welcome to CKAN" @@ -3210,6 +3267,8 @@ msgid "" "This is a nice introductory paragraph about CKAN or the site in general. We " "don't have any copy to go here yet but soon we will " msgstr "" +"هذه فقرة تمهيدية لطيفة حول CKAN أو الموقع الكتروني العام. ليس لدينا أي نسخة " +"للذهاب هنا بعد ولكن سنعمل قريبا" #: ckan/templates/home/snippets/promoted.html:19 msgid "This is a featured section" @@ -3258,6 +3317,9 @@ msgid "" "target=\"popover\" data-content=\"%(markdown_tooltip)s\" data-" "html=\"true\">Markdown formatting here" msgstr "" +"يمكنك استخدام تنسيق علامة مائلةهنا" #: ckan/templates/macros/form.html:265 msgid "This field is required" @@ -3384,6 +3446,11 @@ msgid "" "

Member: Can view the organization's private datasets, " "but not add new datasets.

" msgstr "" +"

مشرف: يمكن إضافة / تحرير وحذف جدولة البيانات ، وكذلك " +"إدارة أعضاء المؤسسة.

محرر: يمكن إضافة وتحرير جدولة " +"البيانات ، ولكن لا يمكنك إدارة أعضاء المؤسسة.

العضو:" +" يمكن عرض جدولة البيانات الخاصة للمؤسسة ، ولكن لا تضيف جدولة بيانات " +"جديدة.

" #: ckan/templates/organization/members.html:14 msgid "{count} member" @@ -3434,6 +3501,11 @@ msgid "" "individual users the right to publish datasets from that particular " "organisation (e.g. Office of National Statistics).

" msgstr "" +"

تعمل المنظمات مثل دوائر النشر لمجموعات البيانات (على سبيل المثال ، وزارة " +"الصحة). وهذا يعني أنه يمكن نشر مجموعات البيانات من قِبل قسم ما بدلاً من " +"مستخدم فردي

داخل المؤسسات ، يمكن للمشرفين تعيين أدوار وتفويض أعضائها" +" ، مما يمنح المستخدمين الفرديين الحق في نشر مجموعات البيانات من تلك المنظمة " +"المعينة (على سبيل المثال ، مكتب الإحصائيات الوطنية)

" #: ckan/templates/organization/snippets/helper.html:8 msgid "" @@ -3441,6 +3513,9 @@ msgid "" "datasets. Users can have different roles within an Organization, depending " "on their level of authorisation to create, edit and publish. " msgstr "" +"تُستخدم مؤسسات CKAN لإنشاء مجموعات من جدولة البيانات وإدارتها ونشرها. يمكن " +"أن يكون للمستخدمين أدوارًا مختلفة داخل مؤسسة ، بناءً على مستوى التفويض الخاص" +" بهم لإنشاء و تحرير ونشر." #: ckan/templates/organization/snippets/organization_form.html:10 msgid "My Organization" @@ -3456,8 +3531,8 @@ msgstr "معلومات قليلة عن منظمتي ..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -3484,6 +3559,9 @@ msgid "" "with a description and other information, at a fixed URL. Datasets are what " "users see when searching for data. " msgstr "" +"جدولة البيانات CKAN عبارة عن مجموعة من موارد البيانات (مثل الملفات) ، " +"بالإضافة إلى وصف ومعلومات أخرى ، على عنوان URL ثابت. جدولة البيانات هي ما " +"يراه المستخدمون عند البحث عن البيانات." #: ckan/templates/package/confirm_delete.html:12 msgid "Are you sure you want to delete dataset - {name}?" @@ -3568,6 +3646,10 @@ msgid "" "structured-data-the-data-explorer' target='_blank'>Data Explorer " "documentation. " msgstr "" +"قد تكون طرق عرض مستكشف البيانات بطيئة وغير موثوق بها الا إذا تم تمكين ملحق " +"مخزن البيانات , لمزيد من المعلومات, يرجى الاطلاع علىوثيقة مستكشف البيانات" #: ckan/templates/package/new_view.html:29 #: ckan/templates/package/snippets/resource_form.html:81 @@ -3580,6 +3662,8 @@ msgid "" "This is an old revision of this dataset, as edited at %(timestamp)s. It may " "differ significantly from the current revision." msgstr "" +"هذه نسخة قديمة من جدولة البيانات هذه , كما تم تعديلها على %(timestamp)s. قد " +"تختلف اختلافا كبيرا عن المراجعة الحالية" #: ckan/templates/package/resource_edit_base.html:17 msgid "All resources" @@ -3652,6 +3736,9 @@ msgid "" "or the data may not have been pushed to the DataStore, or the DataStore " "hasn't finished processing the data yet" msgstr "" +"إذا تطلبت المشاهدة استخدام مخزن البيانات ، فقد لا يتم تمكين المكوّن الإضافي " +"لـ مخزن البيانات ، أو ربما لم يتم دفع البيانات إلى مخزن البيانات ، أو لم " +"ينته مخزن البيانات من معالجة البيانات حتى الآن" #: ckan/templates/package/resource_read.html:144 msgid "Additional Information" @@ -3865,6 +3952,11 @@ msgid "" "under the Open " "Database License." msgstr "" +"ينطبق ترخيص البيانات الذي تحدده أعلاه فقط على محتويات أي ملفات موارد " +"تضيفها إلى جدولة البيانات هذه. بإرسال هذا النموذج ، فإنك توافق على إصدار " +"قيمت البيانات الوصفية التي تدخلها في النموذج تحت رخصة قاعدة البيانات " +"المفتوحة." #: ckan/templates/package/snippets/package_form.html:39 msgid "Are you sure you want to delete this dataset?" @@ -4202,6 +4294,8 @@ msgid "" "

There was an error while searching." " Please try again.

" msgstr "" +"

كان هناك خطأ أثناء البحث. حاول مرة " +"أخرى.

" #: ckan/templates/snippets/search_result_text.html:15 msgid "{number} dataset found for \"{query}\"" @@ -4373,6 +4467,7 @@ msgstr "" msgid "" " Your profile lets other CKAN users know about who you are and what you do. " msgstr "" +"يتيح ملف التعريف الخاص بك لمستخدمي CKAN الآخرين معرفة من أنت وماذا تفعل." #: ckan/templates/user/edit_user_form.html:7 msgid "Change details" @@ -4464,6 +4559,7 @@ msgstr "" #: ckan/templates/user/login.html:44 msgid "No problem, use our password recovery form to reset it." msgstr "" +"لا توجد مشكلة ، استخدم نموذج استرداد كلمة السر الخاص بنا لإعادة تعيينه." #: ckan/templates/user/login.html:47 msgid "Forgot your password?" @@ -4598,6 +4694,8 @@ msgid "" "Enter your username into the box and we will send you an email with a link " "to enter a new password." msgstr "" +"أدخل اسم المستخدم الخاص بك في المربع وسوف نرسل لك رسالة بريد إلكتروني تحتوي " +"على رابط لإدخال كلمة سر جديدة." #: ckan/templates/user/snippets/followee_dropdown.html:14 #: ckan/templates/user/snippets/followee_dropdown.html:15 diff --git a/ckan/i18n/bg/LC_MESSAGES/ckan.mo b/ckan/i18n/bg/LC_MESSAGES/ckan.mo index 62128d564ab..03ba0a4af89 100644 Binary files a/ckan/i18n/bg/LC_MESSAGES/ckan.mo and b/ckan/i18n/bg/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/bg/LC_MESSAGES/ckan.po b/ckan/i18n/bg/LC_MESSAGES/ckan.po index 46195731f1e..6c1a9050e54 100644 --- a/ckan/i18n/bg/LC_MESSAGES/ckan.po +++ b/ckan/i18n/bg/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Ivaylo Petrov, 2018\n" "Language-Team: Bulgarian (https://www.transifex.com/okfn/teams/11162/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Ресурсът от DataStore хранилището не е намерен" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -208,7 +214,7 @@ msgstr "" #: ckanext/datastore/templates/package/resource_read.html:20 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" -msgstr "" +msgstr "Етикет" #: ckan/templates/group/snippets/group_form.html:20 #: ckan/templates/organization/snippets/organization_form.html:20 @@ -233,11 +239,11 @@ msgstr "" #: ckanext/datastore/templates/package/resource_read.html:18 #: ckanext/datatablesview/templates/datatables/datatables_form.html:17 msgid "Column" -msgstr "" +msgstr "Колона" #: ckanext/datastore/templates/package/resource_read.html:19 msgid "Type" -msgstr "" +msgstr "Тип" #: ckan/public/base/javascript/modules/activity-stream.js:97 #: ckan/public/base/javascript/modules/popover-context.js:62 @@ -258,21 +264,28 @@ msgstr "Зареждане...." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 -msgid "Table" +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" msgstr "" +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 +msgid "Table" +msgstr "Таблица" + #: ckanext/datatablesview/templates/datatables/datatables_form.html:6 msgid "Responsive display" -msgstr "" +msgstr "Адаптивно изобразяване" #: ckanext/datatablesview/templates/datatables/datatables_form.html:12 msgid "Show Columns" -msgstr "" +msgstr "Покажи колони" #: ckanext/datatablesview/templates/datatables/datatables_view.html:28 msgid "Hide/Unhide Columns" -msgstr "" +msgstr "Покажи/Скрий колони" #: ckanext/example_iconfigurer/templates/admin/config.html:11 msgid "Datasets per page" @@ -280,7 +293,7 @@ msgstr "" #: ckanext/example_iconfigurer/templates/admin/config.html:13 msgid "Test conf" -msgstr "" +msgstr "Тестова конфигурация" #: ckan/templates/group/read.html:15 ckan/templates/organization/read.html:19 #: ckan/templates/package/search.html:29 @@ -1276,7 +1289,7 @@ msgstr "" #: ckan/controllers/user.py:386 msgid "incorrect password" -msgstr "" +msgstr "грешна парола" #: ckan/controllers/user.py:427 msgid "Login failed. Bad username or password." @@ -2545,7 +2558,7 @@ msgstr "" #: ckan/public/base/javascript/modules/resource-view-filters.js:9 #: ckan/templates/package/snippets/view_form_filters.html:16 msgid "Add Filter" -msgstr "" +msgstr "Добави филтър " #: ckan/public/base/javascript/modules/resource-view-filters.js:52 msgid "Select a field" @@ -3016,21 +3029,21 @@ msgstr "Ако желаете да поканите потребител, във #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Роля" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Сигурни ли сте, че искате да изтриете този член?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3499,8 +3512,8 @@ msgstr "Малко информация за моята организация.. #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Сигурни ли сте, че искате да изтриете тази организация? Това действие ще " "изтрие всички публични и частни набори от данни, принадлежащи на тази " @@ -4662,3 +4675,7 @@ msgstr "Няма последователи" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Търсене на потребители" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/ca/LC_MESSAGES/ckan.mo b/ckan/i18n/ca/LC_MESSAGES/ckan.mo index 15b179dc366..d163beae5e2 100644 Binary files a/ckan/i18n/ca/LC_MESSAGES/ckan.mo and b/ckan/i18n/ca/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/ca/LC_MESSAGES/ckan.po b/ckan/i18n/ca/LC_MESSAGES/ckan.po index c4ff64a1397..246709b3741 100644 --- a/ckan/i18n/ca/LC_MESSAGES/ckan.po +++ b/ckan/i18n/ca/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Catalan (https://www.transifex.com/okfn/teams/11162/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,15 @@ msgstr "format: ha de ser un de %s" msgid "DataStore resource not found" msgstr "Recurs de la DataStore no trobat" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"S'ha desat el diccionari de dades. Qualsevol nou canvi de tipus de camp " +"tindrà efecte el proper cop que el recurs es pugi a la DataStore" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -145,9 +153,9 @@ msgid "" "href=\"http://docs.ckan.org/en/latest/maintaining/datastore.html\" " "target=\"_blank\">main CKAN Data API and DataStore documentation.

" msgstr "" -"Més informació a la documentació de la API de dades i la DataStore.

" +"target=\"_blank\">documentació de la DataStore i API de dades .

" #: ckanext/datastore/templates/ajax_snippets/api_info.html:33 msgid "Endpoints" @@ -209,8 +217,14 @@ msgstr "Exemple: Python" msgid "Field {num}." msgstr "Camp {num}" -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Substitució de tipus de camp" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" msgstr "Etiqueta" @@ -263,7 +277,17 @@ msgstr "Carregant..." msgid "Data API" msgstr "API de dades" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Més informació a la documentació de la API de dades i la DataStore.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Taula" @@ -983,7 +1007,12 @@ msgstr "%s ha sigut esborrat." msgid "User %r not authorized to edit members of %s" msgstr "Usuari %r no autoritzat per a editar els membres de %s" -#: ckan/controllers/group.py:705 +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "No autoritzat a crear membres per al grup %s" + +#: ckan/controllers/group.py:712 #, python-format msgid "Unauthorized to add member to group %s" msgstr "No teniu autorització per a afegir un membre al grup %s" @@ -1845,7 +1874,11 @@ msgstr "Els noms d'usuari han de ser cadenes de text" msgid "That login name is not available." msgstr "Aquest nom de registre no es troba disponible." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "No es pot modificar el nom d'usuari." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "Si us plau, introduïu les dues contrasenyes" @@ -1853,9 +1886,9 @@ msgstr "Si us plau, introduïu les dues contrasenyes" msgid "Passwords must be strings" msgstr "Les contrasenyes han de ser cadenes de text" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "La vostra contrasenya ha de tenir 4 caràcters o més" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "La vostra contrasenya ha de tenir 8 o més caràcters" #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" @@ -2033,8 +2066,12 @@ msgstr "API REST: Esborrat %s" msgid "REST API: Delete Member: %s" msgstr "API REST: Esborrar el membre: %s" -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "No es pot eliminar l'organització si encara té conjunts de dades" + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" msgstr "id no present a les dades" @@ -2594,6 +2631,99 @@ msgstr "Mostra més" msgid "Hide" msgstr "Oculta" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "foo" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "no translation" +msgstr[1] "no translations" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "hola %(name)s!" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "no %(attr)s translation" +msgstr[1] "no %(attr)s translations" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "bar" +msgstr[1] "bars" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "%(color)s shirt" +msgstr[1] "%(color)s shirts" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)d item" +msgstr[1] "%(num)d items" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)d missing translation" +msgstr[1] "%(num)d missing translations" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -3041,21 +3171,21 @@ msgstr "Si voleu convidar un nou usuari, introduïu el seu correu electrònic. " #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rol" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Segur que voleu eliminar aquest membre?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3282,6 +3412,10 @@ msgstr "p.ex. medi ambient" msgid "Search data" msgstr "Cercar dades" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Cercar conjunts de dades" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Etiquetes freqüents" @@ -3531,11 +3665,12 @@ msgstr "Una mica d'informació sobre la meva organització..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" -"Esteu segurs que voleu eliminar aquesta organització? Això eliminarà tots " -"els seus conjunts de dades, tant públics com privats." +"Esteu segurs que voleu esborrar aquesta organització? Atenció: no es pot " +"eliminar un organització mentre contingui conjunts de dades, públics o " +"privats." #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -4095,7 +4230,11 @@ msgstr "Explora" msgid "More information" msgstr "Més informació" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Pantalla sencera" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Incrustar" @@ -4634,7 +4773,11 @@ msgstr "Reinicia la teva contrasenya" msgid "Password Reset" msgstr "Reinicia la contrasenya" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "Podeu canviar el nom d'usuari. No es pot modificar més endavant." + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "Modifica la contrasenya" @@ -4717,3 +4860,7 @@ msgstr "Cap seguidor" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Cercar usuaris" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "La vostra contrasenya ha de tenir 8 o més caràcters." diff --git a/ckan/i18n/check_po_files.py b/ckan/i18n/check_po_files.py index 29adae7530f..ea0d58bba81 100755 --- a/ckan/i18n/check_po_files.py +++ b/ckan/i18n/check_po_files.py @@ -58,13 +58,13 @@ class CheckPoFiles(paste.script.command.Command): def command(self): for path in self.args: - print u'Checking file {}'.format(path) + print(u'Checking file {}'.format(path)) errors = check_po_file(path) if errors: for msgid, msgstr in errors: - print 'Format specifiers don\'t match:' - print u' {0} -> {1}'.format( - msgid, msgstr.encode('ascii', 'replace')) + print("Format specifiers don't match:") + print(u' {0} -> {1}'.format( + msgid, msgstr.encode('ascii', 'replace'))) def check_po_file(path): diff --git a/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.mo b/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.mo index 94eecce8080..3150fc2d820 100644 Binary files a/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.mo and b/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.po b/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.po index 1b2b088b919..6cab0b8d37c 100644 --- a/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.po +++ b/ckan/i18n/cs_CZ/LC_MESSAGES/ckan.po @@ -1,23 +1,23 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Jakub Klímek , 2017\n" +"Last-Translator: Jakub Klímek , 2018\n" "Language-Team: Czech (Czech Republic) (https://www.transifex.com/okfn/teams/11162/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: cs_CZ\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" #: ckanext/datapusher/helpers.py:21 msgid "Complete" @@ -111,7 +111,15 @@ msgstr "formát: musí být jeden z: %s" msgid "DataStore resource not found" msgstr "Požadovaný zdroj z DataStore nebyl nalezen" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Datový slovník uložen. Veškeré změny typů budou uplatněny při dalším nahrání" +" zdroje do DataStore" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -145,9 +153,10 @@ msgid "" "href=\"http://docs.ckan.org/en/latest/maintaining/datastore.html\" " "target=\"_blank\">main CKAN Data API and DataStore documentation.

" msgstr "" -"Další informace naleznete v dokumentaci pro datové CKAN API a DataStore.

" +"target=\"_blank\"> a v dokumentaci DataStore .

" #: ckanext/datastore/templates/ajax_snippets/api_info.html:33 msgid "Endpoints" @@ -211,8 +220,14 @@ msgstr "Příklad: Python" msgid "Field {num}." msgstr "Pole {num}." -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Změna typu" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" msgstr "Název" @@ -265,7 +280,17 @@ msgstr "Nahrávám..." msgid "Data API" msgstr "Datové API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Další informace naleznete v dokumentaci pro datové CKAN API a DataStore.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabulka" @@ -383,6 +408,7 @@ msgid_plural "{num} Datasets" msgstr[0] "{num} dataset" msgstr[1] "{num} datasety" msgstr[2] "{num} datových sad" +msgstr[3] "{num} datových sad" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -981,7 +1007,12 @@ msgstr "Skupina %s byla smazána." msgid "User %r not authorized to edit members of %s" msgstr "Uživatel %r nemá oprávnění měnit členy %s" -#: ckan/controllers/group.py:705 +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "Nemáte oprávnění vytvářet členy skupiny %s" + +#: ckan/controllers/group.py:712 #, python-format msgid "Unauthorized to add member to group %s" msgstr "Nemáte oprávnění přidat člena do skupiny %s" @@ -1462,6 +1493,7 @@ msgid_plural "{n} new activities from {site_title}" msgstr[0] "{n} nová aktivita z {site_title}" msgstr[1] "{n} nové aktivity z {site_title}" msgstr[2] "{n} nových aktivit z {site_title}" +msgstr[3] "{n} nových aktivit z {site_title}" #: ckan/lib/formatters.py:19 msgid "January" @@ -1521,6 +1553,7 @@ msgid_plural "{mins} minutes ago" msgstr[0] "před {mins} minutou" msgstr[1] "před {mins} minutami" msgstr[2] "před {mins} minutami" +msgstr[3] "před {mins} minutami" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" @@ -1528,6 +1561,7 @@ msgid_plural "{hours} hours ago" msgstr[0] "před {hours} hodinou" msgstr[1] "před {hours} hodinami" msgstr[2] "před {hours} hodinami" +msgstr[3] "před {hours} hodinami" #: ckan/lib/formatters.py:125 msgid "{days} day ago" @@ -1535,6 +1569,7 @@ msgid_plural "{days} days ago" msgstr[0] "před {days} dnem" msgstr[1] "před {days} dny" msgstr[2] "před {days} dny" +msgstr[3] "před {days} dny" #: ckan/lib/formatters.py:128 msgid "{months} month ago" @@ -1542,6 +1577,7 @@ msgid_plural "{months} months ago" msgstr[0] "před {months} měsícem" msgstr[1] "před {months} měsíci" msgstr[2] "před {months} měsíci" +msgstr[3] "před {months} měsíci" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" @@ -1549,6 +1585,7 @@ msgid_plural "over {years} years ago" msgstr[0] "před více než {years} rokem" msgstr[1] "před více než {years} roky" msgstr[2] "před více než {years} roky" +msgstr[3] "před více než {years} roky" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1644,6 +1681,7 @@ msgid_plural "{number} views" msgstr[0] "{number} shlédnutí" msgstr[1] "{number} shlédnutí" msgstr[2] "{number} shlédnutí" +msgstr[3] "{number} shlédnutí" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" @@ -1651,6 +1689,7 @@ msgid_plural "{number} recent views" msgstr[0] "{number} nedávné shlédnutí" msgstr[1] "{number} nedávné shlédnutí" msgstr[2] "{number} nedávných shlédnutí" +msgstr[3] "{number} nedávných shlédnutí" #: ckan/lib/mailer.py:39 #, python-format @@ -1844,7 +1883,11 @@ msgstr "Uživatelská jména musí být textové řetězece" msgid "That login name is not available." msgstr "Toto přihlašovací jméno není k dispozici." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "Toto přihlašovací jméno nelze změnit." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "Zadejte prosím obě hesla" @@ -1852,9 +1895,9 @@ msgstr "Zadejte prosím obě hesla" msgid "Passwords must be strings" msgstr "Heslo musí být textový řetězec" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "Heslo musí mít alespoň 4 znaky" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "Vaše heslo musí mít alespoň 8 znaků." #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" @@ -2031,8 +2074,12 @@ msgstr "REST API: Smazat %s" msgid "REST API: Delete Member: %s" msgstr "REST API: Smazat člena: %s" -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "Organizace nemůže být smazána dokud obsahuje datové sady" + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" msgstr "data neobsahují id" @@ -2434,6 +2481,7 @@ msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "Vstup je příliš krátky, musí mít alespoň jeden znak" msgstr[1] "Vstup je příliš krátky, musí mít alespoň %(num)d znaky" msgstr[2] "Vstup je příliš krátky, musí mít alespoň %(num)d znaků" +msgstr[3] "Vstup je příliš krátky, musí mít alespoň %(num)d znaků" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2586,6 +2634,111 @@ msgstr "Ukázat více" msgid "Hide" msgstr "Skrýt" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "něco" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "žádný překlad" +msgstr[1] "žádné překlady" +msgstr[2] "žádné překlady" +msgstr[3] "žádné překlady" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "Vítejte %(name)s!" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "chybí překlad %(attr)s" +msgstr[1] "chybí překlady %(attr)s" +msgstr[2] "chybí překlady %(attr)s" +msgstr[3] "chybí překlady %(attr)s" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "něco" +msgstr[1] "něco" +msgstr[2] "něco" +msgstr[3] "něco" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "%(color)s košile" +msgstr[1] "%(color)s košile" +msgstr[2] "%(color)s košil" +msgstr[3] "%(color)s košil" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)d položka" +msgstr[1] "%(num)d položky" +msgstr[2] "%(num)d položek" +msgstr[3] "%(num)d položek" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)d chybějící překlad" +msgstr[1] "%(num)d chybějící překlady" +msgstr[2] "%(num)d chybějících překladů" +msgstr[3] "%(num)d chybějících překladů" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2626,6 +2779,7 @@ msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "Přehled (%(num)d nová položka)" msgstr[1] "Přehled (%(num)d nové položky)" msgstr[2] "Přehled (%(num)d nových položek)" +msgstr[3] "Přehled (%(num)d nových položek)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -3033,21 +3187,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Role" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Jste si jist, že chcete smazat tohoto člena?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3275,6 +3429,10 @@ msgstr "Např. prostředí" msgid "Search data" msgstr "Hledat data" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Vyhledat datové sady" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Populární tagy" @@ -3451,6 +3609,7 @@ msgid_plural "{count} members" msgstr[0] "{count} člen" msgstr[1] "{count} členové" msgstr[2] "{count} členů" +msgstr[3] "{count} členů" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3523,11 +3682,11 @@ msgstr "Stručné informace o mé organizaci" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" -"Opravdu chcete smazat tuto organizaci? Smažete tak veškeré soukromé a " -"veřejné datové sady, které k ní náleží." +"Opravdu chcete smazat tuto organizaci? Poznámka*: Smazání nemůže proběhnout " +"dokud do této organizace patří veřejné či soukromé datové sady." #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -4085,7 +4244,11 @@ msgstr "Prozkoumat" msgid "More information" msgstr "Více informací" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Na celou obrazovku" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Zakomponovat" @@ -4316,6 +4479,7 @@ msgid_plural "{number} datasets found for \"{query}\"" msgstr[0] "{number} dataset nalezen na dotaz \"{query}\"" msgstr[1] "{number} datasety nalezeny na dotaz \"{query}\"" msgstr[2] "{number} datasetů nalezeno na dotaz \"{query}\"" +msgstr[3] "{number} datasetů nalezeno na dotaz \"{query}\"" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4327,6 +4491,7 @@ msgid_plural "{number} datasets found" msgstr[0] "{number} dataset nalezen" msgstr[1] "{number} datasety nalezeny" msgstr[2] "{number} datových sad nalezeno" +msgstr[3] "{number} datových sad nalezeno" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4338,6 +4503,7 @@ msgid_plural "{number} groups found for \"{query}\"" msgstr[0] "{number} nalezena na dotaz \"{query}\"" msgstr[1] "{number} nalezeny na dotaz \"{query}\"" msgstr[2] "{number} skupin nalezeno na dotaz \"{query}\"" +msgstr[3] "{number} skupin nalezeno na dotaz \"{query}\"" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4349,6 +4515,7 @@ msgid_plural "{number} groups found" msgstr[0] "{number} skupina nalezena" msgstr[1] "{number} skupiny nalezeny" msgstr[2] "{number} skupin nalezeno" +msgstr[3] "{number} skupin nalezeno" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4360,6 +4527,7 @@ msgid_plural "{number} organizations found for \"{query}\"" msgstr[0] "{number} organizace nalezena na dotaz \"{query}\"" msgstr[1] "{number} organizace nalezeny na dotaz \"{query}\"" msgstr[2] "{number} organizací nalezeno na dotaz \"{query}\"" +msgstr[3] "{number} organizací nalezeno na dotaz \"{query}\"" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4371,6 +4539,7 @@ msgid_plural "{number} organizations found" msgstr[0] "{number} organizace nalezena" msgstr[1] "{number} organizace nalezeny" msgstr[2] "{number} organizací nalezeno" +msgstr[3] "{number} organizací nalezeno" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4632,7 +4801,11 @@ msgstr "Resetovat heslo" msgid "Password Reset" msgstr "Resetovat heslo" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "Také můžete změnit uživatelské jméno. Později už to nepůjde." + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "Změnit heslo" @@ -4714,3 +4887,7 @@ msgstr "Žádní sledující" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Vyhledat uživatele" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "Vaše heslo musí mít alespoň 8 znaků." diff --git a/ckan/i18n/da_DK/LC_MESSAGES/ckan.mo b/ckan/i18n/da_DK/LC_MESSAGES/ckan.mo index f6a371aa9bc..398cc6d9464 100644 Binary files a/ckan/i18n/da_DK/LC_MESSAGES/ckan.mo and b/ckan/i18n/da_DK/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/da_DK/LC_MESSAGES/ckan.po b/ckan/i18n/da_DK/LC_MESSAGES/ckan.po index e622ec12aed..23490fe1319 100644 --- a/ckan/i18n/da_DK/LC_MESSAGES/ckan.po +++ b/ckan/i18n/da_DK/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Danish (Denmark) (https://www.transifex.com/okfn/teams/11162/da_DK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: da_DK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "DataStore-ressourcen ikke fundet" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "Loading..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -2990,21 +3003,21 @@ msgstr "Hvis du vil invitere en ny bruger, indtast dennes e-mail-adresse." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rolle" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Er du sikker på, at du vil slette dette medlem?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3467,8 +3480,8 @@ msgstr "Lidt information om min organisation..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Er du sikker på, du vil slette denne organisation? Dette vil slette alle " "offentlige og private datasæt, der tilhører denne organisation." @@ -4626,3 +4639,7 @@ msgstr "Ingen følgere" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Søg efter brugere" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/de/LC_MESSAGES/ckan.mo b/ckan/i18n/de/LC_MESSAGES/ckan.mo index 0059c5037b6..5a979139d99 100644 Binary files a/ckan/i18n/de/LC_MESSAGES/ckan.mo and b/ckan/i18n/de/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/de/LC_MESSAGES/ckan.po b/ckan/i18n/de/LC_MESSAGES/ckan.po index e41d12b22e6..c05eb1bb89a 100644 --- a/ckan/i18n/de/LC_MESSAGES/ckan.po +++ b/ckan/i18n/de/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Ondics Githubler , 2017\n" +"Last-Translator: Ondics Githubler, 2018\n" "Language-Team: German (https://www.transifex.com/okfn/teams/11162/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,15 @@ msgstr "Das Format muss eines der folgenden sein: %s" msgid "DataStore resource not found" msgstr "DataStore Ressource nicht gefunden" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Das Data Dictionary wurde gespeichert. Typ-Änderungen werden wirksam, wenn " +"die Ressource in den DataStore hochgeladen wird." + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -210,8 +218,14 @@ msgstr "Beispiel: Python" msgid "Field {num}." msgstr "Feld {num}." -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Typ-Überschreibung" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" msgstr "Bezeichnung" @@ -264,7 +278,18 @@ msgstr "Lädt..." msgid "Data API" msgstr "Daten-API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Weiterführende Information in der zentralen CKAN Data API und DataStore " +"Dokumentation.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabelle" @@ -862,15 +887,16 @@ msgid "Request params must be in form of a json encoded dictionary." msgstr "" "Die Anfrageparameter müssen in der Form eines JSON-kodierten Objekts sein." -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Gruppe nicht gefunden" @@ -981,6 +1007,11 @@ msgid "User %r not authorized to edit members of %s" msgstr "" "Benutzer %r hat keine Berechtigung die Mitglieder von %s zu bearbeiten" +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "Keine Berechtigung, um Gruppenmitglieder %szuerstellen" + #: ckan/controllers/group.py:705 #, python-format msgid "Unauthorized to add member to group %s" @@ -1839,7 +1870,11 @@ msgstr "Benutzernamen müssen Zeichenketten/Strings sein" msgid "That login name is not available." msgstr "Der Anmeldename ist nicht verfügbar." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "Dieser Benutzernamen kann nicht geändert werden." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "Bitte beide Passwörter angebens" @@ -1847,9 +1882,9 @@ msgstr "Bitte beide Passwörter angebens" msgid "Passwords must be strings" msgstr "Kennworte müssen Zeichenketten/Strings sein" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "Ihr Passwort muss mindestens 4 Zeichen lang sein" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "Das Kennwort muss mindestens 8 Zeichen enthalten." #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" @@ -2028,8 +2063,14 @@ msgstr "REST API: Entfernen %s" msgid "REST API: Delete Member: %s" msgstr "REST API: Entferne Mitglied: %s" -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "" +"Die Organisation kann nicht gelöscht werden, solange ihr noch Datensätze " +"zugeordnet sind." + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" msgstr "ID nicht in Daten enthalten" @@ -2593,6 +2634,99 @@ msgstr "Mehr anzeigen" msgid "Hide" msgstr "Verstecken" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "foo" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "keine Übersetzung" +msgstr[1] "keine Übersetzungen" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "Hallo %(name)s!" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "Keine Übersetzung für \"%(attr)s\"" +msgstr[1] "Keine Übersetzungen für \"%(attr)s\"" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "bar" +msgstr[1] "bars" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "%(color)s Hemd" +msgstr[1] "%(color)s Hemden" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)d Stück" +msgstr[1] "%(num)d Stücke" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)d fehlende Übersetzung" +msgstr[1] "%(num)d fehlende Übersetzungen" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -3040,21 +3174,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rolle" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Sind Sie sicher, dass Sie dieses Mitglied löschen wollen?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3282,6 +3416,10 @@ msgstr "z.B. Umwelt" msgid "Search data" msgstr "Suchdaten" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Datensatz-Suche" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Beliebte Tags" @@ -3530,11 +3668,12 @@ msgstr "Ein paar Informationen zu meiner Organisation..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" -"Soll diese Organisation wirklich gelöscht werden? Dieser Vorgang wird auch " -"alle öffentlichen und privaten Datensätze dieser Organisation löschen." +"Soll diese Organisation wirklich gelöscht werden? Hinweis*: Das Löschen kann" +" nicht ausgeführt werden, solange öffentliche oder private Datensätze zu " +"dieser Organisation gehören." #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -4098,7 +4237,11 @@ msgstr "Entdecke" msgid "More information" msgstr "Mehr Information" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Vollbildschirm" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Einbettung" @@ -4640,7 +4783,11 @@ msgstr "Passwort zurücksetzen" msgid "Password Reset" msgstr "Passwort zurücksetzen" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "Der Benutzername kann auch geändert werden. Später nicht mehr." + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "Passwort aktualisieren" @@ -4724,3 +4871,7 @@ msgstr "Keine Follower" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Suche Nutzer" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "Das Kennwort muss mindestens 8 Zeichen enthalten." diff --git a/ckan/i18n/el/LC_MESSAGES/ckan.mo b/ckan/i18n/el/LC_MESSAGES/ckan.mo index b085690a181..c3c6ae6f735 100644 Binary files a/ckan/i18n/el/LC_MESSAGES/ckan.mo and b/ckan/i18n/el/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/el/LC_MESSAGES/ckan.po b/ckan/i18n/el/LC_MESSAGES/ckan.po index d3c6fa87238..c5712f04672 100644 --- a/ckan/i18n/el/LC_MESSAGES/ckan.po +++ b/ckan/i18n/el/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Sotirios Karampatakis , 2018\n" "Language-Team: Greek (https://www.transifex.com/okfn/teams/11162/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -113,13 +113,22 @@ msgstr "Δεν βρέθηκε ο πόρος DataStore" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Το Λεξικό Δεδομένων αποθηκεύτηκε. Οποιαδήποτε παράκαμψη τύπου θα έχει " +"επίδραση όταν ο πόρος μεταφορτωθεί στο DataStore. " + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" +"Τα δεδομένα ήταν μη έγκυρα (για παράδειγμα: μία αριθμητική τιμή ήταν εκτός " +"ορίων ή καταχωρήθηκε σε πεδίο κειμένου)." -#: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 -#: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 -#: ckanext/datastore/logic/action.py:534 ckanext/datastore/logic/action.py:559 +#: ckanext/datastore/logic/action.py:258 ckanext/datastore/logic/action.py:286 +#: ckanext/datastore/logic/action.py:344 ckanext/datastore/logic/action.py:457 msgid "Resource \"{0}\" was not found." msgstr "Ο πόρος \"{0}\" δεν βρέθηκε." @@ -143,6 +152,10 @@ msgid "" "href=\"http://docs.ckan.org/en/latest/maintaining/datastore.html\" " "target=\"_blank\">main CKAN Data API and DataStore documentation.

" msgstr "" +" Περισσότερες πληροφορίες στην κεντρική τεκμηρίωση του CKAN Data API και του " +"DataStore.

" #: ckanext/datastore/templates/ajax_snippets/api_info.html:33 msgid "Endpoints" @@ -203,7 +216,11 @@ msgstr "Παράδειγμα: Python" #: ckanext/datastore/templates/datastore/dictionary.html:16 msgid "Field {num}." -msgstr "" +msgstr "Πεδίο {num}" + +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Παράκαμψη τύπου" #: ckanext/datastore/templates/datastore/dictionary.html:18 #: ckanext/datastore/templates/package/resource_read.html:20 @@ -259,7 +276,18 @@ msgstr "Φορτώνει...." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Περισσότερες πληροφορίες στην κεντρική τεκμηρίωση του CKAN Data API και του DataStore " +".

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Πίνακας" @@ -974,6 +1002,12 @@ msgstr "%s έχει διαγραφεί." #, python-format msgid "User %r not authorized to edit members of %s" msgstr "" +"Ο χρήστης %r δεν είναι εξουσιοδοτημένος να επεξεργάζεται τα μέλη του %s" + +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "Μη εξουσιοδοτημένος για τη δημιουργία μελών της ομάδας %s" #: ckan/controllers/group.py:705 #, python-format @@ -1069,6 +1103,8 @@ msgstr "Μη έγκυρη μορφή αναθεώρησης:%r" #: ckan/controllers/package.py:396 msgid "Viewing datasets of type \"{package_type}\" is not supported ({file_!r})." msgstr "" +"Η προβολή συνόλων δεδομένων του τύπου \"{package_type}\" δεν υποστηρίζεται " +"({file_!r})." #: ckan/controllers/package.py:435 ckan/controllers/package.py:817 #: ckan/controllers/package.py:918 ckan/controllers/package.py:966 @@ -1775,6 +1811,8 @@ msgid "" "Must be purely lowercase alphanumeric (ascii) characters and these symbols: " "-_" msgstr "" +"Πρέπει να αποτελείται μόνο από πεζούς αλφαρηθμητικούς χαρακτήρες (ascii) και" +" αυτά τα σύμβολα: -_" #: ckan/logic/validators.py:361 msgid "That URL is already in use." @@ -1834,7 +1872,11 @@ msgstr "Τα ονόματα χρηστών πρέπει να αποτελούν msgid "That login name is not available." msgstr "Αυτό το όνομα σύνδεσης δεν είναι διαθέσιμο." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "Αυτό το όνομα σύνδεσης δεν μπορεί να τροποποιηθεί." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "Παρακαλώ εισάγετε και τους δύο κωδικούς πρόσβασης" @@ -1842,11 +1884,9 @@ msgstr "Παρακαλώ εισάγετε και τους δύο κωδικού msgid "Passwords must be strings" msgstr "Οι κωδικοί πρόσβασης πρέπει να αποτελούνται από αλφαριθμητικά" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "" -"Ο κωδικός πρόσβασής σας θα πρέπει να αποτελείται από 4 τουλάχιστον " -"χαρακτήρες" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "Ο κωδικός πρόσβασής σας πρέπει αν έχει τουλάχιστον 8 χαρακτήρες." #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" @@ -2025,8 +2065,14 @@ msgstr "REST API: Διαγραφή %s" msgid "REST API: Delete Member: %s" msgstr "REST API: Διαγραφή Μέλους: %s" -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "" +"Ο οργανισμός δεν μπορεί να διαγραφεί όσο υπάρχουν ακόμα σύνολα δεδομένων που" +" του ανήκουν." + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" msgstr "όχι id στα δεδομένα" @@ -2447,6 +2493,7 @@ msgstr "Δεν βρέθηκε" msgid "Input is too short, must be at least one character" msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "" +"Η καταχώρηση είναι πολύ μικρή, πρέπει να είναι τουλάχιστον ένας χαρακτήρας" msgstr[1] "" #: ckan/public/base/javascript/modules/basic-form.js:4 @@ -2569,6 +2616,8 @@ msgid "" "You are uploading a file. Are you sure you want to navigate away and stop " "this upload?" msgstr "" +"Αυτή τη στιγμή μεταφορτώνετε ένα αρχείο. Είσαστε σίγουρος/η ό,τι θέλετε να " +"μεταβείτε σε άλλη σελίδα και να διακόψετε τη μεταφόρτωση;" #: ckan/public/base/javascript/modules/resource-view-filters.js:9 #: ckan/templates/package/snippets/view_form_filters.html:16 @@ -2600,6 +2649,99 @@ msgstr "Προβολή περισσοτέρων" msgid "Hide" msgstr "Απόκρυψη" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "foo" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "καμία μετάφραση" +msgstr[1] "χωρίς μεταφράσεις" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "Γειά σου %(name)s!" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "Δεν υπάρχει μετάφραση του %(attr)s" +msgstr[1] "Δεν υπάρχουν μεταφράσεις του %(attr)s" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "μπάρα" +msgstr[1] "μπάρες" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "%(color)s πουκάμισο" +msgstr[1] "%(color)s πουκάμισα" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)d αντικείμενο" +msgstr[1] "%(num)d αντικείμενα" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)d υπολειπόμενη μετάφραση" +msgstr[1] "%(num)d υπολειπόμενες μεταφράσεις" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2694,7 +2836,7 @@ msgstr "Αναζήτηση" #: ckan/templates/page.html:6 msgid "Skip to content" -msgstr "" +msgstr "Μεταπήδηση στο περιεχόμενο" #: ckan/templates/activity_streams/activity_stream_items.html:9 msgid "Load less" @@ -3046,21 +3188,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Ρόλος" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Είστε σίγουροι ότι θέλετε να διαγράψετε το μέλος;" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3293,6 +3435,10 @@ msgstr "Π.χ. Περιβάλλον" msgid "Search data" msgstr "Αναζήτηση δεδομένων" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Αναζήτησε σύνολα δεδομένων" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Δημοφιλείς Ετικέτες" @@ -3542,12 +3688,12 @@ msgstr "Λίγες πληροφορίες σχετικά με τον φορέα. #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" -"Είστε σίγουροι ότι θέλετε να διαγράψετε αυτόν το Φορέα; Με αυτή την ενέργεια" -" θα διαγραφούν όλα τα δημόσια και ιδιωτικά σύνολα δεδομένων που ανήκουν σε " -"αυτόν." +"Είσαι σίγουρος ότι θέλεις να διαγράψεις αυτό τον Οργανισμό; Σημείωση*: Η " +"διαγραφή Οργανισμού δεν μπορεί αν εκτελεστεί ενόσω δημόσια ή ιδιωτικά σύνολα" +" δεδομένων ανήκουν στον Οργανισμό. " #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -3662,6 +3808,12 @@ msgid "" "structured-data-the-data-explorer' target='_blank'>Data Explorer " "documentation. " msgstr "" +"Οι οπτικοποιήσεις του Data Explorer μπορεί να είναι αργές και αναξιόπιστες, " +"εκτός εάν η επέκταση DataStore είναι ενεργοποιημένη. Για περισσότερες " +"πληροφορίες, παρακαλώ συμβουλευτείτε την τεκμηρίωση του Data " +"Explorer . " #: ckan/templates/package/new_view.html:29 #: ckan/templates/package/snippets/resource_form.html:81 @@ -3745,6 +3897,8 @@ msgstr "" #: ckan/templates/package/resource_read.html:121 msgid "The site administrators may not have enabled the relevant view plugins" msgstr "" +"Ο διαχειριστής της ιστοσελίδας μπορεί να μην έχει ενεργοποιήσει τα σχετικά " +"πρόσθετα οπτικοποιήσεων. " #: ckan/templates/package/resource_read.html:122 msgid "" @@ -3775,7 +3929,7 @@ msgstr "Τιμή" #: ckan/templates/package/resource_read.html:154 msgid "Data last updated" -msgstr "" +msgstr "Προσφάτως ενημερωμένα δεδομένα" #: ckan/templates/package/resource_read.html:155 #: ckan/templates/package/resource_read.html:159 @@ -3786,7 +3940,7 @@ msgstr "Άγνωστος" #: ckan/templates/package/resource_read.html:158 msgid "Metadata last updated" -msgstr "" +msgstr "Προσφάτως ενημερωμένα μεταδεδομένα" #: ckan/templates/package/resource_read.html:162 #: ckan/templates/package/snippets/additional_info.html:70 @@ -3824,6 +3978,8 @@ msgid "" "

This dataset has no data, why not " "add some?

" msgstr "" +"

Αυτό το σύνολο δεδομένων δεν περιέχει δεδομένα, γιατί δεν προσθέτεις κάποια;

" #: ckan/templates/package/search.html:52 msgid "API" @@ -3980,6 +4136,12 @@ msgid "" "under the Open " "Database License." msgstr "" +"Η Άδεια Χρήσης Δεδομένων που επέλεξες παραπάνω, έχει ισχύ μόνο στα " +"περιεχόμενα οποιουδήποτε αρχείου πόρου που προσθέτεις στο σύνολο δεδομένων. " +"Καταθέτοντας αυτή την φόρμα, συμφωνείς στη διάθεση των μεταδεδομένων" +" που εισάγεις στη φόρμα υπό την άδεια Open Database " +"License." #: ckan/templates/package/snippets/package_form.html:39 msgid "Are you sure you want to delete this dataset?" @@ -4102,13 +4264,17 @@ msgstr "Εξερευνήστε" msgid "More information" msgstr "Περισσότερες πληροφορίες" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Πλήρης Οθόνη" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Ενσωματώστε" #: ckan/templates/package/snippets/resource_view.html:24 msgid "This resource view is not available at the moment." -msgstr "" +msgstr "Αυτή η οπτικοποίηγση πόρου δεν είναι διαθέσιμη αυτή τη στιγμή." #: ckan/templates/package/snippets/resource_view.html:63 msgid "Embed resource view" @@ -4119,6 +4285,8 @@ msgid "" "You can copy and paste the embed code into a CMS or blog software that " "supports raw HTML" msgstr "" +"Μπορείς να αντιγράψεις και επικολλήσεις τον κώδικα ενσωμάτωσης σε " +"οποιοδήποτε CMS ή λογισμικό Blog που υποστηρίζει raw HTML." #: ckan/templates/package/snippets/resource_view.html:69 msgid "Width" @@ -4260,11 +4428,11 @@ msgstr "Εμφάνιση Περισσοτέρων {facet_type}" #: ckan/templates/snippets/facet_list.html:83 msgid "Show Only Popular {facet_type}" -msgstr "" +msgstr "Δείξε Μόνο Δημοφιλή {facet_type}" #: ckan/templates/snippets/facet_list.html:87 msgid "There are no {facet_type} that match this search" -msgstr "" +msgstr "Δεν υπάρχουν {facet_type} που ταιριάζουν με αυτή την αναζήτηση" #: ckan/templates/snippets/home_breadcrumb_item.html:2 msgid "Home" @@ -4320,6 +4488,8 @@ msgid "" "

There was an error while searching." " Please try again.

" msgstr "" +"

Προέκυψε ένα πρόβλημα κατά την αναζήτηση. " +" Παρακαλώ δοκιμάστε ξανά.

" #: ckan/templates/snippets/search_result_text.html:15 msgid "{number} dataset found for \"{query}\"" @@ -4641,7 +4811,13 @@ msgstr "Επαναφορά Κωδικού Πρόσβασης" msgid "Password Reset" msgstr "Επαναφορά Κωδικού Πρόσβασης" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "" +"Μπορείς να αλλάξεις επίσης το όνομα χρήστη. Δεν μπορεί να τροποποιηθεί " +"αργότερα." + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "Ενημέρωση Κωδικού Πρόσβασης" @@ -4694,7 +4870,7 @@ msgstr "Επαναφορά κωδικού πρόσβασης" #: ckan/templates/user/request_reset.html:19 msgid "Request reset" -msgstr "" +msgstr "Αίτηση επαναφοράς" #: ckan/templates/user/request_reset.html:34 msgid "" @@ -4724,3 +4900,7 @@ msgstr "Δεν υπάρχουν ακόλουθοι" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Αναζήτηση χρηστών" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "Ο κωδικός σύνδεσης πρέπει να αποτελείτε από τουλάχιστον 8 χαρακτήρες." diff --git a/ckan/i18n/en_AU/LC_MESSAGES/ckan.mo b/ckan/i18n/en_AU/LC_MESSAGES/ckan.mo index 2e5a1a5aa34..6cebf8d218d 100644 Binary files a/ckan/i18n/en_AU/LC_MESSAGES/ckan.mo and b/ckan/i18n/en_AU/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/en_AU/LC_MESSAGES/ckan.po b/ckan/i18n/en_AU/LC_MESSAGES/ckan.po index 264701788f5..a126bc6edaf 100644 --- a/ckan/i18n/en_AU/LC_MESSAGES/ckan.po +++ b/ckan/i18n/en_AU/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: English (Australia) (https://www.transifex.com/okfn/teams/11162/en_AU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: en_AU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "DataStore resource not found" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -261,7 +267,17 @@ msgstr "Loading..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Further information in the main CKAN Data API and DataStore documentation.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Table" @@ -3000,21 +3016,21 @@ msgstr "If you wish to invite a new user, enter their email address." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Role" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Are you sure you want to delete this member?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3486,8 +3502,8 @@ msgstr "A little information about my organisation..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Are you sure you want to delete this Organisation? This will delete all the " "public and private datasets belonging to this organisation." @@ -4659,3 +4675,7 @@ msgstr "No followers" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Search Users" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/en_GB/LC_MESSAGES/ckan.mo b/ckan/i18n/en_GB/LC_MESSAGES/ckan.mo index 529b1a8a722..6cb71171091 100644 Binary files a/ckan/i18n/en_GB/LC_MESSAGES/ckan.mo and b/ckan/i18n/en_GB/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/en_GB/LC_MESSAGES/ckan.po b/ckan/i18n/en_GB/LC_MESSAGES/ckan.po index a88fee88d56..1c863f62324 100644 --- a/ckan/i18n/en_GB/LC_MESSAGES/ckan.po +++ b/ckan/i18n/en_GB/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: English (United Kingdom) (https://www.transifex.com/okfn/teams/11162/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "format: must be one of %s" msgid "DataStore resource not found" msgstr "DataStore resource not found" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -261,7 +267,17 @@ msgstr "Loading..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Further information in the main CKAN Data API and DataStore documentation.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Table" @@ -3000,21 +3016,21 @@ msgstr "If you wish to invite a new user, enter their email address." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Role" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Are you sure you want to delete this member?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3486,8 +3502,8 @@ msgstr "A little information about my organisation..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Are you sure you want to delete this Organisation? This will delete all the " "public and private datasets belonging to this organisation." @@ -4663,3 +4679,7 @@ msgstr "No followers" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Search Users" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/es/LC_MESSAGES/ckan.mo b/ckan/i18n/es/LC_MESSAGES/ckan.mo index 669c45dd96c..a8a63ae8531 100644 Binary files a/ckan/i18n/es/LC_MESSAGES/ckan.mo and b/ckan/i18n/es/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/es/LC_MESSAGES/ckan.po b/ckan/i18n/es/LC_MESSAGES/ckan.po index 4e93ba93b82..61d48267a8b 100644 --- a/ckan/i18n/es/LC_MESSAGES/ckan.po +++ b/ckan/i18n/es/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: David Portoles , 2018\n" "Language-Team: Spanish (https://www.transifex.com/okfn/teams/11162/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,15 @@ msgstr "formato: debe ser uno de %s" msgid "DataStore resource not found" msgstr "No se ha encontrado el recurso." -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Diccionario de datos guardado. Cualquier actualización de tipo tendrá efecto" +" una vez el recurso vuelva a ser subido a DataStore" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -210,8 +218,14 @@ msgstr "Ejemplo: Python" msgid "Field {num}." msgstr "Campo {num}." -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Actualización de tipo" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" msgstr "Etiqueta" @@ -264,7 +278,18 @@ msgstr "Cargando ..." msgid "Data API" msgstr "API de datos" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Más información en la documentación del API de Datos principal y del DataStore " +"de CKAN.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabla" @@ -867,15 +892,16 @@ msgstr "" "Los parámetros requeridos debe estar en forma de un diccionario en código " "json." -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Grupo no encontrado" @@ -984,7 +1010,12 @@ msgstr "%s ha sido borrado." msgid "User %r not authorized to edit members of %s" msgstr "El usuario %r no está autorizado para editar los miembros de %s" -#: ckan/controllers/group.py:705 +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "No está autorizado a crear miembros del grupo %s" + +#: ckan/controllers/group.py:712 #, python-format msgid "Unauthorized to add member to group %s" msgstr "No estás autorizado para agregar miembros al grupo %s" @@ -1843,7 +1874,11 @@ msgstr "Los nombres de usuarios deben ser cadenas de caracteres" msgid "That login name is not available." msgstr "Este nombre de inicio de sesión no está disponible." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "Este nombre de usuario no puede ser modificado." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "Por favor, introduzca ambas contraseñas" @@ -1851,9 +1886,9 @@ msgstr "Por favor, introduzca ambas contraseñas" msgid "Passwords must be strings" msgstr "Las claves deben ser cadenas de caracteres" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "La contraseña debe tener 4 caracteres o más" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "Su contraseña debe tener 8 caracteres o más" #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" @@ -2032,8 +2067,12 @@ msgstr "REST API: Borrar %s" msgid "REST API: Delete Member: %s" msgstr "REST API: Borrar Miembro: %s" -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "La organización no puede ser borrada mientras tenga un dataset" + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" msgstr "id no presente en los datos" @@ -2594,6 +2633,99 @@ msgstr "Mostrar más" msgid "Hide" msgstr "Esconder" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "foo" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "sin traducción" +msgstr[1] "sin traducciones" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "Hola %(name)s!" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "no %(attr)s translation" +msgstr[1] "no %(attr)s translations" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "barra" +msgstr[1] "barras" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "%(color)s shirt" +msgstr[1] "%(color)s shirts" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)d item" +msgstr[1] "%(num)d items" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "Falta %(num)d traducción" +msgstr[1] "Faltan %(num)d traducciones" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -3043,21 +3175,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rol" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "¿Está seguro de que desea eliminar a este miembro?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3287,6 +3419,10 @@ msgstr "Ej: ambiente" msgid "Search data" msgstr "Buscar datos" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Buscar conjuntos de datos" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Etiquetas populares" @@ -3538,11 +3674,12 @@ msgstr "Un poco de información acerca de mi organización..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" -"¿Estás seguro de que quieres borrar esta Organización? Esto borrará los " -"conjuntos de datos privados y públicos que pertenecen a esta organización." +"¿Estás seguro de que quieres borrar esta organización? Nota*: El borrado no " +"se puede realizar mientras conjuntos de datos públicos o privados " +"pertenezcan a esta organización" #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -4105,7 +4242,11 @@ msgstr "Explorar" msgid "More information" msgstr "Más información" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Pantalla completa" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Incrustar" @@ -4647,7 +4788,13 @@ msgstr "Restablezca su contraseña" msgid "Password Reset" msgstr "Contraseña restablecida" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "" +"También puede cambiar el nombre de usuario. Esto no puede ser modificado " +"después." + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "Actualizar contraseña" @@ -4729,3 +4876,7 @@ msgstr "Sin seguidores" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Buscar Usuarios" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "Su contraseña debe tener 8 caracteres o más." diff --git a/ckan/i18n/es_AR/LC_MESSAGES/ckan.mo b/ckan/i18n/es_AR/LC_MESSAGES/ckan.mo index c4b93e78679..372bdda59b4 100644 Binary files a/ckan/i18n/es_AR/LC_MESSAGES/ckan.mo and b/ckan/i18n/es_AR/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/es_AR/LC_MESSAGES/ckan.po b/ckan/i18n/es_AR/LC_MESSAGES/ckan.po index 0055eed5a7f..8e045057396 100644 --- a/ckan/i18n/es_AR/LC_MESSAGES/ckan.po +++ b/ckan/i18n/es_AR/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Ignacio L'Episcopo, 2018\n" "Language-Team: Spanish (Argentina) (https://www.transifex.com/okfn/teams/11162/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: es_AR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -72,7 +72,7 @@ msgstr "Error:" #: ckanext/datapusher/templates/datapusher/resource_data.html:36 msgid "Error traceback:" -msgstr "" +msgstr "Rastro del error:" #: ckanext/datapusher/templates/datapusher/resource_data.html:48 msgid "Status" @@ -105,13 +105,21 @@ msgstr "DataStore" #: ckanext/datastore/controller.py:46 #, python-format msgid "format: must be one of %s" -msgstr "" +msgstr "formato: debe ser uno de %s" #: ckanext/datastore/controller.py:58 msgid "DataStore resource not found" msgstr "No se ha encontrado el recurso." -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Diccionario de datos guardado. Cualquier actualización de tipo tendrá efecto" +" una vez el recurso vuelva a ser subido a DataStore" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -208,13 +216,19 @@ msgstr "Ejemplo: Python" #: ckanext/datastore/templates/datastore/dictionary.html:16 msgid "Field {num}." -msgstr "" +msgstr "Campo {num}." + +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Actualización de tipo" -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" -msgstr "" +msgstr "Etiqueta" #: ckan/templates/group/snippets/group_form.html:20 #: ckan/templates/organization/snippets/organization_form.html:20 @@ -234,16 +248,16 @@ msgstr "Guardar" #: ckanext/datastore/templates/package/resource_edit_base.html:6 #: ckanext/datastore/templates/package/resource_read.html:14 msgid "Data Dictionary" -msgstr "" +msgstr "Diccionario de datos" #: ckanext/datastore/templates/package/resource_read.html:18 #: ckanext/datatablesview/templates/datatables/datatables_form.html:17 msgid "Column" -msgstr "" +msgstr "Columna" #: ckanext/datastore/templates/package/resource_read.html:19 msgid "Type" -msgstr "" +msgstr "Tipo" #: ckan/public/base/javascript/modules/activity-stream.js:97 #: ckan/public/base/javascript/modules/popover-context.js:62 @@ -264,21 +278,32 @@ msgstr "Cargando ..." msgid "Data API" msgstr "API de datos" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Más información en la documentación del API de Datos principal y del DataStore " +"de CKAN.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabla" #: ckanext/datatablesview/templates/datatables/datatables_form.html:6 msgid "Responsive display" -msgstr "" +msgstr "Diseño adaptable" #: ckanext/datatablesview/templates/datatables/datatables_form.html:12 msgid "Show Columns" -msgstr "" +msgstr "Mostrar columnas" #: ckanext/datatablesview/templates/datatables/datatables_view.html:28 msgid "Hide/Unhide Columns" -msgstr "" +msgstr "Esconder/Mostrar columnas" #: ckanext/example_iconfigurer/templates/admin/config.html:11 msgid "Datasets per page" @@ -366,7 +391,7 @@ msgstr "texto personalizado de recurso" #: ckanext/example_itranslation/templates/home/index.html:4 msgid "This is an untranslated string" -msgstr "" +msgstr "Este texto no está traducido" #: ckanext/example_theme_docs/v10_custom_snippet/templates/snippets/example_theme_most_popular_groups.html:20 #: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:19 @@ -379,8 +404,8 @@ msgstr "Este grupo no tiene una descripción" #: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:22 msgid "{num} Dataset" msgid_plural "{num} Datasets" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{num} Conjunto de Datos" +msgstr[1] "{num} Conjuntos de Datos" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -451,23 +476,23 @@ msgstr "Mapa" #: ckanext/reclineview/theme/public/recline_view.js:28 msgid "error loading view" -msgstr "" +msgstr "error cargando la vista" #: ckanext/reclineview/theme/public/recline_view.js:75 msgid "Could not load view" -msgstr "" +msgstr "No se pudo cargar la vista" #: ckanext/reclineview/theme/public/recline_view.js:77 msgid "DataStore returned an error" -msgstr "" +msgstr "DataStore ha retornado un error" #: ckanext/reclineview/theme/public/recline_view.js:79 msgid "DataProxy returned an error" -msgstr "" +msgstr "DataProxy ha retornado un error" #: ckanext/reclineview/theme/public/recline_view.js:193 msgid "Grid" -msgstr "" +msgstr "Tabla" #: ckan/templates/package/snippets/view_form_filters.html:46 #: ckanext/reclineview/theme/public/recline_view.js:215 @@ -627,7 +652,7 @@ msgstr "Número de Conjuntos de Datos" #: ckanext/stats/templates/ckanext/stats/index.html:152 #: ckanext/stats/templates/ckanext/stats/index.html:184 msgid "Users Creating Most Datasets" -msgstr "" +msgstr "Usuarios que han creado más conjuntos de datos" #: ckan/logic/converters.py:121 ckan/logic/validators.py:214 #: ckan/logic/validators.py:231 ckan/logic/validators.py:706 @@ -665,7 +690,7 @@ msgstr "ej: http://ejemplo.com (si está en blanco usa la url del recurso)" #: ckan/templates/package/snippets/resource_view.html:56 #: ckanext/webpageview/theme/templates/webpage_view.html:2 msgid "Your browser does not support iframes." -msgstr "Tu navegador no soporta iframes." +msgstr "Su navegador no soporta iframes." #: ckan/authz.py:182 #, python-format @@ -686,7 +711,7 @@ msgstr "Miembro" #: ckan/controllers/admin.py:34 msgid "Need to be system administrator to administer" -msgstr "Se necesita ser administrador del sistema para administrar" +msgstr "Es necesario ser administrador del sistema para administrar" #: ckan/controllers/admin.py:50 msgid "Site Title" @@ -743,8 +768,8 @@ msgid "" "Cannot purge package %s as associated revision %s includes non-deleted " "packages %s" msgstr "" -"No se puede purgar el paquete %s como revisión asociada %s incluye paquetes " -"de datos no borrados %s" +"No se puede purgar el paquete %s ya que la revisión asociada %s incluye " +"paquetes de datos no borrados %s" #: ckan/controllers/admin.py:183 #, python-format @@ -867,15 +892,16 @@ msgstr "" "Los parámetros requeridos debe estar en forma de un diccionario en código " "json." -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Grupo no encontrado" @@ -982,9 +1008,14 @@ msgstr "%s ha sido eliminadp." #: ckan/controllers/group.py:653 #, python-format msgid "User %r not authorized to edit members of %s" -msgstr "" +msgstr "El usuario %r no está autorizado para editar los miembros de %s" + +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "No está autorizado a crear miembros del grupo %s" -#: ckan/controllers/group.py:705 +#: ckan/controllers/group.py:712 #, python-format msgid "Unauthorized to add member to group %s" msgstr "No estás autorizado para agregar miembros al grupo %s" @@ -1049,7 +1080,7 @@ msgstr "%s utiliza tu correo electrónico si necesitas cambiar tu contraseña." #: ckan/controllers/package.py:288 msgid "Invalid search query: {error_message}" -msgstr "" +msgstr "Busqueda incorrecta: {error_message}" #: ckan/controllers/package.py:304 msgid "Parameter \"{parameter_name}\" is not an integer" @@ -1076,6 +1107,8 @@ msgstr "Formato de revisión inválido: %r" #: ckan/controllers/package.py:396 msgid "Viewing datasets of type \"{package_type}\" is not supported ({file_!r})." msgstr "" +"No se admite la visualización de datasets de tipo \"{package_type}\" " +"({file_!r})." #: ckan/controllers/package.py:435 ckan/controllers/package.py:817 #: ckan/controllers/package.py:918 ckan/controllers/package.py:966 @@ -1094,7 +1127,7 @@ msgstr "Cambios recientes al conjunto de datos CKAN" #: ckan/controllers/package.py:503 msgid "Unauthorized to create a package" -msgstr "No está autorizado para crear crear el paquete" +msgstr "No está autorizado para crear el paquete" #: ckan/controllers/package.py:573 msgid "Unauthorized to edit this resource" @@ -1153,7 +1186,7 @@ msgstr "No se encontró la vista del recurso" #: ckan/controllers/package.py:1150 msgid "Resource data not found" -msgstr "No se enctraron los datos del recurso" +msgstr "No se encontraron los datos del recurso" #: ckan/controllers/package.py:1159 msgid "No download is available" @@ -1461,8 +1494,8 @@ msgstr "Ver" #: ckan/lib/email_notifications.py:103 msgid "{n} new activity from {site_title}" msgid_plural "{n} new activities from {site_title}" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{n} nueva actividad en {site_title}" +msgstr[1] "{n} nuevas actividades en {site_title}" #: ckan/lib/formatters.py:19 msgid "January" @@ -1519,36 +1552,36 @@ msgstr "Justo ahora" #: ckan/lib/formatters.py:116 msgid "{mins} minute ago" msgid_plural "{mins} minutes ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "hace {mins} minuto" +msgstr[1] "hace {mins} minutos " #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" msgid_plural "{hours} hours ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "hace {hours} hora" +msgstr[1] "hace {hours} horas" #: ckan/lib/formatters.py:125 msgid "{days} day ago" msgid_plural "{days} days ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "hace {days} día" +msgstr[1] "hace {days} días" #: ckan/lib/formatters.py:128 msgid "{months} month ago" msgid_plural "{months} months ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Hace {months} mes" +msgstr[1] "Hace {months} meses" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" msgid_plural "over {years} years ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "hace {years} año" +msgstr[1] "hace {years} años" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" -msgstr "" +msgstr "{day} {month}, {year}, {hour:02}:{min:02} ({timezone})" #: ckan/lib/formatters.py:151 msgid "{month} {day}, {year}" @@ -1637,14 +1670,14 @@ msgstr "Opciones editadas." #: ckan/lib/helpers.py:1648 msgid "{number} view" msgid_plural "{number} views" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} vista" +msgstr[1] "{number} vistas" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" msgid_plural "{number} recent views" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} vista reciente" +msgstr[1] "{number} vistas recientes" #: ckan/lib/mailer.py:39 #, python-format @@ -1689,7 +1722,7 @@ msgstr "Introduce un valor entero" #: ckan/lib/navl/validators.py:124 msgid "Must be a Unicode string value" -msgstr "" +msgstr "Debe ser un texto Unicode" #: ckan/logic/__init__.py:98 ckan/logic/action/__init__.py:60 msgid "Package resource(s) invalid" @@ -1711,7 +1744,7 @@ msgstr "No se puede parsear como un JSON válido" #: ckan/logic/validators.py:33 ckan/logic/validators.py:42 msgid "An organization must be provided" -msgstr "" +msgstr "Se debe proporcionar una organización" #: ckan/logic/validators.py:47 msgid "Organization does not exist" @@ -1839,7 +1872,11 @@ msgstr "Los nombres de usuarios deben ser cadenas de caracteres" msgid "That login name is not available." msgstr "Este nombre de inicio de sesión no está disponible." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "Este nombre de usuario no puede ser modificado." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "Introduce ambas contraseñas" @@ -1847,9 +1884,9 @@ msgstr "Introduce ambas contraseñas" msgid "Passwords must be strings" msgstr "Las claves deben ser cadenas de caracteres" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "La contraseña debe tener 4 caracteres o más" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "Su contraseña debe tener 8 caracteres o más" #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" @@ -1938,7 +1975,7 @@ msgstr "Existe un campo de esquema con el mismo nombre" #: ckan/logic/validators.py:846 msgid "Email {email} is not a valid format" -msgstr "" +msgstr "El email {email} no tiene un formato válido" #: ckan/logic/action/create.py:183 ckan/logic/action/create.py:665 #, python-format @@ -1981,6 +2018,7 @@ msgstr "La valoración debe ser entre %i y %i." #: ckan/logic/action/create.py:1064 msgid "Error sending the invite email, the user was not created: {0}" msgstr "" +"Error enviando una invitación por mail, el usuario no está creado: {0}" #: ckan/logic/action/create.py:1277 ckan/logic/action/create.py:1284 msgid "You must be logged in to follow users" @@ -2009,7 +2047,7 @@ msgstr "Debe haber iniciado sesión para seguir a un grupo." #: ckan/logic/action/delete.py:54 msgid " Delete User: {0}" -msgstr "" +msgstr "Borrar usuario: {0}" #: ckan/logic/action/delete.py:92 #, python-format @@ -2026,8 +2064,12 @@ msgstr "REST API: Eliminar %s" msgid "REST API: Delete Member: %s" msgstr "REST API: Eliminar Miembro: %s" -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "La organización no puede ser eliminada mientras tenga un dataset" + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" msgstr "id no presente en los datos" @@ -2434,8 +2476,8 @@ msgstr "No se encontraron coincidencias" #, python-format msgid "Input is too short, must be at least one character" msgid_plural "Input is too short, must be at least %(num)d characters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Ingreso es demasiado corto, debe tener al menos un carácter" +msgstr[1] "Ingreso es demasiado corto, debe tener al menos %(num)d carácteres" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2565,7 +2607,7 @@ msgstr "Agregar Filtro" #: ckan/public/base/javascript/modules/resource-view-filters.js:52 msgid "Select a field" -msgstr "" +msgstr "Seleccionar un campo" #: ckan/public/base/javascript/modules/slug-preview.js:57 #: ckan/templates/group/edit_base.html:22 ckan/templates/group/members.html:28 @@ -2588,6 +2630,99 @@ msgstr "Mostrar más" msgid "Hide" msgstr "Esconder" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "foo" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "sin traducción" +msgstr[1] "sin traducciones" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "Hola %(name)s!" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "%(attr)s sin traducción" +msgstr[1] "%(attr)s sin traducciones" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "barra" +msgstr[1] "barras" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "camisa %(color)s" +msgstr[1] " camisas %(color)s" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)d item" +msgstr[1] "%(num)d items" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "Falta %(num)d traducción" +msgstr[1] "Faltan %(num)d traducciones" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2603,7 +2738,7 @@ msgstr "API CKAN" #: ckan/templates/footer.html:16 msgid "CKAN Association" -msgstr "" +msgstr "CKAN Association" #: ckan/templates/footer.html:24 msgid "" @@ -2625,8 +2760,8 @@ msgstr "Ver perfil" #, python-format msgid "Dashboard (%(num)d new item)" msgid_plural "Dashboard (%(num)d new items)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Panel de Control (%(num)d nuevo elemento)" +msgstr[1] "Panel de Control (%(num)d nuevos elementos)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -2712,7 +2847,11 @@ msgstr "Configuración" msgid "Trash" msgstr "Papelera" -#: ckan/templates/admin/config.html:16 +#: ckan/templates/admin/config.html:23 ckan/templates/macros/autoform.html:62 +msgid "Site logo" +msgstr "Logotipo del sitio" + +#: ckan/templates/admin/config.html:35 #: ckan/templates/admin/confirm_reset.html:7 msgid "Are you sure you want to reset the config?" msgstr "¿Seguro de que deseas restablecer la configuración?" @@ -3037,21 +3176,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rol" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "¿Seguro de que deseas eliminar a este miembro?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3281,6 +3420,10 @@ msgstr "Ej: ambiente" msgid "Search data" msgstr "Buscar datos" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Buscar conjuntos de datos" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Etiquetas populares" @@ -3456,8 +3599,8 @@ msgstr "" #: ckan/templates/organization/members.html:14 msgid "{count} member" msgid_plural "{count} members" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{count} miembro" +msgstr[1] "{count} miembros" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3532,11 +3675,12 @@ msgstr "Un poco de información acerca de mi organización..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" -"¿Seguro de que deseas eliminar esta Organización? Esto eliminará los " -"conjuntos de datos privados y públicos que pertenecen a esta organización." +"¿Estás seguro de que quieres eliminar esta organización? Nota*: La " +"eliminación no se puede realizar mientras conjuntos de datos públicos o " +"privados pertenezcan a esta organización" #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -3768,7 +3912,7 @@ msgstr "Valor" #: ckan/templates/package/resource_read.html:154 msgid "Data last updated" -msgstr "" +msgstr "Última actualización de los datos" #: ckan/templates/package/resource_read.html:155 #: ckan/templates/package/resource_read.html:159 @@ -3779,7 +3923,7 @@ msgstr "desconocido" #: ckan/templates/package/resource_read.html:158 msgid "Metadata last updated" -msgstr "" +msgstr "Última actualización de los metadatos" #: ckan/templates/package/resource_read.html:162 #: ckan/templates/package/snippets/additional_info.html:70 @@ -3895,21 +4039,24 @@ msgstr "Última actualización" #: ckan/templates/package/snippets/cannot_create_package.html:10 msgid "Before you can create a dataset you need to create an organization." -msgstr "" +msgstr "Antes de poder crear un dataset, necesitas crear una organización" #: ckan/templates/package/snippets/cannot_create_package.html:13 msgid "Create a new organization" -msgstr "" +msgstr "Crear una nueva organización" #: ckan/templates/package/snippets/cannot_create_package.html:18 msgid "There are no organizations to which you can assign this dataset." msgstr "" +"No hay organizaciones a las que le puedas asignar este conjunto de datos." #: ckan/templates/package/snippets/cannot_create_package.html:19 msgid "" "Ask a system administrator to create an organization before you can " "continue." msgstr "" +"Preguntar a un administrador del sistema para crear una organización antes " +"de continuar" #: ckan/templates/package/snippets/package_basic_fields.html:4 #: ckan/templates/package/snippets/view_form.html:8 @@ -4018,11 +4165,11 @@ msgstr "Actualizar Recurso" #: ckan/templates/package/snippets/resource_form.html:24 msgid "Data" -msgstr "" +msgstr "Dato" #: ckan/templates/package/snippets/resource_form.html:24 msgid "http://example.com/external-data.csv" -msgstr "" +msgstr "http://ejemplo.com/dato-externo.csv" #: ckan/templates/package/snippets/resource_form.html:28 msgid "eg. January 2011 Gold Prices" @@ -4096,7 +4243,11 @@ msgstr "Explorar" msgid "More information" msgstr "Más información" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Pantalla completa" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Incrustar" @@ -4319,12 +4470,14 @@ msgid "" "

There was an error while searching." " Please try again.

" msgstr "" +"

Hubo un error mientras se realizaba la búsqueda. Por " +"favor intenta nuevamente.

" #: ckan/templates/snippets/search_result_text.html:15 msgid "{number} dataset found for \"{query}\"" msgid_plural "{number} datasets found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} conjunto de datos encontrado para \"{query}\"" +msgstr[1] "{number} conjuntos de datos encontrados para \"{query}\"" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4333,8 +4486,8 @@ msgstr "Lo sentimos, no se encontraron conjuntos de datos para \"{query}\"" #: ckan/templates/snippets/search_result_text.html:17 msgid "{number} dataset found" msgid_plural "{number} datasets found" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} conjunto de datos encontrado" +msgstr[1] "{number} conjuntos de datos encontrados" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4343,8 +4496,8 @@ msgstr "Conjuntos de datos no encontrados" #: ckan/templates/snippets/search_result_text.html:21 msgid "{number} group found for \"{query}\"" msgid_plural "{number} groups found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} grupo encontrado para \"{query}\"" +msgstr[1] "{number} grupos encontrados para \"{query}\"" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4353,8 +4506,8 @@ msgstr "Lo sentimos, no se encontraron grupos para \"{query}\"" #: ckan/templates/snippets/search_result_text.html:23 msgid "{number} group found" msgid_plural "{number} groups found" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} grupo encontrado" +msgstr[1] "{number} grupos encontrados" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4363,8 +4516,8 @@ msgstr "No se han encontrado grupos" #: ckan/templates/snippets/search_result_text.html:27 msgid "{number} organization found for \"{query}\"" msgid_plural "{number} organizations found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} organización encontrada para \"{query}\"" +msgstr[1] "{number} organizaciones encontradas para \"{query}\"" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4373,8 +4526,8 @@ msgstr "Lo sentimos, no se encontraron organizaciones para \"{query}\"" #: ckan/templates/snippets/search_result_text.html:29 msgid "{number} organization found" msgid_plural "{number} organizations found" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} organización encontrada" +msgstr[1] "{number} organizaciones encontradas" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4499,7 +4652,7 @@ msgstr "Cambia tu contraseña" #: ckan/templates/user/edit_user_form.html:29 msgid "Sysadmin Password" -msgstr "" +msgstr "Clave de administrador de sistema" #: ckan/templates/user/edit_user_form.html:37 #: ckan/templates/user/logout_first.html:12 @@ -4636,7 +4789,13 @@ msgstr "Restablece tu contraseña" msgid "Password Reset" msgstr "Restablecer Contraseña" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "" +"También puede cambiar el nombre de usuario. Esto no puede ser modificado " +"después." + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "Actualizar contraseña" @@ -4718,3 +4877,7 @@ msgstr "Sin seguidores" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Buscar Usuarios" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "La contraseña debe tener 8 caracteres o más." diff --git a/ckan/i18n/fa_IR/LC_MESSAGES/ckan.mo b/ckan/i18n/fa_IR/LC_MESSAGES/ckan.mo index 9a40c463490..a5781999e6b 100644 Binary files a/ckan/i18n/fa_IR/LC_MESSAGES/ckan.mo and b/ckan/i18n/fa_IR/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/fa_IR/LC_MESSAGES/ckan.po b/ckan/i18n/fa_IR/LC_MESSAGES/ckan.po index bb41574d27d..24688f601ca 100644 --- a/ckan/i18n/fa_IR/LC_MESSAGES/ckan.po +++ b/ckan/i18n/fa_IR/LC_MESSAGES/ckan.po @@ -1,23 +1,23 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Persian (Iran) (https://www.transifex.com/okfn/teams/11162/fa_IR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: fa_IR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ckanext/datapusher/helpers.py:21 msgid "Complete" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "" msgid "Data API" msgstr "" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "جدول" @@ -370,6 +383,7 @@ msgstr "" msgid "{num} Dataset" msgid_plural "{num} Datasets" msgstr[0] "" +msgstr[1] "" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -1436,6 +1450,7 @@ msgstr "" msgid "{n} new activity from {site_title}" msgid_plural "{n} new activities from {site_title}" msgstr[0] "" +msgstr[1] "" #: ckan/lib/formatters.py:19 msgid "January" @@ -1493,26 +1508,31 @@ msgstr "" msgid "{mins} minute ago" msgid_plural "{mins} minutes ago" msgstr[0] "" +msgstr[1] "" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" msgid_plural "{hours} hours ago" msgstr[0] "" +msgstr[1] "" #: ckan/lib/formatters.py:125 msgid "{days} day ago" msgid_plural "{days} days ago" msgstr[0] "" +msgstr[1] "" #: ckan/lib/formatters.py:128 msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "" +msgstr[1] "" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" msgid_plural "over {years} years ago" msgstr[0] "" +msgstr[1] "" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1606,11 +1626,13 @@ msgstr "" msgid "{number} view" msgid_plural "{number} views" msgstr[0] "" +msgstr[1] "" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" msgid_plural "{number} recent views" msgstr[0] "" +msgstr[1] "" #: ckan/lib/mailer.py:39 #, python-format @@ -2381,6 +2403,7 @@ msgstr "" msgid "Input is too short, must be at least one character" msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "" +msgstr[1] "" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2531,6 +2554,99 @@ msgstr "" msgid "Hide" msgstr "" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "" +msgstr[1] "" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2567,6 +2683,7 @@ msgstr "" msgid "Dashboard (%(num)d new item)" msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "" +msgstr[1] "" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -2953,21 +3070,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3332,6 +3449,7 @@ msgstr "" msgid "{count} member" msgid_plural "{count} members" msgstr[0] "" +msgstr[1] "" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3394,8 +3512,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4145,6 +4263,7 @@ msgstr "" msgid "{number} dataset found for \"{query}\"" msgid_plural "{number} datasets found for \"{query}\"" msgstr[0] "" +msgstr[1] "" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4154,6 +4273,7 @@ msgstr "" msgid "{number} dataset found" msgid_plural "{number} datasets found" msgstr[0] "" +msgstr[1] "" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4163,6 +4283,7 @@ msgstr "" msgid "{number} group found for \"{query}\"" msgid_plural "{number} groups found for \"{query}\"" msgstr[0] "" +msgstr[1] "" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4172,6 +4293,7 @@ msgstr "" msgid "{number} group found" msgid_plural "{number} groups found" msgstr[0] "" +msgstr[1] "" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4181,6 +4303,7 @@ msgstr "" msgid "{number} organization found for \"{query}\"" msgid_plural "{number} organizations found for \"{query}\"" msgstr[0] "" +msgstr[1] "" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4190,6 +4313,7 @@ msgstr "" msgid "{number} organization found" msgid_plural "{number} organizations found" msgstr[0] "" +msgstr[1] "" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4527,3 +4651,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/fi/LC_MESSAGES/ckan.mo b/ckan/i18n/fi/LC_MESSAGES/ckan.mo index 489a30e5f04..4eb6e60d2b5 100644 Binary files a/ckan/i18n/fi/LC_MESSAGES/ckan.mo and b/ckan/i18n/fi/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/fi/LC_MESSAGES/ckan.po b/ckan/i18n/fi/LC_MESSAGES/ckan.po index e91bd191fd1..04243be5dce 100644 --- a/ckan/i18n/fi/LC_MESSAGES/ckan.po +++ b/ckan/i18n/fi/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Joonas Dukpa , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Finnish (https://www.transifex.com/okfn/teams/11162/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "Tiedostomuodon täytyy olla tyyppiä: %s" msgid "DataStore resource not found" msgstr "DataStore-resurssia ei löytynyt" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -261,7 +267,18 @@ msgstr "Ladataan..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Lisätietoa löydät CKAN informaatio API:sta ja DataStore " +"dokumentaatiosta.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Taulu" @@ -3019,21 +3036,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rooli" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Haluatko varmasti poistaa tämän jäsenen?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3505,8 +3522,8 @@ msgstr "Hieman lisätietoa organisaatiostani..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Haluatko varmasti poistaa tämän organisaation? Tämä poistaa kaikki julkiset " "ja yksityiset tietoaineistot, jotka kuuluvat tälle organisaatiolle." @@ -4687,3 +4704,7 @@ msgstr "Ei seuraajia" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Etsi käyttäjiä" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/fr/LC_MESSAGES/ckan.mo b/ckan/i18n/fr/LC_MESSAGES/ckan.mo index a1b2c480347..969daa98433 100644 Binary files a/ckan/i18n/fr/LC_MESSAGES/ckan.mo and b/ckan/i18n/fr/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/fr/LC_MESSAGES/ckan.po b/ckan/i18n/fr/LC_MESSAGES/ckan.po index 30388642570..7ebdc1cd613 100644 --- a/ckan/i18n/fr/LC_MESSAGES/ckan.po +++ b/ckan/i18n/fr/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Steve King , 2017\n" +"Last-Translator: Mayeul Kauffmann, 2018\n" "Language-Team: French (https://www.transifex.com/okfn/teams/11162/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -111,7 +111,13 @@ msgstr "format : doit être l'un de/des %s" msgid "DataStore resource not found" msgstr "Ressource de magasin de données non trouvée" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -265,7 +271,18 @@ msgstr "Chargement..." msgid "Data API" msgstr "API de données" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Plus d'informations dans la documentation principale de l'API CKAN pour les données et" +" le magasin de données.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Table" @@ -1848,7 +1865,11 @@ msgstr "Les noms d'utilisateurs doivent être des chaînes de caractères" msgid "That login name is not available." msgstr "Ce nom d'utilisateur n'est pas disponible." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "L'identifiant de connexion ne peut pas être modifié." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "Merci d'entrer les 2 mots de passe" @@ -2455,8 +2476,8 @@ msgstr "Aucune correspondance trouvée" #, python-format msgid "Input is too short, must be at least one character" msgid_plural "Input is too short, must be at least %(num)d characters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Saisie trop courte, au moins un caractère est nécessaire" +msgstr[1] "Saisie trop courte, au moins %(num)d caractères sont nécessaires" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2611,6 +2632,99 @@ msgstr "Montrer plus" msgid "Hide" msgstr "Cacher" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "pas de traduction" +msgstr[1] "pas de traduction" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)d traduction manquante" +msgstr[1] "%(num)d traductions manquantes" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2860,7 +2974,7 @@ msgstr "Medium" #: ckan/templates/development/snippets/form.html:6 msgid "Medium Width Input" -msgstr "Entrée ayant la largeur du medium" +msgstr "Entrée ayant un longueur moyenne" #: ckan/templates/development/snippets/form.html:7 msgid "Full" @@ -3060,21 +3174,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr " Rôle" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Etes-vous sûr de vouloir supprimer ce membre?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3305,6 +3419,10 @@ msgstr "Par exemple environnement" msgid "Search data" msgstr "Données de recherche" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Chercher des jeux de données" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Mots-clés populaires" @@ -3555,8 +3673,8 @@ msgstr "Un peu d'information au sujet de mon organisation..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Êtes vous sûr de vouloir supprimer cette organisation ? Cela supprimera " "tous les jeux de données publics et privés appartenant à cette organisation." @@ -4130,7 +4248,11 @@ msgstr "Explorer" msgid "More information" msgstr "Plus d'information" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Plein écran" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Embarquer sur un site" @@ -4671,7 +4793,13 @@ msgstr "Réinitialiser votre mot de passe" msgid "Password Reset" msgstr "Réinitialisation du mot de passe" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "" +"Vous pouvez aussi changer le nom d'utilisateur. Il ne peut pas être modifié " +"ultérieurement." + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "Mettre à jour le mot de passe" @@ -4755,3 +4883,7 @@ msgstr "Aucun suiveur" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Rechercher des utilisateurs" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "Votre mot de passe doit comporter au moins 8 caractères." diff --git a/ckan/i18n/gl/LC_MESSAGES/ckan.mo b/ckan/i18n/gl/LC_MESSAGES/ckan.mo new file mode 100644 index 00000000000..6e6e0f6f3f9 Binary files /dev/null and b/ckan/i18n/gl/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/gl/LC_MESSAGES/ckan.po b/ckan/i18n/gl/LC_MESSAGES/ckan.po new file mode 100644 index 00000000000..0320e8507bd --- /dev/null +++ b/ckan/i18n/gl/LC_MESSAGES/ckan.po @@ -0,0 +1,4734 @@ +# Translations template for ckan. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the ckan project. +# FIRST AUTHOR , 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ckan 2.8.0b0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-03-27 16:10+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Adrià Mercader , 2018\n" +"Language-Team: Galician (https://www.transifex.com/okfn/teams/11162/gl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.5.3\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ckanext/datapusher/helpers.py:21 +msgid "Complete" +msgstr "Rematado" + +#: ckanext/datapusher/helpers.py:22 +msgid "Pending" +msgstr "Pendente" + +#: ckanext/datapusher/helpers.py:23 +msgid "Submitting" +msgstr "Enviando" + +#: ckan/controllers/package.py:681 ckanext/datapusher/helpers.py:24 +msgid "Error" +msgstr "Erro" + +#: ckanext/datapusher/helpers.py:29 +msgid "Not Uploaded Yet" +msgstr "Aínda non foi enviado" + +#: ckan/controllers/package.py:613 ckan/controllers/package.py:1076 +#: ckan/controllers/package.py:1096 ckan/controllers/package.py:1163 +#: ckan/controllers/package.py:1346 ckan/controllers/package.py:1424 +#: ckan/controllers/package.py:1455 ckan/controllers/package.py:1563 +#: ckan/controllers/package.py:1614 ckanext/datapusher/plugin.py:59 +#: ckanext/datastore/controller.py:80 ckanext/resourceproxy/controller.py:33 +msgid "Resource not found" +msgstr "Non se atopou o recurso" + +#: ckan/controllers/api.py:66 ckan/controllers/group.py:156 +#: ckan/controllers/home.py:27 ckan/controllers/package.py:144 +#: ckan/controllers/package.py:315 ckan/controllers/revision.py:34 +#: ckan/controllers/tag.py:27 ckan/controllers/user.py:58 +#: ckan/controllers/user.py:83 ckan/controllers/user.py:86 +#: ckan/controllers/user.py:117 ckan/controllers/user.py:598 +#: ckan/views/dashboard.py:24 ckan/views/user.py:59 ckan/views/user.py:62 +#: ckan/views/user.py:87 ckan/views/user.py:110 ckan/views/user.py:476 +#: ckanext/datapusher/plugin.py:68 +msgid "Not authorized to see this page" +msgstr "Non está autorizado para ver esta páxina" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:12 +#: ckanext/datapusher/templates/datapusher/resource_data.html:12 +msgid "Upload to DataStore" +msgstr "Enviar o almacén de datos" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:19 +#: ckanext/datapusher/templates/datapusher/resource_data.html:19 +msgid "Upload error:" +msgstr "Produciuse un erro de envío:" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:25 +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:27 +#: ckanext/datapusher/templates/datapusher/resource_data.html:25 +#: ckanext/datapusher/templates/datapusher/resource_data.html:27 +msgid "Error:" +msgstr "Erro:" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:36 +#: ckanext/datapusher/templates/datapusher/resource_data.html:36 +msgid "Error traceback:" +msgstr "Rastrexo de erros:" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:48 +#: ckanext/datapusher/templates/datapusher/resource_data.html:48 +msgid "Status" +msgstr "Estado" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:52 +#: ckanext/datapusher/templates/datapusher/resource_data.html:52 +msgid "Last updated" +msgstr "Última actualización" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:56 +#: ckanext/datapusher/templates/datapusher/resource_data.html:56 +msgid "Never" +msgstr "Nunca" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:62 +#: ckanext/datapusher/templates/datapusher/resource_data.html:62 +msgid "Upload Log" +msgstr "Rexistro de envío" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:76 +#: ckanext/datapusher/templates/datapusher/resource_data.html:76 +msgid "Details" +msgstr "Detalles" + +#: ckanext/datapusher/templates-bs2/datapusher/resource_data.html:83 +#: ckanext/datapusher/templates/datapusher/resource_data.html:83 +msgid "End of log" +msgstr "Fin do rexistro" + +#: ckanext/datapusher/templates-bs2/package/resource_edit_base.html:5 +#: ckanext/datapusher/templates/package/resource_edit_base.html:5 +msgid "DataStore" +msgstr "Almacén de datos" + +#: ckanext/datastore/controller.py:53 +#, python-format +msgid "format: must be one of %s" +msgstr "formato: debe ser un de %s" + +#: ckanext/datastore/controller.py:65 +msgid "DataStore resource not found" +msgstr "Non se atopou o recurso «Almacén de datos»" + +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" +"The data was invalid (for example: a numeric value is out of range or was " +"inserted into a text field)." +msgstr "" +"Os datos eran incorrectos (por exemplo: un valor numérico estaba fora do " +"intervalo ou foi inserido nun campo de texto)." + +#: ckanext/datastore/logic/action.py:258 ckanext/datastore/logic/action.py:286 +#: ckanext/datastore/logic/action.py:344 ckanext/datastore/logic/action.py:457 +msgid "Resource \"{0}\" was not found." +msgstr "Non se atopou o recurso «{0}»." + +#: ckanext/datastore/logic/auth.py:19 +msgid "User {0} not authorized to update resource {1}" +msgstr "O usuario {0} non está autorizado para actualizar o recurso {1}" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:19 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:21 +msgid "CKAN Data API" +msgstr "API de datos do CKAN" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:23 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:25 +msgid "Access resource data via a web API with powerful query support" +msgstr "" +"Acceso ao recurso de datos mediante unha API web con servizo completo de " +"consulta" + +#: ckanext/datastore/templates/ajax_snippets/api_info.html:26 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:33 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:35 +msgid "Endpoints" +msgstr "Puntos de acceso" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:37 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:39 +msgid "" +"The Data API can be accessed via the following actions of the CKAN action " +"API." +msgstr "" +"A API de Datos é accesíbel mediante as seguintes accións da API de acción do" +" CKAN." + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:42 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:44 +msgid "Create" +msgstr "Crear" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:46 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:48 +msgid "Update / Insert" +msgstr "Actualizar / Inserir" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:50 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:52 +msgid "Query" +msgstr "Consulta" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:54 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:56 +msgid "Query (via SQL)" +msgstr "Consulta (con SQL)" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:66 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:68 +msgid "Querying" +msgstr "Consultando" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:70 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:72 +msgid "Query example (first 5 results)" +msgstr "Exemplo de consulta (primeiros cinco resultados)" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:75 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:77 +msgid "Query example (results containing 'jones')" +msgstr "Exemplo de consulta (resultados contendo «jones»)" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:80 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:82 +msgid "Query example (via SQL statement)" +msgstr "Consulta exemplo (con sentencia SQL)" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:91 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:93 +msgid "Example: Javascript" +msgstr "Exemplo: Javascript" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:95 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:97 +msgid "A simple ajax (JSONP) request to the data API using jQuery." +msgstr "Unha consulta ajax (JSONP) sinxela á API de datos usando jQuery." + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:116 +#: ckanext/datastore/templates/ajax_snippets/api_info.html:118 +msgid "Example: Python" +msgstr "Exemplo: Python" + +#: ckan/templates/group/member_new.html:60 +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:26 +#: ckanext/datastore/templates/datastore/dictionary.html:20 +msgid "Save" +msgstr "Gardar" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:16 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:3 +msgid "Field {num}." +msgstr "Campo {num}." + +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 +#: ckanext/datatablesview/templates/datatables/datatables_form.html:18 +msgid "Label" +msgstr "Etiqueta" + +#: ckan/templates/group/snippets/group_form.html:20 +#: ckan/templates/organization/snippets/organization_form.html:20 +#: ckan/templates/package/snippets/package_basic_fields.html:19 +#: ckan/templates/package/snippets/resource_form.html:34 +#: ckan/templates/package/snippets/view_form.html:9 +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:21 +#: ckanext/datastore/templates-bs2/package/resource_read.html:21 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:24 +#: ckanext/datastore/templates/package/resource_read.html:22 +msgid "Description" +msgstr "Descrición" + +#: ckanext/datastore/templates-bs2/package/resource_edit_base.html:6 +#: ckanext/datastore/templates-bs2/package/resource_read.html:14 +#: ckanext/datastore/templates/package/resource_edit_base.html:6 +#: ckanext/datastore/templates/package/resource_read.html:14 +msgid "Data Dictionary" +msgstr "Dicionario de datos" + +#: ckanext/datastore/templates-bs2/package/resource_read.html:18 +#: ckanext/datastore/templates/package/resource_read.html:19 +#: ckanext/datatablesview/templates/datatables/datatables_form.html:17 +msgid "Column" +msgstr "Columna" + +#: ckanext/datastore/templates-bs2/package/resource_read.html:19 +#: ckanext/datastore/templates/package/resource_read.html:20 +msgid "Type" +msgstr "Tipo" + +#: ckan/public-bs2/base/javascript/modules/activity-stream.js:97 +#: ckan/public-bs2/base/javascript/modules/popover-context.js:62 +#: ckan/public/base/javascript/modules/activity-stream.js:97 +#: ckan/public/base/javascript/modules/popover-context.js:62 +#: ckan/templates/tests/mock_json_resource_preview_template.html:7 +#: ckan/templates/tests/mock_resource_preview_template.html:7 +#: ckanext/datastore/templates-bs2/package/snippets/data_api_button.html:8 +#: ckanext/datastore/templates/package/snippets/data_api_button.html:7 +#: ckanext/example_theme_docs/v18_snippet_api/fanstatic/example_theme_popover.js:21 +#: ckanext/example_theme_docs/v19_01_error/fanstatic/example_theme_popover.js:21 +#: ckanext/example_theme_docs/v19_02_error_handling/fanstatic/example_theme_popover.js:8 +#: ckanext/example_theme_docs/v20_pubsub/fanstatic/example_theme_popover.js:8 +#: ckanext/example_theme_docs/v21_custom_jquery_plugin/fanstatic/example_theme_popover.js:8 +#: ckanext/reclineview/theme/templates/recline_view.html:14 +#: ckanext/textview/theme/templates/text_view.html:9 +msgid "Loading..." +msgstr "Loading..." + +#: ckanext/datastore/templates-bs2/package/snippets/data_api_button.html:10 +#: ckanext/datastore/templates/package/snippets/data_api_button.html:9 +msgid "Data API" +msgstr "API de datos" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Pode obter máis información na documentación da API principal de datos do CKAN e do " +"almacén de datos.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 +msgid "Table" +msgstr "Táboa" + +#: ckanext/datatablesview/templates/datatables/datatables_form.html:6 +msgid "Responsive display" +msgstr "Deseño adaptábel" + +#: ckanext/datatablesview/templates/datatables/datatables_form.html:12 +msgid "Show Columns" +msgstr "Amosar as columnas" + +#: ckanext/datatablesview/templates/datatables/datatables_view.html:28 +msgid "Hide/Unhide Columns" +msgstr "Agachar/amosar as columnas" + +#: ckanext/example_iconfigurer/templates/admin/config.html:11 +msgid "Datasets per page" +msgstr "Conxuntos de datos por páxina" + +#: ckanext/example_iconfigurer/templates/admin/config.html:13 +msgid "Test conf" +msgstr "Configuración de proba" + +#: ckan/templates/group/read.html:13 ckan/templates/organization/read.html:19 +#: ckan/templates/package/search.html:29 +#: ckan/templates/snippets/sort_by.html:14 +#: ckanext/example_idatasetform/templates/package/search.html:12 +msgid "Relevance" +msgstr "Relevancia" + +#: ckan/templates/group/index.html:20 ckan/templates/group/read.html:14 +#: ckan/templates/organization/bulk_process.html:97 +#: ckan/templates/organization/index.html:20 +#: ckan/templates/organization/read.html:20 +#: ckan/templates/package/search.html:30 +#: ckan/templates/snippets/search_form.html:4 +#: ckan/templates/snippets/simple_search.html:10 +#: ckan/templates/snippets/sort_by.html:15 +#: ckanext/example_idatasetform/templates/package/search.html:13 +msgid "Name Ascending" +msgstr "Nome ascendente" + +#: ckan/templates/group/index.html:20 ckan/templates/group/read.html:15 +#: ckan/templates/organization/bulk_process.html:98 +#: ckan/templates/organization/index.html:20 +#: ckan/templates/organization/read.html:21 +#: ckan/templates/package/search.html:31 +#: ckan/templates/snippets/search_form.html:4 +#: ckan/templates/snippets/simple_search.html:10 +#: ckan/templates/snippets/sort_by.html:16 +#: ckanext/example_idatasetform/templates/package/search.html:14 +msgid "Name Descending" +msgstr "Nome descendente" + +#: ckan/templates/group/read.html:16 +#: ckan/templates/organization/bulk_process.html:99 +#: ckan/templates/organization/read.html:22 +#: ckan/templates/package/search.html:32 +#: ckan/templates/package/snippets/resource_form.html:53 +#: ckan/templates/snippets/sort_by.html:17 +#: ckanext/example_idatasetform/templates/package/search.html:15 +msgid "Last Modified" +msgstr "Última modificación" + +#: ckanext/example_idatasetform/templates/package/search.html:16 +msgid "Custom Field Ascending" +msgstr "Campo personalizado ascendente" + +#: ckanext/example_idatasetform/templates/package/search.html:17 +msgid "Custom Field Descending" +msgstr "Campo personalizado descendente" + +#: ckan/templates/group/read.html:17 ckan/templates/organization/read.html:23 +#: ckan/templates/package/search.html:33 +#: ckan/templates/snippets/package_item.html:50 +#: ckan/templates/snippets/popular.html:3 +#: ckan/templates/snippets/sort_by.html:19 +#: ckanext/example_idatasetform/templates/package/search.html:18 +msgid "Popular" +msgstr "Popular" + +#: ckanext/example_idatasetform/templates/package/snippets/additional_info.html:6 +#: ckanext/example_idatasetform/templates/package/snippets/package_basic_fields.html:4 +#: ckanext/example_idatasetform/templates/package/snippets/resource_form.html:6 +msgid "Custom Text" +msgstr "Texto personalizado" + +#: ckanext/example_idatasetform/templates/package/snippets/package_basic_fields.html:4 +msgid "custom text" +msgstr "texto personalizado" + +#: ckanext/example_idatasetform/templates/package/snippets/package_metadata_fields.html:11 +msgid "Country Code" +msgstr "Código de país" + +#: ckanext/example_idatasetform/templates/package/snippets/resource_form.html:6 +msgid "custom resource text" +msgstr "texto personalizado de recurso" + +#: ckanext/example_itranslation/templates/home/index.html:4 +msgid "This is an untranslated string" +msgstr "Este texto non está traducido" + +#: ckanext/example_theme_docs/v10_custom_snippet/templates/snippets/example_theme_most_popular_groups.html:20 +#: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:19 +msgid "This group has no description" +msgstr "Este grupo non ten unha descrición" + +#: ckan/templates/group/snippets/group_item.html:32 +#: ckan/templates/organization/snippets/organization_item.html:31 +#: ckanext/example_theme_docs/v10_custom_snippet/templates/snippets/example_theme_most_popular_groups.html:23 +#: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:22 +msgid "{num} Dataset" +msgid_plural "{num} Datasets" +msgstr[0] "{num} conxunto de datos" +msgstr[1] "{num} conxuntos de datos" + +#: ckan/templates/group/snippets/group_item.html:34 +#: ckan/templates/organization/snippets/organization_item.html:33 +#: ckanext/example_theme_docs/v10_custom_snippet/templates/snippets/example_theme_most_popular_groups.html:25 +#: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:24 +msgid "0 Datasets" +msgstr "0 conxuntos de datos" + +#: ckanext/example_theme_docs/v12_extra_public_dir/templates/home/snippets/promoted.html:4 +msgid "CKAN's data previewing tool has many powerful features" +msgstr "" +"A ferramenta de vista previa do CKAN ten moitas e moi potentes " +"funcionalidades" + +#: ckan/templates/group/followers.html:3 ckan/templates/group/followers.html:6 +#: ckan/templates/group/snippets/info.html:32 +#: ckan/templates/package/followers.html:3 +#: ckan/templates/package/followers.html:6 +#: ckan/templates/package/snippets/info.html:24 +#: ckan/templates/snippets/context/group.html:13 +#: ckan/templates/snippets/context/user.html:15 +#: ckan/templates/snippets/organization.html:55 +#: ckan/templates/user/followers.html:3 ckan/templates/user/followers.html:7 +#: ckan/templates/user/read_base.html:49 +#: ckanext/example_theme_docs/v18_snippet_api/templates/ajax_snippets/example_theme_popover.html:12 +msgid "Followers" +msgstr "Seguidores" + +#: ckan/logic/__init__.py:99 ckan/logic/action/__init__.py:60 +#: ckan/templates/package/edit_base.html:21 +#: ckan/templates/package/resources.html:5 +#: ckan/templates/package/snippets/package_context.html:12 +#: ckan/templates/package/snippets/resources.html:20 +#: ckan/templates/snippets/context/dataset.html:13 +#: ckanext/example_theme_docs/v18_snippet_api/templates/ajax_snippets/example_theme_popover.html:15 +msgid "Resources" +msgstr "Recursos" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:80 +#: ckan/public/base/javascript/modules/image-upload.js:80 +#: ckan/templates/macros/form.html:424 ckanext/imageview/plugin.py:27 +#: ckanext/imageview/plugin.py:32 +msgid "Image" +msgstr "Imaxe" + +#: ckanext/imageview/theme/templates/image_form.html:3 +msgid "Image url" +msgstr "URL da imaxe" + +#: ckanext/imageview/theme/templates/image_form.html:3 +msgid "eg. http://example.com/image.jpg (if blank uses resource url)" +msgstr "" +"ex.: http://example.com/image.jpg (se estiver en branco usará o URL do " +"recurso)" + +#: ckanext/reclineview/plugin.py:101 +msgid "Data Explorer" +msgstr "Navegador de datos" + +#: ckanext/reclineview/plugin.py:171 +#: ckanext/reclineview/theme/public/recline_view.js:200 +#: ckanext/reclineview/theme/public/recline_view.min.js:14 +msgid "Graph" +msgstr "Gráfico" + +#: ckanext/reclineview/plugin.py:231 +#: ckanext/reclineview/theme/public/recline_view.js:207 +#: ckanext/reclineview/theme/public/recline_view.min.js:14 +msgid "Map" +msgstr "Mapa" + +#: ckanext/reclineview/theme/public/recline_view.js:28 +#: ckanext/reclineview/theme/public/recline_view.min.js:1 +msgid "error loading view" +msgstr "produciuse un erro ao cargar a vista" + +#: ckanext/reclineview/theme/public/recline_view.js:75 +#: ckanext/reclineview/theme/public/recline_view.min.js:5 +msgid "Could not load view" +msgstr "Non foi posíbel cargar a vista" + +#: ckanext/reclineview/theme/public/recline_view.js:77 +#: ckanext/reclineview/theme/public/recline_view.min.js:5 +msgid "DataStore returned an error" +msgstr "O almacén de datos devolveu un erro" + +#: ckanext/reclineview/theme/public/recline_view.js:79 +#: ckanext/reclineview/theme/public/recline_view.min.js:5 +msgid "DataProxy returned an error" +msgstr "O proxy de datos devolveu un erro" + +#: ckanext/reclineview/theme/public/recline_view.js:193 +#: ckanext/reclineview/theme/public/recline_view.min.js:14 +msgid "Grid" +msgstr "Grella" + +#: ckan/templates/package/snippets/view_form_filters.html:46 +#: ckanext/reclineview/theme/public/recline_view.js:215 +#: ckanext/reclineview/theme/public/recline_view.min.js:14 +msgid "Filters" +msgstr "Filtros" + +#: ckanext/reclineview/theme/templates/recline_graph_form.html:3 +#: ckanext/reclineview/theme/templates/recline_map_form.html:3 +msgid "Row offset" +msgstr "Desprazamento de fila" + +#: ckanext/reclineview/theme/templates/recline_graph_form.html:3 +#: ckanext/reclineview/theme/templates/recline_map_form.html:3 +msgid "eg: 0" +msgstr "ex.: 0" + +#: ckanext/reclineview/theme/templates/recline_graph_form.html:4 +#: ckanext/reclineview/theme/templates/recline_map_form.html:4 +msgid "Number of rows" +msgstr "Número de filas" + +#: ckanext/reclineview/theme/templates/recline_graph_form.html:4 +#: ckanext/reclineview/theme/templates/recline_map_form.html:4 +msgid "eg: 100" +msgstr "ex.: 100" + +#: ckanext/reclineview/theme/templates/recline_graph_form.html:6 +msgid "Graph type" +msgstr "Tipo de gráfico" + +#: ckanext/reclineview/theme/templates/recline_graph_form.html:7 +msgid "Group (Axis 1)" +msgstr "Grupo (eixe 1)" + +#: ckanext/reclineview/theme/templates/recline_graph_form.html:8 +msgid "Series (Axis 2)" +msgstr "Series (eixe 2)" + +#: ckanext/reclineview/theme/templates/recline_map_form.html:6 +msgid "Field type" +msgstr "Tipo de campo" + +#: ckanext/reclineview/theme/templates/recline_map_form.html:7 +msgid "Latitude field" +msgstr "Campo de latitude" + +#: ckanext/reclineview/theme/templates/recline_map_form.html:8 +msgid "Longitude field" +msgstr "Campo de lonxitude" + +#: ckanext/reclineview/theme/templates/recline_map_form.html:9 +msgid "GeoJSON field" +msgstr "Campo de GeoJSON" + +#: ckanext/reclineview/theme/templates/recline_map_form.html:10 +msgid "Auto zoom to features" +msgstr "Achegamento automático ás funcionalidades" + +#: ckanext/reclineview/theme/templates/recline_map_form.html:11 +msgid "Cluster markers" +msgstr "Marcadores de clúster" + +#: ckanext/stats/templates/ckanext/stats/index.html:10 +msgid "Total number of Datasets" +msgstr "Número total de conxuntos de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:17 +#: ckanext/stats/templates/ckanext/stats/index.html:40 +msgid "Date" +msgstr "Data" + +#: ckanext/stats/templates/ckanext/stats/index.html:18 +msgid "Total datasets" +msgstr "Total de conxuntos de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:33 +#: ckanext/stats/templates/ckanext/stats/index.html:179 +msgid "Dataset Revisions per Week" +msgstr "Revisións de conxuntos de datos por semana" + +#: ckanext/stats/templates/ckanext/stats/index.html:41 +msgid "All dataset revisions" +msgstr "Todas as revisións de conxuntos de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:42 +msgid "New datasets" +msgstr "Novos conxuntos de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:58 +#: ckanext/stats/templates/ckanext/stats/index.html:180 +msgid "Top Rated Datasets" +msgstr "Conxuntos de datos mellor valorados" + +#: ckanext/stats/templates/ckanext/stats/index.html:64 +msgid "Average rating" +msgstr "Valoración media" + +#: ckanext/stats/templates/ckanext/stats/index.html:65 +msgid "Number of ratings" +msgstr "Número de valoracións" + +#: ckanext/stats/templates/ckanext/stats/index.html:79 +msgid "No ratings" +msgstr "Sen valoración" + +#: ckanext/stats/templates/ckanext/stats/index.html:84 +#: ckanext/stats/templates/ckanext/stats/index.html:181 +msgid "Most Edited Datasets" +msgstr "Conxuntos de datos máis editados" + +#: ckan/logic/converters.py:148 ckan/logic/validators.py:151 +#: ckan/logic/validators.py:193 ckan/templates/package/read_base.html:19 +#: ckan/tests/config/test_middleware.py:619 +#: ckanext/stats/templates/ckanext/stats/index.html:89 +msgid "Dataset" +msgstr "Conxunto de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:90 +msgid "Number of edits" +msgstr "Número de edicións" + +#: ckanext/stats/templates/ckanext/stats/index.html:103 +msgid "No edited datasets" +msgstr "Non foi editado ningún conxunto de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:108 +#: ckanext/stats/templates/ckanext/stats/index.html:182 +msgid "Largest Groups" +msgstr "Grupos máis grandes" + +#: ckan/logic/converters.py:173 ckan/logic/validators.py:246 +#: ckanext/stats/templates/ckanext/stats/index.html:113 +msgid "Group" +msgstr "Grupo" + +#: ckanext/stats/templates/ckanext/stats/index.html:114 +msgid "Number of datasets" +msgstr "Número de conxuntos de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:127 +msgid "No groups" +msgstr "Sen grupos" + +#: ckanext/stats/templates/ckanext/stats/index.html:132 +#: ckanext/stats/templates/ckanext/stats/index.html:183 +msgid "Top Tags" +msgstr "Etiquetas máis utilizadas" + +#: ckanext/stats/templates/ckanext/stats/index.html:136 +msgid "Tag Name" +msgstr "Nome da etiqueta" + +#: ckanext/stats/templates/ckanext/stats/index.html:137 +#: ckanext/stats/templates/ckanext/stats/index.html:157 +msgid "Number of Datasets" +msgstr "Número de conxuntos de datos" + +#: ckanext/stats/templates/ckanext/stats/index.html:152 +#: ckanext/stats/templates/ckanext/stats/index.html:184 +msgid "Users Creating Most Datasets" +msgstr "Usuarios que crearon máis conxuntos de datos" + +#: ckan/logic/converters.py:123 ckan/logic/validators.py:216 +#: ckan/logic/validators.py:233 ckan/logic/validators.py:714 +#: ckan/templates/group/members.html:14 +#: ckan/templates/organization/members.html:19 +#: ckanext/stats/templates/ckanext/stats/index.html:156 +msgid "User" +msgstr "Usuario" + +#: ckanext/stats/templates/ckanext/stats/index.html:175 +msgid "Statistics Menu" +msgstr "Menú de estatísticas" + +#: ckanext/stats/templates/ckanext/stats/index.html:178 +msgid "Total Number of Datasets" +msgstr "Número total de conxuntos de datos" + +#: ckanext/textview/plugin.py:67 ckanext/textview/plugin.py:69 +msgid "Text" +msgstr "Texto" + +#: ckanext/webpageview/plugin.py:22 ckanext/webpageview/plugin.py:27 +msgid "Website" +msgstr "Sitio web" + +#: ckanext/webpageview/theme/templates/webpage_form.html:3 +msgid "Web Page url" +msgstr "URL de páxina web" + +#: ckanext/webpageview/theme/templates/webpage_form.html:3 +msgid "eg. http://example.com (if blank uses resource url)" +msgstr "ex.: http://example.com (se estiver en branco usará o URL do recurso)" + +#: ckan/templates/dataviewer/snippets/data_preview.html:23 +#: ckan/templates/package/snippets/resource_view.html:64 +#: ckanext/webpageview/theme/templates/webpage_view.html:2 +msgid "Your browser does not support iframes." +msgstr "O seu navegador non admite «iframes»" + +#: ckan/authz.py:207 +#, python-format +msgid "Authorization function not found: %s" +msgstr "Non se atopou a función de autorización: %s" + +#: ckan/authz.py:219 ckan/templates/header.html:11 +msgid "Admin" +msgstr "Administrador" + +#: ckan/authz.py:223 +msgid "Editor" +msgstr "Editor" + +#: ckan/authz.py:227 +msgid "Member" +msgstr "Membro" + +#: ckan/controllers/admin.py:34 ckan/views/admin.py:76 +msgid "Need to be system administrator to administer" +msgstr "Para poder administrar, vostede ten que ser administrador do sistema" + +#: ckan/controllers/admin.py:50 ckan/templates/admin/config.html:14 +msgid "Site Title" +msgstr "Título do sitio" + +#: ckan/controllers/admin.py:51 ckan/templates/admin/config.html:16 +msgid "Style" +msgstr "Estilo" + +#: ckan/controllers/admin.py:52 ckan/templates/admin/config.html:18 +msgid "Site Tag Line" +msgstr "Lema do sitio" + +#: ckan/controllers/admin.py:53 +msgid "Site Tag Logo" +msgstr "Logotipo do sitio" + +#: ckan/controllers/admin.py:55 ckan/templates/admin/config.html:25 +#: ckan/templates/group/about.html:3 ckan/templates/group/read_base.html:19 +#: ckan/templates/header.html:88 ckan/templates/home/about.html:3 +#: ckan/templates/home/about.html:6 ckan/templates/home/about.html:16 +#: ckan/templates/organization/about.html:3 +#: ckan/templates/organization/read_base.html:19 +#: ckan/templates/user/edit_user_form.html:14 +msgid "About" +msgstr "Sobre" + +#: ckan/controllers/admin.py:55 ckan/templates/admin/config.html:25 +msgid "About page text" +msgstr "Texto da páxina «Sobre»" + +#: ckan/controllers/admin.py:56 ckan/templates/admin/config.html:27 +msgid "Intro Text" +msgstr "Texto de introdución" + +#: ckan/controllers/admin.py:56 ckan/templates/admin/config.html:27 +msgid "Text on home page" +msgstr "Texto na páxina principal" + +#: ckan/controllers/admin.py:57 ckan/templates/admin/config.html:29 +msgid "Custom CSS" +msgstr "CSS personalizado" + +#: ckan/controllers/admin.py:57 ckan/templates/admin/config.html:29 +msgid "Customisable css inserted into the page header" +msgstr "Folla de estilo CSS personalizábel inserida na cabeceira da páxina" + +#: ckan/controllers/admin.py:58 ckan/templates/admin/config.html:31 +msgid "Homepage" +msgstr "Páxina de inicio" + +#: ckan/controllers/admin.py:161 ckan/views/admin.py:175 +#, python-format +msgid "" +"Cannot purge package %s as associated revision %s includes non-deleted " +"packages %s" +msgstr "" +"Non é posíbel purgar o paquete %s por mor de que a revisión asociada %s " +"inclúe paquetes de datos no eliminados %s" + +#: ckan/controllers/admin.py:183 ckan/views/admin.py:197 +#, python-format +msgid "Problem purging revision %s: %s" +msgstr "Produciuse un problema ao purgar a revisión %s: %s" + +#: ckan/controllers/admin.py:185 ckan/views/admin.py:199 +msgid "Purge complete" +msgstr "Rematou a purga" + +#: ckan/controllers/admin.py:187 ckan/views/admin.py:201 +msgid "Action not implemented." +msgstr "Acción non incorporada." + +#: ckan/controllers/api.py:127 ckan/controllers/api.py:218 +#: ckan/views/api.py:112 ckan/views/api.py:299 +msgid "Access denied" +msgstr "Acceso denegado" + +#: ckan/controllers/api.py:133 ckan/controllers/api.py:227 +#: ckan/logic/action/create.py:911 ckan/logic/converters.py:123 +#: ckan/logic/converters.py:148 ckan/logic/converters.py:173 +#: ckan/logic/validators.py:151 ckan/logic/validators.py:172 +#: ckan/logic/validators.py:193 ckan/logic/validators.py:202 +#: ckan/logic/validators.py:216 ckan/logic/validators.py:233 +#: ckan/logic/validators.py:246 ckan/logic/validators.py:270 +#: ckan/logic/validators.py:714 ckan/views/api.py:119 ckan/views/api.py:308 +msgid "Not found" +msgstr "Non foi posíbel atopalo" + +#: ckan/controllers/api.py:139 ckan/views/api.py:126 +msgid "Bad request" +msgstr "Solicitude incorrecta" + +#: ckan/controllers/api.py:167 +#, python-format +msgid "Action name not known: %s" +msgstr "A acción %s é descoñecida" + +#: ckan/controllers/api.py:188 ckan/views/api.py:268 +#, python-format +msgid "JSON Error: %s" +msgstr "Erro do JSON: %s" + +#: ckan/controllers/api.py:194 ckan/views/api.py:274 +#, python-format +msgid "Bad request data: %s" +msgstr "Solicitude incorrecta de datos: %s" + +#: ckan/controllers/api.py:283 +msgid "No revision specified" +msgstr "Non se especificou ningunha revisión" + +#: ckan/controllers/api.py:287 +#, python-format +msgid "There is no revision with id: %s" +msgstr "Non hai ningunha revisión co ID: %s" + +#: ckan/controllers/api.py:297 +msgid "Missing search term ('since_id=UUID' or 'since_time=TIMESTAMP')" +msgstr "Falta o termo de busca («since_id=UUID» ou «since_time=TIMESTAMP»)" + +#: ckan/controllers/api.py:309 +#, python-format +msgid "Could not read parameters: %r" +msgstr "Non é posíbel ler os parametros: %r" + +#: ckan/controllers/api.py:370 +#, python-format +msgid "Bad search option: %s" +msgstr "A opción de busca está errada: %s" + +#: ckan/controllers/api.py:373 +#, python-format +msgid "Unknown register: %s" +msgstr "Rexistro descoñecido: %s" + +#: ckan/controllers/api.py:382 +#, python-format +msgid "Malformed qjson value: %r" +msgstr "Valor qjson defectuoso: %r" + +#: ckan/controllers/api.py:392 +msgid "Request params must be in form of a json encoded dictionary." +msgstr "Os parámetros requiridos deben estar codificados en formato json." + +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 +msgid "Group not found" +msgstr "Non se atopou o grupo" + +#: ckan/controllers/feed.py:245 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:160 +msgid "Organization not found" +msgstr "Non se atopou a organización" + +#: ckan/controllers/group.py:130 ckan/controllers/group.py:581 +msgid "Incorrect group type" +msgstr "Tipo de grupo incorrecto" + +#: ckan/controllers/group.py:306 ckan/controllers/home.py:61 +#: ckan/controllers/package.py:256 ckan/lib/helpers.py:1036 +#: ckan/templates/header.html:87 ckan/templates/organization/edit_base.html:5 +#: ckan/templates/organization/edit_base.html:8 +#: ckan/templates/organization/index.html:3 +#: ckan/templates/organization/index.html:6 +#: ckan/templates/organization/index.html:18 +#: ckan/templates/organization/read_base.html:3 +#: ckan/templates/organization/read_base.html:6 +#: ckan/templates/package/base.html:14 ckan/views/home.py:46 +msgid "Organizations" +msgstr "Organizacións" + +#: ckan/controllers/group.py:307 ckan/controllers/home.py:62 +#: ckan/controllers/package.py:257 ckan/lib/helpers.py:1037 +#: ckan/templates/group/base_form_page.html:6 ckan/templates/group/edit.html:4 +#: ckan/templates/group/edit_base.html:3 ckan/templates/group/edit_base.html:8 +#: ckan/templates/group/index.html:3 ckan/templates/group/index.html:6 +#: ckan/templates/group/index.html:18 ckan/templates/group/members.html:3 +#: ckan/templates/group/read_base.html:3 ckan/templates/group/read_base.html:6 +#: ckan/templates/header.html:88 ckan/templates/package/group_list.html:5 +#: ckan/templates/package/read_base.html:20 +#: ckan/templates/revision/diff.html:16 ckan/templates/revision/read.html:84 +#: ckan/tests/config/test_middleware.py:632 ckan/views/home.py:47 +msgid "Groups" +msgstr "Grupos" + +#: ckan/controllers/group.py:308 ckan/controllers/home.py:63 +#: ckan/controllers/package.py:258 ckan/lib/helpers.py:1038 +#: ckan/logic/__init__.py:110 +#: ckan/templates/package/snippets/package_basic_fields.html:24 +#: ckan/templates/snippets/context/dataset.html:17 +#: ckan/templates/tag/index.html:3 ckan/templates/tag/index.html:6 +#: ckan/templates/tag/index.html:12 ckan/views/home.py:48 +msgid "Tags" +msgstr "Etiquetas" + +#: ckan/controllers/group.py:309 ckan/controllers/home.py:64 +#: ckan/controllers/package.py:259 ckan/lib/helpers.py:1039 +#: ckan/views/home.py:49 +msgid "Formats" +msgstr "Formatos" + +#: ckan/controllers/group.py:310 ckan/controllers/home.py:65 +#: ckan/controllers/package.py:260 ckan/lib/helpers.py:1040 +#: ckan/views/home.py:50 +msgid "Licenses" +msgstr "Licencias" + +#: ckan/controllers/group.py:396 ckan/controllers/group.py:513 +#: ckan/controllers/package.py:345 ckan/controllers/package.py:576 +#: ckan/controllers/package.py:789 ckan/controllers/package.py:1409 +#: ckan/controllers/package.py:1443 +#, python-format +msgid "User %r not authorized to edit %s" +msgstr "O usuario %r non está autorizado para editar %s" + +#: ckan/controllers/group.py:443 +msgid "Not authorized to perform bulk update" +msgstr "Non está autorizado para facer unha actualización masiva." + +#: ckan/controllers/group.py:461 +msgid "Unauthorized to create a group" +msgstr "Non está autorizado para crear un grupo" + +#: ckan/controllers/group.py:539 ckan/controllers/group.py:569 +#: ckan/controllers/package.py:944 ckan/controllers/package.py:992 +#: ckan/controllers/user.py:250 ckan/controllers/user.py:380 +#: ckan/controllers/user.py:551 ckan/views/user.py:193 ckan/views/user.py:300 +#: ckan/views/user.py:620 +msgid "Integrity Error" +msgstr "Produciuse un erro de integridade" + +#: ckan/controllers/group.py:595 +#, python-format +msgid "User %r not authorized to edit %s authorizations" +msgstr "O usuario %r non está autorizado para editar %s autorizacións" + +#: ckan/controllers/group.py:615 ckan/controllers/group.py:630 +#, python-format +msgid "Unauthorized to delete group %s" +msgstr "Non está autorizado para eliminar o grupo %s" + +#: ckan/controllers/group.py:621 +msgid "Organization has been deleted." +msgstr "A organización foi eliminada correctamente." + +#: ckan/controllers/group.py:623 +msgid "Group has been deleted." +msgstr "O grupo foi eliminado correctamente." + +#: ckan/controllers/group.py:625 +#, python-format +msgid "%s has been deleted." +msgstr "%s foi eliminado correctamente." + +#: ckan/controllers/group.py:657 +#, python-format +msgid "User %r not authorized to edit members of %s" +msgstr "O usuario %r non está autorizado para editar os membros de %s" + +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "" + +#: ckan/controllers/group.py:712 +#, python-format +msgid "Unauthorized to add member to group %s" +msgstr "Non está autorizado para engadir membros no grupo %s" + +#: ckan/controllers/group.py:731 ckan/controllers/group.py:744 +#, python-format +msgid "Unauthorized to delete group %s members" +msgstr "Non está autorizado para eliminar membros do grupo %s" + +#: ckan/controllers/group.py:738 +msgid "Group member has been deleted." +msgstr "O membro do grupo foi eliminado correctamente." + +#: ckan/controllers/group.py:762 ckan/controllers/package.py:436 +msgid "Select two revisions before doing the comparison." +msgstr "Seleccione dúas revisións antes de facer a comparación." + +#: ckan/controllers/group.py:786 +msgid "CKAN Group Revision History" +msgstr "Historial de revisións do grupo CKAN" + +#: ckan/controllers/group.py:790 +msgid "Recent changes to CKAN Group: " +msgstr "Cambios recentes no Grupo CKAN:" + +#: ckan/controllers/group.py:811 ckan/controllers/package.py:487 +msgid "Log message: " +msgstr "Mensaxe do rexistro:" + +#: ckan/controllers/group.py:861 ckan/controllers/package.py:1193 +#: ckan/controllers/user.py:719 ckan/views/user.py:650 +msgid "You are now following {0}" +msgstr "Está a seguir a {0}" + +#: ckan/controllers/group.py:881 ckan/controllers/package.py:1212 +#: ckan/controllers/user.py:739 ckan/views/user.py:672 +msgid "You are no longer following {0}" +msgstr "Xa non está a seguir a {0}" + +#: ckan/controllers/group.py:901 ckan/controllers/user.py:584 +#: ckan/views/user.py:697 +#, python-format +msgid "Unauthorized to view followers %s" +msgstr "Non está autorizado para ver os seguidores de %s" + +#: ckan/controllers/home.py:35 +msgid "This site is currently off-line. Database is not initialised." +msgstr "" +"Este sitio está desconectado neste intre. A base de datos no está preparada." + +#: ckan/controllers/home.py:73 ckan/views/home.py:58 +#, python-format +msgid "Please update your profile and add your email address. " +msgstr "" +"Actualice o seu perfil e engada o seu enderezo de " +"correo-e." + +#: ckan/controllers/home.py:75 ckan/views/home.py:60 +#, python-format +msgid "%s uses your email address if you need to reset your password." +msgstr "" +"%s utiliza o seu enderezo de correo-e se vostede necesita restabelecer o seu" +" contrasinal." + +#: ckan/controllers/package.py:304 +msgid "Invalid search query: {error_message}" +msgstr "A busca é incorrecta: {error_message}" + +#: ckan/controllers/package.py:323 +msgid "Parameter \"{parameter_name}\" is not an integer" +msgstr "O parámetro «{parameter_name}» non é un enteiro" + +#: ckan/controllers/package.py:343 ckan/controllers/package.py:351 +#: ckan/controllers/package.py:389 ckan/controllers/package.py:456 +#: ckan/controllers/package.py:775 ckan/controllers/package.py:823 +#: ckan/controllers/package.py:841 ckan/controllers/package.py:942 +#: ckan/controllers/package.py:990 ckan/controllers/package.py:1042 +#: ckan/controllers/package.py:1089 ckan/controllers/package.py:1237 +#: ckan/controllers/package.py:1253 ckan/controllers/package.py:1316 +#: ckan/controllers/package.py:1415 ckan/controllers/package.py:1450 +#: ckan/controllers/package.py:1557 +msgid "Dataset not found" +msgstr "Non se atopou o conxunto de datos" + +#: ckan/controllers/package.py:377 ckan/controllers/package.py:379 +#: ckan/controllers/package.py:381 +#, python-format +msgid "Invalid revision format: %r" +msgstr "O formato de revisión non é válido: %r" + +#: ckan/controllers/package.py:415 +msgid "Viewing datasets of type \"{package_type}\" is not supported ({file_!r})." +msgstr "" +"Non é posíbel ver os conxuntos de datos do tipo «{package_type}» " +"({file_!r})." + +#: ckan/controllers/package.py:454 ckan/controllers/package.py:839 +#: ckan/controllers/package.py:940 ckan/controllers/package.py:988 +#: ckan/controllers/package.py:1239 +#, python-format +msgid "Unauthorized to read package %s" +msgstr "Non está autorizado para ler o paquete %s" + +#: ckan/controllers/package.py:463 +msgid "CKAN Dataset Revision History" +msgstr "Historial de revisión do conxunto de datos do CKAN" + +#: ckan/controllers/package.py:466 +msgid "Recent changes to CKAN Dataset: " +msgstr "Cambios recentes no conxunto de datos do CKAN" + +#: ckan/controllers/package.py:522 +msgid "Unauthorized to create a package" +msgstr "Non está autorizado para crear un paquete" + +#: ckan/controllers/package.py:598 +msgid "Unauthorized to edit this resource" +msgstr "Non está autorizado para editar este recurso" + +#: ckan/controllers/package.py:666 +msgid "Unauthorized to update dataset" +msgstr "Non está autorizado para actualizar o conxunto de datos" + +#: ckan/controllers/package.py:668 ckan/controllers/package.py:705 +#: ckan/controllers/package.py:731 +msgid "The dataset {id} could not be found." +msgstr "Non foi posíbel atopar o conxunto de datos {id}" + +#: ckan/controllers/package.py:672 +msgid "You must add at least one data resource" +msgstr "Ten que engadir, polo menos, un conxunto de datos" + +#: ckan/controllers/package.py:703 +msgid "Unauthorized to create a resource" +msgstr "Non está autorizado para crear un recurso" + +#: ckan/controllers/package.py:736 +msgid "Unauthorized to create a resource for this package" +msgstr "Non está autorizado para crear un recurso para este paquete" + +#: ckan/controllers/package.py:950 +msgid "Unable to add package to search index." +msgstr "" + +#: ckan/controllers/package.py:998 +msgid "Unable to update search index." +msgstr "" + +#: ckan/controllers/package.py:1035 +msgid "Dataset has been deleted." +msgstr "" + +#: ckan/controllers/package.py:1040 ckan/controllers/package.py:1058 +#, python-format +msgid "Unauthorized to delete package %s" +msgstr "Non está autorizado para eliminar o paquete %s" + +#: ckan/controllers/package.py:1063 +msgid "Resource has been deleted." +msgstr "Foi eliminado o recurso." + +#: ckan/controllers/package.py:1074 +#, python-format +msgid "Unauthorized to delete resource %s" +msgstr "Non está autorizado para eliminar o recurso %s" + +#: ckan/controllers/package.py:1133 ckan/controllers/package.py:1576 +msgid "Resource view not found" +msgstr "" + +#: ckan/controllers/package.py:1172 +msgid "Resource data not found" +msgstr "" + +#: ckan/controllers/package.py:1181 +msgid "No download is available" +msgstr "" + +#: ckan/controllers/package.py:1318 +#, python-format +msgid "Unauthorized to read dataset %s" +msgstr "Non está autorizado para ler o conxunto de datos %s" + +#: ckan/controllers/package.py:1426 +#, python-format +msgid "Unauthorized to read resource %s" +msgstr "Non está autorizado para ler o recurso %s" + +#: ckan/controllers/package.py:1490 +msgid "Unauthorized to edit resource" +msgstr "Non está autorizado para editar o recurso" + +#: ckan/controllers/package.py:1508 +msgid "View not found" +msgstr "" + +#: ckan/controllers/package.py:1514 +msgid "View Type Not found" +msgstr "" + +#: ckan/controllers/package.py:1570 +msgid "Bad resource view data" +msgstr "" + +#: ckan/controllers/package.py:1579 +msgid "Resource view not supplied" +msgstr "" + +#: ckan/controllers/package.py:1608 +msgid "No preview has been defined." +msgstr "" + +#: ckan/controllers/revision.py:45 +msgid "CKAN Repository Revision History" +msgstr "" + +#: ckan/controllers/revision.py:47 +msgid "Recent changes to the CKAN repository." +msgstr "" + +#: ckan/controllers/revision.py:111 +#, python-format +msgid "Datasets affected: %s.\n" +msgstr "" + +#: ckan/controllers/revision.py:191 +msgid "Revision updated" +msgstr "" + +#: ckan/controllers/tag.py:60 +msgid "Other" +msgstr "" + +#: ckan/controllers/tag.py:74 +msgid "Tag not found" +msgstr "" + +#: ckan/controllers/user.py:162 ckan/views/user.py:290 +msgid "Unauthorized to register as a user." +msgstr "Non está autorizado para rexistrarse como usuario" + +#: ckan/controllers/user.py:180 +msgid "Unauthorized to create a user" +msgstr "Non está autorizado para crear un usuario" + +#: ckan/controllers/user.py:211 ckan/views/user.py:426 +msgid "Unauthorized to delete user with id \"{user_id}\"." +msgstr "Non está autorizado para eliminar o usuario co ID «{user_id}»." + +#: ckan/controllers/user.py:225 ckan/controllers/user.py:288 +#: ckan/views/user.py:168 ckan/views/user.py:444 +msgid "No user specified" +msgstr "" + +#: ckan/controllers/user.py:231 ckan/controllers/user.py:313 +#: ckan/controllers/user.py:376 ckan/controllers/user.py:547 +#: ckan/views/user.py:218 ckan/views/user.py:246 ckan/views/user.py:450 +#: ckan/views/user.py:616 +#, python-format +msgid "Unauthorized to edit user %s" +msgstr "Non está autorizado para editar o usuario %s" + +#: ckan/controllers/user.py:233 ckan/controllers/user.py:248 +#: ckan/controllers/user.py:315 ckan/controllers/user.py:378 +#: ckan/controllers/user.py:523 ckan/controllers/user.py:549 +#: ckan/logic/auth/update.py:179 ckan/views/user.py:220 ckan/views/user.py:248 +#: ckan/views/user.py:315 ckan/views/user.py:452 ckan/views/user.py:573 +#: ckan/views/user.py:618 +msgid "User not found" +msgstr "" + +#: ckan/controllers/user.py:235 ckan/controllers/user.py:368 +#: ckan/views/user.py:226 ckan/views/user.py:454 +msgid "Profile updated" +msgstr "" + +#: ckan/controllers/user.py:246 ckan/views/user.py:313 +#, python-format +msgid "Unauthorized to create user %s" +msgstr "Non está autorizado para crear o usuario %s" + +#: ckan/controllers/user.py:252 ckan/views/user.py:306 +msgid "Bad Captcha. Please try again." +msgstr "" + +#: ckan/controllers/user.py:266 ckan/views/user.py:325 +#, python-format +msgid "" +"User \"%s\" is now registered but you are still logged in as \"%s\" from " +"before" +msgstr "" + +#: ckan/controllers/user.py:294 ckan/views/user.py:174 +msgid "Unauthorized to edit a user." +msgstr "Non está autorizado para editar un usuario" + +#: ckan/controllers/user.py:321 ckan/views/user.py:252 +#, python-format +msgid "User %s not authorized to edit %s" +msgstr "O usuario %s non está autorizado para editar %s" + +#: ckan/controllers/user.py:386 ckan/views/user.py:210 +msgid "Password entered was incorrect" +msgstr "" + +#: ckan/controllers/user.py:387 ckan/templates/user/edit_user_form.html:29 +#: ckan/views/user.py:212 +msgid "Old Password" +msgstr "" + +#: ckan/controllers/user.py:387 ckan/views/user.py:212 +msgid "incorrect password" +msgstr "" + +#: ckan/controllers/user.py:427 ckan/views/user.py:386 +msgid "Login failed. Bad username or password." +msgstr "" + +#: ckan/controllers/user.py:460 ckan/views/user.py:504 +msgid "Unauthorized to request reset password." +msgstr "Non está autorizado para solicitar o reinicio do contrasinal." + +#: ckan/controllers/user.py:489 ckan/views/user.py:530 +#, python-format +msgid "\"%s\" matched several users" +msgstr "" + +#: ckan/controllers/user.py:491 ckan/controllers/user.py:493 +#: ckan/views/user.py:532 ckan/views/user.py:534 +#, python-format +msgid "No such user: %s" +msgstr "" + +#: ckan/controllers/user.py:498 ckan/views/user.py:542 +msgid "Please check your inbox for a reset code." +msgstr "" + +#: ckan/controllers/user.py:502 ckan/views/user.py:546 +#, python-format +msgid "Could not send reset link: %s" +msgstr "" + +#: ckan/controllers/user.py:515 ckan/views/user.py:568 +msgid "Unauthorized to reset password." +msgstr "Non está autorizado para reiniciar o contrasinal." + +#: ckan/controllers/user.py:527 ckan/views/user.py:577 +msgid "Invalid reset key. Please try again." +msgstr "" + +#: ckan/controllers/user.py:544 ckan/views/user.py:613 +msgid "Your password has been reset." +msgstr "" + +#: ckan/controllers/user.py:566 +msgid "Your password must be 4 characters or longer." +msgstr "" + +#: ckan/controllers/user.py:569 ckan/views/user.py:592 +msgid "The passwords you entered do not match." +msgstr "" + +#: ckan/controllers/user.py:572 ckan/views/user.py:595 +msgid "You must provide a password" +msgstr "" + +#: ckan/controllers/user.py:640 ckan/views/dashboard.py:58 +msgid "Follow item not found" +msgstr "" + +#: ckan/controllers/user.py:644 ckan/views/dashboard.py:62 +msgid "{0} not found" +msgstr "" + +#: ckan/controllers/user.py:658 ckan/views/dashboard.py:76 +msgid "Everything" +msgstr "" + +#: ckan/controllers/util.py:18 ckan/logic/action/__init__.py:62 +msgid "Missing Value" +msgstr "" + +#: ckan/controllers/util.py:23 +msgid "Redirecting to external site is not allowed." +msgstr "" + +#: ckan/lib/activity_streams.py:60 +msgid "{actor} added the tag {tag} to the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:63 +msgid "{actor} updated the group {group}" +msgstr "" + +#: ckan/lib/activity_streams.py:66 +msgid "{actor} updated the organization {organization}" +msgstr "" + +#: ckan/lib/activity_streams.py:69 +msgid "{actor} updated the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:72 +msgid "{actor} changed the extra {extra} of the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:75 +msgid "{actor} updated the resource {resource} in the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:78 +msgid "{actor} updated their profile" +msgstr "" + +#: ckan/lib/activity_streams.py:81 +msgid "{actor} deleted the group {group}" +msgstr "" + +#: ckan/lib/activity_streams.py:84 +msgid "{actor} deleted the organization {organization}" +msgstr "" + +#: ckan/lib/activity_streams.py:87 +msgid "{actor} deleted the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:90 +msgid "{actor} deleted the extra {extra} from the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:93 +msgid "{actor} deleted the resource {resource} from the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:97 +msgid "{actor} created the group {group}" +msgstr "" + +#: ckan/lib/activity_streams.py:100 +msgid "{actor} created the organization {organization}" +msgstr "" + +#: ckan/lib/activity_streams.py:103 +msgid "{actor} created the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:106 +msgid "{actor} added the extra {extra} to the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:109 +msgid "{actor} added the resource {resource} to the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:112 +msgid "{actor} signed up" +msgstr "" + +#: ckan/lib/activity_streams.py:115 +msgid "{actor} removed the tag {tag} from the dataset {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:118 +msgid "{actor} started following {dataset}" +msgstr "" + +#: ckan/lib/activity_streams.py:121 +msgid "{actor} started following {user}" +msgstr "" + +#: ckan/lib/activity_streams.py:124 +msgid "{actor} started following {group}" +msgstr "" + +#: ckan/lib/datapreview.py:265 ckan/templates/group/edit_base.html:16 +#: ckan/templates/organization/edit_base.html:17 +#: ckan/templates/package/resource_read.html:38 +#: ckan/templates/package/resource_views.html:4 +msgid "View" +msgstr "" + +#: ckan/lib/email_notifications.py:103 +msgid "{n} new activity from {site_title}" +msgid_plural "{n} new activities from {site_title}" +msgstr[0] "" +msgstr[1] "" + +#: ckan/lib/formatters.py:19 +msgid "January" +msgstr "xaneiro" + +#: ckan/lib/formatters.py:23 +msgid "February" +msgstr "febreiro" + +#: ckan/lib/formatters.py:27 +msgid "March" +msgstr "marzo" + +#: ckan/lib/formatters.py:31 +msgid "April" +msgstr "abril" + +#: ckan/lib/formatters.py:35 +msgid "May" +msgstr "maio" + +#: ckan/lib/formatters.py:39 +msgid "June" +msgstr "xuño" + +#: ckan/lib/formatters.py:43 +msgid "July" +msgstr "xullo" + +#: ckan/lib/formatters.py:47 +msgid "August" +msgstr "agosto" + +#: ckan/lib/formatters.py:51 +msgid "September" +msgstr "setembro" + +#: ckan/lib/formatters.py:55 +msgid "October" +msgstr "outubro" + +#: ckan/lib/formatters.py:59 +msgid "November" +msgstr "novembro" + +#: ckan/lib/formatters.py:63 +msgid "December" +msgstr "decembro" + +#: ckan/lib/formatters.py:114 +msgid "Just now" +msgstr "Agora mesmo" + +#: ckan/lib/formatters.py:116 +msgid "{mins} minute ago" +msgid_plural "{mins} minutes ago" +msgstr[0] "Vai {mins} minuto" +msgstr[1] "Vai {mins} minutos" + +#: ckan/lib/formatters.py:119 +msgid "{hours} hour ago" +msgid_plural "{hours} hours ago" +msgstr[0] "Vai {hours} hora" +msgstr[1] "Vai {hours} horas" + +#: ckan/lib/formatters.py:125 +msgid "{days} day ago" +msgid_plural "{days} days ago" +msgstr[0] "Vai {days} día" +msgstr[1] "Vai {days} días" + +#: ckan/lib/formatters.py:128 +msgid "{months} month ago" +msgid_plural "{months} months ago" +msgstr[0] "Vai {months} mes" +msgstr[1] "Vai {months} meses" + +#: ckan/lib/formatters.py:130 +msgid "over {years} year ago" +msgid_plural "over {years} years ago" +msgstr[0] "Vai máis de {years} ano" +msgstr[1] "Vai máis de {years} anos" + +#: ckan/lib/formatters.py:146 +msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" +msgstr "{day} de {month} de {year}, {hour:02}:{min:02} ({timezone})" + +#: ckan/lib/formatters.py:151 +msgid "{month} {day}, {year}" +msgstr "{day} de {month} de {year}" + +#: ckan/lib/formatters.py:167 +msgid "{bytes} bytes" +msgstr "{bytes} bytes" + +#: ckan/lib/formatters.py:169 +msgid "{kibibytes} KiB" +msgstr "{kibibytes} KiB" + +#: ckan/lib/formatters.py:171 +msgid "{mebibytes} MiB" +msgstr "{mebibytes} MiB" + +#: ckan/lib/formatters.py:173 +msgid "{gibibytes} GiB" +msgstr "{gibibytes} GiB" + +#: ckan/lib/formatters.py:175 +msgid "{tebibytes} TiB" +msgstr "{tebibytes} TiB" + +#: ckan/lib/formatters.py:187 +msgid "{n}" +msgstr "{n}" + +#: ckan/lib/formatters.py:189 +msgid "{k}k" +msgstr "{k}k" + +#: ckan/lib/formatters.py:191 +msgid "{m}M" +msgstr "{m}M" + +#: ckan/lib/formatters.py:193 +msgid "{g}G" +msgstr "{g}G" + +#: ckan/lib/formatters.py:195 +msgid "{t}T" +msgstr "{t}T" + +#: ckan/lib/formatters.py:197 +msgid "{p}P" +msgstr "{p}P" + +#: ckan/lib/formatters.py:199 +msgid "{e}E" +msgstr "{e}E" + +#: ckan/lib/formatters.py:201 +msgid "{z}Z" +msgstr "{z}Z" + +#: ckan/lib/formatters.py:203 +msgid "{y}Y" +msgstr "{y}Y" + +#: ckan/lib/helpers.py:1251 +msgid "Update your avatar at gravatar.com" +msgstr "Actualice o seu avatar en gravatar.com" + +#: ckan/lib/helpers.py:1523 ckan/lib/helpers.py:1536 +msgid "Unknown" +msgstr "Descoñecido" + +#: ckan/lib/helpers.py:1587 +msgid "Unnamed resource" +msgstr "" + +#: ckan/lib/helpers.py:1627 +msgid "Created new dataset." +msgstr "" + +#: ckan/lib/helpers.py:1629 +msgid "Edited resources." +msgstr "" + +#: ckan/lib/helpers.py:1631 +msgid "Edited settings." +msgstr "" + +#: ckan/lib/helpers.py:1877 +msgid "{number} view" +msgid_plural "{number} views" +msgstr[0] "" +msgstr[1] "" + +#: ckan/lib/helpers.py:1879 +msgid "{number} recent view" +msgid_plural "{number} recent views" +msgstr[0] "" +msgstr[1] "" + +#: ckan/lib/mailer.py:46 +#, python-format +msgid "%s <%s>" +msgstr "%s <%s>" + +#: ckan/lib/mailer.py:116 +msgid "No recipient email address available!" +msgstr "" + +#: ckan/lib/mailer.py:134 ckan/templates/home/snippets/stats.html:17 +msgid "organization" +msgstr "" + +#: ckan/lib/mailer.py:135 ckan/templates/home/snippets/stats.html:23 +msgid "group" +msgstr "" + +#: ckan/lib/navl/dictization_functions.py:16 +#: ckan/lib/navl/dictization_functions.py:19 +#: ckan/lib/navl/dictization_functions.py:22 +#: ckan/lib/navl/dictization_functions.py:25 +#: ckan/lib/navl/dictization_functions.py:28 +#: ckan/lib/navl/dictization_functions.py:31 +#: ckan/lib/navl/dictization_functions.py:34 +#: ckan/lib/navl/dictization_functions.py:37 ckan/lib/navl/validators.py:27 +#: ckan/lib/navl/validators.py:34 ckan/lib/navl/validators.py:54 +#: ckan/logic/action/get.py:2033 ckan/logic/action/update.py:261 +#: ckan/logic/validators.py:615 +msgid "Missing value" +msgstr "" + +#: ckan/lib/navl/validators.py:68 +#, python-format +msgid "The input field %(name)s was not expected." +msgstr "" + +#: ckan/lib/navl/validators.py:120 +msgid "Please enter an integer value" +msgstr "" + +#: ckan/lib/navl/validators.py:126 +msgid "Must be a Unicode string value" +msgstr "" + +#: ckan/logic/__init__.py:99 ckan/logic/action/__init__.py:60 +msgid "Package resource(s) invalid" +msgstr "" + +#: ckan/logic/__init__.py:106 ckan/logic/__init__.py:108 +#: ckan/logic/action/__init__.py:62 ckan/logic/action/__init__.py:64 +msgid "Extras" +msgstr "" + +#: ckan/logic/converters.py:76 ckan/logic/converters.py:91 +#, python-format +msgid "Tag vocabulary \"%s\" does not exist" +msgstr "" + +#: ckan/logic/converters.py:182 +msgid "Could not parse as valid JSON" +msgstr "" + +#: ckan/logic/validators.py:35 ckan/logic/validators.py:44 +msgid "An organization must be provided" +msgstr "" + +#: ckan/logic/validators.py:49 +msgid "Organization does not exist" +msgstr "" + +#: ckan/logic/validators.py:54 +msgid "You cannot add a dataset to this organization" +msgstr "" + +#: ckan/logic/validators.py:94 +msgid "Invalid integer" +msgstr "" + +#: ckan/logic/validators.py:99 +msgid "Must be a natural number" +msgstr "" + +#: ckan/logic/validators.py:105 +msgid "Must be a postive integer" +msgstr "" + +#: ckan/logic/validators.py:132 +msgid "Date format incorrect" +msgstr "" + +#: ckan/logic/validators.py:141 +msgid "No links are allowed in the log_message." +msgstr "" + +#: ckan/logic/validators.py:161 +msgid "Dataset id already exists" +msgstr "" + +#: ckan/logic/validators.py:202 +msgid "Resource" +msgstr "" + +#: ckan/logic/validators.py:256 +msgid "That group name or ID does not exist." +msgstr "" + +#: ckan/logic/validators.py:270 +msgid "Activity type" +msgstr "" + +#: ckan/logic/validators.py:333 +msgid "Names must be strings" +msgstr "" + +#: ckan/logic/validators.py:337 +msgid "That name cannot be used" +msgstr "" + +#: ckan/logic/validators.py:340 +#, python-format +msgid "Must be at least %s characters long" +msgstr "" + +#: ckan/logic/validators.py:342 ckan/logic/validators.py:631 +#, python-format +msgid "Name must be a maximum of %i characters long" +msgstr "" + +#: ckan/logic/validators.py:345 +msgid "" +"Must be purely lowercase alphanumeric (ascii) characters and these symbols: " +"-_" +msgstr "" + +#: ckan/logic/validators.py:363 +msgid "That URL is already in use." +msgstr "" + +#: ckan/logic/validators.py:368 +#, python-format +msgid "Name \"%s\" length is less than minimum %s" +msgstr "" + +#: ckan/logic/validators.py:372 +#, python-format +msgid "Name \"%s\" length is more than maximum %s" +msgstr "" + +#: ckan/logic/validators.py:378 +#, python-format +msgid "Version must be a maximum of %i characters long" +msgstr "" + +#: ckan/logic/validators.py:396 +#, python-format +msgid "Duplicate key \"%s\"" +msgstr "" + +#: ckan/logic/validators.py:412 +msgid "Group name already exists in database" +msgstr "" + +#: ckan/logic/validators.py:418 +#, python-format +msgid "Tag \"%s\" length is less than minimum %s" +msgstr "" + +#: ckan/logic/validators.py:422 +#, python-format +msgid "Tag \"%s\" length is more than maximum %i" +msgstr "" + +#: ckan/logic/validators.py:430 +#, python-format +msgid "Tag \"%s\" must be alphanumeric characters or symbols: -_." +msgstr "" + +#: ckan/logic/validators.py:438 +#, python-format +msgid "Tag \"%s\" must not be uppercase" +msgstr "" + +#: ckan/logic/validators.py:547 +msgid "User names must be strings" +msgstr "" + +#: ckan/logic/validators.py:562 +msgid "That login name is not available." +msgstr "" + +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "" + +#: ckan/logic/validators.py:577 +msgid "Please enter both passwords" +msgstr "" + +#: ckan/logic/validators.py:585 +msgid "Passwords must be strings" +msgstr "" + +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "" + +#: ckan/logic/validators.py:598 +msgid "The passwords you entered do not match" +msgstr "" + +#: ckan/logic/validators.py:619 +msgid "" +"Edit not allowed as it looks like spam. Please avoid links in your " +"description." +msgstr "" + +#: ckan/logic/validators.py:628 +#, python-format +msgid "Name must be at least %s characters long" +msgstr "" + +#: ckan/logic/validators.py:636 +msgid "That vocabulary name is already in use." +msgstr "" + +#: ckan/logic/validators.py:642 +#, python-format +msgid "Cannot change value of key from %s to %s. This key is read-only" +msgstr "" + +#: ckan/logic/validators.py:651 +msgid "Tag vocabulary was not found." +msgstr "" + +#: ckan/logic/validators.py:664 +#, python-format +msgid "Tag %s does not belong to vocabulary %s" +msgstr "" + +#: ckan/logic/validators.py:670 +msgid "No tag name" +msgstr "" + +#: ckan/logic/validators.py:683 +#, python-format +msgid "Tag %s already belongs to vocabulary %s" +msgstr "" + +#: ckan/logic/validators.py:706 +msgid "Please provide a valid URL" +msgstr "" + +#: ckan/logic/validators.py:720 +msgid "role does not exist." +msgstr "" + +#: ckan/logic/validators.py:749 +msgid "Datasets with no organization can't be private." +msgstr "" + +#: ckan/logic/validators.py:755 +msgid "Not a list" +msgstr "" + +#: ckan/logic/validators.py:758 +msgid "Not a string" +msgstr "" + +#: ckan/logic/validators.py:790 +msgid "This parent would create a loop in the hierarchy" +msgstr "" + +#: ckan/logic/validators.py:800 +msgid "\"filter_fields\" and \"filter_values\" should have the same length" +msgstr "" + +#: ckan/logic/validators.py:811 +msgid "\"filter_fields\" is required when \"filter_values\" is filled" +msgstr "" + +#: ckan/logic/validators.py:814 +msgid "\"filter_values\" is required when \"filter_fields\" is filled" +msgstr "" + +#: ckan/logic/validators.py:828 +msgid "There is a schema field with the same name" +msgstr "" + +#: ckan/logic/validators.py:854 +msgid "Email {email} is not a valid format" +msgstr "" + +#: ckan/logic/action/create.py:184 ckan/logic/action/create.py:668 +#, python-format +msgid "REST API: Create object %s" +msgstr "" + +#: ckan/logic/action/create.py:547 +#, python-format +msgid "REST API: Create package relationship: %s %s %s" +msgstr "" + +#: ckan/logic/action/create.py:588 +#, python-format +msgid "REST API: Create member object %s" +msgstr "" + +#: ckan/logic/action/create.py:807 +msgid "Trying to create an organization as a group" +msgstr "" + +#: ckan/logic/action/create.py:896 +msgid "You must supply a package id or name (parameter \"package\")." +msgstr "" + +#: ckan/logic/action/create.py:899 +msgid "You must supply a rating (parameter \"rating\")." +msgstr "" + +#: ckan/logic/action/create.py:904 +msgid "Rating must be an integer value." +msgstr "" + +#: ckan/logic/action/create.py:908 +#, python-format +msgid "Rating must be between %i and %i." +msgstr "" + +#: ckan/logic/action/create.py:1078 +msgid "Error sending the invite email, the user was not created: {0}" +msgstr "" + +#: ckan/logic/action/create.py:1254 ckan/logic/action/create.py:1261 +msgid "You must be logged in to follow users" +msgstr "" + +#: ckan/logic/action/create.py:1274 +msgid "You cannot follow yourself" +msgstr "" + +#: ckan/logic/action/create.py:1282 ckan/logic/action/create.py:1339 +#: ckan/logic/action/create.py:1478 +msgid "You are already following {0}" +msgstr "" + +#: ckan/logic/action/create.py:1313 ckan/logic/action/create.py:1321 +msgid "You must be logged in to follow a dataset." +msgstr "" + +#: ckan/logic/action/create.py:1379 +msgid "User {username} does not exist." +msgstr "" + +#: ckan/logic/action/create.py:1454 ckan/logic/action/create.py:1462 +msgid "You must be logged in to follow a group." +msgstr "" + +#: ckan/logic/action/delete.py:54 +msgid " Delete User: {0}" +msgstr "" + +#: ckan/logic/action/delete.py:92 +#, python-format +msgid "REST API: Delete Package: %s" +msgstr "" + +#: ckan/logic/action/delete.py:276 ckan/logic/action/delete.py:372 +#, python-format +msgid "REST API: Delete %s" +msgstr "" + +#: ckan/logic/action/delete.py:318 +#, python-format +msgid "REST API: Delete Member: %s" +msgstr "" + +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "" + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 +msgid "id not in data" +msgstr "" + +#: ckan/logic/action/delete.py:564 ckan/logic/action/get.py:2435 +#: ckan/logic/action/update.py:910 +#, python-format +msgid "Could not find vocabulary \"%s\"" +msgstr "" + +#: ckan/logic/action/delete.py:594 +#, python-format +msgid "Could not find tag \"%s\"" +msgstr "" + +#: ckan/logic/action/delete.py:607 ckan/logic/action/delete.py:611 +msgid "You must be logged in to unfollow something." +msgstr "" + +#: ckan/logic/action/delete.py:622 +msgid "You are not following {0}." +msgstr "" + +#: ckan/logic/action/get.py:1095 ckan/logic/action/update.py:77 +#: ckan/logic/action/update.py:91 +msgid "Resource was not found." +msgstr "" + +#: ckan/logic/action/get.py:2037 +msgid "Do not specify if using \"query\" parameter" +msgstr "" + +#: ckan/logic/action/get.py:2046 +msgid "Must be : pair(s)" +msgstr "" + +#: ckan/logic/action/get.py:2078 +msgid "Field \"{field}\" not recognised in resource_search." +msgstr "" + +#: ckan/logic/action/update.py:265 ckan/logic/action/update.py:991 +msgid "Package was not found." +msgstr "" + +#: ckan/logic/action/update.py:308 ckan/logic/action/update.py:526 +#: ckan/logic/action/update.py:1009 +#, python-format +msgid "REST API: Update object %s" +msgstr "" + +#: ckan/logic/action/update.py:405 +#, python-format +msgid "REST API: Update package relationship: %s %s %s" +msgstr "" + +#: ckan/logic/action/update.py:766 +msgid "TaskStatus was not found." +msgstr "" + +#: ckan/logic/action/update.py:995 +msgid "Organization was not found." +msgstr "" + +#: ckan/logic/auth/create.py:27 ckan/logic/auth/create.py:45 +#, python-format +msgid "User %s not authorized to create packages" +msgstr "O usuario %s non está autorizado para crear paquetes" + +#: ckan/logic/auth/create.py:31 ckan/logic/auth/update.py:45 +#, python-format +msgid "User %s not authorized to edit these groups" +msgstr "O usuario %s non está autorizado para editar estes grupos " + +#: ckan/logic/auth/create.py:38 +#, python-format +msgid "User %s not authorized to add dataset to this organization" +msgstr "" +"O usuario %s non está autorizado para engadir conxuntos de datos a esta " +"organización" + +#: ckan/logic/auth/create.py:61 +msgid "No dataset id provided, cannot check auth." +msgstr "" + +#: ckan/logic/auth/create.py:68 ckan/logic/auth/delete.py:34 +#: ckan/logic/auth/get.py:137 ckan/logic/auth/update.py:63 +msgid "No package found for this resource, cannot check auth." +msgstr "" + +#: ckan/logic/auth/create.py:76 +#, python-format +msgid "User %s not authorized to create resources on dataset %s" +msgstr "" + +#: ckan/logic/auth/create.py:108 +#, python-format +msgid "User %s not authorized to edit these packages" +msgstr "" + +#: ckan/logic/auth/create.py:119 +#, python-format +msgid "User %s not authorized to create groups" +msgstr "" + +#: ckan/logic/auth/create.py:129 +#, python-format +msgid "User %s not authorized to create organizations" +msgstr "" + +#: ckan/logic/auth/create.py:145 +msgid "User {user} not authorized to create users via the API" +msgstr "" + +#: ckan/logic/auth/create.py:148 +msgid "Not authorized to create users" +msgstr "Non está autorizado para crear usuarios" + +#: ckan/logic/auth/create.py:189 +msgid "Group was not found." +msgstr "" + +#: ckan/logic/auth/create.py:220 +#, python-format +msgid "User %s not authorized to add members" +msgstr "" + +#: ckan/logic/auth/create.py:244 ckan/logic/auth/update.py:115 +#, python-format +msgid "User %s not authorized to edit group %s" +msgstr "" + +#: ckan/logic/auth/delete.py:40 +#, python-format +msgid "User %s not authorized to delete resource %s" +msgstr "" + +#: ckan/logic/auth/delete.py:56 +msgid "Resource view not found, cannot check auth." +msgstr "" + +#: ckan/logic/auth/delete.py:73 +#, python-format +msgid "User %s not authorized to delete relationship %s" +msgstr "" + +#: ckan/logic/auth/delete.py:82 +#, python-format +msgid "User %s not authorized to delete groups" +msgstr "" + +#: ckan/logic/auth/delete.py:86 +#, python-format +msgid "User %s not authorized to delete group %s" +msgstr "" + +#: ckan/logic/auth/delete.py:103 +#, python-format +msgid "User %s not authorized to delete organizations" +msgstr "" + +#: ckan/logic/auth/delete.py:107 +#, python-format +msgid "User %s not authorized to delete organization %s" +msgstr "" + +#: ckan/logic/auth/delete.py:120 +#, python-format +msgid "User %s not authorized to delete task_status" +msgstr "" + +#: ckan/logic/auth/get.py:13 ckan/logic/auth/get.py:270 +msgid "Not authorized" +msgstr "" + +#: ckan/logic/auth/get.py:109 +#, python-format +msgid "User %s not authorized to read these packages" +msgstr "" + +#: ckan/logic/auth/get.py:124 +#, python-format +msgid "User %s not authorized to read package %s" +msgstr "" + +#: ckan/logic/auth/get.py:143 +#, python-format +msgid "User %s not authorized to read resource %s" +msgstr "" + +#: ckan/logic/auth/get.py:170 +#, python-format +msgid "User %s not authorized to read group %s" +msgstr "" + +#: ckan/logic/auth/get.py:237 +msgid "You must be logged in to access your dashboard." +msgstr "" + +#: ckan/logic/auth/update.py:39 +#, python-format +msgid "User %s not authorized to edit package %s" +msgstr "" + +#: ckan/logic/auth/update.py:71 +#, python-format +msgid "User %s not authorized to edit resource %s" +msgstr "" + +#: ckan/logic/auth/update.py:100 +#, python-format +msgid "User %s not authorized to change state of package %s" +msgstr "" + +#: ckan/logic/auth/update.py:128 +#, python-format +msgid "User %s not authorized to edit organization %s" +msgstr "" + +#: ckan/logic/auth/update.py:145 +#, python-format +msgid "User %s not authorized to change state of group %s" +msgstr "" + +#: ckan/logic/auth/update.py:162 +#, python-format +msgid "User %s not authorized to edit permissions of group %s" +msgstr "" + +#: ckan/logic/auth/update.py:190 +msgid "Have to be logged in to edit user" +msgstr "" + +#: ckan/logic/auth/update.py:198 +#, python-format +msgid "User %s not authorized to edit user %s" +msgstr "" + +#: ckan/logic/auth/update.py:209 +msgid "User {0} not authorized to update user {1}" +msgstr "" + +#: ckan/logic/auth/update.py:217 +#, python-format +msgid "User %s not authorized to change state of revision" +msgstr "" + +#: ckan/logic/auth/update.py:226 +#, python-format +msgid "User %s not authorized to update task_status table" +msgstr "" + +#: ckan/logic/auth/update.py:240 +#, python-format +msgid "User %s not authorized to update term_translation table" +msgstr "" + +#: ckan/model/license.py:223 +msgid "License not specified" +msgstr "" + +#: ckan/model/license.py:233 +msgid "Open Data Commons Public Domain Dedication and License (PDDL)" +msgstr "" + +#: ckan/model/license.py:243 +msgid "Open Data Commons Open Database License (ODbL)" +msgstr "" + +#: ckan/model/license.py:253 +msgid "Open Data Commons Attribution License" +msgstr "" + +#: ckan/model/license.py:264 +msgid "Creative Commons CCZero" +msgstr "" + +#: ckan/model/license.py:273 +msgid "Creative Commons Attribution" +msgstr "" + +#: ckan/model/license.py:283 +msgid "Creative Commons Attribution Share-Alike" +msgstr "" + +#: ckan/model/license.py:292 +msgid "GNU Free Documentation License" +msgstr "" + +#: ckan/model/license.py:302 +msgid "Other (Open)" +msgstr "" + +#: ckan/model/license.py:312 +msgid "Other (Public Domain)" +msgstr "" + +#: ckan/model/license.py:322 +msgid "Other (Attribution)" +msgstr "" + +#: ckan/model/license.py:334 +msgid "UK Open Government Licence (OGL)" +msgstr "" + +#: ckan/model/license.py:342 +msgid "Creative Commons Non-Commercial (Any)" +msgstr "" + +#: ckan/model/license.py:350 +msgid "Other (Non-Commercial)" +msgstr "" + +#: ckan/model/license.py:358 +msgid "Other (Not Open)" +msgstr "" + +#: ckan/model/package_relationship.py:54 +#, python-format +msgid "depends on %s" +msgstr "" + +#: ckan/model/package_relationship.py:54 +#, python-format +msgid "is a dependency of %s" +msgstr "" + +#: ckan/model/package_relationship.py:55 +#, python-format +msgid "derives from %s" +msgstr "" + +#: ckan/model/package_relationship.py:55 +#, python-format +msgid "has derivation %s" +msgstr "" + +#: ckan/model/package_relationship.py:56 +#, python-format +msgid "links to %s" +msgstr "" + +#: ckan/model/package_relationship.py:56 +#, python-format +msgid "is linked from %s" +msgstr "" + +#: ckan/model/package_relationship.py:57 +#, python-format +msgid "is a child of %s" +msgstr "" + +#: ckan/model/package_relationship.py:57 +#, python-format +msgid "is a parent of %s" +msgstr "" + +#: ckan/model/package_relationship.py:61 +#, python-format +msgid "has sibling %s" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/api-info.js:96 +#: ckan/public/base/javascript/modules/api-info.js:96 +msgid "There is no API data to load for this resource" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/api-info.js:124 +#: ckan/public/base/javascript/modules/api-info.js:124 +msgid "Failed to load data API information" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/autocomplete.js:195 +#: ckan/public/base/javascript/modules/autocomplete.js:195 +msgid "Start typing…" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/autocomplete.js:195 +#: ckan/public/base/javascript/modules/autocomplete.js:195 +msgid "No matches found" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/autocomplete.js:204 +#: ckan/public/base/javascript/modules/autocomplete.js:204 +#, python-format +msgid "Input is too short, must be at least one character" +msgid_plural "Input is too short, must be at least %(num)d characters" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/javascript/modules/basic-form.js:4 +#: ckan/public/base/javascript/modules/basic-form.js:4 +msgid "There are unsaved modifications to this form" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/confirm-action.js:97 +#: ckan/public/base/javascript/modules/confirm-action.js:101 +msgid "Please Confirm Action" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/confirm-action.js:100 +#: ckan/public/base/javascript/modules/confirm-action.js:104 +msgid "Are you sure you want to perform this action?" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/confirm-action.js:102 +#: ckan/public/base/javascript/modules/confirm-action.js:106 +#: ckan/templates/user/new_user_form.html:9 +#: ckan/templates/user/perform_reset.html:26 +msgid "Confirm" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/confirm-action.js:103 +#: ckan/public-bs2/base/javascript/modules/resource-reorder.js:59 +#: ckan/public-bs2/base/javascript/modules/resource-view-reorder.js:53 +#: ckan/public/base/javascript/modules/confirm-action.js:107 +#: ckan/public/base/javascript/modules/resource-reorder.js:59 +#: ckan/public/base/javascript/modules/resource-view-reorder.js:53 +#: ckan/templates/admin/confirm_reset.html:9 +#: ckan/templates/group/confirm_delete.html:14 +#: ckan/templates/group/confirm_delete_member.html:15 +#: ckan/templates/organization/confirm_delete.html:14 +#: ckan/templates/organization/confirm_delete_member.html:15 +#: ckan/templates/package/confirm_delete.html:15 +#: ckan/templates/package/confirm_delete_resource.html:14 +msgid "Cancel" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/follow.js:70 +#: ckan/public/base/javascript/modules/follow.js:70 +#: ckan/templates/snippets/follow_button.html:9 +msgid "Unfollow" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/follow.js:73 +#: ckan/public/base/javascript/modules/follow.js:73 +#: ckan/templates/snippets/follow_button.html:14 +msgid "Follow" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:60 +#: ckan/public/base/javascript/modules/image-upload.js:60 +msgid "Link" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:61 +#: ckan/public/base/javascript/modules/image-upload.js:61 +msgid "Link to a URL on the internet (you can also link to an API)" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:68 +#: ckan/public/base/javascript/modules/image-upload.js:68 +msgid "Upload" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:72 +#: ckan/public/base/javascript/modules/image-upload.js:72 +#: ckan/templates/group/snippets/group_item.html:43 +#: ckan/templates/macros/form.html:241 +#: ckan/templates/snippets/search_form.html:69 +msgid "Remove" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:87 +#: ckan/public/base/javascript/modules/image-upload.js:87 +msgid "Upload a file on your computer" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:110 +#: ckan/public-bs2/base/javascript/modules/image-upload.js:178 +#: ckan/public-bs2/base/javascript/modules/slug-preview.js:56 +#: ckan/public/base/javascript/modules/image-upload.js:110 +#: ckan/public/base/javascript/modules/image-upload.js:178 +#: ckan/public/base/javascript/modules/slug-preview.js:56 +#: ckan/templates/group/snippets/group_form.html:18 +#: ckan/templates/organization/snippets/organization_form.html:18 +#: ckan/templates/package/snippets/package_basic_fields.html:13 +#: ckan/templates/package/snippets/resource_form.html:26 +msgid "URL" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/image-upload.js:119 +#: ckan/public-bs2/base/javascript/modules/image-upload.js:209 +#: ckan/public/base/javascript/modules/image-upload.js:119 +#: ckan/public/base/javascript/modules/image-upload.js:209 +msgid "File" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-reorder.js:56 +#: ckan/public-bs2/base/javascript/modules/resource-view-reorder.js:50 +#: ckan/public/base/javascript/modules/resource-reorder.js:56 +#: ckan/public/base/javascript/modules/resource-view-reorder.js:50 +msgid "Save order" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-reorder.js:69 +#: ckan/public-bs2/base/javascript/modules/resource-view-reorder.js:59 +#: ckan/public/base/javascript/modules/resource-reorder.js:69 +#: ckan/public/base/javascript/modules/resource-view-reorder.js:59 +msgid "Saving..." +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-upload-field.js:57 +#: ckan/public/base/javascript/modules/resource-upload-field.js:57 +msgid "Upload a file" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-upload-field.js:144 +#: ckan/public/base/javascript/modules/resource-upload-field.js:144 +msgid "An Error Occurred" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-upload-field.js:201 +#: ckan/public/base/javascript/modules/resource-upload-field.js:201 +msgid "Unable to upload file" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-upload-field.js:252 +#: ckan/public/base/javascript/modules/resource-upload-field.js:252 +msgid "Unable to authenticate upload" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-upload-field.js:260 +#: ckan/public/base/javascript/modules/resource-upload-field.js:260 +msgid "Resource uploaded" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-upload-field.js:266 +#: ckan/public/base/javascript/modules/resource-upload-field.js:266 +msgid "Unable to get data for uploaded file" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-upload-field.js:272 +#: ckan/public/base/javascript/modules/resource-upload-field.js:272 +msgid "" +"You are uploading a file. Are you sure you want to navigate away and stop " +"this upload?" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-view-filters.js:9 +#: ckan/public/base/javascript/modules/resource-view-filters.js:9 +#: ckan/templates/package/snippets/view_form_filters.html:16 +msgid "Add Filter" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/resource-view-filters.js:52 +#: ckan/public/base/javascript/modules/resource-view-filters.js:52 +msgid "Select a field" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/slug-preview.js:57 +#: ckan/public/base/javascript/modules/slug-preview.js:57 +#: ckan/templates/group/edit_base.html:20 ckan/templates/group/members.html:28 +#: ckan/templates/organization/bulk_process.html:65 +#: ckan/templates/organization/edit.html:3 +#: ckan/templates/organization/edit_base.html:22 +#: ckan/templates/organization/members.html:33 +#: ckan/templates/package/edit_base.html:11 +#: ckan/templates/package/resource_edit.html:3 +#: ckan/templates/package/resource_edit_base.html:12 +#: ckan/templates/package/snippets/resource_item.html:56 +msgid "Edit" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/table-toggle-more.js:25 +#: ckan/public/base/javascript/modules/table-toggle-more.js:25 +msgid "Show more" +msgstr "" + +#: ckan/public-bs2/base/javascript/modules/table-toggle-more.js:26 +#: ckan/public/base/javascript/modules/table-toggle-more.js:26 +msgid "Hide" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/error_document_template.html:3 +#, python-format +msgid "Error %(error_code)s" +msgstr "" + +#: ckan/templates/footer.html:9 +msgid "About {0}" +msgstr "" + +#: ckan/templates/footer.html:15 +msgid "CKAN API" +msgstr "" + +#: ckan/templates/footer.html:16 +msgid "CKAN Association" +msgstr "" + +#: ckan/templates/footer.html:24 +msgid "" +"Powered by CKAN" +msgstr "" + +#: ckan/templates/header.html:9 +msgid "Sysadmin settings" +msgstr "" + +#: ckan/templates/header.html:16 +msgid "View profile" +msgstr "" + +#: ckan/templates/header.html:23 +#, python-format +msgid "Dashboard (%(num)d new item)" +msgid_plural "Dashboard (%(num)d new items)" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/header.html:27 ckan/templates/user/dashboard.html:6 +msgid "Dashboard" +msgstr "" + +#: ckan/templates/header.html:33 ckan/templates/user/dashboard.html:16 +msgid "Edit settings" +msgstr "" + +#: ckan/templates/header.html:35 +msgid "Settings" +msgstr "" + +#: ckan/templates/header.html:40 ckan/templates/header.html:42 +msgid "Log out" +msgstr "" + +#: ckan/templates/header.html:52 ckan/templates/user/logout_first.html:14 +msgid "Log in" +msgstr "" + +#: ckan/templates/header.html:54 ckan/templates/user/new.html:3 +msgid "Register" +msgstr "" + +#: ckan/templates/group/read_base.html:17 +#: ckan/templates/group/snippets/info.html:36 ckan/templates/header.html:87 +#: ckan/templates/organization/bulk_process.html:20 +#: ckan/templates/organization/edit_base.html:23 +#: ckan/templates/organization/read_base.html:17 +#: ckan/templates/package/base.html:7 ckan/templates/package/base.html:17 +#: ckan/templates/package/base.html:21 ckan/templates/package/search.html:4 +#: ckan/templates/package/snippets/new_package_breadcrumb.html:1 +#: ckan/templates/revision/diff.html:11 ckan/templates/revision/read.html:65 +#: ckan/templates/snippets/context/group.html:17 +#: ckan/templates/snippets/context/user.html:19 +#: ckan/templates/snippets/organization.html:59 +#: ckan/templates/user/read.html:11 ckan/templates/user/read_base.html:19 +#: ckan/templates/user/read_base.html:53 +msgid "Datasets" +msgstr "" + +#: ckan/templates/header.html:94 +msgid "Search Datasets" +msgstr "" + +#: ckan/templates/header.html:95 ckan/templates/home/snippets/search.html:11 +#: ckan/templates/snippets/simple_search.html:5 +#: ckan/templates/user/snippets/user_search.html:6 +msgid "Search" +msgstr "" + +#: ckan/templates/page.html:6 +msgid "Skip to content" +msgstr "" + +#: ckan/templates/activity_streams/activity_stream_items.html:9 +msgid "Load less" +msgstr "" + +#: ckan/templates/activity_streams/activity_stream_items.html:17 +msgid "Load more" +msgstr "" + +#: ckan/templates/activity_streams/activity_stream_items.html:23 +msgid "No activities are within this activity stream" +msgstr "" + +#: ckan/templates/admin/base.html:3 +msgid "Administration" +msgstr "" + +#: ckan/templates/admin/base.html:8 +msgid "Sysadmins" +msgstr "" + +#: ckan/templates/admin/base.html:9 +msgid "Config" +msgstr "" + +#: ckan/templates/admin/base.html:10 ckan/templates/admin/trash.html:29 +msgid "Trash" +msgstr "" + +#: ckan/templates/admin/config.html:23 ckan/templates/macros/autoform.html:62 +msgid "Site logo" +msgstr "" + +#: ckan/templates/admin/config.html:35 +#: ckan/templates/admin/confirm_reset.html:7 +msgid "Are you sure you want to reset the config?" +msgstr "" + +#: ckan/templates/admin/config.html:35 +msgid "Reset" +msgstr "" + +#: ckan/templates/admin/config.html:36 +msgid "Update Config" +msgstr "" + +#: ckan/templates/admin/config.html:45 +msgid "CKAN config options" +msgstr "" + +#: ckan/templates/admin/config.html:52 +#, python-format +msgid "" +"

Site Title: This is the title of this CKAN instance It " +"appears in various places throughout CKAN.

Style: " +"Choose from a list of simple variations of the main colour scheme to get a " +"very quick custom theme working.

Site Tag Logo: This" +" is the logo that appears in the header of all the CKAN instance " +"templates.

About: This text will appear on this CKAN" +" instances about page.

Intro " +"Text: This text will appear on this CKAN instances home page as a welcome to visitors.

" +"

Custom CSS: This is a block of CSS that appears in " +"<head> tag of every page. If you wish to customize the " +"templates more fully we recommend reading the documentation.

" +"

Homepage: This is for choosing a predefined layout for " +"the modules that appear on your homepage.

" +msgstr "" + +#: ckan/templates/admin/confirm_reset.html:3 +#: ckan/templates/admin/confirm_reset.html:10 +msgid "Confirm Reset" +msgstr "" + +#: ckan/templates/admin/index.html:15 +msgid "Administer CKAN" +msgstr "" + +#: ckan/templates/admin/index.html:20 +#, python-format +msgid "" +"

As a sysadmin user you have full control over this CKAN instance. " +"Proceed with care!

For guidance on using sysadmin features, see the " +"CKAN sysadmin guide

" +msgstr "" + +#: ckan/templates/admin/trash.html:20 +msgid "Purge" +msgstr "" + +#: ckan/templates/admin/trash.html:32 +msgid "

Purge deleted datasets forever and irreversibly.

" +msgstr "" + +#: ckan/templates/dataviewer/snippets/data_preview.html:9 +msgid "This resource can not be previewed at the moment." +msgstr "" + +#: ckan/templates/dataviewer/snippets/data_preview.html:11 +#: ckan/templates/package/resource_read.html:133 +#: ckan/templates/package/snippets/resource_view.html:34 +msgid "Click here for more information." +msgstr "" + +#: ckan/templates/dataviewer/snippets/data_preview.html:18 +#: ckan/templates/package/snippets/resource_view.html:41 +msgid "Download resource" +msgstr "" + +#: ckan/templates/dataviewer/snippets/no_preview.html:3 +msgid "No preview available." +msgstr "" + +#: ckan/templates/dataviewer/snippets/no_preview.html:5 +msgid "More details..." +msgstr "" + +#: ckan/templates/dataviewer/snippets/no_preview.html:12 +#, python-format +msgid "No handler defined for data type: %(type)s." +msgstr "" + +#: ckan/templates/development/snippets/form.html:5 +msgid "Standard" +msgstr "" + +#: ckan/templates/development/snippets/form.html:5 +msgid "Standard Input" +msgstr "" + +#: ckan/templates/development/snippets/form.html:6 +msgid "Medium" +msgstr "" + +#: ckan/templates/development/snippets/form.html:6 +msgid "Medium Width Input" +msgstr "" + +#: ckan/templates/development/snippets/form.html:7 +msgid "Full" +msgstr "" + +#: ckan/templates/development/snippets/form.html:7 +msgid "Full Width Input" +msgstr "" + +#: ckan/templates/development/snippets/form.html:8 +msgid "Large" +msgstr "" + +#: ckan/templates/development/snippets/form.html:8 +msgid "Large Input" +msgstr "" + +#: ckan/templates/development/snippets/form.html:9 +msgid "Prepend" +msgstr "" + +#: ckan/templates/development/snippets/form.html:9 +msgid "Prepend Input" +msgstr "" + +#: ckan/templates/development/snippets/form.html:13 +msgid "Custom Field (empty)" +msgstr "" + +#: ckan/templates/development/snippets/form.html:19 +#: ckan/templates/snippets/custom_form_fields.html:20 +#: ckan/templates/snippets/custom_form_fields.html:37 +msgid "Custom Field" +msgstr "" + +#: ckan/templates/development/snippets/form.html:22 +msgid "Markdown" +msgstr "" + +#: ckan/templates/development/snippets/form.html:23 +msgid "Textarea" +msgstr "" + +#: ckan/templates/development/snippets/form.html:24 +msgid "Select" +msgstr "" + +#: ckan/templates/group/activity_stream.html:3 +#: ckan/templates/group/activity_stream.html:6 +#: ckan/templates/group/read_base.html:18 +#: ckan/templates/organization/activity_stream.html:3 +#: ckan/templates/organization/activity_stream.html:6 +#: ckan/templates/organization/read_base.html:18 +#: ckan/templates/package/activity.html:3 +#: ckan/templates/package/activity.html:6 +#: ckan/templates/package/read_base.html:21 +#: ckan/templates/user/activity_stream.html:3 +#: ckan/templates/user/activity_stream.html:6 +#: ckan/templates/user/read_base.html:20 +msgid "Activity Stream" +msgstr "" + +#: ckan/templates/group/admins.html:3 ckan/templates/group/admins.html:6 +#: ckan/templates/organization/admins.html:3 +#: ckan/templates/organization/admins.html:6 +msgid "Administrators" +msgstr "" + +#: ckan/templates/group/base_form_page.html:7 +msgid "Add a Group" +msgstr "" + +#: ckan/templates/group/base_form_page.html:11 +msgid "Group Form" +msgstr "" + +#: ckan/templates/group/confirm_delete.html:3 +#: ckan/templates/group/confirm_delete.html:15 +#: ckan/templates/group/confirm_delete_member.html:3 +#: ckan/templates/group/confirm_delete_member.html:16 +#: ckan/templates/organization/confirm_delete.html:3 +#: ckan/templates/organization/confirm_delete.html:15 +#: ckan/templates/organization/confirm_delete_member.html:3 +#: ckan/templates/organization/confirm_delete_member.html:16 +#: ckan/templates/package/confirm_delete.html:3 +#: ckan/templates/package/confirm_delete.html:16 +#: ckan/templates/package/confirm_delete_resource.html:3 +#: ckan/templates/package/confirm_delete_resource.html:15 +msgid "Confirm Delete" +msgstr "" + +#: ckan/templates/group/confirm_delete.html:11 +msgid "Are you sure you want to delete group - {name}?" +msgstr "" + +#: ckan/templates/group/confirm_delete_member.html:11 +#: ckan/templates/organization/confirm_delete_member.html:11 +msgid "Are you sure you want to delete member - {name}?" +msgstr "" + +#: ckan/templates/group/edit.html:7 ckan/templates/group/edit_base.html:3 +#: ckan/templates/group/edit_base.html:11 +#: ckan/templates/group/read_base.html:12 +#: ckan/templates/organization/edit_base.html:11 +#: ckan/templates/organization/read_base.html:12 +#: ckan/templates/package/read_base.html:14 +#: ckan/templates/package/resource_read.html:31 +#: ckan/templates/user/edit.html:8 ckan/templates/user/edit_base.html:3 +#: ckan/templates/user/read_base.html:14 +msgid "Manage" +msgstr "" + +#: ckan/templates/group/edit.html:12 +msgid "Edit Group" +msgstr "" + +#: ckan/templates/group/edit_base.html:21 ckan/templates/group/members.html:3 +#: ckan/templates/organization/edit_base.html:24 +#: ckan/templates/organization/members.html:3 +msgid "Members" +msgstr "" + +#: ckan/templates/group/history.html:3 ckan/templates/group/history.html:6 +#: ckan/templates/package/history.html:3 ckan/templates/package/history.html:6 +msgid "History" +msgstr "" + +#: ckan/templates/group/index.html:13 +#: ckan/templates/user/dashboard_groups.html:7 +msgid "Add Group" +msgstr "" + +#: ckan/templates/group/index.html:20 +msgid "Search groups..." +msgstr "" + +#: ckan/templates/group/index.html:29 +msgid "There are currently no groups for this site" +msgstr "" + +#: ckan/templates/group/index.html:31 +#: ckan/templates/organization/index.html:31 +msgid "How about creating one?" +msgstr "" + +#: ckan/templates/group/member_new.html:8 +#: ckan/templates/organization/member_new.html:10 +msgid "Back to all members" +msgstr "" + +#: ckan/templates/group/member_new.html:10 +#: ckan/templates/organization/member_new.html:7 +#: ckan/templates/organization/member_new.html:12 +msgid "Edit Member" +msgstr "" + +#: ckan/templates/group/member_new.html:10 +#: ckan/templates/group/member_new.html:64 ckan/templates/group/members.html:6 +#: ckan/templates/organization/member_new.html:7 +#: ckan/templates/organization/member_new.html:12 +#: ckan/templates/organization/member_new.html:63 +#: ckan/templates/organization/members.html:8 +msgid "Add Member" +msgstr "" + +#: ckan/templates/group/member_new.html:18 +#: ckan/templates/organization/member_new.html:19 +msgid "Existing User" +msgstr "" + +#: ckan/templates/group/member_new.html:21 +#: ckan/templates/organization/member_new.html:22 +msgid "If you wish to add an existing user, search for their username below." +msgstr "" + +#: ckan/templates/group/member_new.html:38 +#: ckan/templates/organization/member_new.html:39 +msgid "or" +msgstr "" + +#: ckan/templates/group/member_new.html:42 +#: ckan/templates/organization/member_new.html:43 +msgid "New User" +msgstr "" + +#: ckan/templates/group/member_new.html:45 +#: ckan/templates/organization/member_new.html:46 +msgid "If you wish to invite a new user, enter their email address." +msgstr "" + +#: ckan/templates/group/member_new.html:55 +#: ckan/templates/group/members.html:15 +#: ckan/templates/organization/member_new.html:54 +#: ckan/templates/organization/members.html:20 +msgid "Role" +msgstr "" + +#: ckan/templates/group/member_new.html:58 +#: ckan/templates/group/members.html:31 +#: ckan/templates/organization/member_new.html:57 +#: ckan/templates/organization/members.html:36 +msgid "Are you sure you want to delete this member?" +msgstr "" + +#: ckan/templates/group/member_new.html:58 +#: ckan/templates/group/members.html:31 +#: ckan/templates/group/snippets/group_form.html:38 +#: ckan/templates/organization/bulk_process.html:47 +#: ckan/templates/organization/member_new.html:57 +#: ckan/templates/organization/members.html:36 +#: ckan/templates/organization/snippets/organization_form.html:38 +#: ckan/templates/package/edit_view.html:19 +#: ckan/templates/package/snippets/package_form.html:39 +#: ckan/templates/package/snippets/resource_form.html:67 +#: ckan/templates/revision/read.html:24 +#: ckan/templates/user/edit_user_form.html:45 +msgid "Delete" +msgstr "" + +#: ckan/templates/group/member_new.html:77 +#: ckan/templates/organization/member_new.html:76 +msgid "What are roles?" +msgstr "" + +#: ckan/templates/group/member_new.html:80 +msgid "" +"

Admin: Can edit group information, as well as manage " +"organization members.

Member: Can add/remove " +"datasets from groups

" +msgstr "" + +#: ckan/templates/group/new.html:3 ckan/templates/group/new.html:5 +#: ckan/templates/group/new.html:7 +msgid "Create a Group" +msgstr "" + +#: ckan/templates/group/new_group_form.html:17 +msgid "Update Group" +msgstr "" + +#: ckan/templates/group/new_group_form.html:19 +msgid "Create Group" +msgstr "" + +#: ckan/templates/group/read.html:19 ckan/templates/organization/read.html:25 +#: ckan/templates/snippets/search_form.html:3 +msgid "Search datasets..." +msgstr "" + +#: ckan/templates/group/snippets/feeds.html:3 +msgid "Datasets in group: {group}" +msgstr "" + +#: ckan/templates/group/snippets/feeds.html:4 +#: ckan/templates/organization/snippets/feeds.html:4 +msgid "Recent Revision History" +msgstr "" + +#: ckan/templates/group/snippets/group_form.html:10 +#: ckan/templates/organization/snippets/organization_form.html:10 +#: ckan/templates/package/snippets/resource_form.html:30 +msgid "Name" +msgstr "" + +#: ckan/templates/group/snippets/group_form.html:10 +msgid "My Group" +msgstr "" + +#: ckan/templates/group/snippets/group_form.html:18 +msgid "my-group" +msgstr "" + +#: ckan/templates/group/snippets/group_form.html:20 +msgid "A little information about my group..." +msgstr "" + +#: ckan/templates/group/snippets/group_form.html:38 +msgid "Are you sure you want to delete this Group?" +msgstr "" + +#: ckan/templates/group/snippets/group_form.html:41 +msgid "Save Group" +msgstr "" + +#: ckan/templates/group/snippets/group_item.html:38 +#: ckan/templates/group/snippets/group_item.html:39 +msgid "View {name}" +msgstr "" + +#: ckan/templates/group/snippets/group_item.html:43 +msgid "Remove dataset from this group" +msgstr "" + +#: ckan/templates/group/snippets/helper.html:4 +msgid "What are Groups?" +msgstr "" + +#: ckan/templates/group/snippets/helper.html:8 +msgid "" +" You can use CKAN Groups to create and manage collections of datasets. This " +"could be to catalogue datasets for a particular project or team, or on a " +"particular theme, or as a very simple way to help people find and search " +"your own published datasets. " +msgstr "" + +#: ckan/templates/group/snippets/history_revisions.html:10 +#: ckan/templates/package/snippets/history_revisions.html:10 +msgid "Compare" +msgstr "" + +#: ckan/templates/group/snippets/info.html:16 +#: ckan/templates/organization/bulk_process.html:72 +#: ckan/templates/package/read.html:21 +#: ckan/templates/package/snippets/package_basic_fields.html:118 +#: ckan/templates/snippets/organization.html:37 +#: ckan/templates/snippets/package_item.html:42 +msgid "Deleted" +msgstr "" + +#: ckan/templates/group/snippets/info.html:24 +#: ckan/templates/package/snippets/package_context.html:7 +#: ckan/templates/snippets/organization.html:45 +msgid "read more" +msgstr "" + +#: ckan/templates/group/snippets/revisions_table.html:7 +#: ckan/templates/package/snippets/revisions_table.html:7 +#: ckan/templates/revision/read.html:5 ckan/templates/revision/read.html:9 +#: ckan/templates/revision/read.html:39 +#: ckan/templates/revision/snippets/revisions_list.html:4 +msgid "Revision" +msgstr "" + +#: ckan/templates/group/snippets/revisions_table.html:8 +#: ckan/templates/package/snippets/revisions_table.html:8 +#: ckan/templates/revision/read.html:53 +#: ckan/templates/revision/snippets/revisions_list.html:5 +msgid "Timestamp" +msgstr "" + +#: ckan/templates/group/snippets/revisions_table.html:9 +#: ckan/templates/package/snippets/additional_info.html:25 +#: ckan/templates/package/snippets/additional_info.html:30 +#: ckan/templates/package/snippets/package_metadata_fields.html:14 +#: ckan/templates/package/snippets/revisions_table.html:9 +#: ckan/templates/revision/read.html:50 +#: ckan/templates/revision/snippets/revisions_list.html:6 +msgid "Author" +msgstr "" + +#: ckan/templates/group/snippets/revisions_table.html:10 +#: ckan/templates/package/snippets/revisions_table.html:10 +#: ckan/templates/revision/read.html:56 +#: ckan/templates/revision/snippets/revisions_list.html:8 +msgid "Log Message" +msgstr "" + +#: ckan/templates/home/index.html:4 +msgid "Welcome" +msgstr "" + +#: ckan/templates/home/snippets/about_text.html:1 +msgid "" +"

CKAN is the world’s leading open-source data portal platform.

" +"

CKAN is a complete out-of-the-box software solution that makes data " +"accessible and usable – by providing tools to streamline publishing, " +"sharing, finding and using data (including storage of data and provision of " +"robust data APIs). CKAN is aimed at data publishers (national and regional " +"governments, companies and organizations) wanting to make their data open " +"and available.

CKAN is used by governments and user groups worldwide " +"and powers a variety of official and community data portals including " +"portals for local, national and international government, such as the UK’s " +"data.gov.uk and the European Union’s publicdata.eu, the Brazilian dados.gov.br, Dutch and Netherland " +"government portals, as well as city and municipal sites in the US, UK, " +"Argentina, Finland and elsewhere.

CKAN: http://ckan.org/
CKAN Tour: http://ckan.org/tour/
Features " +"overview: http://ckan.org/features/

" +msgstr "" + +#: ckan/templates/home/snippets/promoted.html:8 +msgid "Welcome to CKAN" +msgstr "" + +#: ckan/templates/home/snippets/promoted.html:10 +msgid "" +"This is a nice introductory paragraph about CKAN or the site in general. We " +"don't have any copy to go here yet but soon we will " +msgstr "" + +#: ckan/templates/home/snippets/promoted.html:19 +msgid "This is a featured section" +msgstr "" + +#: ckan/templates/home/snippets/search.html:2 +msgid "E.g. environment" +msgstr "" + +#: ckan/templates/home/snippets/search.html:6 +msgid "Search data" +msgstr "" + +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "" + +#: ckan/templates/home/snippets/search.html:16 +msgid "Popular tags" +msgstr "" + +#: ckan/templates/home/snippets/stats.html:5 +msgid "{0} statistics" +msgstr "" + +#: ckan/templates/home/snippets/stats.html:11 +msgid "dataset" +msgstr "" + +#: ckan/templates/home/snippets/stats.html:11 +msgid "datasets" +msgstr "" + +#: ckan/templates/home/snippets/stats.html:17 +msgid "organizations" +msgstr "" + +#: ckan/templates/home/snippets/stats.html:23 +msgid "groups" +msgstr "" + +#: ckan/templates/macros/form.html:126 +#, python-format +msgid "" +"You can use Markdown formatting here" +msgstr "" + +#: ckan/templates/macros/form.html:277 +msgid "This field is required" +msgstr "" + +#: ckan/templates/macros/form.html:277 +msgid "Custom" +msgstr "" + +#: ckan/templates/macros/form.html:302 +msgid "The form contains invalid entries:" +msgstr "" + +#: ckan/templates/macros/form.html:407 +msgid "Required field" +msgstr "" + +#: ckan/templates/macros/form.html:422 +msgid "http://example.com/my-image.jpg" +msgstr "" + +#: ckan/templates/macros/form.html:423 +msgid "Image URL" +msgstr "" + +#: ckan/templates/macros/form.html:438 +msgid "Clear Upload" +msgstr "" + +#: ckan/templates/organization/base_form_page.html:5 +msgid "Organization Form" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:3 +#: ckan/templates/organization/bulk_process.html:11 +msgid "Edit datasets" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:16 +msgid " found for \"{query}\"" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:18 +msgid "Sorry no datasets found for \"{query}\"" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:37 +msgid "Make public" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:41 +msgid "Make private" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:70 +#: ckan/templates/package/read.html:18 +#: ckan/templates/snippets/package_item.html:40 +msgid "Draft" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:75 +#: ckan/templates/package/read.html:11 +#: ckan/templates/package/snippets/package_basic_fields.html:98 +#: ckan/templates/snippets/package_item.html:31 +#: ckan/templates/snippets/private.html:2 +#: ckan/templates/user/read_base.html:82 ckan/templates/user/read_base.html:96 +msgid "Private" +msgstr "" + +#: ckan/templates/organization/bulk_process.html:88 +msgid "This organization has no datasets associated to it" +msgstr "" + +#: ckan/templates/organization/confirm_delete.html:11 +msgid "Are you sure you want to delete organization - {name}?" +msgstr "" + +#: ckan/templates/organization/edit.html:6 +#: ckan/templates/organization/snippets/info.html:13 +#: ckan/templates/organization/snippets/info.html:16 +msgid "Edit Organization" +msgstr "" + +#: ckan/templates/organization/index.html:13 +#: ckan/templates/user/dashboard_organizations.html:7 +msgid "Add Organization" +msgstr "" + +#: ckan/templates/organization/index.html:20 +msgid "Search organizations..." +msgstr "" + +#: ckan/templates/organization/index.html:29 +msgid "There are currently no organizations for this site" +msgstr "" + +#: ckan/templates/organization/member_new.html:31 +#: ckan/templates/user/edit_user_form.html:8 +#: ckan/templates/user/logout_first.html:10 +#: ckan/templates/user/new_user_form.html:5 +#: ckan/templates/user/perform_reset.html:22 +#: ckan/templates/user/read_base.html:76 +#: ckan/templates/user/request_reset.html:16 +#: ckan/templates/user/snippets/login_form.html:20 +msgid "Username" +msgstr "" + +#: ckan/templates/organization/member_new.html:49 +msgid "Email address" +msgstr "" + +#: ckan/templates/organization/member_new.html:59 +msgid "Update Member" +msgstr "" + +#: ckan/templates/organization/member_new.html:79 +msgid "" +"

Admin: Can add/edit and delete datasets, as well as " +"manage organization members.

Editor: Can add and " +"edit datasets, but not manage organization members.

" +"

Member: Can view the organization's private datasets, " +"but not add new datasets.

" +msgstr "" + +#: ckan/templates/organization/members.html:14 +msgid "{count} member" +msgid_plural "{count} members" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/organization/new.html:3 +#: ckan/templates/organization/new.html:5 +#: ckan/templates/organization/new.html:7 +#: ckan/templates/organization/new.html:12 +msgid "Create an Organization" +msgstr "" + +#: ckan/templates/organization/new_organization_form.html:17 +msgid "Update Organization" +msgstr "" + +#: ckan/templates/organization/new_organization_form.html:19 +msgid "Create Organization" +msgstr "" + +#: ckan/templates/organization/snippets/feeds.html:3 +msgid "Datasets in organization: {group}" +msgstr "" + +#: ckan/templates/organization/snippets/help.html:4 +#: ckan/templates/organization/snippets/helper.html:4 +msgid "What are Organizations?" +msgstr "" + +#: ckan/templates/organization/snippets/help.html:7 +msgid "" +"

Organizations act like publishing departments for datasets (for example," +" the Department of Health). This means that datasets can be published by and" +" belong to a department instead of an individual user.

Within " +"organizations, admins can assign roles and authorise its members, giving " +"individual users the right to publish datasets from that particular " +"organisation (e.g. Office of National Statistics).

" +msgstr "" + +#: ckan/templates/organization/snippets/helper.html:8 +msgid "" +" CKAN Organizations are used to create, manage and publish collections of " +"datasets. Users can have different roles within an Organization, depending " +"on their level of authorisation to create, edit and publish. " +msgstr "" + +#: ckan/templates/organization/snippets/organization_form.html:10 +msgid "My Organization" +msgstr "" + +#: ckan/templates/organization/snippets/organization_form.html:18 +msgid "my-organization" +msgstr "" + +#: ckan/templates/organization/snippets/organization_form.html:20 +msgid "A little information about my organization..." +msgstr "" + +#: ckan/templates/organization/snippets/organization_form.html:38 +msgid "" +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." +msgstr "" + +#: ckan/templates/organization/snippets/organization_form.html:41 +msgid "Save Organization" +msgstr "" + +#: ckan/templates/organization/snippets/organization_item.html:42 +#: ckan/templates/organization/snippets/organization_item.html:43 +msgid "View {organization_name}" +msgstr "" + +#: ckan/templates/package/base.html:22 ckan/templates/package/new.html:9 +#: ckan/templates/package/snippets/new_package_breadcrumb.html:2 +msgid "Create Dataset" +msgstr "" + +#: ckan/templates/package/base_form_page.html:22 +msgid "What are datasets?" +msgstr "" + +#: ckan/templates/package/base_form_page.html:25 +msgid "" +" A CKAN Dataset is a collection of data resources (such as files), together " +"with a description and other information, at a fixed URL. Datasets are what " +"users see when searching for data. " +msgstr "" + +#: ckan/templates/package/confirm_delete.html:12 +msgid "Are you sure you want to delete dataset - {name}?" +msgstr "" + +#: ckan/templates/package/confirm_delete_resource.html:11 +msgid "Are you sure you want to delete resource - {name}?" +msgstr "" + +#: ckan/templates/package/edit_base.html:16 +msgid "View dataset" +msgstr "" + +#: ckan/templates/package/edit_base.html:20 +msgid "Edit metadata" +msgstr "" + +#: ckan/templates/package/edit_view.html:3 +#: ckan/templates/package/edit_view.html:4 +#: ckan/templates/package/edit_view.html:8 +#: ckan/templates/package/edit_view.html:12 +msgid "Edit view" +msgstr "" + +#: ckan/templates/package/edit_view.html:20 +#: ckan/templates/package/new_view.html:28 +#: ckan/templates/package/snippets/resource_item.html:32 +msgid "Preview" +msgstr "" + +#: ckan/templates/package/edit_view.html:21 +msgid "Update" +msgstr "" + +#: ckan/templates/package/group_list.html:14 +msgid "Associate this group with this dataset" +msgstr "" + +#: ckan/templates/package/group_list.html:14 +msgid "Add to group" +msgstr "" + +#: ckan/templates/package/group_list.html:23 +msgid "There are no groups associated with this dataset" +msgstr "" + +#: ckan/templates/package/new_package_form.html:15 +msgid "Update Dataset" +msgstr "" + +#: ckan/templates/package/new_resource.html:5 +msgid "Add data to the dataset" +msgstr "" + +#: ckan/templates/package/new_resource.html:11 +#: ckan/templates/package/new_resource_not_draft.html:8 +msgid "Add New Resource" +msgstr "" + +#: ckan/templates/package/new_resource_not_draft.html:3 +#: ckan/templates/package/new_resource_not_draft.html:4 +msgid "Add resource" +msgstr "" + +#: ckan/templates/package/new_resource_not_draft.html:16 +msgid "New resource" +msgstr "" + +#: ckan/templates/package/new_view.html:3 +#: ckan/templates/package/new_view.html:4 +#: ckan/templates/package/new_view.html:8 +#: ckan/templates/package/new_view.html:12 +msgid "Add view" +msgstr "" + +#: ckan/templates/package/new_view.html:19 +msgid "" +" Data Explorer views may be slow and unreliable unless the DataStore " +"extension is enabled. For more information, please see the Data Explorer " +"documentation. " +msgstr "" + +#: ckan/templates/package/new_view.html:29 +#: ckan/templates/package/snippets/resource_form.html:83 +msgid "Add" +msgstr "" + +#: ckan/templates/package/read_base.html:32 +#, python-format +msgid "" +"This is an old revision of this dataset, as edited at %(timestamp)s. It may " +"differ significantly from the current revision." +msgstr "" + +#: ckan/templates/package/resource_edit_base.html:17 +msgid "All resources" +msgstr "" + +#: ckan/templates/package/resource_edit_base.html:19 +msgid "View resource" +msgstr "" + +#: ckan/templates/package/resource_edit_base.html:24 +#: ckan/templates/package/resource_edit_base.html:30 +msgid "Edit resource" +msgstr "" + +#: ckan/templates/package/resource_edit_base.html:26 +msgid "Views" +msgstr "" + +#: ckan/templates/package/resource_read.html:40 +msgid "API Endpoint" +msgstr "" + +#: ckan/templates/package/resource_read.html:42 +#: ckan/templates/package/snippets/resource_item.html:47 +msgid "Go to resource" +msgstr "" + +#: ckan/templates/package/resource_read.html:44 +#: ckan/templates/package/snippets/resource_item.html:44 +msgid "Download" +msgstr "" + +#: ckan/templates/package/resource_read.html:76 +#: ckan/templates/package/resource_read.html:78 +msgid "URL:" +msgstr "" + +#: ckan/templates/package/resource_read.html:86 +msgid "From the dataset abstract" +msgstr "" + +#: ckan/templates/package/resource_read.html:88 +#, python-format +msgid "Source: %(dataset)s" +msgstr "" + +#: ckan/templates/package/resource_read.html:127 +msgid "There are no views created for this resource yet." +msgstr "" + +#: ckan/templates/package/resource_read.html:131 +msgid "Not seeing the views you were expecting?" +msgstr "" + +#: ckan/templates/package/resource_read.html:136 +msgid "Here are some reasons you may not be seeing expected views:" +msgstr "" + +#: ckan/templates/package/resource_read.html:138 +msgid "No view has been created that is suitable for this resource" +msgstr "" + +#: ckan/templates/package/resource_read.html:139 +msgid "The site administrators may not have enabled the relevant view plugins" +msgstr "" + +#: ckan/templates/package/resource_read.html:140 +msgid "" +"If a view requires the DataStore, the DataStore plugin may not be enabled, " +"or the data may not have been pushed to the DataStore, or the DataStore " +"hasn't finished processing the data yet" +msgstr "" + +#: ckan/templates/package/resource_read.html:162 +msgid "Additional Information" +msgstr "" + +#: ckan/templates/package/resource_read.html:166 +#: ckan/templates/package/snippets/additional_info.html:6 +#: ckan/templates/revision/diff.html:43 +#: ckan/templates/snippets/additional_info.html:11 +msgid "Field" +msgstr "" + +#: ckan/templates/package/resource_read.html:167 +#: ckan/templates/package/snippets/additional_info.html:7 +#: ckan/templates/snippets/additional_info.html:12 +msgid "Value" +msgstr "" + +#: ckan/templates/package/resource_read.html:172 +msgid "Data last updated" +msgstr "" + +#: ckan/templates/package/resource_read.html:173 +#: ckan/templates/package/resource_read.html:177 +#: ckan/templates/package/resource_read.html:181 +#: ckan/templates/package/resource_read.html:185 +msgid "unknown" +msgstr "" + +#: ckan/templates/package/resource_read.html:176 +msgid "Metadata last updated" +msgstr "" + +#: ckan/templates/package/resource_read.html:180 +#: ckan/templates/package/snippets/additional_info.html:70 +msgid "Created" +msgstr "" + +#: ckan/templates/package/resource_read.html:184 +#: ckan/templates/package/snippets/resource_form.html:39 +#: ckan/templates/package/snippets/resource_info.html:16 +msgid "Format" +msgstr "" + +#: ckan/templates/package/resource_read.html:188 +#: ckan/templates/package/snippets/package_basic_fields.html:30 +#: ckan/templates/snippets/license.html:21 +msgid "License" +msgstr "" + +#: ckan/templates/package/resource_views.html:10 +msgid "New view" +msgstr "" + +#: ckan/templates/package/resource_views.html:28 +msgid "This resource has no views" +msgstr "" + +#: ckan/templates/package/resources.html:8 +msgid "Add new resource" +msgstr "" + +#: ckan/templates/package/resources.html:20 +#: ckan/templates/package/snippets/resources_list.html:26 +#, python-format +msgid "" +"

This dataset has no data, why not " +"add some?

" +msgstr "" + +#: ckan/templates/package/search.html:52 +msgid "API" +msgstr "" + +#: ckan/templates/package/search.html:53 +msgid "API Docs" +msgstr "" + +#: ckan/templates/package/search.html:55 +msgid "full {format} dump" +msgstr "" + +#: ckan/templates/package/search.html:56 +#, python-format +msgid "" +" You can also access this registry using the %(api_link)s (see " +"%(api_doc_link)s) or download a %(dump_link)s. " +msgstr "" + +#: ckan/templates/package/search.html:60 +#, python-format +msgid "" +" You can also access this registry using the %(api_link)s (see " +"%(api_doc_link)s). " +msgstr "" + +#: ckan/templates/package/view_edit_base.html:9 +msgid "All views" +msgstr "" + +#: ckan/templates/package/view_edit_base.html:12 +msgid "View view" +msgstr "" + +#: ckan/templates/package/view_edit_base.html:37 +msgid "View preview" +msgstr "" + +#: ckan/templates/package/snippets/additional_info.html:2 +#: ckan/templates/snippets/additional_info.html:7 +msgid "Additional Info" +msgstr "" + +#: ckan/templates/package/snippets/additional_info.html:14 +#: ckan/templates/package/snippets/package_metadata_fields.html:6 +msgid "Source" +msgstr "" + +#: ckan/templates/package/snippets/additional_info.html:37 +#: ckan/templates/package/snippets/additional_info.html:42 +#: ckan/templates/package/snippets/package_metadata_fields.html:20 +msgid "Maintainer" +msgstr "" + +#: ckan/templates/package/snippets/additional_info.html:49 +#: ckan/templates/package/snippets/package_metadata_fields.html:10 +msgid "Version" +msgstr "" + +#: ckan/templates/package/snippets/additional_info.html:56 +#: ckan/templates/package/snippets/package_basic_fields.html:114 +#: ckan/templates/user/read_base.html:91 +msgid "State" +msgstr "" + +#: ckan/templates/package/snippets/additional_info.html:62 +msgid "Last Updated" +msgstr "" + +#: ckan/templates/package/snippets/cannot_create_package.html:10 +msgid "Before you can create a dataset you need to create an organization." +msgstr "" + +#: ckan/templates/package/snippets/cannot_create_package.html:13 +msgid "Create a new organization" +msgstr "" + +#: ckan/templates/package/snippets/cannot_create_package.html:18 +msgid "There are no organizations to which you can assign this dataset." +msgstr "" + +#: ckan/templates/package/snippets/cannot_create_package.html:19 +msgid "" +"Ask a system administrator to create an organization before you can " +"continue." +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:4 +#: ckan/templates/package/snippets/view_form.html:8 +msgid "Title" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:4 +msgid "eg. A descriptive title" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:13 +msgid "eg. my-dataset" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:19 +msgid "eg. Some useful notes about the data" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:24 +msgid "eg. economy, mental health, government" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:45 +msgid "" +" License definitions and additional information can be found at opendefinition.org " +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:76 +#: ckan/templates/snippets/organization.html:23 +msgid "Organization" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:80 +msgid "No organization" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:95 +msgid "Visibility" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:98 +msgid "Public" +msgstr "" + +#: ckan/templates/package/snippets/package_basic_fields.html:117 +msgid "Active" +msgstr "" + +#: ckan/templates/package/snippets/package_form.html:28 +msgid "" +"The data license you select above only applies to the contents of any" +" resource files that you add to this dataset. By submitting this form, you " +"agree to release the metadata values that you enter into the form " +"under the Open " +"Database License." +msgstr "" + +#: ckan/templates/package/snippets/package_form.html:39 +msgid "Are you sure you want to delete this dataset?" +msgstr "" + +#: ckan/templates/package/snippets/package_form.html:43 +msgid "Next: Add Data" +msgstr "" + +#: ckan/templates/package/snippets/package_metadata_fields.html:6 +msgid "http://example.com/dataset.json" +msgstr "" + +#: ckan/templates/package/snippets/package_metadata_fields.html:10 +msgid "1.0" +msgstr "" + +#: ckan/templates/package/snippets/package_metadata_fields.html:14 +#: ckan/templates/package/snippets/package_metadata_fields.html:20 +#: ckan/templates/user/new_user_form.html:6 +msgid "Joe Bloggs" +msgstr "" + +#: ckan/templates/package/snippets/package_metadata_fields.html:16 +msgid "Author Email" +msgstr "" + +#: ckan/templates/package/snippets/package_metadata_fields.html:16 +#: ckan/templates/package/snippets/package_metadata_fields.html:22 +#: ckan/templates/user/new_user_form.html:7 +msgid "joe@example.com" +msgstr "" + +#: ckan/templates/package/snippets/package_metadata_fields.html:22 +msgid "Maintainer Email" +msgstr "" + +#: ckan/templates/package/snippets/resource_edit_form.html:12 +msgid "Update Resource" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:26 +msgid "Data" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:26 +msgid "http://example.com/external-data.csv" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:30 +msgid "eg. January 2011 Gold Prices" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:34 +msgid "Some useful notes about the data" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:39 +msgid "eg. CSV, XML or JSON" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:42 +msgid "This will be guessed automatically. Leave blank if you wish" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:53 +msgid "eg. 2012-06-05" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:55 +msgid "File Size" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:55 +msgid "eg. 1024" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:57 +#: ckan/templates/package/snippets/resource_form.html:59 +msgid "MIME Type" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:57 +#: ckan/templates/package/snippets/resource_form.html:59 +msgid "eg. application/json" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:67 +msgid "Are you sure you want to delete this resource?" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:73 +msgid "Previous" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:76 +msgid "Save & add another" +msgstr "" + +#: ckan/templates/package/snippets/resource_form.html:79 +msgid "Finish" +msgstr "" + +#: ckan/templates/package/snippets/resource_help.html:2 +msgid "What's a resource?" +msgstr "" + +#: ckan/templates/package/snippets/resource_help.html:4 +msgid "A resource can be any file or link to a file containing useful data." +msgstr "" + +#: ckan/templates/package/snippets/resource_item.html:23 +msgid "Explore" +msgstr "" + +#: ckan/templates/package/snippets/resource_item.html:35 +msgid "More information" +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:18 +msgid "Embed" +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:32 +msgid "This resource view is not available at the moment." +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:74 +msgid "Embed resource view" +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:77 +msgid "" +"You can copy and paste the embed code into a CMS or blog software that " +"supports raw HTML" +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:80 +msgid "Width" +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:83 +msgid "Height" +msgstr "" + +#: ckan/templates/package/snippets/resource_view.html:86 +msgid "Code" +msgstr "" + +#: ckan/templates/package/snippets/resource_views_list.html:8 +msgid "Resource Preview" +msgstr "" + +#: ckan/templates/package/snippets/resources_list.html:13 +msgid "Data and Resources" +msgstr "" + +#: ckan/templates/package/snippets/resources_list.html:30 +msgid "This dataset has no data" +msgstr "" + +#: ckan/templates/package/snippets/revisions_table.html:24 +#, python-format +msgid "Read dataset as of %s" +msgstr "" + +#: ckan/templates/package/snippets/stages.html:23 +#: ckan/templates/package/snippets/stages.html:25 +msgid "Create dataset" +msgstr "" + +#: ckan/templates/package/snippets/stages.html:30 +#: ckan/templates/package/snippets/stages.html:34 +#: ckan/templates/package/snippets/stages.html:36 +msgid "Add data" +msgstr "" + +#: ckan/templates/package/snippets/view_form.html:8 +msgid "eg. My View" +msgstr "" + +#: ckan/templates/package/snippets/view_form.html:9 +msgid "eg. Information about my view" +msgstr "" + +#: ckan/templates/package/snippets/view_form_filters.html:28 +msgid "Remove Filter" +msgstr "" + +#: ckan/templates/package/snippets/view_help.html:2 +msgid "What's a view?" +msgstr "" + +#: ckan/templates/package/snippets/view_help.html:4 +msgid "A view is a representation of the data held against a resource" +msgstr "" + +#: ckan/templates/revision/diff.html:6 +msgid "Differences" +msgstr "" + +#: ckan/templates/revision/diff.html:13 ckan/templates/revision/diff.html:18 +#: ckan/templates/revision/diff.html:23 +msgid "Revision Differences" +msgstr "" + +#: ckan/templates/revision/diff.html:44 +msgid "Difference" +msgstr "" + +#: ckan/templates/revision/diff.html:54 +msgid "No Differences" +msgstr "" + +#: ckan/templates/revision/list.html:3 ckan/templates/revision/list.html:6 +#: ckan/templates/revision/list.html:10 +msgid "Revision History" +msgstr "" + +#: ckan/templates/revision/list.html:6 ckan/templates/revision/read.html:8 +msgid "Revisions" +msgstr "" + +#: ckan/templates/revision/read.html:30 +msgid "Undelete" +msgstr "" + +#: ckan/templates/revision/read.html:64 +msgid "Changes" +msgstr "" + +#: ckan/templates/revision/read.html:74 +msgid "Datasets' Tags" +msgstr "" + +#: ckan/templates/revision/snippets/revisions_list.html:7 +msgid "Entity" +msgstr "" + +#: ckan/templates/snippets/activity_item.html:3 +msgid "New activity item" +msgstr "" + +#: ckan/templates/snippets/add_dataset.html:6 +msgid "Add Dataset" +msgstr "" + +#: ckan/templates/snippets/datapusher_status.html:8 +msgid "Datapusher status: {status}." +msgstr "" + +#: ckan/templates/snippets/disqus_trackback.html:2 +msgid "Trackback URL" +msgstr "" + +#: ckan/templates/snippets/facet_list.html:82 +msgid "Show More {facet_type}" +msgstr "" + +#: ckan/templates/snippets/facet_list.html:85 +msgid "Show Only Popular {facet_type}" +msgstr "" + +#: ckan/templates/snippets/facet_list.html:89 +msgid "There are no {facet_type} that match this search" +msgstr "" + +#: ckan/templates/snippets/home_breadcrumb_item.html:2 +msgid "Home" +msgstr "" + +#: ckan/templates/snippets/language_selector.html:3 +msgid "Language" +msgstr "" + +#: ckan/templates/snippets/language_selector.html:11 +#: ckan/templates/snippets/search_form.html:42 +#: ckan/templates/snippets/simple_search.html:15 +#: ckan/templates/snippets/sort_by.html:22 +msgid "Go" +msgstr "" + +#: ckan/templates/snippets/license.html:14 +msgid "No License Provided" +msgstr "" + +#: ckan/templates/snippets/license.html:28 +msgid "This dataset satisfies the Open Definition." +msgstr "" + +#: ckan/templates/snippets/organization.html:48 +msgid "There is no description for this organization" +msgstr "" + +#: ckan/templates/snippets/package_item.html:57 +msgid "This dataset has no description" +msgstr "" + +#: ckan/templates/snippets/search_form.html:33 +#: ckan/templates/snippets/simple_search.html:8 +#: ckan/templates/snippets/sort_by.html:12 +msgid "Order by" +msgstr "" + +#: ckan/templates/snippets/search_form.html:74 +msgid "Filter Results" +msgstr "" + +#: ckan/templates/snippets/search_form.html:81 +msgid "

Please try another search.

" +msgstr "" + +#: ckan/templates/snippets/search_form.html:87 +msgid "" +"

There was an error while searching." +" Please try again.

" +msgstr "" + +#: ckan/templates/snippets/search_result_text.html:15 +msgid "{number} dataset found for \"{query}\"" +msgid_plural "{number} datasets found for \"{query}\"" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/snippets/search_result_text.html:16 +msgid "No datasets found for \"{query}\"" +msgstr "" + +#: ckan/templates/snippets/search_result_text.html:17 +msgid "{number} dataset found" +msgid_plural "{number} datasets found" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/snippets/search_result_text.html:18 +msgid "No datasets found" +msgstr "" + +#: ckan/templates/snippets/search_result_text.html:21 +msgid "{number} group found for \"{query}\"" +msgid_plural "{number} groups found for \"{query}\"" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/snippets/search_result_text.html:22 +msgid "No groups found for \"{query}\"" +msgstr "" + +#: ckan/templates/snippets/search_result_text.html:23 +msgid "{number} group found" +msgid_plural "{number} groups found" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/snippets/search_result_text.html:24 +msgid "No groups found" +msgstr "" + +#: ckan/templates/snippets/search_result_text.html:27 +msgid "{number} organization found for \"{query}\"" +msgid_plural "{number} organizations found for \"{query}\"" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/snippets/search_result_text.html:28 +msgid "No organizations found for \"{query}\"" +msgstr "" + +#: ckan/templates/snippets/search_result_text.html:29 +msgid "{number} organization found" +msgid_plural "{number} organizations found" +msgstr[0] "" +msgstr[1] "" + +#: ckan/templates/snippets/search_result_text.html:30 +msgid "No organizations found" +msgstr "" + +#: ckan/templates/snippets/social.html:5 +msgid "Social" +msgstr "" + +#: ckan/templates/snippets/subscribe.html:2 +msgid "Subscribe" +msgstr "" + +#: ckan/templates/snippets/subscribe.html:4 +#: ckan/templates/user/edit_user_form.html:12 +#: ckan/templates/user/new_user_form.html:7 +#: ckan/templates/user/read_base.html:82 +msgid "Email" +msgstr "" + +#: ckan/templates/snippets/subscribe.html:5 +msgid "RSS" +msgstr "" + +#: ckan/templates/snippets/context/user.html:23 +#: ckan/templates/user/read_base.html:57 +msgid "Edits" +msgstr "" + +#: ckan/templates/tag/index.html:33 ckan/templates/tag/index.html:34 +msgid "Search Tags" +msgstr "" + +#: ckan/templates/user/dashboard.html:19 ckan/templates/user/dashboard.html:37 +msgid "News feed" +msgstr "" + +#: ckan/templates/user/dashboard.html:20 +#: ckan/templates/user/dashboard_datasets.html:12 +msgid "My Datasets" +msgstr "" + +#: ckan/templates/user/dashboard.html:21 +#: ckan/templates/user/dashboard_organizations.html:12 +msgid "My Organizations" +msgstr "" + +#: ckan/templates/user/dashboard.html:22 +#: ckan/templates/user/dashboard_groups.html:12 +msgid "My Groups" +msgstr "" + +#: ckan/templates/user/dashboard.html:39 +msgid "Activity from items that I'm following" +msgstr "" + +#: ckan/templates/user/dashboard_datasets.html:17 +#: ckan/templates/user/read.html:20 +msgid "You haven't created any datasets." +msgstr "" + +#: ckan/templates/user/dashboard_datasets.html:19 +#: ckan/templates/user/dashboard_groups.html:22 +#: ckan/templates/user/dashboard_organizations.html:23 +#: ckan/templates/user/read.html:22 +msgid "Create one now?" +msgstr "" + +#: ckan/templates/user/dashboard_groups.html:20 +msgid "You are not a member of any groups." +msgstr "" + +#: ckan/templates/user/dashboard_organizations.html:21 +msgid "You are not a member of any organizations." +msgstr "" + +#: ckan/templates/user/edit.html:6 ckan/templates/user/edit_base.html:3 +#: ckan/templates/user/list.html:6 ckan/templates/user/list.html:13 +#: ckan/templates/user/read_base.html:5 ckan/templates/user/read_base.html:8 +#: ckan/templates/user/snippets/user_search.html:2 +msgid "Users" +msgstr "" + +#: ckan/templates/user/edit.html:17 +msgid "Account Info" +msgstr "" + +#: ckan/templates/user/edit.html:19 +msgid "" +" Your profile lets other CKAN users know about who you are and what you do. " +msgstr "" + +#: ckan/templates/user/edit_user_form.html:7 +msgid "Change details" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:10 +msgid "Full name" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:10 +msgid "eg. Joe Bloggs" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:12 +msgid "eg. joe@example.com" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:14 +msgid "A little information about yourself" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:17 +msgid "Subscribe to notification emails" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:26 +msgid "Change password" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:29 +msgid "Sysadmin Password" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:37 +#: ckan/templates/user/logout_first.html:11 +#: ckan/templates/user/new_user_form.html:8 +#: ckan/templates/user/perform_reset.html:25 +#: ckan/templates/user/snippets/login_form.html:22 +msgid "Password" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:39 +msgid "Confirm Password" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:45 +msgid "Are you sure you want to delete this User?" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:50 +msgid "Are you sure you want to regenerate the API key?" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:50 +msgid "Regenerate API Key" +msgstr "" + +#: ckan/templates/user/edit_user_form.html:54 +msgid "Update Profile" +msgstr "" + +#: ckan/templates/user/list.html:3 +#: ckan/templates/user/snippets/user_search.html:11 +msgid "All Users" +msgstr "" + +#: ckan/templates/user/login.html:3 ckan/templates/user/login.html:6 +#: ckan/templates/user/login.html:12 +#: ckan/templates/user/snippets/login_form.html:28 +msgid "Login" +msgstr "" + +#: ckan/templates/user/login.html:25 +msgid "Need an Account?" +msgstr "" + +#: ckan/templates/user/login.html:27 +msgid "Then sign right up, it only takes a minute." +msgstr "" + +#: ckan/templates/user/login.html:30 +msgid "Create an Account" +msgstr "" + +#: ckan/templates/user/login.html:42 +msgid "Forgotten your password?" +msgstr "" + +#: ckan/templates/user/login.html:44 +msgid "No problem, use our password recovery form to reset it." +msgstr "" + +#: ckan/templates/user/login.html:47 +msgid "Forgot your password?" +msgstr "" + +#: ckan/templates/user/logout.html:3 ckan/templates/user/logout.html:9 +msgid "Logged Out" +msgstr "" + +#: ckan/templates/user/logout.html:11 +msgid "You are now logged out." +msgstr "" + +#: ckan/templates/user/logout_first.html:9 +msgid "You're already logged in as {user}." +msgstr "" + +#: ckan/templates/user/logout_first.html:9 +msgid "Logout" +msgstr "" + +#: ckan/templates/user/logout_first.html:12 +#: ckan/templates/user/snippets/login_form.html:24 +msgid "Remember me" +msgstr "" + +#: ckan/templates/user/logout_first.html:20 +msgid "You're already logged in" +msgstr "" + +#: ckan/templates/user/logout_first.html:22 +msgid "You need to log out before you can log in with another account." +msgstr "" + +#: ckan/templates/user/logout_first.html:23 +msgid "Log out now" +msgstr "" + +#: ckan/templates/user/new.html:6 +msgid "Registration" +msgstr "" + +#: ckan/templates/user/new.html:14 +msgid "Register for an Account" +msgstr "" + +#: ckan/templates/user/new.html:26 +msgid "Why Sign Up?" +msgstr "" + +#: ckan/templates/user/new.html:28 +msgid "Create datasets, groups and other exciting things" +msgstr "" + +#: ckan/templates/user/new_user_form.html:5 +msgid "username" +msgstr "" + +#: ckan/templates/user/new_user_form.html:6 +msgid "Full Name" +msgstr "" + +#: ckan/templates/user/new_user_form.html:19 +msgid "Create Account" +msgstr "" + +#: ckan/templates/user/perform_reset.html:4 +#: ckan/templates/user/perform_reset.html:14 +msgid "Reset Your Password" +msgstr "" + +#: ckan/templates/user/perform_reset.html:7 +msgid "Password Reset" +msgstr "" + +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "" + +#: ckan/templates/user/perform_reset.html:29 +msgid "Update Password" +msgstr "" + +#: ckan/templates/user/perform_reset.html:43 +#: ckan/templates/user/request_reset.html:32 +msgid "How does this work?" +msgstr "" + +#: ckan/templates/user/perform_reset.html:45 +msgid "Simply enter a new password and we'll update your account" +msgstr "" + +#: ckan/templates/user/read.html:27 +msgid "User hasn't created any datasets." +msgstr "" + +#: ckan/templates/user/read_base.html:39 +msgid "You have not provided a biography." +msgstr "" + +#: ckan/templates/user/read_base.html:41 +msgid "This user has no biography." +msgstr "" + +#: ckan/templates/user/read_base.html:73 +msgid "Open ID" +msgstr "" + +#: ckan/templates/user/read_base.html:82 ckan/templates/user/read_base.html:96 +msgid "This means only you can see this" +msgstr "" + +#: ckan/templates/user/read_base.html:87 +msgid "Member Since" +msgstr "" + +#: ckan/templates/user/read_base.html:96 +msgid "API Key" +msgstr "" + +#: ckan/templates/user/request_reset.html:3 +#: ckan/templates/user/request_reset.html:13 +msgid "Reset your password" +msgstr "" + +#: ckan/templates/user/request_reset.html:6 +msgid "Password reset" +msgstr "" + +#: ckan/templates/user/request_reset.html:19 +msgid "Request reset" +msgstr "" + +#: ckan/templates/user/request_reset.html:34 +msgid "" +"Enter your username into the box and we will send you an email with a link " +"to enter a new password." +msgstr "" + +#: ckan/templates/user/snippets/followee_dropdown.html:15 +#: ckan/templates/user/snippets/followee_dropdown.html:16 +msgid "Activity from:" +msgstr "" + +#: ckan/templates/user/snippets/followee_dropdown.html:23 +msgid "Search list..." +msgstr "" + +#: ckan/templates/user/snippets/followee_dropdown.html:44 +msgid "You are not following anything" +msgstr "" + +#: ckan/templates/user/snippets/followers.html:9 +msgid "No followers" +msgstr "" + +#: ckan/templates/user/snippets/user_search.html:5 +msgid "Search Users" +msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/he/LC_MESSAGES/ckan.mo b/ckan/i18n/he/LC_MESSAGES/ckan.mo index 17f4141318a..7b17f21654a 100644 Binary files a/ckan/i18n/he/LC_MESSAGES/ckan.mo and b/ckan/i18n/he/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/he/LC_MESSAGES/ckan.po b/ckan/i18n/he/LC_MESSAGES/ckan.po index a203cca6dc2..3f110abc057 100644 --- a/ckan/i18n/he/LC_MESSAGES/ckan.po +++ b/ckan/i18n/he/LC_MESSAGES/ckan.po @@ -1,23 +1,23 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Hebrew (https://www.transifex.com/okfn/teams/11162/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: he\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" #: ckanext/datapusher/helpers.py:21 msgid "Complete" @@ -113,13 +113,19 @@ msgstr "משאב DataStore לא נמצא" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" +"לנתונים אין משמעות (לדוגמה: ערך מספרי מחוץ לטווח או שהוכנס אל תוך שדה טקסט)." -#: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 -#: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 -#: ckanext/datastore/logic/action.py:534 ckanext/datastore/logic/action.py:559 +#: ckanext/datastore/logic/action.py:258 ckanext/datastore/logic/action.py:286 +#: ckanext/datastore/logic/action.py:344 ckanext/datastore/logic/action.py:457 msgid "Resource \"{0}\" was not found." msgstr "משאב \"{0}\" לא נמצא." @@ -255,7 +261,14 @@ msgstr "טוען..." msgid "Data API" msgstr "מידע API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -372,6 +385,8 @@ msgid "{num} Dataset" msgid_plural "{num} Datasets" msgstr[0] "צביר נתונים" msgstr[1] "{num} צבירי נתונים" +msgstr[2] "{num} צבירי נתונים" +msgstr[3] "{num} צבירי נתונים" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -1438,6 +1453,8 @@ msgid "{n} new activity from {site_title}" msgid_plural "{n} new activities from {site_title}" msgstr[0] "" msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:19 msgid "January" @@ -1496,30 +1513,40 @@ msgid "{mins} minute ago" msgid_plural "{mins} minutes ago" msgstr[0] "לפני דקה אחת" msgstr[1] "לפני {mins} דקות" +msgstr[2] "לפני {mins} דקות" +msgstr[3] "לפני {mins} דקות" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" msgid_plural "{hours} hours ago" msgstr[0] "לפני {hours} שעה" msgstr[1] " לפני {hours} שעות" +msgstr[2] " לפני {hours} שעות" +msgstr[3] " לפני {hours} שעות" #: ckan/lib/formatters.py:125 msgid "{days} day ago" msgid_plural "{days} days ago" msgstr[0] "לפני יום אחד" msgstr[1] "לפני {days} ימים" +msgstr[2] "לפני {days} ימים" +msgstr[3] "לפני {days} ימים" #: ckan/lib/formatters.py:128 msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "לפני חודש" msgstr[1] "לפני {months} חודשים" +msgstr[2] "לפני {months} חודשים" +msgstr[3] "לפני {months} חודשים" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" msgid_plural "over {years} years ago" msgstr[0] "לפני יותר משנה" msgstr[1] "לפני יותר מ-{years} שנים" +msgstr[2] "לפני יותר מ-{years} שנים" +msgstr[3] "לפני יותר מ-{years} שנים" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1614,12 +1641,16 @@ msgid "{number} view" msgid_plural "{number} views" msgstr[0] "תצוגה אחת" msgstr[1] "{number} תצוגות" +msgstr[2] "{number} תצוגות" +msgstr[3] "{number} תצוגות" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" msgid_plural "{number} recent views" msgstr[0] "תצוגה אחרונה" msgstr[1] "{number} תצוגות אחרונות" +msgstr[2] "{number} תצוגות אחרונות" +msgstr[3] "{number} תצוגות אחרונות" #: ckan/lib/mailer.py:39 #, python-format @@ -2391,6 +2422,8 @@ msgid "Input is too short, must be at least one character" msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "" msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2542,6 +2575,111 @@ msgstr "הראי עוד" msgid "Hide" msgstr "החביאי" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2581,6 +2719,8 @@ msgid "Dashboard (%(num)d new item)" msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "לוח מחוונים (%(num)d פריט חדש)" msgstr[1] "לוח מחוונים(%(num)d פריטים חדשים)" +msgstr[2] "לוח מחוונים(%(num)d פריטים חדשים)" +msgstr[3] "לוח מחוונים(%(num)d פריטים חדשים)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -2980,21 +3120,21 @@ msgstr "אם אתם רוצים להזמין משתמש חדש, הקלידו את #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "תפקיד" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "האם אתם בטוחים שאתם רוצים למחוק את חבר הקבוצה הזה?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3253,6 +3393,9 @@ msgid "" "target=\"popover\" data-content=\"%(markdown_tooltip)s\" data-" "html=\"true\">Markdown formatting here" msgstr "" +"ניתן להשתמש כאן בתחביר Markdown" #: ckan/templates/macros/form.html:265 msgid "This field is required" @@ -3388,8 +3531,10 @@ msgstr "" #: ckan/templates/organization/members.html:14 msgid "{count} member" msgid_plural "{count} members" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "חבר {count}" +msgstr[1] "{count} חברים" +msgstr[2] "{count} חברים" +msgstr[3] "{count} חברים" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3455,8 +3600,8 @@ msgstr "מידע קצר על הארגון שלי..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "האם אתם בטוחים שאתם רוצים למחוק את הארגון הזה? פעולה זו תמחק את כל צבירי " "הנתונים הפומביים והפרטיים השייכים לארגון." @@ -4216,12 +4361,16 @@ msgid "" "

There was an error while searching." " Please try again.

" msgstr "" +"

אירעה שגיאה בעת החיפוש. נא לנסות " +"שוב.

" #: ckan/templates/snippets/search_result_text.html:15 msgid "{number} dataset found for \"{query}\"" msgid_plural "{number} datasets found for \"{query}\"" msgstr[0] "צביר נתונים אחד נמצא עבור \"{query}\"" msgstr[1] "{number} צבירי נתוניים נמצאו עבור \"{query}\"" +msgstr[2] "{number} צבירי נתוניים נמצאו עבור \"{query}\"" +msgstr[3] "{number} צבירי נתוניים נמצאו עבור \"{query}\"" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4232,6 +4381,8 @@ msgid "{number} dataset found" msgid_plural "{number} datasets found" msgstr[0] "נמצא צביר נתונים יחיד" msgstr[1] "נמצאו {number} צבירי נתונים" +msgstr[2] "נמצאו {number} צבירי נתונים" +msgstr[3] "נמצאו {number} צבירי נתונים" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4242,6 +4393,8 @@ msgid "{number} group found for \"{query}\"" msgid_plural "{number} groups found for \"{query}\"" msgstr[0] "קבוצה אחת נמצאה עבור \"{query}\"" msgstr[1] "{number} קבוצות נמצאו עבור \"{query}\"" +msgstr[2] "{number} קבוצות נמצאו עבור \"{query}\"" +msgstr[3] "{number} קבוצות נמצאו עבור \"{query}\"" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4252,6 +4405,8 @@ msgid "{number} group found" msgid_plural "{number} groups found" msgstr[0] "נמצאה קבוצה אחת" msgstr[1] "{number} קבוצות נמצאו" +msgstr[2] "{number} קבוצות נמצאו" +msgstr[3] "{number} קבוצות נמצאו" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4262,6 +4417,8 @@ msgid "{number} organization found for \"{query}\"" msgid_plural "{number} organizations found for \"{query}\"" msgstr[0] "ארגון אחד נמצא עבור \"{query}\"" msgstr[1] "{number} ארגונים נמצאו עבור \"{query}\"" +msgstr[2] "{number} ארגונים נמצאו עבור \"{query}\"" +msgstr[3] "{number} ארגונים נמצאו עבור \"{query}\"" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4272,6 +4429,8 @@ msgid "{number} organization found" msgid_plural "{number} organizations found" msgstr[0] "ארגון אחד נמצא" msgstr[1] "{number} ארגונים נמצאו" +msgstr[2] "{number} ארגונים נמצאו" +msgstr[3] "{number} ארגונים נמצאו" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4611,3 +4770,7 @@ msgstr "אין עוקבים" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "חיפוש משתמשים" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/hr/LC_MESSAGES/ckan.mo b/ckan/i18n/hr/LC_MESSAGES/ckan.mo index 7cae997de31..50b7c85e12e 100644 Binary files a/ckan/i18n/hr/LC_MESSAGES/ckan.mo and b/ckan/i18n/hr/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/hr/LC_MESSAGES/ckan.po b/ckan/i18n/hr/LC_MESSAGES/ckan.po index 8b6b402c137..e6aa220308e 100644 --- a/ckan/i18n/hr/LC_MESSAGES/ckan.po +++ b/ckan/i18n/hr/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Croatian (https://www.transifex.com/okfn/teams/11162/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "DataStore resurs nije pronаđen" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -255,7 +261,14 @@ msgstr "Učitаvаnje ..." msgid "Data API" msgstr "API podаtаkа" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tablica" @@ -3010,21 +3023,21 @@ msgstr "Ako želite pozvati nove korisnike, unesite njihove e-mail adrese." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Uloga" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Jeste li sigurni da želite izbrisati ovaj član?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3490,8 +3503,8 @@ msgstr "Malo informacija o mojoj Organizaciji" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Jeste li sigurni da želite obrisati ovu Organizaciju? Ovime ćete obrisati " "sve javne i privatne skupove podataka koji pripadaju ovoj organizaciji." @@ -4656,3 +4669,7 @@ msgstr "Nema sljedbenika" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Traži korisnike" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/hu/LC_MESSAGES/ckan.mo b/ckan/i18n/hu/LC_MESSAGES/ckan.mo index 2db31e35e8d..75dd558ef4b 100644 Binary files a/ckan/i18n/hu/LC_MESSAGES/ckan.mo and b/ckan/i18n/hu/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/hu/LC_MESSAGES/ckan.po b/ckan/i18n/hu/LC_MESSAGES/ckan.po index 6a80a7233f3..01edebf334e 100644 --- a/ckan/i18n/hu/LC_MESSAGES/ckan.po +++ b/ckan/i18n/hu/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Hungarian (https://www.transifex.com/okfn/teams/11162/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "Betöltés ..." msgid "Data API" msgstr "" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -2965,21 +2978,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3407,8 +3420,8 @@ msgstr "Kevés információ a szervezetemről..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4546,3 +4559,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/id/LC_MESSAGES/ckan.mo b/ckan/i18n/id/LC_MESSAGES/ckan.mo index ae3df9de8c4..12eea9edaa0 100644 Binary files a/ckan/i18n/id/LC_MESSAGES/ckan.mo and b/ckan/i18n/id/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/id/LC_MESSAGES/ckan.po b/ckan/i18n/id/LC_MESSAGES/ckan.po index 271bf203116..304364a98f1 100644 --- a/ckan/i18n/id/LC_MESSAGES/ckan.po +++ b/ckan/i18n/id/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Try Fathur Rachman , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Indonesian (https://www.transifex.com/okfn/teams/11162/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -111,7 +111,13 @@ msgstr "Format: harus menjadi salah satu %s" msgid "DataStore resource not found" msgstr "Sumber kumpulan data tidak ditemukan" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "Memuat..." msgid "Data API" msgstr "API data" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabel" @@ -2965,21 +2978,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3406,8 +3419,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4541,3 +4554,7 @@ msgstr "Tidak ada pengikut" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Cari Pengguna" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/is/LC_MESSAGES/ckan.mo b/ckan/i18n/is/LC_MESSAGES/ckan.mo index 408dde96f7e..bc0f629819e 100644 Binary files a/ckan/i18n/is/LC_MESSAGES/ckan.mo and b/ckan/i18n/is/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/is/LC_MESSAGES/ckan.po b/ckan/i18n/is/LC_MESSAGES/ckan.po index 863d19bb0ff..efabbaea83a 100644 --- a/ckan/i18n/is/LC_MESSAGES/ckan.po +++ b/ckan/i18n/is/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Icelandic (https://www.transifex.com/okfn/teams/11162/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Tilfang DataStore fannst ekki" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -260,7 +266,18 @@ msgstr "Hleð..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Ítarlegri upplýsingar má finna í aðalleiðbeiningum CKAN gagnaforritaskila og " +"gagnabankans.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tafla" @@ -2275,10 +2292,6 @@ msgid "User %s not authorized to update term_translation table" msgstr "" "Notandinn %s hefur ekki réttindi til að uppfæra töfluna term_translation" -#: ckan/logic/auth/update.py:262 -msgid "Valid API key needed to edit a package" -msgstr "Til að breyta pakka þarftu gildan API lykil" - #: ckan/logic/auth/update.py:272 msgid "Valid API key needed to edit a group" msgstr "Þú verður að hafa gildan API lykil til að breyta safni" @@ -3007,21 +3020,21 @@ msgstr "Ef þú vilt bjóða nýjum notanda skaltu slá inn netfang hans." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Hlutverk" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Ertu viss um að þú viljir eyða þessum meðlim?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3491,8 +3504,8 @@ msgstr "Stutt lýsing á stofnuninni..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Ertu viss um að þú viljir eyða þessari stofnun? Þetta mun eyða öllum " "opinberum og lokuðum gagnapökkum sem tilheyra þessari stofnun." @@ -4667,3 +4680,7 @@ msgstr "Engir fylgjendur" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Leita að notanda" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/it/LC_MESSAGES/ckan.mo b/ckan/i18n/it/LC_MESSAGES/ckan.mo index 730bbac2234..21c91e87a92 100644 Binary files a/ckan/i18n/it/LC_MESSAGES/ckan.mo and b/ckan/i18n/it/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/it/LC_MESSAGES/ckan.po b/ckan/i18n/it/LC_MESSAGES/ckan.po index cff404dee9c..6fdcfc087f8 100644 --- a/ckan/i18n/it/LC_MESSAGES/ckan.po +++ b/ckan/i18n/it/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Italian (https://www.transifex.com/okfn/teams/11162/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Risorsa DataStore non trovata" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -265,7 +271,18 @@ msgstr "Caricando..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Ulteriori informazioni presso la documentazione principale su CKAN Data API e " +"DataStore.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabella" @@ -863,15 +880,16 @@ msgid "Request params must be in form of a json encoded dictionary." msgstr "" "I parametri della richiesta devono essere un dizionario codificato in JSON" -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Gruppo non trovato" @@ -2290,10 +2308,6 @@ msgid "User %s not authorized to update term_translation table" msgstr "" "L'utente %s non è autorizzato ad aggiornare la tabella term_translation" -#: ckan/logic/auth/update.py:262 -msgid "Valid API key needed to edit a package" -msgstr "È necessaria una chiave API valida per modificare il pacchetto" - #: ckan/logic/auth/update.py:272 msgid "Valid API key needed to edit a group" msgstr "È necessaria una chiave API valida per modificare il gruppo" @@ -3028,21 +3042,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Ruolo" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Sei sicuro di voler cancellare questo membro?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3520,8 +3534,8 @@ msgstr "Qualche informazioni sulla mia organizzazione..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Sei sicuro che vuoi eliminare questa Organizzazione? Saranno eliminati tutti" " i dataset pubblici e privati associati a questa organizzazione." @@ -4699,3 +4713,7 @@ msgstr "Nessun sostenitore" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Cerca Utenti" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/ja/LC_MESSAGES/ckan.mo b/ckan/i18n/ja/LC_MESSAGES/ckan.mo index 9320016e21c..26d0f85c470 100644 Binary files a/ckan/i18n/ja/LC_MESSAGES/ckan.mo and b/ckan/i18n/ja/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/ja/LC_MESSAGES/ckan.po b/ckan/i18n/ja/LC_MESSAGES/ckan.po index 039d7e6eb37..6fcfbb287af 100644 --- a/ckan/i18n/ja/LC_MESSAGES/ckan.po +++ b/ckan/i18n/ja/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Azusa Akiyama , 2017\n" +"Last-Translator: Azusa Akiyama , 2018\n" "Language-Team: Japanese (https://www.transifex.com/okfn/teams/11162/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -111,7 +111,13 @@ msgstr "フォーマット:%sの1つである必要があります" msgid "DataStore resource not found" msgstr "データストアリソースが見つかりません" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "データディクショナリを保存しました。再定義したタイプは、リソースが次回データストアにアップロードされたときに有効になります。" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -141,7 +147,7 @@ msgid "" "href=\"http://docs.ckan.org/en/latest/maintaining/datastore.html\" " "target=\"_blank\">main CKAN Data API and DataStore documentation.

" msgstr "" -" より詳しい情報は main CKAN Data API and DataStore " "documentationを参照してください。

" @@ -204,8 +210,14 @@ msgstr "例: Python" msgid "Field {num}." msgstr "フィールド{num}" -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "タイプ再定義" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" msgstr "ラベル" @@ -258,7 +270,18 @@ msgstr "ロード中..." msgid "Data API" msgstr "データAPI" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" より詳しい情報は main CKAN Data API and DataStore " +"documentationを参照してください。

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "テーブル" @@ -968,7 +991,12 @@ msgstr "%s はすでに削除されています" msgid "User %r not authorized to edit members of %s" msgstr "ユーザ %r は %s の編集メンバではありません" -#: ckan/controllers/group.py:705 +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "グループ %s のメンバーの作成は許可されていません" + +#: ckan/controllers/group.py:712 #, python-format msgid "Unauthorized to add member to group %s" msgstr "グループ %s へのメンバーの追加は許可されていません" @@ -1804,7 +1832,11 @@ msgstr "ユーザ名は文字列である必要があります" msgid "That login name is not available." msgstr "このログイン名は使用できません。" -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "そのログイン名には変更できません。" + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" msgstr "パスワードとして同じ文字列を入力してください" @@ -1812,9 +1844,9 @@ msgstr "パスワードとして同じ文字列を入力してください" msgid "Passwords must be strings" msgstr "パスワードは文字列である必要があります" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "パスワードは4文字以上である必要があります" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "パスワードは8文字以上でなければいけません" #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" @@ -1986,8 +2018,12 @@ msgstr "REST API: %s を削除" msgid "REST API: Delete Member: %s" msgstr "REST API: Delete Member: %s" -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" +msgstr "データセットを保有する組織は削除できません。" + +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" msgstr "そのidはデータ内にありません" @@ -2533,6 +2569,93 @@ msgstr "もっとみる" msgid "Hide" msgstr "隠す" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "foo" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "翻訳なし" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "ハロー %(name)s!" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "%(attr)s の翻訳なし" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "bars" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "%(color)s シャツ" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)d アイテム" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)d 翻訳がありません。" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2970,21 +3093,21 @@ msgstr "もし新規ユーザを招待したい場合は、そのメールアド #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "ロール" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "このメンバーを削除してよろしいですか?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3193,6 +3316,10 @@ msgstr "例: 環境" msgid "Search data" msgstr "データ検索" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "データセット検索" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "人気のあるタグ" @@ -3431,9 +3558,9 @@ msgstr "私の組織についての簡単な情報" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." -msgstr "この組織を削除しても良いですか?この操作によってこの組織が持つパブリックとプライベートのデータセット全てが削除されます。" +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." +msgstr "この組織を削除しても良いですか? Note:この組織がパブリックとプライベートのデータセットを持つ間は削除はできません。" #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -3977,7 +4104,11 @@ msgstr "探索" msgid "More information" msgstr "より多くの情報" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "フルスクリーン" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "埋めこみ" @@ -4502,7 +4633,11 @@ msgstr "パスワードのリセット" msgid "Password Reset" msgstr "パスワードのリセット" -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." +msgstr "ユーザー名を変更することもできます。 後で変更することはできません。" + +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" msgstr "パスワードの変更" @@ -4582,3 +4717,7 @@ msgstr "まだフォローされていません" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "ユーザを検索" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "パスワードは8文字以上でなければいけません。" diff --git a/ckan/i18n/km/LC_MESSAGES/ckan.mo b/ckan/i18n/km/LC_MESSAGES/ckan.mo index 7e52ce2ef4a..67245137fcb 100644 Binary files a/ckan/i18n/km/LC_MESSAGES/ckan.mo and b/ckan/i18n/km/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/km/LC_MESSAGES/ckan.po b/ckan/i18n/km/LC_MESSAGES/ckan.po index 2bcebe581b4..f4751a3a6f4 100644 --- a/ckan/i18n/km/LC_MESSAGES/ckan.po +++ b/ckan/i18n/km/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Khmer (https://www.transifex.com/okfn/teams/11162/km/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: km\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "" msgid "Data API" msgstr "" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -2958,21 +2971,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "តួនាទី" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3399,8 +3412,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4537,3 +4550,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/ko_KR/LC_MESSAGES/ckan.mo b/ckan/i18n/ko_KR/LC_MESSAGES/ckan.mo index 6bdc580afd5..56a34634077 100644 Binary files a/ckan/i18n/ko_KR/LC_MESSAGES/ckan.mo and b/ckan/i18n/ko_KR/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/ko_KR/LC_MESSAGES/ckan.po b/ckan/i18n/ko_KR/LC_MESSAGES/ckan.po index c4ff08c1e32..7e77b710ff0 100644 --- a/ckan/i18n/ko_KR/LC_MESSAGES/ckan.po +++ b/ckan/i18n/ko_KR/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Yeongtaek Hong , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Korean (Korea) (https://www.transifex.com/okfn/teams/11162/ko_KR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: ko_KR\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -111,7 +111,13 @@ msgstr "형식은 다음 중 하나여야 합니다. %s" msgid "DataStore resource not found" msgstr "데이터스토어 리소스를 찾을 수 없음" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -256,7 +262,16 @@ msgstr "로딩중…" msgid "Data API" msgstr "데이터 API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"핵심 CKAN 데이터 API와 데이터스토어 문서 참고.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "표" @@ -2969,21 +2984,21 @@ msgstr "신규 사용자를 초대하려면, 이메일 주소를 입력하세요 #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "역할" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "이 멤버의 삭제를 원합니까?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3444,9 +3459,9 @@ msgstr "내 조직에 대한 일부 정보..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." -msgstr "이 기관을 삭제하시겠습니까? 이 기관에 속한 모든 공용 및 비밀 데이터셋을 삭제합니다." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." +msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -4595,3 +4610,7 @@ msgstr "follower 없음" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "사용자 검색하기" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/lt/LC_MESSAGES/ckan.mo b/ckan/i18n/lt/LC_MESSAGES/ckan.mo index b861d667516..9da216eb785 100644 Binary files a/ckan/i18n/lt/LC_MESSAGES/ckan.mo and b/ckan/i18n/lt/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/lt/LC_MESSAGES/ckan.po b/ckan/i18n/lt/LC_MESSAGES/ckan.po index e249a8df3cf..301ef175e4e 100644 --- a/ckan/i18n/lt/LC_MESSAGES/ckan.po +++ b/ckan/i18n/lt/LC_MESSAGES/ckan.po @@ -1,23 +1,23 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Lithuanian (https://www.transifex.com/okfn/teams/11162/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: lt\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" #: ckanext/datapusher/helpers.py:21 msgid "Complete" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "Kraunama..." msgid "Data API" msgstr "Duomenų API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -372,6 +385,7 @@ msgid_plural "{num} Datasets" msgstr[0] "{num} rinkmena" msgstr[1] "{num} rinkmenos" msgstr[2] "{num} rinkmenos" +msgstr[3] "{num} rinkmenos" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -1445,6 +1459,7 @@ msgid_plural "{n} new activities from {site_title}" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:19 msgid "January" @@ -1504,6 +1519,7 @@ msgid_plural "{mins} minutes ago" msgstr[0] "prieš {mins} minutę" msgstr[1] "prieš {mins} minutes" msgstr[2] "prieš {mins} minutes" +msgstr[3] "prieš {mins} minutes" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" @@ -1511,6 +1527,7 @@ msgid_plural "{hours} hours ago" msgstr[0] "prieš {hours} valandą" msgstr[1] "prieš {hours} valandas" msgstr[2] "prieš {hours} valandas" +msgstr[3] "prieš {hours} valandas" #: ckan/lib/formatters.py:125 msgid "{days} day ago" @@ -1518,6 +1535,7 @@ msgid_plural "{days} days ago" msgstr[0] "prieš vieną dieną" msgstr[1] "prieš {days} dienas" msgstr[2] "prieš {days} dienas" +msgstr[3] "prieš {days} dienas" #: ckan/lib/formatters.py:128 msgid "{months} month ago" @@ -1525,6 +1543,7 @@ msgid_plural "{months} months ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" @@ -1532,6 +1551,7 @@ msgid_plural "over {years} years ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1627,6 +1647,7 @@ msgid_plural "{number} views" msgstr[0] "{number} peržiūra" msgstr[1] "{number} peržiūrų" msgstr[2] "{number} peržiūrų" +msgstr[3] "{number} peržiūrų" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" @@ -1634,6 +1655,7 @@ msgid_plural "{number} recent views" msgstr[0] "{number} pastaroji peržiūra" msgstr[1] "{number} pastarųjų peržiūrų" msgstr[2] "{number} pastarūjų peržiūrų" +msgstr[3] "{number} pastarūjų peržiūrų" #: ckan/lib/mailer.py:39 #, python-format @@ -2408,6 +2430,7 @@ msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2558,6 +2581,111 @@ msgstr "Rodyti daugiau" msgid "Hide" msgstr "Paslėpti" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2598,6 +2726,7 @@ msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "Valdymo pultas (%(num)d naujas įrašas)" msgstr[1] "Valdymo pultas (%(num)d naujų įrašų)" msgstr[2] "Valdymo pultas (%(num)d naujų įrašų)" +msgstr[3] "Valdymo pultas (%(num)d naujų įrašų)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -2986,21 +3115,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Vaidmuo" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Ar tikrai norite ištrinti šį narį?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3393,6 +3522,7 @@ msgid_plural "{count} members" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3455,8 +3585,8 @@ msgstr "Truputis informacijos apie mano organizaciją..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4218,6 +4348,7 @@ msgid_plural "{number} datasets found for \"{query}\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4229,6 +4360,7 @@ msgid_plural "{number} datasets found" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4240,6 +4372,7 @@ msgid_plural "{number} groups found for \"{query}\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4251,6 +4384,7 @@ msgid_plural "{number} groups found" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4262,6 +4396,7 @@ msgid_plural "{number} organizations found for \"{query}\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4273,6 +4408,7 @@ msgid_plural "{number} organizations found" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4610,3 +4746,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Ieškoti naudotojų" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/lv/LC_MESSAGES/ckan.mo b/ckan/i18n/lv/LC_MESSAGES/ckan.mo index 0716c0d3678..40b724e1da0 100644 Binary files a/ckan/i18n/lv/LC_MESSAGES/ckan.mo and b/ckan/i18n/lv/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/lv/LC_MESSAGES/ckan.po b/ckan/i18n/lv/LC_MESSAGES/ckan.po index 342e64f12c2..d31686d2298 100644 --- a/ckan/i18n/lv/LC_MESSAGES/ckan.po +++ b/ckan/i18n/lv/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Latvian (https://www.transifex.com/okfn/teams/11162/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: lv\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Datu glabātuves resurss nav atrasts" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -261,7 +267,18 @@ msgstr "Notiek ielāde..." msgid "Data API" msgstr "Datu API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Sīkāka informācija galvenā CKAN datu API un DataStore dokumentācija ." + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabula" @@ -3015,21 +3032,21 @@ msgstr "Ja vēlaties uzaicināt jaunu lietotāju, ievadiet tā epasta adresi." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Loma" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Vai tiešām vēlaties dzēst šo biedru?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3500,8 +3517,8 @@ msgstr "Nedaudz informācijas par manu organizāciju ..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Vai tiešām vēlaties dzēst šo organizāciju? Tas izdzēsīs visas publiskās un " "privātās datu kopas, kas pieder šai organizācijai." @@ -4686,3 +4703,7 @@ msgstr "Nav sekotāju" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Meklēt lietotājus" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/mk/LC_MESSAGES/ckan.mo b/ckan/i18n/mk/LC_MESSAGES/ckan.mo index 03004c3a294..36787a335f4 100644 Binary files a/ckan/i18n/mk/LC_MESSAGES/ckan.mo and b/ckan/i18n/mk/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/mk/LC_MESSAGES/ckan.po b/ckan/i18n/mk/LC_MESSAGES/ckan.po index 4cbb101ee82..b5cfbbd6114 100644 --- a/ckan/i18n/mk/LC_MESSAGES/ckan.po +++ b/ckan/i18n/mk/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Zoran Pandovski , 2017\n" +"Last-Translator: Konstantin Sivakov , 2018\n" "Language-Team: Macedonian (https://www.transifex.com/okfn/teams/11162/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: mk\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" @@ -29,7 +29,7 @@ msgstr "Во тек" #: ckanext/datapusher/helpers.py:23 msgid "Submitting" -msgstr "" +msgstr "Се испраќа" #: ckan/controllers/package.py:659 ckanext/datapusher/helpers.py:24 msgid "Error" @@ -37,7 +37,7 @@ msgstr "Грешка" #: ckanext/datapusher/helpers.py:29 msgid "Not Uploaded Yet" -msgstr "" +msgstr "Сè уште не е прикачено" #: ckan/controllers/package.py:591 ckan/controllers/package.py:1054 #: ckan/controllers/package.py:1074 ckan/controllers/package.py:1141 @@ -55,15 +55,15 @@ msgstr "Ресурсот не е пронајден" #: ckan/controllers/user.py:85 ckan/controllers/user.py:116 #: ckan/controllers/user.py:594 ckanext/datapusher/plugin.py:68 msgid "Not authorized to see this page" -msgstr "" +msgstr "Не сте овластени да пристапите на оваа страна" #: ckanext/datapusher/templates/datapusher/resource_data.html:12 msgid "Upload to DataStore" -msgstr "" +msgstr "Прикачи во податочно складиште" #: ckanext/datapusher/templates/datapusher/resource_data.html:19 msgid "Upload error:" -msgstr "" +msgstr "Грешка при прикачување:" #: ckanext/datapusher/templates/datapusher/resource_data.html:25 #: ckanext/datapusher/templates/datapusher/resource_data.html:27 @@ -72,7 +72,7 @@ msgstr "Грешка:" #: ckanext/datapusher/templates/datapusher/resource_data.html:36 msgid "Error traceback:" -msgstr "" +msgstr "Трага на грешка:" #: ckanext/datapusher/templates/datapusher/resource_data.html:48 msgid "Status" @@ -80,60 +80,71 @@ msgstr "Статус" #: ckanext/datapusher/templates/datapusher/resource_data.html:52 msgid "Last updated" -msgstr "" +msgstr "Последно ажуриран" #: ckanext/datapusher/templates/datapusher/resource_data.html:56 msgid "Never" -msgstr "" +msgstr "Никогаш" #: ckanext/datapusher/templates/datapusher/resource_data.html:62 msgid "Upload Log" -msgstr "" +msgstr "Дневник на прикачување" #: ckanext/datapusher/templates/datapusher/resource_data.html:76 msgid "Details" -msgstr "" +msgstr "Детали" #: ckanext/datapusher/templates/datapusher/resource_data.html:83 msgid "End of log" -msgstr "" +msgstr "Крај на дневник" #: ckanext/datapusher/templates/package/resource_edit_base.html:5 msgid "DataStore" -msgstr "" +msgstr "Податочно складиште" #: ckanext/datastore/controller.py:46 #, python-format msgid "format: must be one of %s" -msgstr "" +msgstr "формат: мора да биде еден од %s" #: ckanext/datastore/controller.py:58 msgid "DataStore resource not found" -msgstr "" +msgstr "Ресурсот не е пронајден во податочното складиште" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Зачуван е Речникот на податоци. Секоја промена на типот на податок ќе се " +"рефлектира кога ресурсот е повторно прикачен во податочното складиште." + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" +"Податоците не се валидни (на пример: бројна вредност е надвор од опсегот или" +" била внесена во поле за текст)." -#: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 -#: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 -#: ckanext/datastore/logic/action.py:534 ckanext/datastore/logic/action.py:559 +#: ckanext/datastore/logic/action.py:258 ckanext/datastore/logic/action.py:286 +#: ckanext/datastore/logic/action.py:344 ckanext/datastore/logic/action.py:457 msgid "Resource \"{0}\" was not found." -msgstr "" +msgstr "Ресурсот \"{0}\" не е пронајден." #: ckanext/datastore/logic/auth.py:19 msgid "User {0} not authorized to update resource {1}" -msgstr "" +msgstr "Корисникот {0} не е овластен да го ажурира ресурсот {1}" #: ckanext/datastore/templates/ajax_snippets/api_info.html:19 msgid "CKAN Data API" -msgstr "" +msgstr "CKAN API за податоци" #: ckanext/datastore/templates/ajax_snippets/api_info.html:23 msgid "Access resource data via a web API with powerful query support" msgstr "" +"Пристапете до податоците во ресурс преку веб API со моќна поддршка за " +"кверирање" #: ckanext/datastore/templates/ajax_snippets/api_info.html:24 msgid "" @@ -141,48 +152,54 @@ msgid "" "href=\"http://docs.ckan.org/en/latest/maintaining/datastore.html\" " "target=\"_blank\">main CKAN Data API and DataStore documentation.

" msgstr "" +"Дополнителни информации во главната документација на CKAN API за податоци и " +"податочното складиште.

" #: ckanext/datastore/templates/ajax_snippets/api_info.html:33 msgid "Endpoints" -msgstr "" +msgstr "Крајни точки" #: ckanext/datastore/templates/ajax_snippets/api_info.html:37 msgid "" "The Data API can be accessed via the following actions of the CKAN action " "API." msgstr "" +"До API-то за податоци може да се пристапи преку следните акции на CKAN API-" +"то за акции." #: ckanext/datastore/templates/ajax_snippets/api_info.html:42 msgid "Create" -msgstr "Креирај" +msgstr "Креирајте" #: ckanext/datastore/templates/ajax_snippets/api_info.html:46 msgid "Update / Insert" -msgstr "" +msgstr "Ажурирајте / Внесете" #: ckanext/datastore/templates/ajax_snippets/api_info.html:50 msgid "Query" -msgstr "" +msgstr "Квери" #: ckanext/datastore/templates/ajax_snippets/api_info.html:54 msgid "Query (via SQL)" -msgstr "" +msgstr "Квери (преку SQL)" #: ckanext/datastore/templates/ajax_snippets/api_info.html:66 msgid "Querying" -msgstr "" +msgstr "Кверирање" #: ckanext/datastore/templates/ajax_snippets/api_info.html:70 msgid "Query example (first 5 results)" -msgstr "" +msgstr "Пример за квери (првите 5 резултати)" #: ckanext/datastore/templates/ajax_snippets/api_info.html:75 msgid "Query example (results containing 'jones')" -msgstr "" +msgstr "Пример за квери (резултати кои содржат 'јован')" #: ckanext/datastore/templates/ajax_snippets/api_info.html:80 msgid "Query example (via SQL statement)" -msgstr "" +msgstr "Пример за квери (преку SQL израз)" #: ckanext/datastore/templates/ajax_snippets/api_info.html:91 msgid "Example: Javascript" @@ -191,20 +208,34 @@ msgstr "Пример: Javascript" #: ckanext/datastore/templates/ajax_snippets/api_info.html:95 msgid "A simple ajax (JSONP) request to the data API using jQuery." msgstr "" +"Едноставно AJAX (JSONP) барање до API-то за податоци користејќи jQuery." #: ckanext/datastore/templates/ajax_snippets/api_info.html:116 msgid "Example: Python" msgstr "Пример: Python" -#: ckanext/datastore/templates/datastore/dictionary.html:16 +#: ckan/templates/group/member_new.html:60 +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:26 +#: ckanext/datastore/templates/datastore/dictionary.html:20 +msgid "Save" +msgstr "Зачувајте" + +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:16 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:3 msgid "Field {num}." -msgstr "" +msgstr "Поле {num}." + +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Променете тип" -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" -msgstr "" +msgstr "Ознака" #: ckan/templates/group/snippets/group_form.html:20 #: ckan/templates/organization/snippets/organization_form.html:20 @@ -224,7 +255,7 @@ msgstr "Зачувај" #: ckanext/datastore/templates/package/resource_edit_base.html:6 #: ckanext/datastore/templates/package/resource_read.html:14 msgid "Data Dictionary" -msgstr "" +msgstr "Речник на податоци" #: ckanext/datastore/templates/package/resource_read.html:18 #: ckanext/datatablesview/templates/datatables/datatables_form.html:17 @@ -248,35 +279,46 @@ msgstr "Тип" #: ckanext/reclineview/theme/templates/recline_view.html:14 #: ckanext/textview/theme/templates/text_view.html:9 msgid "Loading..." -msgstr "Се вчитува" +msgstr "Се вчитува..." #: ckanext/datastore/templates/package/snippets/data_api_button.html:10 msgid "Data API" +msgstr "API за податоци" + +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" msgstr "" +"Дополнителни информации во главната документација на CKAN API за податоци и Складиште" +" на податоци .

" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Табела" #: ckanext/datatablesview/templates/datatables/datatables_form.html:6 msgid "Responsive display" -msgstr "" +msgstr "Прилагодлив екран" #: ckanext/datatablesview/templates/datatables/datatables_form.html:12 msgid "Show Columns" -msgstr "Прикажи колони" +msgstr "Прикажете колони" #: ckanext/datatablesview/templates/datatables/datatables_view.html:28 msgid "Hide/Unhide Columns" -msgstr "Сокриј/Прикажи Колони" +msgstr "Сокријте/Прикажете Колони" #: ckanext/example_iconfigurer/templates/admin/config.html:11 msgid "Datasets per page" -msgstr "" +msgstr "Податочни сетови по страна" #: ckanext/example_iconfigurer/templates/admin/config.html:13 msgid "Test conf" -msgstr "" +msgstr "Тест конфигурација" #: ckan/templates/group/read.html:15 ckan/templates/organization/read.html:19 #: ckan/templates/package/search.html:29 @@ -295,7 +337,7 @@ msgstr "Релевантност" #: ckan/templates/snippets/sort_by.html:15 #: ckanext/example_idatasetform/templates/package/search.html:13 msgid "Name Ascending" -msgstr "" +msgstr "Име Растечки" #: ckan/templates/group/index.html:20 ckan/templates/group/read.html:17 #: ckan/templates/organization/bulk_process.html:98 @@ -307,7 +349,7 @@ msgstr "" #: ckan/templates/snippets/sort_by.html:16 #: ckanext/example_idatasetform/templates/package/search.html:14 msgid "Name Descending" -msgstr "" +msgstr "Име Опаѓачки" #: ckan/templates/group/read.html:18 #: ckan/templates/organization/bulk_process.html:99 @@ -321,11 +363,11 @@ msgstr "Последно променет" #: ckanext/example_idatasetform/templates/package/search.html:16 msgid "Custom Field Ascending" -msgstr "" +msgstr "Приспособливо поле Растечки" #: ckanext/example_idatasetform/templates/package/search.html:17 msgid "Custom Field Descending" -msgstr "" +msgstr "Приспособливо поле Опаѓачки" #: ckan/templates/group/read.html:19 ckan/templates/organization/read.html:23 #: ckan/templates/package/search.html:33 @@ -340,28 +382,28 @@ msgstr "Популарни" #: ckanext/example_idatasetform/templates/package/snippets/package_basic_fields.html:4 #: ckanext/example_idatasetform/templates/package/snippets/resource_form.html:6 msgid "Custom Text" -msgstr "" +msgstr "Прилагоден текст" #: ckanext/example_idatasetform/templates/package/snippets/package_basic_fields.html:4 msgid "custom text" -msgstr "" +msgstr "прилагоден текст" #: ckanext/example_idatasetform/templates/package/snippets/package_metadata_fields.html:11 msgid "Country Code" -msgstr "" +msgstr "Код на држава" #: ckanext/example_idatasetform/templates/package/snippets/resource_form.html:6 msgid "custom resource text" -msgstr "" +msgstr "прилагоден текст за ресурс" #: ckanext/example_itranslation/templates/home/index.html:4 msgid "This is an untranslated string" -msgstr "" +msgstr "Овој текст не е преведен" #: ckanext/example_theme_docs/v10_custom_snippet/templates/snippets/example_theme_most_popular_groups.html:20 #: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:19 msgid "This group has no description" -msgstr "" +msgstr "Оваа група нема опис" #: ckan/templates/group/snippets/group_item.html:32 #: ckan/templates/organization/snippets/organization_item.html:31 @@ -369,19 +411,19 @@ msgstr "" #: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:22 msgid "{num} Dataset" msgid_plural "{num} Datasets" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{num} податочен сет" +msgstr[1] "{num} податочни сетови" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 #: ckanext/example_theme_docs/v10_custom_snippet/templates/snippets/example_theme_most_popular_groups.html:25 #: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:24 msgid "0 Datasets" -msgstr "" +msgstr "0 податочни сетови" #: ckanext/example_theme_docs/v12_extra_public_dir/templates/home/snippets/promoted.html:4 msgid "CKAN's data previewing tool has many powerful features" -msgstr "" +msgstr "Алатката за приказ на податоци во CKAN има многу моќни одлики" #: ckan/templates/group/followers.html:3 ckan/templates/group/followers.html:6 #: ckan/templates/group/snippets/info.html:32 @@ -415,20 +457,22 @@ msgstr "Слика" #: ckanext/imageview/theme/templates/image_form.html:3 msgid "Image url" -msgstr "" +msgstr "Линк до слика" #: ckanext/imageview/theme/templates/image_form.html:3 msgid "eg. http://example.com/image.jpg (if blank uses resource url)" msgstr "" +"пр. https://sajt.com/slika.jpg (доколку е празно се користи линк до " +"ресурсот)" #: ckanext/reclineview/plugin.py:101 msgid "Data Explorer" -msgstr "" +msgstr "Прегледувач на податоци" #: ckanext/reclineview/plugin.py:171 #: ckanext/reclineview/theme/public/recline_view.js:200 msgid "Graph" -msgstr "" +msgstr "График" #: ckanext/reclineview/plugin.py:231 #: ckanext/reclineview/theme/public/recline_view.js:207 @@ -437,23 +481,23 @@ msgstr "Мапа" #: ckanext/reclineview/theme/public/recline_view.js:28 msgid "error loading view" -msgstr "" +msgstr "грешка при вчитување на приказ" #: ckanext/reclineview/theme/public/recline_view.js:75 msgid "Could not load view" -msgstr "" +msgstr "Не може да се вчита приказ" #: ckanext/reclineview/theme/public/recline_view.js:77 msgid "DataStore returned an error" -msgstr "" +msgstr "Податочното складиште врати грешка" #: ckanext/reclineview/theme/public/recline_view.js:79 msgid "DataProxy returned an error" -msgstr "" +msgstr "Податочното прокси врати грешка" #: ckanext/reclineview/theme/public/recline_view.js:193 msgid "Grid" -msgstr "" +msgstr "Мрежа" #: ckan/templates/package/snippets/view_form_filters.html:46 #: ckanext/reclineview/theme/public/recline_view.js:215 @@ -463,12 +507,12 @@ msgstr "Филтри" #: ckanext/reclineview/theme/templates/recline_graph_form.html:3 #: ckanext/reclineview/theme/templates/recline_map_form.html:3 msgid "Row offset" -msgstr "" +msgstr "Растојание меѓу редови" #: ckanext/reclineview/theme/templates/recline_graph_form.html:3 #: ckanext/reclineview/theme/templates/recline_map_form.html:3 msgid "eg: 0" -msgstr "пример: 0" +msgstr "пр: 0" #: ckanext/reclineview/theme/templates/recline_graph_form.html:4 #: ckanext/reclineview/theme/templates/recline_map_form.html:4 @@ -478,110 +522,110 @@ msgstr "Број на редови" #: ckanext/reclineview/theme/templates/recline_graph_form.html:4 #: ckanext/reclineview/theme/templates/recline_map_form.html:4 msgid "eg: 100" -msgstr "пример: 100" +msgstr "пр: 100" #: ckanext/reclineview/theme/templates/recline_graph_form.html:6 msgid "Graph type" -msgstr "" +msgstr "Вид на график" #: ckanext/reclineview/theme/templates/recline_graph_form.html:7 msgid "Group (Axis 1)" -msgstr "" +msgstr "Група (Оска 1)" #: ckanext/reclineview/theme/templates/recline_graph_form.html:8 msgid "Series (Axis 2)" -msgstr "" +msgstr "Серија (Оска 2)" #: ckanext/reclineview/theme/templates/recline_map_form.html:6 msgid "Field type" -msgstr "" +msgstr "Тип на поле" #: ckanext/reclineview/theme/templates/recline_map_form.html:7 msgid "Latitude field" -msgstr "Географска ширина" +msgstr "Поле за географска ширина" #: ckanext/reclineview/theme/templates/recline_map_form.html:8 msgid "Longitude field" -msgstr "Географска должина" +msgstr "Поле за географска должина" #: ckanext/reclineview/theme/templates/recline_map_form.html:9 msgid "GeoJSON field" -msgstr "" +msgstr "Поле за GeoJSON" #: ckanext/reclineview/theme/templates/recline_map_form.html:10 msgid "Auto zoom to features" -msgstr "" +msgstr "Автоматски зумирате до одлики" #: ckanext/reclineview/theme/templates/recline_map_form.html:11 msgid "Cluster markers" -msgstr "" +msgstr "Маркери за кластер" #: ckanext/stats/templates/ckanext/stats/index.html:10 msgid "Total number of Datasets" -msgstr "Вкупно датасети" +msgstr "Вкупен број на податочни сетови" #: ckanext/stats/templates/ckanext/stats/index.html:17 #: ckanext/stats/templates/ckanext/stats/index.html:40 msgid "Date" -msgstr "Дата" +msgstr "Датум" #: ckanext/stats/templates/ckanext/stats/index.html:18 msgid "Total datasets" -msgstr "" +msgstr "Вкупен број на податочни сетови" #: ckanext/stats/templates/ckanext/stats/index.html:33 #: ckanext/stats/templates/ckanext/stats/index.html:179 msgid "Dataset Revisions per Week" -msgstr "" +msgstr "Ревизии на податочен сет по Недела" #: ckanext/stats/templates/ckanext/stats/index.html:41 msgid "All dataset revisions" -msgstr "" +msgstr "Сите ревизии за податочен сет" #: ckanext/stats/templates/ckanext/stats/index.html:42 msgid "New datasets" -msgstr "Нов датасет" +msgstr "Нови податочни сетови" #: ckanext/stats/templates/ckanext/stats/index.html:58 #: ckanext/stats/templates/ckanext/stats/index.html:180 msgid "Top Rated Datasets" -msgstr "" +msgstr "Топ оценети податочни сетови" #: ckanext/stats/templates/ckanext/stats/index.html:64 msgid "Average rating" -msgstr "Просечна оценка" +msgstr "Просечна оцена" #: ckanext/stats/templates/ckanext/stats/index.html:65 msgid "Number of ratings" -msgstr "Број на оценки" +msgstr "Број на оцени" #: ckanext/stats/templates/ckanext/stats/index.html:79 msgid "No ratings" -msgstr "" +msgstr "Нема оцени" #: ckanext/stats/templates/ckanext/stats/index.html:84 #: ckanext/stats/templates/ckanext/stats/index.html:181 msgid "Most Edited Datasets" -msgstr "" +msgstr "Најмногу променети податочни сетови" #: ckan/logic/converters.py:146 ckan/logic/validators.py:149 #: ckan/logic/validators.py:191 ckan/templates/package/read_base.html:19 #: ckanext/stats/templates/ckanext/stats/index.html:89 msgid "Dataset" -msgstr "" +msgstr "Податочен сет" #: ckanext/stats/templates/ckanext/stats/index.html:90 msgid "Number of edits" -msgstr "" +msgstr "Број на промени" #: ckanext/stats/templates/ckanext/stats/index.html:103 msgid "No edited datasets" -msgstr "" +msgstr "Податочни сетови без промени" #: ckanext/stats/templates/ckanext/stats/index.html:108 #: ckanext/stats/templates/ckanext/stats/index.html:182 msgid "Largest Groups" -msgstr "" +msgstr "Најголеми групи" #: ckan/logic/converters.py:171 ckan/logic/validators.py:244 #: ckanext/stats/templates/ckanext/stats/index.html:113 @@ -590,30 +634,30 @@ msgstr "Група" #: ckanext/stats/templates/ckanext/stats/index.html:114 msgid "Number of datasets" -msgstr "" +msgstr "Број на податочни сетови" #: ckanext/stats/templates/ckanext/stats/index.html:127 msgid "No groups" -msgstr "" +msgstr "Нема групи" #: ckanext/stats/templates/ckanext/stats/index.html:132 #: ckanext/stats/templates/ckanext/stats/index.html:183 msgid "Top Tags" -msgstr "" +msgstr "Топ тагови" #: ckanext/stats/templates/ckanext/stats/index.html:136 msgid "Tag Name" -msgstr "" +msgstr "Име на таг" #: ckanext/stats/templates/ckanext/stats/index.html:137 #: ckanext/stats/templates/ckanext/stats/index.html:157 msgid "Number of Datasets" -msgstr "Број на датасети" +msgstr "Број на податочни сетови" #: ckanext/stats/templates/ckanext/stats/index.html:152 #: ckanext/stats/templates/ckanext/stats/index.html:184 msgid "Users Creating Most Datasets" -msgstr "" +msgstr "Корисници кои креираат најмногу податочни сетови" #: ckan/logic/converters.py:121 ckan/logic/validators.py:214 #: ckan/logic/validators.py:231 ckan/logic/validators.py:706 @@ -625,15 +669,15 @@ msgstr "Корисник" #: ckanext/stats/templates/ckanext/stats/index.html:175 msgid "Statistics Menu" -msgstr "" +msgstr "Мени за статистика" #: ckanext/stats/templates/ckanext/stats/index.html:178 msgid "Total Number of Datasets" -msgstr "" +msgstr "Вкупен број на податочни сетови" #: ckanext/textview/plugin.py:67 ckanext/textview/plugin.py:69 msgid "Text" -msgstr "" +msgstr "Текст" #: ckanext/webpageview/plugin.py:21 ckanext/webpageview/plugin.py:26 msgid "Website" @@ -641,22 +685,23 @@ msgstr "Веб страна" #: ckanext/webpageview/theme/templates/webpage_form.html:3 msgid "Web Page url" -msgstr "" +msgstr "Линк до веб страна" #: ckanext/webpageview/theme/templates/webpage_form.html:3 msgid "eg. http://example.com (if blank uses resource url)" msgstr "" +"пр. https://sajt.com (доколку остани празно се користи линк до ресурсот)" #: ckan/templates/dataviewer/snippets/data_preview.html:23 #: ckan/templates/package/snippets/resource_view.html:56 #: ckanext/webpageview/theme/templates/webpage_view.html:2 msgid "Your browser does not support iframes." -msgstr "Вашиот прелистувач не поддржува iframes" +msgstr "Вашиот прелистувач не поддржува iframes." #: ckan/authz.py:182 #, python-format msgid "Authorization function not found: %s" -msgstr "" +msgstr "Не е пронајдена функција за авторизација: %s" #: ckan/authz.py:194 ckan/templates/header.html:14 msgid "Admin" @@ -664,7 +709,7 @@ msgstr "Администратор" #: ckan/authz.py:198 msgid "Editor" -msgstr "Едитор" +msgstr "Уредувач" #: ckan/authz.py:202 msgid "Member" @@ -672,23 +717,23 @@ msgstr "Член" #: ckan/controllers/admin.py:34 msgid "Need to be system administrator to administer" -msgstr "" +msgstr "Потребно е да бидете систем администратор за да администрирате." #: ckan/controllers/admin.py:50 msgid "Site Title" -msgstr "" +msgstr "Наслов на сајтот" #: ckan/controllers/admin.py:51 msgid "Style" -msgstr "" +msgstr "Стил" #: ckan/controllers/admin.py:52 msgid "Site Tag Line" -msgstr "" +msgstr "Таг линија на сајтот" #: ckan/controllers/admin.py:53 msgid "Site Tag Logo" -msgstr "" +msgstr "Таг лого на сајтот" #: ckan/controllers/admin.py:55 ckan/templates/group/about.html:3 #: ckan/templates/group/read_base.html:19 ckan/templates/header.html:106 @@ -697,15 +742,15 @@ msgstr "" #: ckan/templates/organization/read_base.html:19 #: ckan/templates/user/edit_user_form.html:14 msgid "About" -msgstr "" +msgstr "За" #: ckan/controllers/admin.py:55 msgid "About page text" -msgstr "" +msgstr "За страницата текст" #: ckan/controllers/admin.py:56 msgid "Intro Text" -msgstr "" +msgstr "Интро текст" #: ckan/controllers/admin.py:56 msgid "Text on home page" @@ -713,11 +758,11 @@ msgstr "Текст на насловна страна" #: ckan/controllers/admin.py:57 msgid "Custom CSS" -msgstr "" +msgstr "Приспособлив CSS" #: ckan/controllers/admin.py:57 msgid "Customisable css inserted into the page header" -msgstr "" +msgstr "Приспособлив CSS вметнат во хедерот на страната" #: ckan/controllers/admin.py:58 msgid "Homepage" @@ -729,19 +774,21 @@ msgid "" "Cannot purge package %s as associated revision %s includes non-deleted " "packages %s" msgstr "" +"Не може да се исчисти податочниот сет %s затоа што поврзаната ревизија %s " +"вклучува податочни сетови кои не се избришани %s" #: ckan/controllers/admin.py:183 #, python-format msgid "Problem purging revision %s: %s" -msgstr "" +msgstr "Грешка при чистење на ревизија %s: %s" #: ckan/controllers/admin.py:185 msgid "Purge complete" -msgstr "" +msgstr "Чистењето е завршено" #: ckan/controllers/admin.py:187 msgid "Action not implemented." -msgstr "" +msgstr "Акцијата не е имплементирана." #: ckan/controllers/api.py:124 ckan/controllers/api.py:221 msgid "Access denied" @@ -756,27 +803,27 @@ msgstr "Пристапот е одбиен" #: ckan/logic/validators.py:244 ckan/logic/validators.py:268 #: ckan/logic/validators.py:706 msgid "Not found" -msgstr "Не е пронајден" +msgstr "Не е пронајдено" #: ckan/controllers/api.py:136 msgid "Bad request" -msgstr "" +msgstr "Лошо барање" #: ckan/controllers/api.py:170 #, python-format msgid "Action name not known: %s" -msgstr "" +msgstr "Името на акцијата не е познато: %s" #: ckan/controllers/api.py:191 ckan/controllers/api.py:362 #: ckan/controllers/api.py:425 #, python-format msgid "JSON Error: %s" -msgstr "" +msgstr "JSON грешка: %s" #: ckan/controllers/api.py:197 #, python-format msgid "Bad request data: %s" -msgstr "" +msgstr "Погрешни податоци во барање: %s" #: ckan/controllers/api.py:300 #, python-format @@ -813,40 +860,43 @@ msgstr "" #: ckan/controllers/api.py:500 msgid "No revision specified" -msgstr "" +msgstr "Нема ревизија назначено" #: ckan/controllers/api.py:504 #, python-format msgid "There is no revision with id: %s" -msgstr "" +msgstr "Нема ревизија со ИД: %s" #: ckan/controllers/api.py:514 msgid "Missing search term ('since_id=UUID' or 'since_time=TIMESTAMP')" msgstr "" +"Недостасува термин за пребарување ('since_id=UUID' или " +"'since_time=TIMESTAMP')" #: ckan/controllers/api.py:526 #, python-format msgid "Could not read parameters: %r" -msgstr "" +msgstr "Не може да се прочитаат параметри: %r" #: ckan/controllers/api.py:587 #, python-format msgid "Bad search option: %s" -msgstr "" +msgstr "Лоша опција за пребарување: %s" #: ckan/controllers/api.py:590 #, python-format msgid "Unknown register: %s" -msgstr "" +msgstr "Непозната регистрација: %s" #: ckan/controllers/api.py:599 #, python-format msgid "Malformed qjson value: %r" -msgstr "" +msgstr "Погрешна вредност на qjson: %r" #: ckan/controllers/api.py:609 msgid "Request params must be in form of a json encoded dictionary." msgstr "" +"Параметрите за барањето мора да бидат во форма на json енкодиран речник." #: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 #: ckan/controllers/group.py:225 ckan/controllers/group.py:393 @@ -879,7 +929,7 @@ msgstr "Погрешен тип на група" #: ckan/templates/organization/read_base.html:6 #: ckan/templates/package/base.html:14 msgid "Organizations" -msgstr "" +msgstr "Организации" #: ckan/controllers/group.py:306 ckan/controllers/home.py:62 #: ckan/controllers/package.py:241 ckan/lib/helpers.py:834 @@ -903,89 +953,94 @@ msgstr "" #: ckan/templates/tag/index.html:3 ckan/templates/tag/index.html:6 #: ckan/templates/tag/index.html:12 msgid "Tags" -msgstr "" +msgstr "Тагови" #: ckan/controllers/group.py:308 ckan/controllers/home.py:64 #: ckan/controllers/package.py:243 ckan/lib/helpers.py:836 msgid "Formats" -msgstr "" +msgstr "Формати" #: ckan/controllers/group.py:309 ckan/controllers/home.py:65 #: ckan/controllers/package.py:244 ckan/lib/helpers.py:837 msgid "Licenses" -msgstr "" +msgstr "Лиценци" #: ckan/controllers/group.py:395 ckan/controllers/group.py:512 #: ckan/controllers/package.py:326 ckan/controllers/package.py:767 #: ckan/controllers/package.py:1387 ckan/controllers/package.py:1421 #, python-format msgid "User %r not authorized to edit %s" -msgstr "" +msgstr "Корисникот %r не е овластен да го променува %s" #: ckan/controllers/group.py:442 msgid "Not authorized to perform bulk update" -msgstr "" +msgstr "Не сте овластени да извршите масовно ажурирање" #: ckan/controllers/group.py:460 msgid "Unauthorized to create a group" -msgstr "" +msgstr "Не сте овластени за да креирате група" #: ckan/controllers/group.py:538 ckan/controllers/group.py:568 #: ckan/controllers/package.py:922 ckan/controllers/package.py:970 #: ckan/controllers/user.py:249 ckan/controllers/user.py:379 #: ckan/controllers/user.py:548 msgid "Integrity Error" -msgstr "" +msgstr "Грешка при интегритет" #: ckan/controllers/group.py:594 #, python-format msgid "User %r not authorized to edit %s authorizations" -msgstr "" +msgstr "Корисникот %r не е овластен да ги променува %s овластувањата" #: ckan/controllers/group.py:614 ckan/controllers/group.py:629 #, python-format msgid "Unauthorized to delete group %s" -msgstr "" +msgstr "Не сте овластени да ја избришете групата %s" #: ckan/controllers/group.py:620 msgid "Organization has been deleted." -msgstr "" +msgstr "Организацијата е избришана." #: ckan/controllers/group.py:622 msgid "Group has been deleted." -msgstr "" +msgstr "Групата е избришана." #: ckan/controllers/group.py:624 #, python-format msgid "%s has been deleted." -msgstr "" +msgstr "%s е избришана." #: ckan/controllers/group.py:653 #, python-format msgid "User %r not authorized to edit members of %s" -msgstr "" +msgstr "Корисникот %r не е овластен да прави промени во членовите на %s" + +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "Не сте овластени за да креирате %s членови во групата." -#: ckan/controllers/group.py:705 +#: ckan/controllers/group.py:712 #, python-format msgid "Unauthorized to add member to group %s" -msgstr "" +msgstr "Не сте овластени за да го додадете членот во групата %s" #: ckan/controllers/group.py:724 ckan/controllers/group.py:737 #, python-format msgid "Unauthorized to delete group %s members" -msgstr "" +msgstr "Не сте овластени за да избришете %s членови во групата." #: ckan/controllers/group.py:731 msgid "Group member has been deleted." -msgstr "" +msgstr "Членот на групата е избришан." #: ckan/controllers/group.py:755 ckan/controllers/package.py:417 msgid "Select two revisions before doing the comparison." -msgstr "" +msgstr "Изберете две ревизии пред да направите споредба." #: ckan/controllers/group.py:779 msgid "CKAN Group Revision History" -msgstr "" +msgstr "Историја на ревизија во CKAN група" #: ckan/controllers/group.py:783 msgid "Recent changes to CKAN Group: " @@ -993,44 +1048,49 @@ msgstr "Последни промени во CKAN група:" #: ckan/controllers/group.py:804 ckan/controllers/package.py:468 msgid "Log message: " -msgstr "" +msgstr "Порака од дневник:" #: ckan/controllers/group.py:854 ckan/controllers/package.py:1171 #: ckan/controllers/user.py:715 msgid "You are now following {0}" -msgstr "" +msgstr "Сега ја/го следите {0}" #: ckan/controllers/group.py:874 ckan/controllers/package.py:1190 #: ckan/controllers/user.py:735 msgid "You are no longer following {0}" -msgstr "" +msgstr "Веќе не ја/го следите {0}" #: ckan/controllers/group.py:894 ckan/controllers/user.py:580 #, python-format msgid "Unauthorized to view followers %s" -msgstr "" +msgstr "Не сте овластени за да ги погледнете следбениците %s" #: ckan/controllers/home.py:35 msgid "This site is currently off-line. Database is not initialised." msgstr "" +"Овај сајт е моментално недостапен. Базата на податоци не е иницијализирана." #: ckan/controllers/home.py:73 #, python-format msgid "Please update your profile and add your email address. " msgstr "" +"Ве молиме ажурирајте го Вашиот профил и додадете ја " +"вашата е-маил адреса." #: ckan/controllers/home.py:75 #, python-format msgid "%s uses your email address if you need to reset your password." msgstr "" +"%s ја користи Вашата е-маил адреса доколку е потребно да ја ресетирате " +"Вашата лозинка." #: ckan/controllers/package.py:288 msgid "Invalid search query: {error_message}" -msgstr "" +msgstr "Невалидно пребарување: {error_message}" #: ckan/controllers/package.py:304 msgid "Parameter \"{parameter_name}\" is not an integer" -msgstr "" +msgstr "Параметарот \"{parameter_name}\" не е цел број" #: ckan/controllers/package.py:324 ckan/controllers/package.py:332 #: ckan/controllers/package.py:370 ckan/controllers/package.py:437 @@ -1042,150 +1102,152 @@ msgstr "" #: ckan/controllers/package.py:1393 ckan/controllers/package.py:1428 #: ckan/controllers/package.py:1535 msgid "Dataset not found" -msgstr "" +msgstr "Податочниот сет не е пронајден" #: ckan/controllers/package.py:358 ckan/controllers/package.py:360 #: ckan/controllers/package.py:362 #, python-format msgid "Invalid revision format: %r" -msgstr "" +msgstr "Невалиден формат за ревизија: %r" #: ckan/controllers/package.py:396 msgid "Viewing datasets of type \"{package_type}\" is not supported ({file_!r})." msgstr "" +"Прегледување на податочни сетови од тип \"{package_type}\" не е поддржано " +"({file_!r})." #: ckan/controllers/package.py:435 ckan/controllers/package.py:817 #: ckan/controllers/package.py:918 ckan/controllers/package.py:966 #: ckan/controllers/package.py:1217 #, python-format msgid "Unauthorized to read package %s" -msgstr "" +msgstr "Не сте овластени за да го погледнете податочниот сет %s" #: ckan/controllers/package.py:444 msgid "CKAN Dataset Revision History" -msgstr "" +msgstr "Историја на ревизија на податочен сет во CKAN" #: ckan/controllers/package.py:447 msgid "Recent changes to CKAN Dataset: " -msgstr "" +msgstr "Скорешни промени во податочен сет во CKAN" #: ckan/controllers/package.py:503 msgid "Unauthorized to create a package" -msgstr "" +msgstr "Не сте овластени за да креирате податочен сет" #: ckan/controllers/package.py:573 msgid "Unauthorized to edit this resource" -msgstr "" +msgstr "Не сте овластени за да правите промени во овој ресурс" #: ckan/controllers/package.py:644 msgid "Unauthorized to update dataset" -msgstr "" +msgstr "Не сте овластени за да го ажурирате податочниот сет" #: ckan/controllers/package.py:646 ckan/controllers/package.py:683 #: ckan/controllers/package.py:709 msgid "The dataset {id} could not be found." -msgstr "" +msgstr "Податочниот сет {id} не може да биде пронајден." #: ckan/controllers/package.py:650 msgid "You must add at least one data resource" -msgstr "" +msgstr "Мора да додадете барем еден ресурс." #: ckan/controllers/package.py:681 msgid "Unauthorized to create a resource" -msgstr "" +msgstr "Не сте овластени за да креирате ресурс" #: ckan/controllers/package.py:714 msgid "Unauthorized to create a resource for this package" -msgstr "" +msgstr "Не сте овластени за да креирате ресурс за овој податочен сет." #: ckan/controllers/package.py:928 msgid "Unable to add package to search index." -msgstr "" +msgstr "Не може да се додаде податочниот сет во индексот за пребарување." #: ckan/controllers/package.py:976 msgid "Unable to update search index." -msgstr "" +msgstr "Не може да се ажурира индексот за пребарување." #: ckan/controllers/package.py:1013 msgid "Dataset has been deleted." -msgstr "" +msgstr "Податочниот сет е избришан." #: ckan/controllers/package.py:1018 ckan/controllers/package.py:1036 #, python-format msgid "Unauthorized to delete package %s" -msgstr "" +msgstr "Не сте овластени за да го избришете податочниот сет %s" #: ckan/controllers/package.py:1041 msgid "Resource has been deleted." -msgstr "" +msgstr "Ресурсот е избришан." #: ckan/controllers/package.py:1052 #, python-format msgid "Unauthorized to delete resource %s" -msgstr "" +msgstr "Не сте овластени за да го избришете ресурсот %s" #: ckan/controllers/package.py:1111 ckan/controllers/package.py:1554 msgid "Resource view not found" -msgstr "" +msgstr "Приказот за ресурсот не е пронајден" #: ckan/controllers/package.py:1150 msgid "Resource data not found" -msgstr "" +msgstr "Податоците за ресурсот не се пронајдени." #: ckan/controllers/package.py:1159 msgid "No download is available" -msgstr "" +msgstr "Не е достапно преземање" #: ckan/controllers/package.py:1296 #, python-format msgid "Unauthorized to read dataset %s" -msgstr "" +msgstr "Не сте овластени за да го прочитате податочниот сет %s" #: ckan/controllers/package.py:1404 #, python-format msgid "Unauthorized to read resource %s" -msgstr "" +msgstr "Не сте овластени за да го погледнете ресурсот%s" #: ckan/controllers/package.py:1468 msgid "Unauthorized to edit resource" -msgstr "" +msgstr "Не сте овластени за да го промените ресурсот" #: ckan/controllers/package.py:1486 msgid "View not found" -msgstr "" +msgstr "Приказот не е пронајден" #: ckan/controllers/package.py:1492 msgid "View Type Not found" -msgstr "" +msgstr "Типот за приказот не е пронајден" #: ckan/controllers/package.py:1548 msgid "Bad resource view data" -msgstr "" +msgstr "Лоши податоци за приказ на ресурс" #: ckan/controllers/package.py:1557 msgid "Resource view not supplied" -msgstr "" +msgstr "Приказот за ресурсот не е обезбеден" #: ckan/controllers/package.py:1586 msgid "No preview has been defined." -msgstr "" +msgstr "Преглед не е дефиниран." #: ckan/controllers/revision.py:44 msgid "CKAN Repository Revision History" -msgstr "" +msgstr "CKAN историја за ревизија на складиште" #: ckan/controllers/revision.py:46 msgid "Recent changes to the CKAN repository." -msgstr "" +msgstr "Скорешни промени во складиштето на CKAN" #: ckan/controllers/revision.py:110 #, python-format msgid "Datasets affected: %s.\n" -msgstr "" +msgstr "Засегнати податочни сетови: %s.\n" #: ckan/controllers/revision.py:190 msgid "Revision updated" -msgstr "" +msgstr "Ревизијата е ажурирана" #: ckan/controllers/tag.py:60 msgid "Other" @@ -1193,49 +1255,49 @@ msgstr "Друго" #: ckan/controllers/tag.py:74 msgid "Tag not found" -msgstr "" +msgstr "Тагот не е пронајден" #: ckan/controllers/user.py:161 msgid "Unauthorized to register as a user." -msgstr "" +msgstr "Не сте овластени за да се регистрирате како корисник." #: ckan/controllers/user.py:179 msgid "Unauthorized to create a user" -msgstr "" +msgstr "Не сте овластени за да креирате корисник" #: ckan/controllers/user.py:210 msgid "Unauthorized to delete user with id \"{user_id}\"." -msgstr "" +msgstr "Не сте овластени за да го избришете корисникот со ИД \"{user_id}\"." #: ckan/controllers/user.py:224 ckan/controllers/user.py:287 msgid "No user specified" -msgstr "" +msgstr "Нема назначено корисник" #: ckan/controllers/user.py:230 ckan/controllers/user.py:312 #: ckan/controllers/user.py:375 ckan/controllers/user.py:544 #, python-format msgid "Unauthorized to edit user %s" -msgstr "" +msgstr "Не сте овластени за да го промените корисникот %s" #: ckan/controllers/user.py:232 ckan/controllers/user.py:247 #: ckan/controllers/user.py:314 ckan/controllers/user.py:377 #: ckan/controllers/user.py:524 ckan/controllers/user.py:546 #: ckan/logic/auth/update.py:179 msgid "User not found" -msgstr "" +msgstr "Корисникот не е пронајден" #: ckan/controllers/user.py:234 ckan/controllers/user.py:367 msgid "Profile updated" -msgstr "" +msgstr "Профилот е ажуриран" #: ckan/controllers/user.py:245 #, python-format msgid "Unauthorized to create user %s" -msgstr "" +msgstr "Не сте овластени за да го креирате корисникот %s" #: ckan/controllers/user.py:251 msgid "Bad Captcha. Please try again." -msgstr "" +msgstr "Captcha не е точна. Ве молиме обидете се повторно." #: ckan/controllers/user.py:265 #, python-format @@ -1243,23 +1305,25 @@ msgid "" "User \"%s\" is now registered but you are still logged in as \"%s\" from " "before" msgstr "" +"Корисникот \"%s\" е сега регистриран, но сè уште сте најавени како \"%s\" " +"од претходно" #: ckan/controllers/user.py:293 msgid "Unauthorized to edit a user." -msgstr "" +msgstr "Не сте овластени за да го промените корисникот." #: ckan/controllers/user.py:320 #, python-format msgid "User %s not authorized to edit %s" -msgstr "" +msgstr "Корисникот \"%s\" не е овластен да прави промени на \"%s\"" #: ckan/controllers/user.py:385 msgid "Password entered was incorrect" -msgstr "" +msgstr "Внесената лозинка е погрешна" #: ckan/controllers/user.py:386 ckan/templates/user/edit_user_form.html:29 msgid "Old Password" -msgstr "" +msgstr "Стара лозинка" #: ckan/controllers/user.py:386 msgid "incorrect password" @@ -1267,175 +1331,175 @@ msgstr "Погрешна лозинка" #: ckan/controllers/user.py:427 msgid "Login failed. Bad username or password." -msgstr "" +msgstr "Најавата е неуспешна. Погрешно корисничко има или лозинка." #: ckan/controllers/user.py:461 msgid "Unauthorized to request reset password." -msgstr "" +msgstr "Не сте овластени да побарате ресетирање на лозинката." #: ckan/controllers/user.py:490 #, python-format msgid "\"%s\" matched several users" -msgstr "" +msgstr "\"%s\" се совпадна со неколку корисници." #: ckan/controllers/user.py:492 ckan/controllers/user.py:494 #, python-format msgid "No such user: %s" -msgstr "" +msgstr "Не постои таков корисник: \"%s\"" #: ckan/controllers/user.py:499 msgid "Please check your inbox for a reset code." -msgstr "" +msgstr "Ве молиме да го проверите вашето сандаче за код за ресетирање." #: ckan/controllers/user.py:503 #, python-format msgid "Could not send reset link: %s" -msgstr "" +msgstr "Не може да се испрати линк за ресетирање: \"%s\"" #: ckan/controllers/user.py:516 msgid "Unauthorized to reset password." -msgstr "" +msgstr "Не сте овластени да ја ресетирате лозинката." #: ckan/controllers/user.py:528 msgid "Invalid reset key. Please try again." -msgstr "" +msgstr "Невалиден клуч за ресетирање. Обидете се повторно." #: ckan/controllers/user.py:541 msgid "Your password has been reset." -msgstr "" +msgstr "Вашата лозинка е ресетирана." #: ckan/controllers/user.py:562 msgid "Your password must be 4 characters or longer." -msgstr "" +msgstr "Вашата лозинка мода да биде 4 карактери или подолга." #: ckan/controllers/user.py:565 msgid "The passwords you entered do not match." -msgstr "" +msgstr "Лозинките што ги внесовте не се совпаѓаат." #: ckan/controllers/user.py:568 msgid "You must provide a password" -msgstr "" +msgstr "Мора да наведете лозинка." #: ckan/controllers/user.py:636 msgid "Follow item not found" -msgstr "" +msgstr "Елемент за следење не е пронајден," #: ckan/controllers/user.py:640 msgid "{0} not found" -msgstr "" +msgstr "{0} не е пронајден." #: ckan/controllers/user.py:654 msgid "Everything" -msgstr "" +msgstr "Сè" #: ckan/controllers/util.py:18 ckan/logic/action/__init__.py:62 msgid "Missing Value" -msgstr "" +msgstr "Недостасува вредност" #: ckan/controllers/util.py:23 msgid "Redirecting to external site is not allowed." -msgstr "" +msgstr "Не е дозволено пренасочување кон надворешен сајт." #: ckan/lib/activity_streams.py:60 msgid "{actor} added the tag {tag} to the dataset {dataset}" -msgstr "" +msgstr "{actor} додаде таг {tag} на податочниот сет {dataset}" #: ckan/lib/activity_streams.py:63 msgid "{actor} updated the group {group}" -msgstr "" +msgstr "{actor} ја ажурираше групата {group}" #: ckan/lib/activity_streams.py:66 msgid "{actor} updated the organization {organization}" -msgstr "" +msgstr "{actor} ја ажурираше организацијата {organization}" #: ckan/lib/activity_streams.py:69 msgid "{actor} updated the dataset {dataset}" -msgstr "" +msgstr "{actor} го ажурираше податочниот сет {dataset}" #: ckan/lib/activity_streams.py:72 msgid "{actor} changed the extra {extra} of the dataset {dataset}" -msgstr "" +msgstr "{actor} го смени додатокот {extra} од податочниот сет {dataset}" #: ckan/lib/activity_streams.py:75 msgid "{actor} updated the resource {resource} in the dataset {dataset}" -msgstr "" +msgstr "{actor} го ажурираше ресурсот {resource} во податочниот сет {dataset}" #: ckan/lib/activity_streams.py:78 msgid "{actor} updated their profile" -msgstr "" +msgstr "{actor} го ажурираше својот профил" #: ckan/lib/activity_streams.py:81 msgid "{actor} deleted the group {group}" -msgstr "" +msgstr "{actor} ја избриша групата {group}" #: ckan/lib/activity_streams.py:84 msgid "{actor} deleted the organization {organization}" -msgstr "" +msgstr "{actor} ја избриша организацијата {organization}" #: ckan/lib/activity_streams.py:87 msgid "{actor} deleted the dataset {dataset}" -msgstr "" +msgstr "{actor} го избриша податочниот сет {dataset}" #: ckan/lib/activity_streams.py:90 msgid "{actor} deleted the extra {extra} from the dataset {dataset}" -msgstr "" +msgstr "{actor} го избриша додатокот {extra} од податочниот сет {dataset}" #: ckan/lib/activity_streams.py:93 msgid "{actor} deleted the resource {resource} from the dataset {dataset}" -msgstr "" +msgstr "{actor} го избриша ресурсот {resource} од податочниот сет {dataset}" #: ckan/lib/activity_streams.py:97 msgid "{actor} created the group {group}" -msgstr "" +msgstr "{actor} ја креираше групата {group}" #: ckan/lib/activity_streams.py:100 msgid "{actor} created the organization {organization}" -msgstr "" +msgstr "{actor} ја креираше организацијата {organization}" #: ckan/lib/activity_streams.py:103 msgid "{actor} created the dataset {dataset}" -msgstr "" +msgstr "{actor} го креираше податочниот сет {dataset}" #: ckan/lib/activity_streams.py:106 msgid "{actor} added the extra {extra} to the dataset {dataset}" -msgstr "" +msgstr "{actor} го додаде додатокот {extra} на податочниот сет {dataset}" #: ckan/lib/activity_streams.py:109 msgid "{actor} added the resource {resource} to the dataset {dataset}" -msgstr "" +msgstr "{actor} aго додаде ресурсот {resource} на податочниот сет {dataset}" #: ckan/lib/activity_streams.py:112 msgid "{actor} signed up" -msgstr "" +msgstr "{actor} се пријави" #: ckan/lib/activity_streams.py:115 msgid "{actor} removed the tag {tag} from the dataset {dataset}" -msgstr "" +msgstr "{actor} го отстрани тагот {tag} од податочниот сет {dataset}" #: ckan/lib/activity_streams.py:118 msgid "{actor} started following {dataset}" -msgstr "" +msgstr "{actor} почна да го следи {dataset}" #: ckan/lib/activity_streams.py:121 msgid "{actor} started following {user}" -msgstr "" +msgstr "{actor} почна да го/ја следи {user}" #: ckan/lib/activity_streams.py:124 msgid "{actor} started following {group}" -msgstr "" +msgstr "{actor} почна да ја следи {group}" #: ckan/lib/datapreview.py:265 ckan/templates/group/edit_base.html:18 #: ckan/templates/organization/edit_base.html:17 #: ckan/templates/package/resource_read.html:37 #: ckan/templates/package/resource_views.html:4 msgid "View" -msgstr "" +msgstr "Види" #: ckan/lib/email_notifications.py:103 msgid "{n} new activity from {site_title}" msgid_plural "{n} new activities from {site_title}" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{n} нова активност од {site_title}" +msgstr[1] "{n} нови активности од {site_title}" #: ckan/lib/formatters.py:19 msgid "January" @@ -1492,149 +1556,149 @@ msgstr "" #: ckan/lib/formatters.py:116 msgid "{mins} minute ago" msgid_plural "{mins} minutes ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Пред {mins} минута" +msgstr[1] "Пред {mins} минути" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" msgid_plural "{hours} hours ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Пред {hours} час" +msgstr[1] "Пред {hours} часови" #: ckan/lib/formatters.py:125 msgid "{days} day ago" msgid_plural "{days} days ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Пред {days} ден" +msgstr[1] "Пред {days} денови" #: ckan/lib/formatters.py:128 msgid "{months} month ago" msgid_plural "{months} months ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Пред {months} месец" +msgstr[1] "Пред {months} месеци " #: ckan/lib/formatters.py:130 msgid "over {years} year ago" msgid_plural "over {years} years ago" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Пред {years} година" +msgstr[1] "Пред {years} години" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" -msgstr "" +msgstr "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" #: ckan/lib/formatters.py:151 msgid "{month} {day}, {year}" -msgstr "" +msgstr "{month} {day}, {year}" #: ckan/lib/formatters.py:167 msgid "{bytes} bytes" -msgstr "" +msgstr "{bytes} бајтови" #: ckan/lib/formatters.py:169 msgid "{kibibytes} KiB" -msgstr "" +msgstr "{kibibytes} КиБ" #: ckan/lib/formatters.py:171 msgid "{mebibytes} MiB" -msgstr "" +msgstr "{mebibytes} МиБ" #: ckan/lib/formatters.py:173 msgid "{gibibytes} GiB" -msgstr "" +msgstr "{gibibytes} ГиБ" #: ckan/lib/formatters.py:175 msgid "{tebibytes} TiB" -msgstr "" +msgstr "{tebibytes} ТиБ" #: ckan/lib/formatters.py:187 msgid "{n}" -msgstr "" +msgstr "{n}" #: ckan/lib/formatters.py:189 msgid "{k}k" -msgstr "" +msgstr "{k}к" #: ckan/lib/formatters.py:191 msgid "{m}M" -msgstr "" +msgstr "{m}М" #: ckan/lib/formatters.py:193 msgid "{g}G" -msgstr "" +msgstr "{g}Г" #: ckan/lib/formatters.py:195 msgid "{t}T" -msgstr "" +msgstr "{t}Т" #: ckan/lib/formatters.py:197 msgid "{p}P" -msgstr "" +msgstr "{p}П" #: ckan/lib/formatters.py:199 msgid "{e}E" -msgstr "" +msgstr "{e}Е" #: ckan/lib/formatters.py:201 msgid "{z}Z" -msgstr "" +msgstr "{z}З" #: ckan/lib/formatters.py:203 msgid "{y}Y" -msgstr "" +msgstr "{y}Ѕ" #: ckan/lib/helpers.py:1048 msgid "Update your avatar at gravatar.com" -msgstr "" +msgstr "Ажурирајте го Вашиот аватар преку gravatar.com" #: ckan/lib/helpers.py:1297 ckan/lib/helpers.py:1310 msgid "Unknown" -msgstr "" +msgstr "Непознато" #: ckan/lib/helpers.py:1361 msgid "Unnamed resource" -msgstr "" +msgstr "Неименуван ресурс" #: ckan/lib/helpers.py:1401 msgid "Created new dataset." -msgstr "" +msgstr "Креирајте нов податочен сет." #: ckan/lib/helpers.py:1403 msgid "Edited resources." -msgstr "" +msgstr "Променети ресурси." #: ckan/lib/helpers.py:1405 msgid "Edited settings." -msgstr "" +msgstr "Променети подесувања." #: ckan/lib/helpers.py:1648 msgid "{number} view" msgid_plural "{number} views" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} преглед" +msgstr[1] "{number} прегледи" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" msgid_plural "{number} recent views" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} скорешен преглед" +msgstr[1] "{number} скорешни прегледи" #: ckan/lib/mailer.py:39 #, python-format msgid "%s <%s>" -msgstr "" +msgstr "%s <%s>" #: ckan/lib/mailer.py:109 msgid "No recipient email address available!" -msgstr "" +msgstr "Не постои достапна електронска адреса на примачот!" #: ckan/lib/mailer.py:127 ckan/templates/home/snippets/stats.html:17 msgid "organization" -msgstr "" +msgstr "организација" #: ckan/lib/mailer.py:128 ckan/templates/home/snippets/stats.html:23 msgid "group" -msgstr "" +msgstr "група" #: ckan/lib/navl/dictization_functions.py:14 #: ckan/lib/navl/dictization_functions.py:17 @@ -1648,50 +1712,50 @@ msgstr "" #: ckan/logic/action/get.py:2083 ckan/logic/action/update.py:257 #: ckan/logic/validators.py:607 msgid "Missing value" -msgstr "" +msgstr "Недостасува вредност" #: ckan/lib/navl/validators.py:66 #, python-format msgid "The input field %(name)s was not expected." -msgstr "" +msgstr "Полето за внесување %(name)sне беше очекувано" #: ckan/lib/navl/validators.py:118 msgid "Please enter an integer value" -msgstr "" +msgstr "Ве молиме внесете вредност во цел број" #: ckan/lib/navl/validators.py:124 msgid "Must be a Unicode string value" -msgstr "" +msgstr "Вредноста треба да биде уникод." #: ckan/logic/__init__.py:98 ckan/logic/action/__init__.py:60 msgid "Package resource(s) invalid" -msgstr "" +msgstr "Пакетот со ресурс(и) е невалиден." #: ckan/logic/__init__.py:105 ckan/logic/__init__.py:107 #: ckan/logic/action/__init__.py:62 ckan/logic/action/__init__.py:64 msgid "Extras" -msgstr "" +msgstr "Додатоци" #: ckan/logic/converters.py:74 ckan/logic/converters.py:89 #, python-format msgid "Tag vocabulary \"%s\" does not exist" -msgstr "" +msgstr "Вокабуларот за тагови %s не постои" #: ckan/logic/converters.py:180 msgid "Could not parse as valid JSON" -msgstr "" +msgstr "Не може да се обработи како валиден JSON" #: ckan/logic/validators.py:33 ckan/logic/validators.py:42 msgid "An organization must be provided" -msgstr "" +msgstr "Организација мора да се обезбеди" #: ckan/logic/validators.py:47 msgid "Organization does not exist" -msgstr "" +msgstr "Организацијата не постои" #: ckan/logic/validators.py:52 msgid "You cannot add a dataset to this organization" -msgstr "" +msgstr "Неможете да додадете податочен сет кон оваа организација" #: ckan/logic/validators.py:92 msgid "Invalid integer" @@ -1699,7 +1763,7 @@ msgstr "" #: ckan/logic/validators.py:97 msgid "Must be a natural number" -msgstr "" +msgstr "Мора да биде природен број" #: ckan/logic/validators.py:103 msgid "Must be a postive integer" @@ -1707,409 +1771,429 @@ msgstr "Мора да биде позитивен број" #: ckan/logic/validators.py:130 msgid "Date format incorrect" -msgstr "Датата е грешна" +msgstr "Форматот за датум е погрешен." #: ckan/logic/validators.py:139 msgid "No links are allowed in the log_message." -msgstr "" +msgstr "Линкови не се дозволени во log_message." #: ckan/logic/validators.py:159 msgid "Dataset id already exists" -msgstr "" +msgstr "ИД на податочниот сет веќе постои" #: ckan/logic/validators.py:200 msgid "Resource" -msgstr "" +msgstr "Ресурс" #: ckan/logic/validators.py:254 msgid "That group name or ID does not exist." -msgstr "" +msgstr "Тоа име на група или ИД веќе постои." #: ckan/logic/validators.py:268 msgid "Activity type" -msgstr "" +msgstr "Тип на активност" #: ckan/logic/validators.py:331 msgid "Names must be strings" -msgstr "" +msgstr "Имињата мора да се текстуални" #: ckan/logic/validators.py:335 msgid "That name cannot be used" -msgstr "" +msgstr "Името неможе да се употреби" #: ckan/logic/validators.py:338 #, python-format msgid "Must be at least %s characters long" -msgstr "" +msgstr "Мора да биде најмалку %s карактери долго" #: ckan/logic/validators.py:340 ckan/logic/validators.py:623 #, python-format msgid "Name must be a maximum of %i characters long" -msgstr "" +msgstr "Името мора да биде најмногу %i карактери долго" #: ckan/logic/validators.py:343 msgid "" "Must be purely lowercase alphanumeric (ascii) characters and these symbols: " "-_" -msgstr "" +msgstr "Мора да бидат мали алфанумерички карактери (ascii) и овие симболи: -_" #: ckan/logic/validators.py:361 msgid "That URL is already in use." -msgstr "" +msgstr "Овој линк е веќе во употреба." #: ckan/logic/validators.py:366 #, python-format msgid "Name \"%s\" length is less than minimum %s" -msgstr "" +msgstr "Должината на името \"%s\" мора да биде минимум %s " #: ckan/logic/validators.py:370 #, python-format msgid "Name \"%s\" length is more than maximum %s" -msgstr "" +msgstr "Должината на името \"%s\" мора да е максимум %s" #: ckan/logic/validators.py:376 #, python-format msgid "Version must be a maximum of %i characters long" -msgstr "" +msgstr "Верзијата мора да биде најмногу %i карактери долга" #: ckan/logic/validators.py:394 #, python-format msgid "Duplicate key \"%s\"" -msgstr "" +msgstr "Копија на клуч “%s“" #: ckan/logic/validators.py:410 msgid "Group name already exists in database" -msgstr "" +msgstr "Името на групата веќе постои во базата на податоци" #: ckan/logic/validators.py:416 #, python-format msgid "Tag \"%s\" length is less than minimum %s" -msgstr "" +msgstr "Должината на тагот “%s“ е помала од најмалата дозволена од %s" #: ckan/logic/validators.py:420 #, python-format msgid "Tag \"%s\" length is more than maximum %i" -msgstr "" +msgstr "Должината на тагот “%s“ е поголем од најголемата дозволена од %i" #: ckan/logic/validators.py:428 #, python-format msgid "Tag \"%s\" must be alphanumeric characters or symbols: -_." msgstr "" +"Тагот “%s“ мора да биде од алфанумерички карактери или од симболите: -_." #: ckan/logic/validators.py:436 #, python-format msgid "Tag \"%s\" must not be uppercase" -msgstr "" +msgstr "Тагот “%s“ мора да биде со големи букви" #: ckan/logic/validators.py:545 msgid "User names must be strings" -msgstr "" +msgstr "Корисничките имиња мора да се текстуални" #: ckan/logic/validators.py:561 msgid "That login name is not available." -msgstr "" +msgstr "Тоа име за најавување не е достапно." -#: ckan/logic/validators.py:570 +#: ckan/logic/validators.py:566 +msgid "That login name can not be modified." +msgstr "Тоа име за логирање неможе да биде променето." + +#: ckan/logic/validators.py:577 msgid "Please enter both passwords" -msgstr "" +msgstr "Ве молиме внесете ги двете лозинки" #: ckan/logic/validators.py:578 msgid "Passwords must be strings" -msgstr "" +msgstr "Лозинките мора да бидат текстуални" -#: ckan/logic/validators.py:582 -msgid "Your password must be 4 characters or longer" -msgstr "Вашата лозинка мора да биде 4 или повеке карактери" +#: ckan/logic/validators.py:589 +msgid "Your password must be 8 characters or longer" +msgstr "Вашата лозинка мора да биде од 8 карактери или подолга" #: ckan/logic/validators.py:590 msgid "The passwords you entered do not match" -msgstr "" +msgstr "Лозинките кои ги внесовте не се совпаѓаат" #: ckan/logic/validators.py:611 msgid "" "Edit not allowed as it looks like spam. Please avoid links in your " "description." msgstr "" +"Уредувањето не е дозволено бидејќи изгледа како спам. Ве молиме избегнувајте" +" линкови во вашиот опис." #: ckan/logic/validators.py:620 #, python-format msgid "Name must be at least %s characters long" -msgstr "" +msgstr "Името мора да биде намалку %s карактери долго" #: ckan/logic/validators.py:628 msgid "That vocabulary name is already in use." -msgstr "" +msgstr "Името на вокабуларот веќе постои." #: ckan/logic/validators.py:634 #, python-format msgid "Cannot change value of key from %s to %s. This key is read-only" msgstr "" +"Не може да се промени вредноста на клучот од %s на %s. Овој клуч е само за " +"читање." #: ckan/logic/validators.py:643 msgid "Tag vocabulary was not found." -msgstr "" +msgstr "Вокабуларот за тагот не е пронајден." #: ckan/logic/validators.py:656 #, python-format msgid "Tag %s does not belong to vocabulary %s" -msgstr "" +msgstr "Тагот %s не припаѓа на вокабуларот %s" #: ckan/logic/validators.py:662 msgid "No tag name" -msgstr "" +msgstr "Тагот нема име" #: ckan/logic/validators.py:675 #, python-format msgid "Tag %s already belongs to vocabulary %s" -msgstr "" +msgstr "Тагот %s веќе припаѓа на вокабуларот %s" #: ckan/logic/validators.py:698 msgid "Please provide a valid URL" -msgstr "" +msgstr "Ве молиме обезбедете валиден линк" #: ckan/logic/validators.py:712 msgid "role does not exist." -msgstr "" +msgstr "улогата не постои." #: ckan/logic/validators.py:741 msgid "Datasets with no organization can't be private." -msgstr "" +msgstr "Податочниите сетови без организација неможат да бидат приватни." #: ckan/logic/validators.py:747 msgid "Not a list" -msgstr "" +msgstr "Не е листа" #: ckan/logic/validators.py:750 msgid "Not a string" -msgstr "" +msgstr "Не е текст" #: ckan/logic/validators.py:782 msgid "This parent would create a loop in the hierarchy" -msgstr "" +msgstr "Овој родител ќе создаде јамка во хиерархијата" #: ckan/logic/validators.py:792 msgid "\"filter_fields\" and \"filter_values\" should have the same length" -msgstr "" +msgstr "\"filter_fields\" и \"filter_values\" не треба да бидат со иста должина" #: ckan/logic/validators.py:803 msgid "\"filter_fields\" is required when \"filter_values\" is filled" -msgstr "" +msgstr "\"filter_fields\" е задолжително кога \"filter_values\" е пополнето" #: ckan/logic/validators.py:806 msgid "\"filter_values\" is required when \"filter_fields\" is filled" -msgstr "" +msgstr "\"filter_values\" е задолжително кога \"filter_fields\" е пополнето" #: ckan/logic/validators.py:820 msgid "There is a schema field with the same name" -msgstr "" +msgstr "Постои поле во шемата со истото име" #: ckan/logic/validators.py:846 msgid "Email {email} is not a valid format" -msgstr "" +msgstr "Електронската адреса {email} не е во валиден формат" #: ckan/logic/action/create.py:183 ckan/logic/action/create.py:665 #, python-format msgid "REST API: Create object %s" -msgstr "" +msgstr "REST API: Креирајте објект %s" #: ckan/logic/action/create.py:544 #, python-format msgid "REST API: Create package relationship: %s %s %s" -msgstr "" +msgstr "REST API: Креирајте врска за податочен сет: %s%s%s" #: ckan/logic/action/create.py:585 #, python-format msgid "REST API: Create member object %s" -msgstr "" +msgstr "REST API: Креирајте објект за членот %s" #: ckan/logic/action/create.py:804 msgid "Trying to create an organization as a group" -msgstr "" +msgstr "Се обидувате да креирате организација како група" #: ckan/logic/action/create.py:893 msgid "You must supply a package id or name (parameter \"package\")." -msgstr "" +msgstr "Мора да обезбедите ИД или име за податочниот сет (parameter \"package\")." #: ckan/logic/action/create.py:896 msgid "You must supply a rating (parameter \"rating\")." -msgstr "" +msgstr "Мора да обезбедите оцена (параметар \"rating\")." #: ckan/logic/action/create.py:901 msgid "Rating must be an integer value." -msgstr "" +msgstr "Оцената мора да биде цел број." #: ckan/logic/action/create.py:905 #, python-format msgid "Rating must be between %i and %i." -msgstr "" +msgstr "Оценувањето мора да биде меѓу %i и %i." #: ckan/logic/action/create.py:1064 msgid "Error sending the invite email, the user was not created: {0}" msgstr "" +"Грешка при испраќањето на електронска порака за покана, корисникот не е " +"креиран: {0}" #: ckan/logic/action/create.py:1277 ckan/logic/action/create.py:1284 msgid "You must be logged in to follow users" -msgstr "" +msgstr "Мора да бидете најавени за да следите корисници" #: ckan/logic/action/create.py:1297 msgid "You cannot follow yourself" -msgstr "" +msgstr "Неможете да се следите самите себе" #: ckan/logic/action/create.py:1305 ckan/logic/action/create.py:1362 #: ckan/logic/action/create.py:1501 msgid "You are already following {0}" -msgstr "" +msgstr "Веќе го/ја следите {0}" #: ckan/logic/action/create.py:1336 ckan/logic/action/create.py:1344 msgid "You must be logged in to follow a dataset." -msgstr "" +msgstr "Мора да бидете логирани за да следите податочен сет." #: ckan/logic/action/create.py:1402 msgid "User {username} does not exist." -msgstr "" +msgstr "Корисникот {username} не постои." #: ckan/logic/action/create.py:1477 ckan/logic/action/create.py:1485 msgid "You must be logged in to follow a group." -msgstr "" +msgstr "Мора да бидете најавени за да следите група." #: ckan/logic/action/delete.py:54 msgid " Delete User: {0}" -msgstr "" +msgstr "Избришете корисник: {0}" #: ckan/logic/action/delete.py:92 #, python-format msgid "REST API: Delete Package: %s" -msgstr "" +msgstr "REST API: Избришете податочен сет: %s" #: ckan/logic/action/delete.py:276 ckan/logic/action/delete.py:358 #, python-format msgid "REST API: Delete %s" -msgstr "" +msgstr "REST API: Избришете %s" #: ckan/logic/action/delete.py:318 #, python-format msgid "REST API: Delete Member: %s" +msgstr "REST API: Избришете член: %s" + +#: ckan/logic/action/delete.py:358 +msgid "Organization cannot be deleted while it still has datasets" msgstr "" +"Организацијата неможе да биде избришана додека поседува податочни сетови." -#: ckan/logic/action/delete.py:544 ckan/logic/action/delete.py:570 -#: ckan/logic/action/get.py:2482 ckan/logic/action/update.py:953 +#: ckan/logic/action/delete.py:560 ckan/logic/action/delete.py:586 +#: ckan/logic/action/get.py:2432 ckan/logic/action/update.py:906 msgid "id not in data" -msgstr "" +msgstr "ИД не е во податоците." #: ckan/logic/action/delete.py:548 ckan/logic/action/get.py:2485 #: ckan/logic/action/update.py:957 #, python-format msgid "Could not find vocabulary \"%s\"" -msgstr "" +msgstr "Вокабуларот %s неможе да биде пронајден" #: ckan/logic/action/delete.py:578 #, python-format msgid "Could not find tag \"%s\"" -msgstr "" +msgstr "Тагот “%s“ неможе да биде пронајден" #: ckan/logic/action/delete.py:604 ckan/logic/action/delete.py:608 msgid "You must be logged in to unfollow something." -msgstr "" +msgstr "Мора да бидете најавени за да одследите нешто" #: ckan/logic/action/delete.py:619 msgid "You are not following {0}." -msgstr "" +msgstr "Вие не го/ја следите {0}. " #: ckan/logic/action/get.py:1097 ckan/logic/action/update.py:75 #: ckan/logic/action/update.py:89 msgid "Resource was not found." -msgstr "" +msgstr "Ресурсот не е пронајден." #: ckan/logic/action/get.py:2087 msgid "Do not specify if using \"query\" parameter" -msgstr "" +msgstr "Не наведувајте дали користите \"квери\" параметар" #: ckan/logic/action/get.py:2096 msgid "Must be : pair(s)" -msgstr "" +msgstr "Мора да е/се : пар(ови)" #: ckan/logic/action/get.py:2128 msgid "Field \"{field}\" not recognised in resource_search." -msgstr "" +msgstr "Полето \"{field}\" не е препознато во resource_search." #: ckan/logic/action/update.py:261 ckan/logic/action/update.py:1055 msgid "Package was not found." -msgstr "" +msgstr "Податочниот сет не е пронајден." #: ckan/logic/action/update.py:304 ckan/logic/action/update.py:521 #: ckan/logic/action/update.py:1073 #, python-format msgid "REST API: Update object %s" -msgstr "" +msgstr "REST API: Ажурирајте објект %s" #: ckan/logic/action/update.py:401 #, python-format msgid "REST API: Update package relationship: %s %s %s" -msgstr "" +msgstr "REST API: Ажурирајте ја врската за податочниот сет: %s%s%s" #: ckan/logic/action/update.py:761 msgid "TaskStatus was not found." -msgstr "" +msgstr "TaskStatus не е пронајден." #: ckan/logic/action/update.py:1059 msgid "Organization was not found." -msgstr "" +msgstr "Организацијата не е пронајдена." #: ckan/logic/auth/create.py:27 ckan/logic/auth/create.py:45 #, python-format msgid "User %s not authorized to create packages" -msgstr "" +msgstr "Корисникот %s не е овластен да креира податочни сетови" #: ckan/logic/auth/create.py:31 ckan/logic/auth/update.py:45 #, python-format msgid "User %s not authorized to edit these groups" -msgstr "" +msgstr "Корисникот %s не е овластен да ги променува овие групи" #: ckan/logic/auth/create.py:38 #, python-format msgid "User %s not authorized to add dataset to this organization" msgstr "" +"Корисникот %s не е овластен да додава податочни сетови за оваа организација" #: ckan/logic/auth/create.py:61 msgid "No dataset id provided, cannot check auth." msgstr "" +"ИД за податочниот сет не е обезбеден, неможе да се провери овласувањето" #: ckan/logic/auth/create.py:68 ckan/logic/auth/delete.py:34 #: ckan/logic/auth/get.py:137 ckan/logic/auth/update.py:63 msgid "No package found for this resource, cannot check auth." msgstr "" +"Податочен сет не е креиран за овој ресурс, неможе да се провери " +"овластувањето" #: ckan/logic/auth/create.py:76 #, python-format msgid "User %s not authorized to create resources on dataset %s" -msgstr "" +msgstr "Корисникот %s не е овластен да креира ресурси за податочниот сет %s" #: ckan/logic/auth/create.py:108 #, python-format msgid "User %s not authorized to edit these packages" -msgstr "" +msgstr "Корисникот %s не е овластен да ги променува овие податочни сетови" #: ckan/logic/auth/create.py:119 #, python-format msgid "User %s not authorized to create groups" -msgstr "" +msgstr "Корисникот %s не е овластен да креира групи" #: ckan/logic/auth/create.py:129 #, python-format msgid "User %s not authorized to create organizations" -msgstr "" +msgstr "Корисникот %s не е овластен да креира организации" #: ckan/logic/auth/create.py:145 msgid "User {user} not authorized to create users via the API" -msgstr "" +msgstr "Корисникот {user} не е овластен да креира корисници преку API" #: ckan/logic/auth/create.py:148 msgid "Not authorized to create users" -msgstr "" +msgstr "Не сте овластени да креирате корисници" #: ckan/logic/auth/create.py:189 msgid "Group was not found." -msgstr "" +msgstr "Групата не е пронајдена." #: ckan/logic/auth/create.py:209 msgid "Valid API key needed to create a package" @@ -2122,137 +2206,138 @@ msgstr "" #: ckan/logic/auth/create.py:237 #, python-format msgid "User %s not authorized to add members" -msgstr "" +msgstr "Корисникот %s не е овластен да додава членови" #: ckan/logic/auth/create.py:261 ckan/logic/auth/update.py:115 #, python-format msgid "User %s not authorized to edit group %s" -msgstr "" +msgstr "Корисникот %s не е овластен да ја промени групата %s" #: ckan/logic/auth/delete.py:40 #, python-format msgid "User %s not authorized to delete resource %s" -msgstr "" +msgstr "Корисникот %s не е овластен да го избрише ресурсот %s" #: ckan/logic/auth/delete.py:56 msgid "Resource view not found, cannot check auth." msgstr "" +"Приказот за ресурсот не е пронајден, неможе да се провери овластувањето." #: ckan/logic/auth/delete.py:73 #, python-format msgid "User %s not authorized to delete relationship %s" -msgstr "" +msgstr "Корисникот %s не е овластен да ја избрише врската %s" #: ckan/logic/auth/delete.py:82 #, python-format msgid "User %s not authorized to delete groups" -msgstr "" +msgstr "Корисникот %s не е овластен да избрише групи." #: ckan/logic/auth/delete.py:86 #, python-format msgid "User %s not authorized to delete group %s" -msgstr "" +msgstr "Корисникот %s не е овластен да избрише група %s" #: ckan/logic/auth/delete.py:103 #, python-format msgid "User %s not authorized to delete organizations" -msgstr "" +msgstr "Корисникот %s не е овластен да избрише организации" #: ckan/logic/auth/delete.py:107 #, python-format msgid "User %s not authorized to delete organization %s" -msgstr "" +msgstr "Корисникот %s не е овластен да избрише организација %s" #: ckan/logic/auth/delete.py:120 #, python-format msgid "User %s not authorized to delete task_status" -msgstr "" +msgstr "Корисникот %s не е овластен да избрише task_status" #: ckan/logic/auth/get.py:13 ckan/logic/auth/get.py:285 msgid "Not authorized" -msgstr "" +msgstr "Не сте овластени" #: ckan/logic/auth/get.py:109 #, python-format msgid "User %s not authorized to read these packages" -msgstr "" +msgstr "Корисникот %s не е овластен да ги чита овие податочни сетови" #: ckan/logic/auth/get.py:124 #, python-format msgid "User %s not authorized to read package %s" -msgstr "" +msgstr "Корисникот %s не е овластен да го прочита податочниот сет %s" #: ckan/logic/auth/get.py:143 #, python-format msgid "User %s not authorized to read resource %s" -msgstr "" +msgstr "Корисникот %s не е овластен да го прочита ресурсот %s" #: ckan/logic/auth/get.py:170 #, python-format msgid "User %s not authorized to read group %s" -msgstr "" +msgstr "Корисникот %s не е овластен да ја прочита групата %s" #: ckan/logic/auth/get.py:252 msgid "You must be logged in to access your dashboard." -msgstr "" +msgstr "Мора да се најавени за да пристапите кон контролната табла." #: ckan/logic/auth/update.py:39 #, python-format msgid "User %s not authorized to edit package %s" -msgstr "" +msgstr "Корисникот %sне е овластен да го промени податочниот сет %s" #: ckan/logic/auth/update.py:71 #, python-format msgid "User %s not authorized to edit resource %s" -msgstr "" +msgstr "Корисникот%sне е овластен да го промени ресурсот %s" #: ckan/logic/auth/update.py:100 #, python-format msgid "User %s not authorized to change state of package %s" -msgstr "" +msgstr "Корисникот %sне е овластен да ја менува состојбата на пакетот %s" #: ckan/logic/auth/update.py:128 #, python-format msgid "User %s not authorized to edit organization %s" -msgstr "" +msgstr "Корисникот %sне е овластен да ја менува организацијата %s" #: ckan/logic/auth/update.py:145 #, python-format msgid "User %s not authorized to change state of group %s" -msgstr "" +msgstr "Корисникот%sне е овластен да ја менува состојбата на групата %s" #: ckan/logic/auth/update.py:162 #, python-format msgid "User %s not authorized to edit permissions of group %s" -msgstr "" +msgstr " Корисникот %s не е овластен да ги менува дозволите на групата %s" #: ckan/logic/auth/update.py:190 msgid "Have to be logged in to edit user" -msgstr "" +msgstr "Мора да бидете најавени за да го менувате корисникот" #: ckan/logic/auth/update.py:198 #, python-format msgid "User %s not authorized to edit user %s" -msgstr "" +msgstr "Корисникот \"%s\" не е овластен да прави промени на корисникот \"%s\"" #: ckan/logic/auth/update.py:209 msgid "User {0} not authorized to update user {1}" -msgstr "" +msgstr "Корисникот {0} не е овластен да го ажурира корисникот {1}" #: ckan/logic/auth/update.py:217 #, python-format msgid "User %s not authorized to change state of revision" -msgstr "" +msgstr "Корисникот%sне е овластен да ја менува состојбата на ревизијата" #: ckan/logic/auth/update.py:226 #, python-format msgid "User %s not authorized to update task_status table" -msgstr "" +msgstr "Корисникот %s не е овластен да ја ажурира \"task_status\" табелата" #: ckan/logic/auth/update.py:240 #, python-format msgid "User %s not authorized to update term_translation table" -msgstr "" +msgstr "Кориникот %sне е овластен да ја ажурира \"term_translation\" табелата" #: ckan/logic/auth/update.py:262 msgid "Valid API key needed to edit a package" @@ -2264,143 +2349,143 @@ msgstr "" #: ckan/model/license.py:222 msgid "License not specified" -msgstr "" +msgstr "Лиценцата не е наведена" #: ckan/model/license.py:232 msgid "Open Data Commons Public Domain Dedication and License (PDDL)" -msgstr "" +msgstr "Open Data Commons Јавен Домен Посветеност и Лиценца (PDDL)" #: ckan/model/license.py:242 msgid "Open Data Commons Open Database License (ODbL)" -msgstr "" +msgstr "Open Data Commons Лиценца за Отворена Датабаза (ODbL)" #: ckan/model/license.py:252 msgid "Open Data Commons Attribution License" -msgstr "" +msgstr "Open Data Commons Лиценца за Наведување извор" #: ckan/model/license.py:263 msgid "Creative Commons CCZero" -msgstr "" +msgstr "Creative Commons CCZero" #: ckan/model/license.py:272 msgid "Creative Commons Attribution" -msgstr "" +msgstr "Creative Commons Наведување извор" #: ckan/model/license.py:282 msgid "Creative Commons Attribution Share-Alike" -msgstr "" +msgstr "Creative Commons Наведување извор Сподели-Слично" #: ckan/model/license.py:291 msgid "GNU Free Documentation License" -msgstr "" +msgstr "GNU Бесплатна лиценца за документација" #: ckan/model/license.py:301 msgid "Other (Open)" -msgstr "" +msgstr "Друго (Отворено)" #: ckan/model/license.py:311 msgid "Other (Public Domain)" -msgstr "" +msgstr "Друго (Јавен домен)" #: ckan/model/license.py:321 msgid "Other (Attribution)" -msgstr "" +msgstr "Друго (Наведување извор)" #: ckan/model/license.py:333 msgid "UK Open Government Licence (OGL)" -msgstr "" +msgstr "Велика Британија Отворена Владина Лиценца (OGL)" #: ckan/model/license.py:341 msgid "Creative Commons Non-Commercial (Any)" -msgstr "" +msgstr "Creative Commons Не-комерцијално (Секое)" #: ckan/model/license.py:349 msgid "Other (Non-Commercial)" -msgstr "" +msgstr "Друго (Не-комерцијално)" #: ckan/model/license.py:357 msgid "Other (Not Open)" -msgstr "" +msgstr "Друго (Не отворено)" #: ckan/model/package_relationship.py:54 #, python-format msgid "depends on %s" -msgstr "" +msgstr "зависи од %s" #: ckan/model/package_relationship.py:54 #, python-format msgid "is a dependency of %s" -msgstr "" +msgstr "е зависност од %s" #: ckan/model/package_relationship.py:55 #, python-format msgid "derives from %s" -msgstr "" +msgstr "произлегува од %s" #: ckan/model/package_relationship.py:55 #, python-format msgid "has derivation %s" -msgstr "" +msgstr "има деривација %s" #: ckan/model/package_relationship.py:56 #, python-format msgid "links to %s" -msgstr "" +msgstr "се поврзува со %s" #: ckan/model/package_relationship.py:56 #, python-format msgid "is linked from %s" -msgstr "" +msgstr "е поврзано од %s" #: ckan/model/package_relationship.py:57 #, python-format msgid "is a child of %s" -msgstr "" +msgstr "е дете на %s" #: ckan/model/package_relationship.py:57 #, python-format msgid "is a parent of %s" -msgstr "" +msgstr "е родител на %s" #: ckan/model/package_relationship.py:61 #, python-format msgid "has sibling %s" -msgstr "" +msgstr "има брат/сестра %s" #: ckan/public/base/javascript/modules/api-info.js:96 msgid "There is no API data to load for this resource" -msgstr "" +msgstr "Нема API податоци да се вчитаат за овој ресурс" #: ckan/public/base/javascript/modules/api-info.js:124 msgid "Failed to load data API information" -msgstr "" +msgstr "Не успеаа да се вчитаат информациите за API на податоци" #: ckan/public/base/javascript/modules/autocomplete.js:195 msgid "Start typing…" -msgstr "" +msgstr "Започнете да пишувате…" #: ckan/public/base/javascript/modules/autocomplete.js:195 msgid "No matches found" -msgstr "" +msgstr "Не се пронајдени совпаѓања" #: ckan/public/base/javascript/modules/autocomplete.js:204 #, python-format msgid "Input is too short, must be at least one character" msgid_plural "Input is too short, must be at least %(num)d characters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Влезот е премногу краток, мора да биде најмалку еден знак" +msgstr[1] "Влезот е премногу краток, мора да биде најмалку %(num)d знак" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" -msgstr "" +msgstr "Во овој формулар има незачувани модификации" #: ckan/public/base/javascript/modules/confirm-action.js:97 msgid "Please Confirm Action" -msgstr "" +msgstr "Ве молиме потврдете ја активноста" #: ckan/public/base/javascript/modules/confirm-action.js:100 msgid "Are you sure you want to perform this action?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да ја извршите оваа активност?" #: ckan/public/base/javascript/modules/confirm-action.js:102 #: ckan/templates/user/new_user_form.html:9 @@ -2419,29 +2504,29 @@ msgstr "Потврди" #: ckan/templates/package/confirm_delete.html:15 #: ckan/templates/package/confirm_delete_resource.html:14 msgid "Cancel" -msgstr "" +msgstr "Откажете" #: ckan/public/base/javascript/modules/follow.js:69 #: ckan/templates/snippets/follow_button.html:9 msgid "Unfollow" -msgstr "" +msgstr "Одследете" #: ckan/public/base/javascript/modules/follow.js:72 #: ckan/templates/snippets/follow_button.html:14 msgid "Follow" -msgstr "" +msgstr "Следете" #: ckan/public/base/javascript/modules/image-upload.js:60 msgid "Link" -msgstr "" +msgstr "Линк" #: ckan/public/base/javascript/modules/image-upload.js:61 msgid "Link to a URL on the internet (you can also link to an API)" -msgstr "" +msgstr "Поврзете со линк на интернет (исто така можете да поврзете со API)" #: ckan/public/base/javascript/modules/image-upload.js:68 msgid "Upload" -msgstr "" +msgstr "Прикачете" #: ckan/public/base/javascript/modules/image-upload.js:72 #: ckan/templates/group/snippets/group_item.html:43 @@ -2452,7 +2537,7 @@ msgstr "Избриши" #: ckan/public/base/javascript/modules/image-upload.js:87 msgid "Upload a file on your computer" -msgstr "" +msgstr "Прикачете датотека на вашиот компјутер" #: ckan/public/base/javascript/modules/image-upload.js:110 #: ckan/public/base/javascript/modules/image-upload.js:173 @@ -2462,52 +2547,54 @@ msgstr "" #: ckan/templates/package/snippets/package_basic_fields.html:13 #: ckan/templates/package/snippets/resource_form.html:24 msgid "URL" -msgstr "" +msgstr "УРЛ" #: ckan/public/base/javascript/modules/image-upload.js:119 #: ckan/public/base/javascript/modules/image-upload.js:204 msgid "File" -msgstr "" +msgstr "Датотека" #: ckan/public/base/javascript/modules/resource-reorder.js:56 #: ckan/public/base/javascript/modules/resource-view-reorder.js:50 msgid "Save order" -msgstr "" +msgstr "Распоред на зачувување" #: ckan/public/base/javascript/modules/resource-reorder.js:69 #: ckan/public/base/javascript/modules/resource-view-reorder.js:59 msgid "Saving..." -msgstr "" +msgstr "Се зачувува..." #: ckan/public/base/javascript/modules/resource-upload-field.js:57 msgid "Upload a file" -msgstr "" +msgstr "Прикачете датотека" #: ckan/public/base/javascript/modules/resource-upload-field.js:144 msgid "An Error Occurred" -msgstr "" +msgstr "Се појави грешка" #: ckan/public/base/javascript/modules/resource-upload-field.js:201 msgid "Unable to upload file" -msgstr "" +msgstr "Не може да се прикачи датотеката" #: ckan/public/base/javascript/modules/resource-upload-field.js:252 msgid "Unable to authenticate upload" -msgstr "" +msgstr "Не може да се автентицира прикачувањето" #: ckan/public/base/javascript/modules/resource-upload-field.js:260 msgid "Resource uploaded" -msgstr "" +msgstr "Ресурсот е прикачен" #: ckan/public/base/javascript/modules/resource-upload-field.js:266 msgid "Unable to get data for uploaded file" -msgstr "" +msgstr "Не може да се добијат податоци за прикачената датотека" #: ckan/public/base/javascript/modules/resource-upload-field.js:272 msgid "" "You are uploading a file. Are you sure you want to navigate away and stop " "this upload?" msgstr "" +"Прикачувате датотека. Дали сте сигурни дека сакате да отидете и да " +"престанете со прикачувањето?" #: ckan/public/base/javascript/modules/resource-view-filters.js:9 #: ckan/templates/package/snippets/view_form_filters.html:16 @@ -2516,7 +2603,7 @@ msgstr "Додади филтер" #: ckan/public/base/javascript/modules/resource-view-filters.js:52 msgid "Select a field" -msgstr "" +msgstr "Изберете поле" #: ckan/public/base/javascript/modules/slug-preview.js:57 #: ckan/templates/group/edit_base.html:22 ckan/templates/group/members.html:28 @@ -2529,7 +2616,7 @@ msgstr "" #: ckan/templates/package/resource_edit_base.html:12 #: ckan/templates/package/snippets/resource_item.html:56 msgid "Edit" -msgstr "" +msgstr "Уредете" #: ckan/public/base/javascript/modules/table-toggle-more.js:25 msgid "Show more" @@ -2537,69 +2624,164 @@ msgstr "Прикажи повеке" #: ckan/public/base/javascript/modules/table-toggle-more.js:26 msgid "Hide" -msgstr "" +msgstr "Сокријте" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "фоо" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "нема превод" +msgstr[1] "нема преводи" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "здраво %(name)s" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "нема %(attr)sпревод" +msgstr[1] "нема %(attr)sпреводи" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "бар" +msgstr[1] "бар" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "%(color)sмаица" +msgstr[1] "%(color)sмаици" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "%(num)dставка" +msgstr[1] "%(num)dставки" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)dнедостасува превод" +msgstr[1] "%(num)dнедостасуваат преводи" #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" -msgstr "" +msgstr "Грешка %(error_code)s" #: ckan/templates/footer.html:9 msgid "About {0}" -msgstr "" +msgstr "За {0}" #: ckan/templates/footer.html:15 msgid "CKAN API" -msgstr "" +msgstr "CKAN API" #: ckan/templates/footer.html:16 msgid "CKAN Association" -msgstr "" +msgstr "CKAN Асоцијација" #: ckan/templates/footer.html:24 msgid "" "Powered by CKAN" msgstr "" +"Поддржано одCKAN" #: ckan/templates/header.html:12 msgid "Sysadmin settings" -msgstr "" +msgstr "Поставки на системски администратор" #: ckan/templates/header.html:19 msgid "View profile" -msgstr "" +msgstr "Видете профил" #: ckan/templates/header.html:26 #, python-format msgid "Dashboard (%(num)d new item)" msgid_plural "Dashboard (%(num)d new items)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Контролна табла (%(num)dнова ставка)" +msgstr[1] "Контролна табла (%(num)d нови ставки)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" -msgstr "" +msgstr "Контролна табла" #: ckan/templates/header.html:35 ckan/templates/user/dashboard.html:16 msgid "Edit settings" -msgstr "" +msgstr "Променете поставки" #: ckan/templates/header.html:37 msgid "Settings" -msgstr "" +msgstr "Поставки" #: ckan/templates/header.html:43 ckan/templates/header.html:45 msgid "Log out" -msgstr "" +msgstr "Одјавете се" #: ckan/templates/header.html:56 ckan/templates/user/logout_first.html:15 msgid "Log in" -msgstr "" +msgstr "Најавете се" #: ckan/templates/header.html:58 ckan/templates/user/new.html:3 msgid "Register" -msgstr "" +msgstr "Регистрирајте се" #: ckan/templates/group/read_base.html:17 #: ckan/templates/group/snippets/info.html:36 ckan/templates/header.html:103 @@ -2617,25 +2799,25 @@ msgstr "" #: ckan/templates/user/read.html:5 ckan/templates/user/read_base.html:19 #: ckan/templates/user/read_base.html:53 msgid "Datasets" -msgstr "" +msgstr "Податочни сетови" #: ckan/templates/header.html:116 msgid "Search Datasets" -msgstr "" +msgstr "Пребарувајте податочни сетови" #: ckan/templates/header.html:117 ckan/templates/home/snippets/search.html:11 #: ckan/templates/snippets/simple_search.html:5 #: ckan/templates/user/snippets/user_search.html:6 msgid "Search" -msgstr "" +msgstr "Пребарувај" #: ckan/templates/page.html:6 msgid "Skip to content" -msgstr "" +msgstr "Прескокнете до содржина" #: ckan/templates/activity_streams/activity_stream_items.html:9 msgid "Load less" -msgstr "" +msgstr "Прикажи помалку" #: ckan/templates/activity_streams/activity_stream_items.html:17 msgid "Load more" @@ -2643,28 +2825,32 @@ msgstr "Прикажи повеке" #: ckan/templates/activity_streams/activity_stream_items.html:23 msgid "No activities are within this activity stream" -msgstr "" +msgstr "Нема активности во оваа низа на активности" #: ckan/templates/admin/base.html:3 msgid "Administration" -msgstr "" +msgstr "Администрација" #: ckan/templates/admin/base.html:8 msgid "Sysadmins" -msgstr "" +msgstr "Системски администратори" #: ckan/templates/admin/base.html:9 msgid "Config" -msgstr "" +msgstr "Конфигурација" #: ckan/templates/admin/base.html:10 ckan/templates/admin/trash.html:29 msgid "Trash" -msgstr "" +msgstr "Корпа" -#: ckan/templates/admin/config.html:16 +#: ckan/templates/admin/config.html:23 ckan/templates/macros/autoform.html:62 +msgid "Site logo" +msgstr "Лого на сајтот" + +#: ckan/templates/admin/config.html:35 #: ckan/templates/admin/confirm_reset.html:7 msgid "Are you sure you want to reset the config?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да ја ресетирате конфигурацијата?" #: ckan/templates/admin/config.html:16 msgid "Reset" @@ -2672,11 +2858,11 @@ msgstr "Ресетирај" #: ckan/templates/admin/config.html:17 msgid "Update Config" -msgstr "" +msgstr "Ажурирајте ја конфигурацијата" #: ckan/templates/admin/config.html:26 msgid "CKAN config options" -msgstr "" +msgstr "CKAN опции за конфигурација" #: ckan/templates/admin/config.html:33 #, python-format @@ -2697,15 +2883,30 @@ msgid "" "

Homepage: This is for choosing a predefined layout for " "the modules that appear on your homepage.

" msgstr "" +"

Наслов на сајтот:Ова е насловот на оваа CKAN инстанца. " +"Се појавува на различни места низ CKAN.

Стил:Изберете" +" од листата на едноставни варијации на главната шема на бои за да добиете " +"многу брза прилагодлива тема да работи.

Таг лого на " +"сајтот:Ова е логото што се појавува во насловот на сите шаблони на " +"CKAN инстанци

ЗаОвој текст ќе се појави на овие CKAN " +"инстанци страницата за.

Воведен " +"текст:Овој текст ќе се појави на овие CKAN инстанци на главна страница како добредојде на " +"посетителите.

Прилагоден CSS:Ова е блок од CSS што се" +" појавува во<head>тагот од секоја страница. Ако сакате да" +" ги прилагодите шаблоните целосно, препорачуваме читање на документацијата

Главна " +"страница:Ова е за избор на предефиниран изглед за модулите кои се " +"појавуваат на вашата почетна страница

" #: ckan/templates/admin/confirm_reset.html:3 #: ckan/templates/admin/confirm_reset.html:10 msgid "Confirm Reset" -msgstr "" +msgstr "Потврдете ресетирање" #: ckan/templates/admin/index.html:15 msgid "Administer CKAN" -msgstr "" +msgstr "Администрирајте CKAN" #: ckan/templates/admin/index.html:20 #, python-format @@ -2714,86 +2915,92 @@ msgid "" "Proceed with care!

For guidance on using sysadmin features, see the " "CKAN sysadmin guide

" msgstr "" +"

Како корисник на системски администратор имате целосна контрола врз оваа " +"CKAN инстанца. Продолжете со внимание!

а упатства за користење на " +"функциите на системскиот администратор, видете го CKAN водичот за системски " +"администратор

" #: ckan/templates/admin/trash.html:20 msgid "Purge" -msgstr "" +msgstr "Исчистете" #: ckan/templates/admin/trash.html:32 msgid "

Purge deleted datasets forever and irreversibly.

" msgstr "" +"

Исчистете ги избришаните податочни сетови засекогаш и неповратно.

" #: ckan/templates/dataviewer/snippets/data_preview.html:9 msgid "This resource can not be previewed at the moment." -msgstr "" +msgstr "Овој ресурс не може да се прегледа во моментот." #: ckan/templates/dataviewer/snippets/data_preview.html:11 #: ckan/templates/package/resource_read.html:115 #: ckan/templates/package/snippets/resource_view.html:26 msgid "Click here for more information." -msgstr "" +msgstr "Притиснете тука за повеќе информации." #: ckan/templates/dataviewer/snippets/data_preview.html:18 #: ckan/templates/package/snippets/resource_view.html:33 msgid "Download resource" -msgstr "" +msgstr "Преземете ресурс" #: ckan/templates/dataviewer/snippets/no_preview.html:3 msgid "No preview available." -msgstr "" +msgstr "Прегледот не е достапен" #: ckan/templates/dataviewer/snippets/no_preview.html:5 msgid "More details..." -msgstr "" +msgstr "Повеќе детали..." #: ckan/templates/dataviewer/snippets/no_preview.html:12 #, python-format msgid "No handler defined for data type: %(type)s." -msgstr "" +msgstr "Нема управувач за тој податочен тип: %(type)s" #: ckan/templates/development/snippets/form.html:5 msgid "Standard" -msgstr "" +msgstr "Стандарден" #: ckan/templates/development/snippets/form.html:5 msgid "Standard Input" -msgstr "" +msgstr "Стандарден внес" #: ckan/templates/development/snippets/form.html:6 msgid "Medium" -msgstr "" +msgstr "Средно" #: ckan/templates/development/snippets/form.html:6 msgid "Medium Width Input" -msgstr "" +msgstr "Влез за средна ширина" #: ckan/templates/development/snippets/form.html:7 msgid "Full" -msgstr "" +msgstr "Целосно" #: ckan/templates/development/snippets/form.html:7 msgid "Full Width Input" -msgstr "" +msgstr "Влез за целосна ширина" #: ckan/templates/development/snippets/form.html:8 msgid "Large" -msgstr "" +msgstr "Голем" #: ckan/templates/development/snippets/form.html:8 msgid "Large Input" -msgstr "" +msgstr "Голем внес" #: ckan/templates/development/snippets/form.html:9 msgid "Prepend" -msgstr "" +msgstr "Подгответе" #: ckan/templates/development/snippets/form.html:9 msgid "Prepend Input" -msgstr "" +msgstr "Подгответе внес" #: ckan/templates/development/snippets/form.html:13 msgid "Custom Field (empty)" -msgstr "" +msgstr "Приспособливо поле (празно)" #: ckan/templates/development/snippets/form.html:19 #: ckan/templates/group/snippets/group_form.html:35 @@ -2803,19 +3010,19 @@ msgstr "" #: ckan/templates/snippets/custom_form_fields.html:20 #: ckan/templates/snippets/custom_form_fields.html:37 msgid "Custom Field" -msgstr "" +msgstr "Приспособливо поле" #: ckan/templates/development/snippets/form.html:22 msgid "Markdown" -msgstr "" +msgstr "Означете" #: ckan/templates/development/snippets/form.html:23 msgid "Textarea" -msgstr "" +msgstr "Простор за текст" #: ckan/templates/development/snippets/form.html:24 msgid "Select" -msgstr "" +msgstr "Одбери" #: ckan/templates/group/activity_stream.html:3 #: ckan/templates/group/activity_stream.html:6 @@ -2830,21 +3037,21 @@ msgstr "" #: ckan/templates/user/activity_stream.html:6 #: ckan/templates/user/read_base.html:20 msgid "Activity Stream" -msgstr "" +msgstr "Проток на активности" #: ckan/templates/group/admins.html:3 ckan/templates/group/admins.html:6 #: ckan/templates/organization/admins.html:3 #: ckan/templates/organization/admins.html:6 msgid "Administrators" -msgstr "" +msgstr "Администратори" #: ckan/templates/group/base_form_page.html:7 msgid "Add a Group" -msgstr "" +msgstr "Додадете група" #: ckan/templates/group/base_form_page.html:11 msgid "Group Form" -msgstr "" +msgstr "Форма за група" #: ckan/templates/group/confirm_delete.html:3 #: ckan/templates/group/confirm_delete.html:15 @@ -2859,16 +3066,16 @@ msgstr "" #: ckan/templates/package/confirm_delete_resource.html:3 #: ckan/templates/package/confirm_delete_resource.html:15 msgid "Confirm Delete" -msgstr "" +msgstr "Потврдете го бришењето" #: ckan/templates/group/confirm_delete.html:11 msgid "Are you sure you want to delete group - {name}?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да ја избришете групата - {name}?" #: ckan/templates/group/confirm_delete_member.html:11 #: ckan/templates/organization/confirm_delete_member.html:11 msgid "Are you sure you want to delete member - {name}?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да го избришете членот - {name}?" #: ckan/templates/group/edit.html:7 ckan/templates/group/edit_base.html:4 #: ckan/templates/group/edit_base.html:13 @@ -2880,51 +3087,51 @@ msgstr "" #: ckan/templates/user/edit.html:8 ckan/templates/user/edit_base.html:3 #: ckan/templates/user/read_base.html:14 msgid "Manage" -msgstr "" +msgstr "Управувај" #: ckan/templates/group/edit.html:12 msgid "Edit Group" -msgstr "" +msgstr "Промени ја групата" #: ckan/templates/group/edit_base.html:23 ckan/templates/group/members.html:3 #: ckan/templates/organization/edit_base.html:24 #: ckan/templates/organization/members.html:3 msgid "Members" -msgstr "" +msgstr "Членови" #: ckan/templates/group/history.html:3 ckan/templates/group/history.html:6 #: ckan/templates/package/history.html:3 ckan/templates/package/history.html:6 msgid "History" -msgstr "" +msgstr "Историја" #: ckan/templates/group/index.html:13 #: ckan/templates/user/dashboard_groups.html:7 msgid "Add Group" -msgstr "" +msgstr "Додади група" #: ckan/templates/group/index.html:20 msgid "Search groups..." -msgstr "" +msgstr "Пребарај групи..." #: ckan/templates/group/index.html:29 msgid "There are currently no groups for this site" -msgstr "" +msgstr "Моментално, не постојат групи за оваа страна" #: ckan/templates/group/index.html:31 #: ckan/templates/organization/index.html:31 msgid "How about creating one?" -msgstr "" +msgstr "Дали сакате да креирате?" #: ckan/templates/group/member_new.html:8 #: ckan/templates/organization/member_new.html:10 msgid "Back to all members" -msgstr "" +msgstr "Назад кон сите членови" #: ckan/templates/group/member_new.html:10 #: ckan/templates/organization/member_new.html:7 #: ckan/templates/organization/member_new.html:12 msgid "Edit Member" -msgstr "" +msgstr "Променете член" #: ckan/templates/group/member_new.html:10 #: ckan/templates/group/member_new.html:64 ckan/templates/group/members.html:6 @@ -2933,17 +3140,19 @@ msgstr "" #: ckan/templates/organization/member_new.html:65 #: ckan/templates/organization/members.html:8 msgid "Add Member" -msgstr "" +msgstr "Додадете член" #: ckan/templates/group/member_new.html:18 #: ckan/templates/organization/member_new.html:20 msgid "Existing User" -msgstr "" +msgstr "Постоечки корисник" #: ckan/templates/group/member_new.html:21 #: ckan/templates/organization/member_new.html:23 msgid "If you wish to add an existing user, search for their username below." msgstr "" +"Доколку сакате да додадете постоечки корисник, пребарајте го нивното " +"корисничко име подолу." #: ckan/templates/group/member_new.html:38 #: ckan/templates/organization/member_new.html:40 @@ -2953,30 +3162,32 @@ msgstr "или" #: ckan/templates/group/member_new.html:42 #: ckan/templates/organization/member_new.html:44 msgid "New User" -msgstr "" +msgstr "Нов корисник" #: ckan/templates/group/member_new.html:45 #: ckan/templates/organization/member_new.html:47 msgid "If you wish to invite a new user, enter their email address." msgstr "" +"Доколку сакате да поканите нов корисник, внесете ја неговата електронска " +"пошта." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" -msgstr "" +msgstr "Улога" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да го избришете овој член?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -2987,12 +3198,12 @@ msgstr "" #: ckan/templates/revision/read.html:24 #: ckan/templates/user/edit_user_form.html:45 msgid "Delete" -msgstr "" +msgstr "Избришете" #: ckan/templates/group/member_new.html:77 #: ckan/templates/organization/member_new.html:78 msgid "What are roles?" -msgstr "" +msgstr "Што претставуваат улоги?" #: ckan/templates/group/member_new.html:80 msgid "" @@ -3000,72 +3211,76 @@ msgid "" "organization members.

Member: Can add/remove " "datasets from groups

" msgstr "" +"

АдминистраторМоже да промени информација за групата, " +"како и да управува со членовите на " +"организацијата.

Член:Може да додаде/избрише податочни" +" сетови од групите

" #: ckan/templates/group/new.html:3 ckan/templates/group/new.html:5 #: ckan/templates/group/new.html:7 msgid "Create a Group" -msgstr "" +msgstr "Креирајте група" #: ckan/templates/group/new_group_form.html:17 msgid "Update Group" -msgstr "" +msgstr "Ажурирајте група" #: ckan/templates/group/new_group_form.html:19 msgid "Create Group" -msgstr "" +msgstr "Крирајте група" #: ckan/templates/group/read.html:21 ckan/templates/organization/read.html:25 #: ckan/templates/snippets/search_form.html:3 msgid "Search datasets..." -msgstr "" +msgstr "Пребарувајте податочни сетови..." #: ckan/templates/group/snippets/feeds.html:3 msgid "Datasets in group: {group}" -msgstr "" +msgstr "Податочни сетови во група : {group}" #: ckan/templates/group/snippets/feeds.html:4 #: ckan/templates/organization/snippets/feeds.html:4 msgid "Recent Revision History" -msgstr "" +msgstr "Скорешна историја на ревизија" #: ckan/templates/group/snippets/group_form.html:10 #: ckan/templates/organization/snippets/organization_form.html:10 #: ckan/templates/package/snippets/resource_form.html:28 msgid "Name" -msgstr "" +msgstr "Име" #: ckan/templates/group/snippets/group_form.html:10 msgid "My Group" -msgstr "" +msgstr "Моја група" #: ckan/templates/group/snippets/group_form.html:18 msgid "my-group" -msgstr "" +msgstr "моја-група" #: ckan/templates/group/snippets/group_form.html:20 msgid "A little information about my group..." -msgstr "" +msgstr "Кратка информација за мојата група..." #: ckan/templates/group/snippets/group_form.html:60 msgid "Are you sure you want to delete this Group?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да ја избришете оваа група?" #: ckan/templates/group/snippets/group_form.html:63 msgid "Save Group" -msgstr "" +msgstr "Зачувајте ја групата" #: ckan/templates/group/snippets/group_item.html:38 #: ckan/templates/group/snippets/group_item.html:39 msgid "View {name}" -msgstr "" +msgstr "Приказ {name}" #: ckan/templates/group/snippets/group_item.html:43 msgid "Remove dataset from this group" -msgstr "" +msgstr "Избришете податочен сет од оваа група" #: ckan/templates/group/snippets/helper.html:4 msgid "What are Groups?" -msgstr "Што се групи ?" +msgstr "Што претставуваат групи?" #: ckan/templates/group/snippets/helper.html:8 msgid "" @@ -3074,11 +3289,16 @@ msgid "" "particular theme, or as a very simple way to help people find and search " "your own published datasets. " msgstr "" +"Можете да употребите CKAN групи за да креирате и управувате со колекција од " +"податочни сетови. Ова може да овозможи каталогно подредување на податочни " +"сетови за одреден проект или тим, или за одредена тема, или како едноставен " +"начин да овозможите на луѓето да ги пронајдат и пребараат вашите лично " +"објавени податочни сетови." #: ckan/templates/group/snippets/history_revisions.html:10 #: ckan/templates/package/snippets/history_revisions.html:10 msgid "Compare" -msgstr "" +msgstr "Споредете" #: ckan/templates/group/snippets/info.html:16 #: ckan/templates/organization/bulk_process.html:72 @@ -3087,13 +3307,13 @@ msgstr "" #: ckan/templates/snippets/organization.html:37 #: ckan/templates/snippets/package_item.html:42 msgid "Deleted" -msgstr "" +msgstr "Избришано" #: ckan/templates/group/snippets/info.html:24 #: ckan/templates/package/snippets/package_context.html:7 #: ckan/templates/snippets/organization.html:45 msgid "read more" -msgstr "" +msgstr "прочитај повеќе" #: ckan/templates/group/snippets/revisions_table.html:7 #: ckan/templates/package/snippets/revisions_table.html:7 @@ -3101,14 +3321,14 @@ msgstr "" #: ckan/templates/revision/read.html:39 #: ckan/templates/revision/snippets/revisions_list.html:4 msgid "Revision" -msgstr "" +msgstr "Ревизија" #: ckan/templates/group/snippets/revisions_table.html:8 #: ckan/templates/package/snippets/revisions_table.html:8 #: ckan/templates/revision/read.html:53 #: ckan/templates/revision/snippets/revisions_list.html:5 msgid "Timestamp" -msgstr "" +msgstr "Временска маркица" #: ckan/templates/group/snippets/revisions_table.html:9 #: ckan/templates/package/snippets/additional_info.html:25 @@ -3118,18 +3338,18 @@ msgstr "" #: ckan/templates/revision/read.html:50 #: ckan/templates/revision/snippets/revisions_list.html:6 msgid "Author" -msgstr "" +msgstr "Автор" #: ckan/templates/group/snippets/revisions_table.html:10 #: ckan/templates/package/snippets/revisions_table.html:10 #: ckan/templates/revision/read.html:56 #: ckan/templates/revision/snippets/revisions_list.html:8 msgid "Log Message" -msgstr "" +msgstr "Порака од дневник." #: ckan/templates/home/index.html:4 msgid "Welcome" -msgstr "" +msgstr "Добродојдовте" #: ckan/templates/home/snippets/about_text.html:1 msgid "" @@ -3152,52 +3372,77 @@ msgid "" "overview: http://ckan.org/features/

" msgstr "" +"

CKAN е водечка портал платформа за отворени податоци, во " +"светот.

CKAN е комплетно софтверско решение кое овозможува пристап до " +"податоци и нивно користење - преку обезбедување на алатки за поедноставување" +" на објавување, споделување, наоѓање и користење на податоци (вклучувајќи " +"складирање на податоци и обезбедување на цврсти API-ја на податоци ). CKAN е" +" наменета за издавачи на податоци (национални и регионални влади, компании и" +" организации) кои сакаат да ги направат своите податоци отворени и " +"достапни.

CKAN се користи од страна на влади и кориснички групи низ " +"целиот свет и поддржува различни официјални и општи портали за податоци, " +"вклучувајќи портали за локална, национална и меѓународна влада, како што е " +"Велика Британија data.gov.uk и Европската" +" Унија publicdata.eu, Бразилската dados.gov.br, Холандски владини портали, " +"како и градски и општински локации во САД, Велика Британија, Аргентина, " +"Финска и на други места.

CKAN:http://ckan.org/
CKAN Тура:http://ckan.org/tour/
Преглед на " +"карактеристики:http://ckan.org/features/

" #: ckan/templates/home/snippets/promoted.html:8 msgid "Welcome to CKAN" -msgstr "" +msgstr "Добродојдовте во CKAN" #: ckan/templates/home/snippets/promoted.html:10 msgid "" "This is a nice introductory paragraph about CKAN or the site in general. We " "don't have any copy to go here yet but soon we will " msgstr "" +"Ова е убав воведен дел за CKAN или за сајтот воопшто. Ние немаме никаков " +"текст за тука, но наскоро ќе имаме " #: ckan/templates/home/snippets/promoted.html:19 msgid "This is a featured section" -msgstr "" +msgstr "Ова е карактеристична секција" #: ckan/templates/home/snippets/search.html:2 msgid "E.g. environment" -msgstr "" +msgstr "пр. околина" #: ckan/templates/home/snippets/search.html:6 msgid "Search data" -msgstr "" +msgstr "Пребарувај податоци" + +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Пребарувај податочни сетови" #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" -msgstr "" +msgstr "Популарни тагови" #: ckan/templates/home/snippets/stats.html:5 msgid "{0} statistics" -msgstr "" +msgstr "{0} статистики" #: ckan/templates/home/snippets/stats.html:11 msgid "dataset" -msgstr "" +msgstr "податочен сет" #: ckan/templates/home/snippets/stats.html:11 msgid "datasets" -msgstr "" +msgstr "податочни сетови" #: ckan/templates/home/snippets/stats.html:17 msgid "organizations" -msgstr "" +msgstr "организации" #: ckan/templates/home/snippets/stats.html:23 msgid "groups" -msgstr "" +msgstr "групи" #: ckan/templates/macros/autoform.html:62 msgid "Site logo" @@ -3210,43 +3455,46 @@ msgid "" "target=\"popover\" data-content=\"%(markdown_tooltip)s\" data-" "html=\"true\">Markdown formatting here" msgstr "" +"Можете да користите Означи форматирањетука" #: ckan/templates/macros/form.html:265 msgid "This field is required" -msgstr "" +msgstr "Ова поле е задолжително" #: ckan/templates/macros/form.html:265 msgid "Custom" -msgstr "" +msgstr "Приспособливо" #: ckan/templates/macros/form.html:290 msgid "The form contains invalid entries:" -msgstr "" +msgstr "Формата содржи невалидни записи:" #: ckan/templates/macros/form.html:395 msgid "Required field" -msgstr "" +msgstr "Задолжително поле" #: ckan/templates/macros/form.html:410 msgid "http://example.com/my-image.jpg" -msgstr "" +msgstr "http://example.com/my-image.jpg" #: ckan/templates/macros/form.html:411 msgid "Image URL" -msgstr "" +msgstr "Линк до слика" #: ckan/templates/macros/form.html:424 msgid "Clear Upload" -msgstr "" +msgstr "Исчистете го прикачувањето" #: ckan/templates/organization/base_form_page.html:5 msgid "Organization Form" -msgstr "" +msgstr "Форма за организација" #: ckan/templates/organization/bulk_process.html:3 #: ckan/templates/organization/bulk_process.html:11 msgid "Edit datasets" -msgstr "" +msgstr "Промена на податочни сетови" #: ckan/templates/organization/bulk_process.html:6 msgid "Add dataset" @@ -3254,25 +3502,25 @@ msgstr "" #: ckan/templates/organization/bulk_process.html:16 msgid " found for \"{query}\"" -msgstr "" +msgstr "пронајдено за \"{query}\"" #: ckan/templates/organization/bulk_process.html:18 msgid "Sorry no datasets found for \"{query}\"" -msgstr "" +msgstr "Податочни сетови не беа пронајдени за \"{query}\"" #: ckan/templates/organization/bulk_process.html:37 msgid "Make public" -msgstr "" +msgstr "Направете јавно" #: ckan/templates/organization/bulk_process.html:41 msgid "Make private" -msgstr "" +msgstr "Направете приватно" #: ckan/templates/organization/bulk_process.html:70 #: ckan/templates/package/read.html:18 #: ckan/templates/snippets/package_item.html:40 msgid "Draft" -msgstr "" +msgstr "Скица" #: ckan/templates/organization/bulk_process.html:75 #: ckan/templates/package/read.html:11 @@ -3281,34 +3529,34 @@ msgstr "" #: ckan/templates/snippets/private.html:2 #: ckan/templates/user/read_base.html:82 ckan/templates/user/read_base.html:96 msgid "Private" -msgstr "" +msgstr "Приватно" #: ckan/templates/organization/bulk_process.html:88 msgid "This organization has no datasets associated to it" -msgstr "" +msgstr "Организацијата не поседува поврзани податочни сетови" #: ckan/templates/organization/confirm_delete.html:11 msgid "Are you sure you want to delete organization - {name}?" -msgstr "" +msgstr "Дали сте сигурни дека саката да ја избришете организацијата - {name}?" #: ckan/templates/organization/edit.html:6 #: ckan/templates/organization/snippets/info.html:13 #: ckan/templates/organization/snippets/info.html:16 msgid "Edit Organization" -msgstr "" +msgstr "Промена на организацијата" #: ckan/templates/organization/index.html:13 #: ckan/templates/user/dashboard_organizations.html:7 msgid "Add Organization" -msgstr "" +msgstr "Додадете организација" #: ckan/templates/organization/index.html:20 msgid "Search organizations..." -msgstr "" +msgstr "Пребарувајте организации..." #: ckan/templates/organization/index.html:29 msgid "There are currently no organizations for this site" -msgstr "" +msgstr "Во моментов не постојат организации за оваа страница" #: ckan/templates/organization/member_new.html:32 #: ckan/templates/user/edit_user_form.html:8 @@ -3318,15 +3566,15 @@ msgstr "" #: ckan/templates/user/request_reset.html:16 #: ckan/templates/user/snippets/login_form.html:20 msgid "Username" -msgstr "" +msgstr "Корисничко име" #: ckan/templates/organization/member_new.html:50 msgid "Email address" -msgstr "" +msgstr "Адреса на е-пошта" #: ckan/templates/organization/member_new.html:61 msgid "Update Member" -msgstr "" +msgstr "Ажурирајте член" #: ckan/templates/organization/member_new.html:81 msgid "" @@ -3336,27 +3584,34 @@ msgid "" "

Member: Can view the organization's private datasets, " "but not add new datasets.

" msgstr "" +"

Администратор:Може да додава/уредува и брише податочни " +"сетови, како и да управува со членови на " +"организацијата.

Уредувач:Може да додава и уредува " +"податочни сетови, но не може да управува со членови на " +"организацијата.

Член:Може да ги прегледува приватните" +" податочни сетови на организацијата, но не и да додава нови податочни сетови" +"

" #: ckan/templates/organization/members.html:14 msgid "{count} member" msgid_plural "{count} members" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{count} член" +msgstr[1] "{count} членови" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 #: ckan/templates/organization/new.html:7 #: ckan/templates/organization/new.html:12 msgid "Create an Organization" -msgstr "" +msgstr "Креирајте организација" #: ckan/templates/organization/new_organization_form.html:17 msgid "Update Organization" -msgstr "" +msgstr "Ажурирајте организација" #: ckan/templates/organization/new_organization_form.html:19 msgid "Create Organization" -msgstr "" +msgstr "Креирајте организација" #: ckan/templates/organization/read.html:5 #: ckan/templates/package/search.html:16 @@ -3366,12 +3621,12 @@ msgstr "" #: ckan/templates/organization/snippets/feeds.html:3 msgid "Datasets in organization: {group}" -msgstr "" +msgstr "Податочни сетови во организација: {group}" #: ckan/templates/organization/snippets/help.html:4 #: ckan/templates/organization/snippets/helper.html:4 msgid "What are Organizations?" -msgstr "" +msgstr "Што се Организации?" #: ckan/templates/organization/snippets/help.html:7 msgid "" @@ -3382,6 +3637,13 @@ msgid "" "individual users the right to publish datasets from that particular " "organisation (e.g. Office of National Statistics).

" msgstr "" +"

Организациите дејствуваат како издавачки одделенија за податочни сетови " +"(на пример, Министерството за здравство). Ова значи дека податочните сетови " +"може да бидат објавени и припаѓаат на оддел наместо на поединечен корисник. " +"

Во рамките на организациите, администраторите можат да доделуваат " +"улоги и да ги овластуваат своите членови, давајќи им на индивидуалните " +"корисници право да објавуваат податочни сетови од таа одредена организација " +"(пр. Канцеларијата за национална статистика).

" #: ckan/templates/organization/snippets/helper.html:8 msgid "" @@ -3389,42 +3651,49 @@ msgid "" "datasets. Users can have different roles within an Organization, depending " "on their level of authorisation to create, edit and publish. " msgstr "" +"CKAN организациите се користат за креирање, управување и објавување на " +"збирки на податочни сетови. Корисниците можат да имаат различни улоги во " +"рамките на една организација, во зависност од нивното ниво на овластување за" +" креирање, уредување и објавување" #: ckan/templates/organization/snippets/organization_form.html:10 msgid "My Organization" -msgstr "" +msgstr "Моја Организација" #: ckan/templates/organization/snippets/organization_form.html:18 msgid "my-organization" -msgstr "" +msgstr "моја-организација" #: ckan/templates/organization/snippets/organization_form.html:20 msgid "A little information about my organization..." -msgstr "" +msgstr "Малку информации за мојата организација ..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" +"Дали сте сигурни дека сакате да ја избришете оваа организација? Забелешка*: " +"Бришењето не може да се изврши додека јавните или приватните податочни " +"сетови припаѓаат на оваа организација." #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" -msgstr "" +msgstr "Зачувајте организација" #: ckan/templates/organization/snippets/organization_item.html:42 #: ckan/templates/organization/snippets/organization_item.html:43 msgid "View {organization_name}" -msgstr "" +msgstr "Видете {organization_name}" #: ckan/templates/package/base.html:22 ckan/templates/package/new.html:9 #: ckan/templates/package/snippets/new_package_breadcrumb.html:2 msgid "Create Dataset" -msgstr "" +msgstr "Креирајте податочен сет" #: ckan/templates/package/base_form_page.html:22 msgid "What are datasets?" -msgstr "" +msgstr "Што се податочни сетови?" #: ckan/templates/package/base_form_page.html:25 msgid "" @@ -3432,81 +3701,85 @@ msgid "" "with a description and other information, at a fixed URL. Datasets are what " "users see when searching for data. " msgstr "" +"CKAN податочен сет претставува колекција од ресурси (како датотеки), заедно " +"со опис и други информации, до постојан линк. Податочните сетови се она што " +"корисниците го гледаат кога бараат податоци." #: ckan/templates/package/confirm_delete.html:12 msgid "Are you sure you want to delete dataset - {name}?" msgstr "" +"Дали сте сигурни дека сакате да го избришете податочниот сет - {name}?" #: ckan/templates/package/confirm_delete_resource.html:11 msgid "Are you sure you want to delete resource - {name}?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да го избришете ресурсот - {name}?" #: ckan/templates/package/edit_base.html:16 msgid "View dataset" -msgstr "" +msgstr "Приказ на податочен сет" #: ckan/templates/package/edit_base.html:20 msgid "Edit metadata" -msgstr "" +msgstr "Промена на мета податоци" #: ckan/templates/package/edit_view.html:3 #: ckan/templates/package/edit_view.html:4 #: ckan/templates/package/edit_view.html:8 #: ckan/templates/package/edit_view.html:12 msgid "Edit view" -msgstr "" +msgstr "Промена на приказ" #: ckan/templates/package/edit_view.html:20 #: ckan/templates/package/new_view.html:28 #: ckan/templates/package/snippets/resource_item.html:32 #: ckan/templates/snippets/datapreview_embed_dialog.html:16 msgid "Preview" -msgstr "" +msgstr "Преглед" #: ckan/templates/package/edit_view.html:21 msgid "Update" -msgstr "" +msgstr "Ажурирање" #: ckan/templates/package/group_list.html:14 msgid "Associate this group with this dataset" -msgstr "" +msgstr "Поврзете ја оваа група со овој податочен сет." #: ckan/templates/package/group_list.html:14 msgid "Add to group" -msgstr "" +msgstr "Додадете во група" #: ckan/templates/package/group_list.html:23 msgid "There are no groups associated with this dataset" -msgstr "" +msgstr "Не постојат групи поврзани со овој податочен сет" #: ckan/templates/package/new_package_form.html:15 msgid "Update Dataset" -msgstr "" +msgstr "Ажурирање на податочен сет." #: ckan/templates/package/new_resource.html:5 msgid "Add data to the dataset" -msgstr "" +msgstr "Додадете податоци во податочниот сет" #: ckan/templates/package/new_resource.html:11 #: ckan/templates/package/new_resource_not_draft.html:8 msgid "Add New Resource" -msgstr "" +msgstr "Додадете нов ресурс" #: ckan/templates/package/new_resource_not_draft.html:3 #: ckan/templates/package/new_resource_not_draft.html:4 msgid "Add resource" -msgstr "" +msgstr "Додадете ресурс" #: ckan/templates/package/new_resource_not_draft.html:16 msgid "New resource" -msgstr "" +msgstr "Нов ресурс" #: ckan/templates/package/new_view.html:3 #: ckan/templates/package/new_view.html:4 #: ckan/templates/package/new_view.html:8 #: ckan/templates/package/new_view.html:12 msgid "Add view" -msgstr "" +msgstr "Додадете приказ" #: ckan/templates/package/new_view.html:19 msgid "" @@ -3516,11 +3789,16 @@ msgid "" "structured-data-the-data-explorer' target='_blank'>Data Explorer " "documentation. " msgstr "" +"Прегледите на Data Explorer може да бидат бавни и несигурни, освен ако не е " +"овозможена екстензијата за DataStore. За повеќе информации, ве молиме " +"погледнете Документација на Data Explorer" #: ckan/templates/package/new_view.html:29 #: ckan/templates/package/snippets/resource_form.html:81 msgid "Add" -msgstr "" +msgstr "Додадете" #: ckan/templates/package/read_base.html:32 #, python-format @@ -3528,71 +3806,76 @@ msgid "" "This is an old revision of this dataset, as edited at %(timestamp)s. It may " "differ significantly from the current revision." msgstr "" +"Ова е стара ревизија на овој податочен сет, како што е изменето во " +"%(timestamp)s. Може да се разликува значително од тековната ревизија" #: ckan/templates/package/resource_edit_base.html:17 msgid "All resources" -msgstr "" +msgstr "Сите ресурси" #: ckan/templates/package/resource_edit_base.html:19 msgid "View resource" -msgstr "" +msgstr "Приказ на ресурс" #: ckan/templates/package/resource_edit_base.html:24 #: ckan/templates/package/resource_edit_base.html:30 msgid "Edit resource" -msgstr "" +msgstr "Промена на ресурс" #: ckan/templates/package/resource_edit_base.html:26 msgid "Views" -msgstr "" +msgstr "Прикази" #: ckan/templates/package/resource_read.html:39 msgid "API Endpoint" -msgstr "" +msgstr "API Завршна точка" #: ckan/templates/package/resource_read.html:41 #: ckan/templates/package/snippets/resource_item.html:47 msgid "Go to resource" -msgstr "" +msgstr "Одете до ресурс" #: ckan/templates/package/resource_read.html:43 #: ckan/templates/package/snippets/resource_item.html:44 msgid "Download" -msgstr "" +msgstr "Преземете" #: ckan/templates/package/resource_read.html:56 #: ckan/templates/package/resource_read.html:58 msgid "URL:" -msgstr "" +msgstr "линк" #: ckan/templates/package/resource_read.html:66 msgid "From the dataset abstract" -msgstr "" +msgstr "Од апстрактот на податочниот сет" #: ckan/templates/package/resource_read.html:68 #, python-format msgid "Source: %(dataset)s" -msgstr "" +msgstr "Извор:%(dataset)s" #: ckan/templates/package/resource_read.html:109 msgid "There are no views created for this resource yet." -msgstr "" +msgstr "Сеуште не се креирани прикази за овој податочен сет." #: ckan/templates/package/resource_read.html:113 msgid "Not seeing the views you were expecting?" -msgstr "" +msgstr "Не ги гледате приказите кои што ги очекувавте?" #: ckan/templates/package/resource_read.html:118 msgid "Here are some reasons you may not be seeing expected views:" -msgstr "" +msgstr "Еве неколку причини зошто можеби не ги гледате очекуваните приказиЧ" #: ckan/templates/package/resource_read.html:120 msgid "No view has been created that is suitable for this resource" -msgstr "" +msgstr "Не е креиран соодветен приказ за овој ресурс" #: ckan/templates/package/resource_read.html:121 msgid "The site administrators may not have enabled the relevant view plugins" msgstr "" +"Администраторите на страната можеби не ги овозможиле соодветните додатоци за" +" приказ" #: ckan/templates/package/resource_read.html:122 msgid "" @@ -3600,67 +3883,70 @@ msgid "" "or the data may not have been pushed to the DataStore, or the DataStore " "hasn't finished processing the data yet" msgstr "" +"Ако за гледање е потребен DataStore, приклучокот за DataStore можеби не е " +"овозможен, или податоците можеби не биле турнати до DataStore, или DataStore" +" уште не завршил со обработка на податоците" #: ckan/templates/package/resource_read.html:144 msgid "Additional Information" -msgstr "" +msgstr "Дополнителни информации" #: ckan/templates/package/resource_read.html:148 #: ckan/templates/package/snippets/additional_info.html:6 #: ckan/templates/revision/diff.html:43 #: ckan/templates/snippets/additional_info.html:11 msgid "Field" -msgstr "" +msgstr "Поле" #: ckan/templates/package/resource_read.html:149 #: ckan/templates/package/snippets/additional_info.html:7 #: ckan/templates/snippets/additional_info.html:12 msgid "Value" -msgstr "" +msgstr "Вредност" #: ckan/templates/package/resource_read.html:154 msgid "Data last updated" -msgstr "" +msgstr "Последно ажурирани податоци" #: ckan/templates/package/resource_read.html:155 #: ckan/templates/package/resource_read.html:159 #: ckan/templates/package/resource_read.html:163 #: ckan/templates/package/resource_read.html:167 msgid "unknown" -msgstr "" +msgstr "непознато" #: ckan/templates/package/resource_read.html:158 msgid "Metadata last updated" -msgstr "" +msgstr "Последно ажурирани мета податоци" #: ckan/templates/package/resource_read.html:162 #: ckan/templates/package/snippets/additional_info.html:70 msgid "Created" -msgstr "" +msgstr "Креирано" #: ckan/templates/package/resource_read.html:166 #: ckan/templates/package/snippets/resource_form.html:37 #: ckan/templates/package/snippets/resource_info.html:16 msgid "Format" -msgstr "" +msgstr "Формат" #: ckan/templates/package/resource_read.html:170 #: ckan/templates/package/snippets/package_basic_fields.html:30 #: ckan/templates/snippets/license.html:21 msgid "License" -msgstr "" +msgstr "Лиценца" #: ckan/templates/package/resource_views.html:10 msgid "New view" -msgstr "" +msgstr "Нов приказ" #: ckan/templates/package/resource_views.html:28 msgid "This resource has no views" -msgstr "" +msgstr "Овој ресурс нема прикази" #: ckan/templates/package/resources.html:8 msgid "Add new resource" -msgstr "" +msgstr "Додадете нов ресурс" #: ckan/templates/package/resources.html:20 #: ckan/templates/package/snippets/resources_list.html:26 @@ -3669,18 +3955,20 @@ msgid "" "

This dataset has no data, why not " "add some?

" msgstr "" +"

Овој податочен сет не содржи податоци,зошто не додадете?

" #: ckan/templates/package/search.html:52 msgid "API" -msgstr "" +msgstr "API" #: ckan/templates/package/search.html:53 msgid "API Docs" -msgstr "" +msgstr "API документи" #: ckan/templates/package/search.html:55 msgid "full {format} dump" -msgstr "" +msgstr "целосно {format} спуштање" #: ckan/templates/package/search.html:56 #, python-format @@ -3688,6 +3976,8 @@ msgid "" " You can also access this registry using the %(api_link)s (see " "%(api_doc_link)s) or download a %(dump_link)s. " msgstr "" +"До овој регистар можете исто така да пристапите со помош на %(api_link)s " +"(види %(api_doc_link)s) или спуштете го %(dump_link)s" #: ckan/templates/package/search.html:60 #, python-format @@ -3695,115 +3985,122 @@ msgid "" " You can also access this registry using the %(api_link)s (see " "%(api_doc_link)s). " msgstr "" +"До овој регистар можете исто така да пристапите со помош на " +"%(api_link)s(види %(api_doc_link)s)" #: ckan/templates/package/view_edit_base.html:9 msgid "All views" -msgstr "" +msgstr "Сите прикази" #: ckan/templates/package/view_edit_base.html:12 msgid "View view" -msgstr "" +msgstr "Погледни го приказот" #: ckan/templates/package/view_edit_base.html:37 msgid "View preview" -msgstr "" +msgstr "Погледни го прегледот" #: ckan/templates/package/snippets/additional_info.html:2 #: ckan/templates/snippets/additional_info.html:7 msgid "Additional Info" -msgstr "" +msgstr "Дополнителни информации" #: ckan/templates/package/snippets/additional_info.html:14 #: ckan/templates/package/snippets/package_metadata_fields.html:6 msgid "Source" -msgstr "" +msgstr "Извор" #: ckan/templates/package/snippets/additional_info.html:37 #: ckan/templates/package/snippets/additional_info.html:42 #: ckan/templates/package/snippets/package_metadata_fields.html:20 msgid "Maintainer" -msgstr "" +msgstr "Одржувач" #: ckan/templates/package/snippets/additional_info.html:49 #: ckan/templates/package/snippets/package_metadata_fields.html:10 msgid "Version" -msgstr "" +msgstr "Верзија" #: ckan/templates/package/snippets/additional_info.html:56 #: ckan/templates/package/snippets/package_basic_fields.html:108 #: ckan/templates/user/read_base.html:91 msgid "State" -msgstr "" +msgstr "Состојба" #: ckan/templates/package/snippets/additional_info.html:62 msgid "Last Updated" -msgstr "" +msgstr "Последно ажурирано" #: ckan/templates/package/snippets/cannot_create_package.html:10 msgid "Before you can create a dataset you need to create an organization." -msgstr "" +msgstr "Пред да креирате податочен сет потребно е да креирате организација." #: ckan/templates/package/snippets/cannot_create_package.html:13 msgid "Create a new organization" -msgstr "" +msgstr "Креирајте нова организација" #: ckan/templates/package/snippets/cannot_create_package.html:18 msgid "There are no organizations to which you can assign this dataset." msgstr "" +"Не постои организација на која што можете да го додадете податочниот сет." #: ckan/templates/package/snippets/cannot_create_package.html:19 msgid "" "Ask a system administrator to create an organization before you can " "continue." msgstr "" +"Побарајте од систем администраторот да креира организација пред да " +"продолжите понатаму." #: ckan/templates/package/snippets/package_basic_fields.html:4 #: ckan/templates/package/snippets/view_form.html:8 msgid "Title" -msgstr "" +msgstr "Наслов" #: ckan/templates/package/snippets/package_basic_fields.html:4 msgid "eg. A descriptive title" -msgstr "" +msgstr "пр. Описен наслов" #: ckan/templates/package/snippets/package_basic_fields.html:13 msgid "eg. my-dataset" -msgstr "" +msgstr "пр. мој-датасет" #: ckan/templates/package/snippets/package_basic_fields.html:19 msgid "eg. Some useful notes about the data" -msgstr "" +msgstr "пр. Некои корисни белешки за податочниот сет" #: ckan/templates/package/snippets/package_basic_fields.html:24 msgid "eg. economy, mental health, government" -msgstr "" +msgstr "пр. економија, ментално здравје, влада" #: ckan/templates/package/snippets/package_basic_fields.html:41 msgid "" " License definitions and additional information can be found at opendefinition.org " msgstr "" +"Дефиниции за лиценцата и дополнителни информации може да се најдат на opendefinition.org" #: ckan/templates/package/snippets/package_basic_fields.html:70 #: ckan/templates/snippets/organization.html:23 msgid "Organization" -msgstr "" +msgstr "Организација" #: ckan/templates/package/snippets/package_basic_fields.html:74 msgid "No organization" -msgstr "" +msgstr "Нема организација" #: ckan/templates/package/snippets/package_basic_fields.html:89 msgid "Visibility" -msgstr "" +msgstr "Видливост" #: ckan/templates/package/snippets/package_basic_fields.html:92 msgid "Public" -msgstr "" +msgstr "Јавно" #: ckan/templates/package/snippets/package_basic_fields.html:111 msgid "Active" -msgstr "" +msgstr "Активно" #: ckan/templates/package/snippets/package_form.html:28 msgid "" @@ -3813,288 +4110,287 @@ msgid "" "under the Open " "Database License." msgstr "" +"Лиценцата за податоцикоја ја избирате погоре се однесува само на " +"содржината на секоја датотека од ресурс која ја додавате на овој податочен " +"сет. Со поднесување на оваа форма, вие се согласувате да ги објавите мета" +" податочните вредности кои ги внесувате во формуларот под Лиценцата за отворени" +" податоци" #: ckan/templates/package/snippets/package_form.html:39 msgid "Are you sure you want to delete this dataset?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да го избришете овој податочен сет?" #: ckan/templates/package/snippets/package_form.html:43 msgid "Next: Add Data" -msgstr "" +msgstr "Следно: Додадете податоци" #: ckan/templates/package/snippets/package_metadata_fields.html:6 msgid "http://example.com/dataset.json" -msgstr "" +msgstr "http://example.com/dataset.json" #: ckan/templates/package/snippets/package_metadata_fields.html:10 msgid "1.0" -msgstr "" +msgstr "1.0" #: ckan/templates/package/snippets/package_metadata_fields.html:14 #: ckan/templates/package/snippets/package_metadata_fields.html:20 #: ckan/templates/user/new_user_form.html:6 msgid "Joe Bloggs" -msgstr "" +msgstr "Јован Јовановски" #: ckan/templates/package/snippets/package_metadata_fields.html:16 msgid "Author Email" -msgstr "" +msgstr "Електронска пошта на автор" #: ckan/templates/package/snippets/package_metadata_fields.html:16 #: ckan/templates/package/snippets/package_metadata_fields.html:22 #: ckan/templates/user/new_user_form.html:7 msgid "joe@example.com" -msgstr "" +msgstr "joe@example.com" #: ckan/templates/package/snippets/package_metadata_fields.html:22 msgid "Maintainer Email" -msgstr "" +msgstr "Електронска пошта на одржувач" #: ckan/templates/package/snippets/resource_edit_form.html:12 msgid "Update Resource" -msgstr "" +msgstr "Ажурирајње на ресурс" #: ckan/templates/package/snippets/resource_form.html:24 msgid "Data" -msgstr "" +msgstr "Податоци" #: ckan/templates/package/snippets/resource_form.html:24 msgid "http://example.com/external-data.csv" -msgstr "" +msgstr "http://example.com/external-data.csv" #: ckan/templates/package/snippets/resource_form.html:28 msgid "eg. January 2011 Gold Prices" -msgstr "" +msgstr "пр. Јануари 2011" #: ckan/templates/package/snippets/resource_form.html:32 msgid "Some useful notes about the data" -msgstr "" +msgstr "Некои корисни белешки за податоците" #: ckan/templates/package/snippets/resource_form.html:37 msgid "eg. CSV, XML or JSON" -msgstr "" +msgstr "пр. CSV, XML или JSON" #: ckan/templates/package/snippets/resource_form.html:40 msgid "This will be guessed automatically. Leave blank if you wish" -msgstr "" +msgstr "Ова ќе биде впишано автоматски. Оставете празно по избор" #: ckan/templates/package/snippets/resource_form.html:51 msgid "eg. 2012-06-05" -msgstr "" +msgstr "пр. 05-06-2012" #: ckan/templates/package/snippets/resource_form.html:53 msgid "File Size" -msgstr "" +msgstr "Големина на датотека" #: ckan/templates/package/snippets/resource_form.html:53 msgid "eg. 1024" -msgstr "" +msgstr "пр. 1024" #: ckan/templates/package/snippets/resource_form.html:55 #: ckan/templates/package/snippets/resource_form.html:57 msgid "MIME Type" -msgstr "" +msgstr "МИМЕ Тип" #: ckan/templates/package/snippets/resource_form.html:55 #: ckan/templates/package/snippets/resource_form.html:57 msgid "eg. application/json" -msgstr "" +msgstr "пр. application/json" #: ckan/templates/package/snippets/resource_form.html:65 msgid "Are you sure you want to delete this resource?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да го избришете овој ресурс?" #: ckan/templates/package/snippets/resource_form.html:71 msgid "Previous" -msgstr "" +msgstr "Прегледи" #: ckan/templates/package/snippets/resource_form.html:74 msgid "Save & add another" -msgstr "" +msgstr "Зачувајте и додајте нов" #: ckan/templates/package/snippets/resource_form.html:77 msgid "Finish" -msgstr "" +msgstr "Заврши" #: ckan/templates/package/snippets/resource_help.html:2 msgid "What's a resource?" -msgstr "" +msgstr "Што претставува ресурс?" #: ckan/templates/package/snippets/resource_help.html:4 msgid "A resource can be any file or link to a file containing useful data." msgstr "" +"Ресурс може да биде секоја датотека или линк до датотека која содржи корисни" +" податоци." #: ckan/templates/package/snippets/resource_item.html:23 msgid "Explore" -msgstr "" +msgstr "Истражи" #: ckan/templates/package/snippets/resource_item.html:35 msgid "More information" -msgstr "" +msgstr "Повеќе информации" + +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Цел екран" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" -msgstr "" +msgstr "Вметни" #: ckan/templates/package/snippets/resource_view.html:24 msgid "This resource view is not available at the moment." -msgstr "" +msgstr "Овој приказ на ресурс не е достапен во моментот. " #: ckan/templates/package/snippets/resource_view.html:63 msgid "Embed resource view" -msgstr "" +msgstr "Вметни приказ на ресурс" #: ckan/templates/package/snippets/resource_view.html:66 msgid "" "You can copy and paste the embed code into a CMS or blog software that " "supports raw HTML" msgstr "" +"Можете да го копирате и залепите вметнатиот код во системот за управување со" +" податоци или блог софтвер кој поддржува чист HTML" #: ckan/templates/package/snippets/resource_view.html:69 msgid "Width" -msgstr "" +msgstr "Ширина" #: ckan/templates/package/snippets/resource_view.html:72 msgid "Height" -msgstr "" +msgstr "Висина" #: ckan/templates/package/snippets/resource_view.html:75 msgid "Code" -msgstr "" +msgstr "Код" #: ckan/templates/package/snippets/resource_views_list.html:8 msgid "Resource Preview" -msgstr "" +msgstr "Приказ на ресурс" #: ckan/templates/package/snippets/resources_list.html:13 msgid "Data and Resources" -msgstr "" +msgstr "Податоци и ресурси" #: ckan/templates/package/snippets/resources_list.html:30 msgid "This dataset has no data" -msgstr "" +msgstr "Овој податочен сет не содржи податоци" #: ckan/templates/package/snippets/revisions_table.html:24 #, python-format msgid "Read dataset as of %s" -msgstr "" +msgstr "Прочитајте го податочниот сет од %s" #: ckan/templates/package/snippets/stages.html:23 #: ckan/templates/package/snippets/stages.html:25 msgid "Create dataset" -msgstr "" +msgstr "Креирајте податочен сет" #: ckan/templates/package/snippets/stages.html:30 #: ckan/templates/package/snippets/stages.html:34 #: ckan/templates/package/snippets/stages.html:36 msgid "Add data" -msgstr "" +msgstr "Додајте податоци" #: ckan/templates/package/snippets/view_form.html:8 msgid "eg. My View" -msgstr "" +msgstr "пр. Мој приказ" #: ckan/templates/package/snippets/view_form.html:9 msgid "eg. Information about my view" -msgstr "" +msgstr "пр. Информации за мојот приказ" #: ckan/templates/package/snippets/view_form_filters.html:28 msgid "Remove Filter" -msgstr "" +msgstr "Отстранете филтер" #: ckan/templates/package/snippets/view_help.html:2 msgid "What's a view?" -msgstr "" +msgstr "Што означува приказ?" #: ckan/templates/package/snippets/view_help.html:4 msgid "A view is a representation of the data held against a resource" msgstr "" +"Приказот претставува репрезентација на податоците содржани во ресурсот" #: ckan/templates/revision/diff.html:6 msgid "Differences" -msgstr "" +msgstr "Разлики" #: ckan/templates/revision/diff.html:13 ckan/templates/revision/diff.html:18 #: ckan/templates/revision/diff.html:23 msgid "Revision Differences" -msgstr "" +msgstr "Ревизија на разликите" #: ckan/templates/revision/diff.html:44 msgid "Difference" -msgstr "" +msgstr "Разлика" #: ckan/templates/revision/diff.html:54 msgid "No Differences" -msgstr "" +msgstr "Нема разлики" #: ckan/templates/revision/list.html:3 ckan/templates/revision/list.html:6 #: ckan/templates/revision/list.html:10 msgid "Revision History" -msgstr "" +msgstr "Историја на ревизии" #: ckan/templates/revision/list.html:6 ckan/templates/revision/read.html:8 msgid "Revisions" -msgstr "" +msgstr "Промени" #: ckan/templates/revision/read.html:30 msgid "Undelete" -msgstr "" +msgstr "Вратете го избришаното" #: ckan/templates/revision/read.html:64 msgid "Changes" -msgstr "" +msgstr "Промени" #: ckan/templates/revision/read.html:74 msgid "Datasets' Tags" -msgstr "" +msgstr "Тагови на податочен сет" #: ckan/templates/revision/snippets/revisions_list.html:7 msgid "Entity" -msgstr "" +msgstr "Ентитет" #: ckan/templates/snippets/activity_item.html:3 msgid "New activity item" -msgstr "" +msgstr "Нова активност" -#: ckan/templates/snippets/datapreview_embed_dialog.html:4 -msgid "Embed Data Viewer" -msgstr "" - -#: ckan/templates/snippets/datapreview_embed_dialog.html:8 -msgid "Embed this view by copying this into your webpage:" -msgstr "" - -#: ckan/templates/snippets/datapreview_embed_dialog.html:10 -msgid "Choose width and height in pixels:" -msgstr "" - -#: ckan/templates/snippets/datapreview_embed_dialog.html:11 -msgid "Width:" -msgstr "" - -#: ckan/templates/snippets/datapreview_embed_dialog.html:13 -msgid "Height:" -msgstr "" +#: ckan/templates/snippets/add_dataset.html:6 +msgid "Add Dataset" +msgstr "Додадете податочен сет" #: ckan/templates/snippets/datapusher_status.html:8 msgid "Datapusher status: {status}." -msgstr "" +msgstr "Статус на Datapusher: {status}." #: ckan/templates/snippets/disqus_trackback.html:2 msgid "Trackback URL" -msgstr "" +msgstr "Линк за следење" #: ckan/templates/snippets/facet_list.html:80 msgid "Show More {facet_type}" -msgstr "" +msgstr "Покажи повеќе {facet_type}" #: ckan/templates/snippets/facet_list.html:83 msgid "Show Only Popular {facet_type}" -msgstr "" +msgstr "Прикажи ги популарните {facet_type}" #: ckan/templates/snippets/facet_list.html:87 msgid "There are no {facet_type} that match this search" -msgstr "" +msgstr "Не се пронајдени {facet_type} кои се совпаѓаат со ова пребарување" #: ckan/templates/snippets/home_breadcrumb_item.html:2 msgid "Home" @@ -4102,30 +4398,30 @@ msgstr "" #: ckan/templates/snippets/language_selector.html:3 msgid "Language" -msgstr "" +msgstr "Јазик" #: ckan/templates/snippets/language_selector.html:11 #: ckan/templates/snippets/search_form.html:41 #: ckan/templates/snippets/simple_search.html:15 #: ckan/templates/snippets/sort_by.html:22 msgid "Go" -msgstr "" +msgstr "Оди" #: ckan/templates/snippets/license.html:14 msgid "No License Provided" -msgstr "" +msgstr "Лиценца не е обезбедена" #: ckan/templates/snippets/license.html:28 msgid "This dataset satisfies the Open Definition." -msgstr "" +msgstr "Податочниот сет ја задоволува отворената дефиниција." #: ckan/templates/snippets/organization.html:48 msgid "There is no description for this organization" -msgstr "" +msgstr "Не постои опис за оваа организација" #: ckan/templates/snippets/package_item.html:57 msgid "This dataset has no description" -msgstr "" +msgstr "Овој податочен сет нема опис" #: ckan/templates/snippets/search_form.html:17 msgid "Submit" @@ -4135,200 +4431,204 @@ msgstr "" #: ckan/templates/snippets/simple_search.html:8 #: ckan/templates/snippets/sort_by.html:12 msgid "Order by" -msgstr "" +msgstr "Подреди според" #: ckan/templates/snippets/search_form.html:73 msgid "Filter Results" -msgstr "" +msgstr "Филтрирај ги резултатите" #: ckan/templates/snippets/search_form.html:80 msgid "

Please try another search.

" -msgstr "" +msgstr "

Ве молиме обидете се со ново пребарување

" #: ckan/templates/snippets/search_form.html:86 msgid "" "

There was an error while searching." " Please try again.

" msgstr "" +"

Се појави грешка при " +"пребарувањето.Ве молиме обидете се повторно.

" #: ckan/templates/snippets/search_result_text.html:15 msgid "{number} dataset found for \"{query}\"" msgid_plural "{number} datasets found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} податочен сет пронајден за \"{query}\"" +msgstr[1] "{number} податочни сетови пронајдени за \"{query}\"" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" -msgstr "" +msgstr "Не се пронајдени податочни сетови за \"{query}\" " #: ckan/templates/snippets/search_result_text.html:17 msgid "{number} dataset found" msgid_plural "{number} datasets found" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} податочен сет е пронајден" +msgstr[1] "{number} податочни сетови се пронајдени" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" -msgstr "" +msgstr "Не се пронајдени податочни сетови" #: ckan/templates/snippets/search_result_text.html:21 msgid "{number} group found for \"{query}\"" msgid_plural "{number} groups found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} група пронајдена за \"{query}\"" +msgstr[1] "{number} групи пронајдени за \"{query}\"" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" -msgstr "" +msgstr "Не се пронајдени групи за \"{query}\"" #: ckan/templates/snippets/search_result_text.html:23 msgid "{number} group found" msgid_plural "{number} groups found" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} пронајдена група" +msgstr[1] "{number} пронајдени групи" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" -msgstr "" +msgstr "Не се пронајдени групи" #: ckan/templates/snippets/search_result_text.html:27 msgid "{number} organization found for \"{query}\"" msgid_plural "{number} organizations found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} организација пронајдена за \"{query}\"" +msgstr[1] "{number} организации пронајдени за \"{query}\"" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" -msgstr "" +msgstr "Не се пронајдени организации за \"{query}\"" #: ckan/templates/snippets/search_result_text.html:29 msgid "{number} organization found" msgid_plural "{number} organizations found" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{number} организација е пронајдена" +msgstr[1] "{number} организации се пронајдени" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" -msgstr "" +msgstr "Организации не се пронајдени" #: ckan/templates/snippets/social.html:5 msgid "Social" -msgstr "" +msgstr "Социјален" #: ckan/templates/snippets/subscribe.html:2 msgid "Subscribe" -msgstr "" +msgstr "Зачлени се" #: ckan/templates/snippets/subscribe.html:4 #: ckan/templates/user/edit_user_form.html:12 #: ckan/templates/user/new_user_form.html:7 #: ckan/templates/user/read_base.html:82 msgid "Email" -msgstr "" +msgstr "Електронска пошта" #: ckan/templates/snippets/subscribe.html:5 msgid "RSS" -msgstr "" +msgstr "РСС" #: ckan/templates/snippets/context/user.html:23 #: ckan/templates/user/read_base.html:57 msgid "Edits" -msgstr "" +msgstr "Промени" #: ckan/templates/tag/index.html:33 ckan/templates/tag/index.html:34 msgid "Search Tags" -msgstr "" +msgstr "Пребарувај тагови" #: ckan/templates/user/dashboard.html:19 ckan/templates/user/dashboard.html:37 msgid "News feed" -msgstr "" +msgstr "Новости" #: ckan/templates/user/dashboard.html:20 #: ckan/templates/user/dashboard_datasets.html:12 msgid "My Datasets" -msgstr "" +msgstr "Мои податочни сетови" #: ckan/templates/user/dashboard.html:21 #: ckan/templates/user/dashboard_organizations.html:12 msgid "My Organizations" -msgstr "" +msgstr "Мои организации" #: ckan/templates/user/dashboard.html:22 #: ckan/templates/user/dashboard_groups.html:12 msgid "My Groups" -msgstr "" +msgstr "Мои групи" #: ckan/templates/user/dashboard.html:39 msgid "Activity from items that I'm following" -msgstr "" +msgstr "Активност од предмети што ги следам" #: ckan/templates/user/dashboard_datasets.html:17 #: ckan/templates/user/read.html:14 msgid "You haven't created any datasets." -msgstr "" +msgstr "Податочни сетови не се креирани." #: ckan/templates/user/dashboard_datasets.html:19 #: ckan/templates/user/dashboard_groups.html:22 #: ckan/templates/user/dashboard_organizations.html:23 #: ckan/templates/user/read.html:16 msgid "Create one now?" -msgstr "" +msgstr "Дали сакате да креирате сега?" #: ckan/templates/user/dashboard_groups.html:20 msgid "You are not a member of any groups." -msgstr "" +msgstr "Вие не сте член на група." #: ckan/templates/user/dashboard_organizations.html:21 msgid "You are not a member of any organizations." -msgstr "" +msgstr "Вие не сте член на организација." #: ckan/templates/user/edit.html:6 ckan/templates/user/edit_base.html:3 #: ckan/templates/user/list.html:6 ckan/templates/user/list.html:13 #: ckan/templates/user/read_base.html:5 ckan/templates/user/read_base.html:8 #: ckan/templates/user/snippets/user_search.html:2 msgid "Users" -msgstr "" +msgstr "Корисници" #: ckan/templates/user/edit.html:17 msgid "Account Info" -msgstr "" +msgstr "Информации за сметката" #: ckan/templates/user/edit.html:19 msgid "" " Your profile lets other CKAN users know about who you are and what you do. " msgstr "" +"Вашиот профил доволува останатите корисници на CKAN да знаат кои сте Вие и " +"што правите." #: ckan/templates/user/edit_user_form.html:7 msgid "Change details" -msgstr "" +msgstr "Промена на деталите" #: ckan/templates/user/edit_user_form.html:10 msgid "Full name" -msgstr "" +msgstr "Целосно име" #: ckan/templates/user/edit_user_form.html:10 msgid "eg. Joe Bloggs" -msgstr "" +msgstr "пр. Јован Јовановски" #: ckan/templates/user/edit_user_form.html:12 msgid "eg. joe@example.com" -msgstr "" +msgstr "пр. joe@example.com" #: ckan/templates/user/edit_user_form.html:14 msgid "A little information about yourself" -msgstr "" +msgstr "Кратка информација за Вас" #: ckan/templates/user/edit_user_form.html:17 msgid "Subscribe to notification emails" -msgstr "" +msgstr "Зачленете се за известувања преку електронска пошта" #: ckan/templates/user/edit_user_form.html:26 msgid "Change password" -msgstr "" +msgstr "Промена на лозинка" #: ckan/templates/user/edit_user_form.html:29 msgid "Sysadmin Password" -msgstr "" +msgstr "Лозинка на систем администратор" #: ckan/templates/user/edit_user_form.html:37 #: ckan/templates/user/logout_first.html:12 @@ -4340,28 +4640,28 @@ msgstr "" #: ckan/templates/user/edit_user_form.html:39 msgid "Confirm Password" -msgstr "" +msgstr "Потврдете ја лозинката" #: ckan/templates/user/edit_user_form.html:45 msgid "Are you sure you want to delete this User?" -msgstr "" +msgstr "Дали сте сигурни дека сакате да го избришете овој корисник?" #: ckan/templates/user/edit_user_form.html:50 msgid "Are you sure you want to regenerate the API key?" -msgstr "" +msgstr "Дали сте сигурни дека саката да регенерирате нов API клуч?" #: ckan/templates/user/edit_user_form.html:50 msgid "Regenerate API Key" -msgstr "" +msgstr "Регенерирај API клуч" #: ckan/templates/user/edit_user_form.html:54 msgid "Update Profile" -msgstr "" +msgstr "Ажурирајте го профилот" #: ckan/templates/user/list.html:3 #: ckan/templates/user/snippets/user_search.html:11 msgid "All Users" -msgstr "" +msgstr "Сите корисници" #: ckan/templates/user/login.html:3 ckan/templates/user/login.html:6 #: ckan/templates/user/login.html:12 @@ -4371,175 +4671,189 @@ msgstr "" #: ckan/templates/user/login.html:25 msgid "Need an Account?" -msgstr "" +msgstr "Дали Ви е потребна сметка?" #: ckan/templates/user/login.html:27 msgid "Then sign right up, it only takes a minute." -msgstr "" +msgstr "Тогаш веднаш регистрирајте се, нема да Ви одземе повеќе од минута." #: ckan/templates/user/login.html:30 msgid "Create an Account" -msgstr "" +msgstr "Креирајте сметка" #: ckan/templates/user/login.html:42 msgid "Forgotten your password?" -msgstr "" +msgstr "Дали ја заборавивте Вашата лозинка?" #: ckan/templates/user/login.html:44 msgid "No problem, use our password recovery form to reset it." msgstr "" +"Не грижете се, искористете ја нашата форма за ресетирање на лозинката." #: ckan/templates/user/login.html:47 msgid "Forgot your password?" -msgstr "" +msgstr "Дали ја заборавивте Вашата лозинка?" #: ckan/templates/user/logout.html:3 ckan/templates/user/logout.html:9 msgid "Logged Out" -msgstr "" +msgstr "Сега сте одјавени." #: ckan/templates/user/logout.html:11 msgid "You are now logged out." -msgstr "" +msgstr "Сега сте одјавени." #: ckan/templates/user/logout_first.html:9 msgid "You're already logged in as {user}." -msgstr "" +msgstr "Веќе сте најавени како {user}." #: ckan/templates/user/logout_first.html:9 msgid "Logout" -msgstr "" +msgstr "Одјавете се" #: ckan/templates/user/logout_first.html:13 #: ckan/templates/user/snippets/login_form.html:24 msgid "Remember me" -msgstr "" +msgstr "Запамети ме" #: ckan/templates/user/logout_first.html:22 msgid "You're already logged in" -msgstr "" +msgstr "Веќе сте логирани" #: ckan/templates/user/logout_first.html:24 msgid "You need to log out before you can log in with another account." msgstr "" +"Потребно е да се одјавите пред да можете да се најавите со друга сметка." #: ckan/templates/user/logout_first.html:25 msgid "Log out now" -msgstr "" +msgstr "Одјавете се сега" #: ckan/templates/user/new.html:6 msgid "Registration" -msgstr "" +msgstr "Регистрација" #: ckan/templates/user/new.html:14 msgid "Register for an Account" -msgstr "" +msgstr "Креирај сметка" #: ckan/templates/user/new.html:26 msgid "Why Sign Up?" -msgstr "" +msgstr "Зошто да се регистрирате?" #: ckan/templates/user/new.html:28 msgid "Create datasets, groups and other exciting things" -msgstr "" +msgstr "Креирајте податочни сетови, групи и други интересни нешта" #: ckan/templates/user/new_user_form.html:5 msgid "username" -msgstr "" +msgstr "корисничко име" #: ckan/templates/user/new_user_form.html:6 msgid "Full Name" -msgstr "" +msgstr "Целосно име" #: ckan/templates/user/new_user_form.html:17 msgid "Create Account" -msgstr "" +msgstr "Креирајте сметка" #: ckan/templates/user/perform_reset.html:4 #: ckan/templates/user/perform_reset.html:14 msgid "Reset Your Password" -msgstr "" +msgstr "Ресетирајте ја Вашата лозинка" #: ckan/templates/user/perform_reset.html:7 msgid "Password Reset" +msgstr "Ресетирање на лозинката" + +#: ckan/templates/user/perform_reset.html:21 +msgid "You can also change username. It can not be modified later." msgstr "" +"Вие исто така можете да го промените вашето корисничко име. Истото нема да " +"може да биде променето подоцна." -#: ckan/templates/user/perform_reset.html:24 +#: ckan/templates/user/perform_reset.html:29 msgid "Update Password" -msgstr "" +msgstr "Ажурирање на лозинка" #: ckan/templates/user/perform_reset.html:38 #: ckan/templates/user/request_reset.html:32 msgid "How does this work?" -msgstr "" +msgstr "Како ова функционира?" #: ckan/templates/user/perform_reset.html:40 msgid "Simply enter a new password and we'll update your account" -msgstr "" +msgstr "Едноставно внесете нова лозинка и Вашата сметка ке биде ажурирана" #: ckan/templates/user/read.html:21 msgid "User hasn't created any datasets." -msgstr "" +msgstr "Корисникот не креирал податочни сетови." #: ckan/templates/user/read_base.html:39 msgid "You have not provided a biography." -msgstr "" +msgstr "Недостасува биографија" #: ckan/templates/user/read_base.html:41 msgid "This user has no biography." -msgstr "" +msgstr "Корисникот нема биографија." #: ckan/templates/user/read_base.html:73 msgid "Open ID" -msgstr "" +msgstr "Open ID" #: ckan/templates/user/read_base.html:82 ckan/templates/user/read_base.html:96 msgid "This means only you can see this" -msgstr "" +msgstr "Ова значи дека само Вие можете да го видите ова" #: ckan/templates/user/read_base.html:87 msgid "Member Since" -msgstr "" +msgstr "Член од" #: ckan/templates/user/read_base.html:96 msgid "API Key" -msgstr "" +msgstr "API клуч" #: ckan/templates/user/request_reset.html:3 #: ckan/templates/user/request_reset.html:13 msgid "Reset your password" -msgstr "" +msgstr "Ресетирајте ја Вашата лозинка" #: ckan/templates/user/request_reset.html:6 msgid "Password reset" -msgstr "" +msgstr "Ресетирање на лозинка" #: ckan/templates/user/request_reset.html:19 msgid "Request reset" -msgstr "" +msgstr "Ресетирај" #: ckan/templates/user/request_reset.html:34 msgid "" "Enter your username into the box and we will send you an email with a link " "to enter a new password." msgstr "" +"Внесете го Вашето корисничко име во полето и ние ќе Ви испратиме електронска" +" порака со линк за влез и нова лозинка." #: ckan/templates/user/snippets/followee_dropdown.html:14 #: ckan/templates/user/snippets/followee_dropdown.html:15 msgid "Activity from:" -msgstr "" +msgstr "Активност од:" #: ckan/templates/user/snippets/followee_dropdown.html:23 msgid "Search list..." -msgstr "" +msgstr "Пребарај низ листата..." #: ckan/templates/user/snippets/followee_dropdown.html:44 msgid "You are not following anything" -msgstr "" +msgstr "Вие не следите ништо" #: ckan/templates/user/snippets/followers.html:9 msgid "No followers" -msgstr "" +msgstr "Нема следачи" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" -msgstr "" +msgstr "Пребарувај корисници" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "Вашата лозинка мора да е 8 карактери или повеќе." diff --git a/ckan/i18n/mn_MN/LC_MESSAGES/ckan.mo b/ckan/i18n/mn_MN/LC_MESSAGES/ckan.mo index 9d677632bba..3a3fcba0cf5 100644 Binary files a/ckan/i18n/mn_MN/LC_MESSAGES/ckan.mo and b/ckan/i18n/mn_MN/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/mn_MN/LC_MESSAGES/ckan.po b/ckan/i18n/mn_MN/LC_MESSAGES/ckan.po index c16d636c5d9..e5bf589fdda 100644 --- a/ckan/i18n/mn_MN/LC_MESSAGES/ckan.po +++ b/ckan/i18n/mn_MN/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Mongolian (Mongolia) (https://www.transifex.com/okfn/teams/11162/mn_MN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: mn_MN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -113,13 +113,20 @@ msgstr "Өгөгдлийн агуулахын нөөц олдсонгүй" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" +"Өгөгдөл буруу байна (жишээ нь, тоон утга хязгаараас давсан эсвэл бичвэр " +"талбарт тоо оруулсан)" -#: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 -#: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 -#: ckanext/datastore/logic/action.py:534 ckanext/datastore/logic/action.py:559 +#: ckanext/datastore/logic/action.py:258 ckanext/datastore/logic/action.py:286 +#: ckanext/datastore/logic/action.py:344 ckanext/datastore/logic/action.py:457 msgid "Resource \"{0}\" was not found." msgstr "Нөөц \"{0}\" олдсонгүй." @@ -134,8 +141,7 @@ msgstr "CKAN өгөгдлийн API" #: ckanext/datastore/templates/ajax_snippets/api_info.html:23 msgid "Access resource data via a web API with powerful query support" msgstr "" -"Өндөр түвшний хайлт хийх боломж бүхий веб API-н тусламжтайгаар нөөц өгөгдөлд" -" хандана" +"Илүү нарийвчилсан хайлт хийх боломжтой веб API-аар нөөц өгөгдөлд хандах" #: ckanext/datastore/templates/ajax_snippets/api_info.html:24 msgid "" @@ -256,7 +262,17 @@ msgstr "Ачааллаж байна..." msgid "Data API" msgstr "Өгөгдлийн API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"CKAN Data API болон Өгөгдлийн нөөцийн баримт бичигт " +"нэмэлт мэдээллийг агуулж байгаа болно.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -384,6 +400,7 @@ msgstr "0 Өгөгдлийн бүрдлүүд" #: ckanext/example_theme_docs/v12_extra_public_dir/templates/home/snippets/promoted.html:4 msgid "CKAN's data previewing tool has many powerful features" msgstr "" +"CKAN-ны өгөгдөл урьдчилан харах хэрэгсэл нь олон хүчирхэг боломжуудтай" #: ckan/templates/group/followers.html:3 ckan/templates/group/followers.html:6 #: ckan/templates/group/snippets/info.html:32 @@ -853,15 +870,16 @@ msgid "Request params must be in form of a json encoded dictionary." msgstr "" "Хүсэлтийн параметр нь json-оор шифрлэгдсэн үгсийн сан хэлбэрт байх ёстой" -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Бүлэг олдсонгүй" @@ -1059,6 +1077,7 @@ msgstr "Засварын хэлбэр таарахгүй байна: %r" #: ckan/controllers/package.py:396 msgid "Viewing datasets of type \"{package_type}\" is not supported ({file_!r})." msgstr "" +"\"{package_type}\" төрлийн өгөгдлийн бүрдлийг харах ({file_!r})-д боломжгүй." #: ckan/controllers/package.py:435 ckan/controllers/package.py:817 #: ckan/controllers/package.py:918 ckan/controllers/package.py:966 @@ -1905,11 +1924,11 @@ msgstr "" #: ckan/logic/validators.py:803 msgid "\"filter_fields\" is required when \"filter_values\" is filled" -msgstr "" +msgstr "\"filter_values\" утгыг оруулсан бол \"filter_fields\" утга заавал байх ёстой" #: ckan/logic/validators.py:806 msgid "\"filter_values\" is required when \"filter_fields\" is filled" -msgstr "" +msgstr "\"filter_fields\" утга оруулсан бол \"filter_values\" утга заавал байх ёстой" #: ckan/logic/validators.py:820 msgid "There is a schema field with the same name" @@ -2747,6 +2766,10 @@ msgid "" "Proceed with care!

For guidance on using sysadmin features, see the " "CKAN sysadmin guide

" msgstr "" +"

Та систем админ хэрэглэгч адил энэ CKAN-ыг бүрэн удирдах боломжтой " +"байна. Болгоомжтой ажиллаарай!

Систем админы хийх үйлдлийн " +"боломжуудыг CKAN систем админы " +"гарын авлагаас үзнэ үү.

" #: ckan/templates/admin/trash.html:20 msgid "Purge" @@ -2997,21 +3020,21 @@ msgstr "Та шинэ хэрэглэгч урих бол имэйл хаягий #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Хэрэглэгчийн төрөл" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Та энэ гишүүнийг устгахдаа итгэлтэй байна уу?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3449,6 +3472,12 @@ msgid "" "individual users the right to publish datasets from that particular " "organisation (e.g. Office of National Statistics).

" msgstr "" +"

Байгууллага нь өгөгдлийн бүрдэл нийтлэгч байгууллага байна (Жишээ нь, " +"Үндэсний Статистикийн Хороо). Энэ нь аливаа өгөгдлийн бүрдэл хэн нэгэн хүн " +"эсвэл ажилтанд хамаарах бус тухайн өгөгдлийг нийтлэгч байгууллагатай " +"холбоотой.

Байгууллага дотор админ хэрэглэгчид нь гишүүдэд үүрэг " +"оноох, эрх олгох, энгийн хэрэглэгчид тухайн байгууллагын өмнөөс өгөгдөл " +"нийтлэх эрхийг өгөх боломжтой.

" #: ckan/templates/organization/snippets/helper.html:8 msgid "" @@ -3474,8 +3503,8 @@ msgstr "Миний байгууллагийн талаар товч мэдээл #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Та тус байгууллагыг устгахдаа итгэлтэй байна уу? Ингэснээр тухайн " "байгууллагад хамааралтай нээлттэй болон хаалттай өгөгдлийн бүрдлүүд устана." @@ -3592,6 +3621,11 @@ msgid "" "structured-data-the-data-explorer' target='_blank'>Data Explorer " "documentation. " msgstr "" +"Өгөгдлийн Хөтөч харагдац нь DataStore өргөтгөл идэвхжээгүй тохиолдолд удаан," +" найдваргүй ажиллаж болзошгүй. Дэлгэрэнгүй мэдээллийг Өгөгдлийн Хөтчийн " +"баримтаас танилцана уу." #: ckan/templates/package/new_view.html:29 #: ckan/templates/package/snippets/resource_form.html:81 @@ -3672,6 +3706,7 @@ msgstr "" #: ckan/templates/package/resource_read.html:121 msgid "The site administrators may not have enabled the relevant view plugins" msgstr "" +"Энэ сайтын администраторууд харагдац плагинийг идэвхжүүлээгүй байгаа болно" #: ckan/templates/package/resource_read.html:122 msgid "" @@ -3901,6 +3936,12 @@ msgid "" "under the Open " "Database License." msgstr "" +"Өгөгдлийн лиценз та дээрх нөөцүүдээс өөрийн тохирохыг сонгон энэхүү " +"өгөгдлийн бүрдэлд нэмж болно. Энэхүү формыг бөглөж илгээснээр та дараах " +"зөвшөөрлөөр нийтлэгдэж байгаа болно. мета өгөгдөл таны энэхүү форумд " +"оруулсан утга нь Нээлттэй өгөгдлийн " +"сангийн лицензтэй болно." #: ckan/templates/package/snippets/package_form.html:39 msgid "Are you sure you want to delete this dataset?" @@ -4039,6 +4080,7 @@ msgid "" "You can copy and paste the embed code into a CMS or blog software that " "supports raw HTML" msgstr "" +"Хуулж авсан шигтгээ код оо та КМС эсвэл блог програм дотор оо нааж болно" #: ckan/templates/package/snippets/resource_view.html:69 msgid "Width" @@ -4241,6 +4283,8 @@ msgid "" "

There was an error while searching." " Please try again.

" msgstr "" +"

Хайлт хийхэд алдаа гарлаа. дахин " +"хайлт хийнэ үү.

" #: ckan/templates/snippets/search_result_text.html:15 msgid "{number} dataset found for \"{query}\"" @@ -4638,3 +4682,7 @@ msgstr "Дагагчгүй" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Хэрэглэгчид хайх" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/ne/LC_MESSAGES/ckan.mo b/ckan/i18n/ne/LC_MESSAGES/ckan.mo index df0b88147f7..b395d19c2ab 100644 Binary files a/ckan/i18n/ne/LC_MESSAGES/ckan.mo and b/ckan/i18n/ne/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/nl/LC_MESSAGES/ckan.mo b/ckan/i18n/nl/LC_MESSAGES/ckan.mo index 032c8b3fe6a..ee060df3f86 100644 Binary files a/ckan/i18n/nl/LC_MESSAGES/ckan.mo and b/ckan/i18n/nl/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/nl/LC_MESSAGES/ckan.po b/ckan/i18n/nl/LC_MESSAGES/ckan.po index c8248c9f266..2c486d1d36a 100644 --- a/ckan/i18n/nl/LC_MESSAGES/ckan.po +++ b/ckan/i18n/nl/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Peter Vos , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Dutch (https://www.transifex.com/okfn/teams/11162/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "vorm moet een van de volgende zijn: %s" msgid "DataStore resource not found" msgstr "Datastore bron niet gevonden" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -262,7 +268,17 @@ msgstr "Laden..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Verdere informatie in de CKAN Data API en DataStore documentatie.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabel" @@ -859,15 +875,16 @@ msgid "Request params must be in form of a json encoded dictionary." msgstr "" "Opgevraagde parameters moeten zich bevinden in een json encoded dictionary" -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "De titel van de dataset." @@ -3019,21 +3036,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rol" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Weet u zeker dat u dit lid wil verwijderen?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3503,8 +3520,8 @@ msgstr "Informatie over de organisatie..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Weet u zeker dat u deze organisatie wilt verwijderen? Hierdoor worden ook de" " publieke en prive datasets van deze organisatie verwijderd." @@ -4672,3 +4689,7 @@ msgstr "Geen volgers" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Zoek Gebruikers" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/no/LC_MESSAGES/ckan.mo b/ckan/i18n/no/LC_MESSAGES/ckan.mo index 66f613a49b5..4b1a9094fb2 100644 Binary files a/ckan/i18n/no/LC_MESSAGES/ckan.mo and b/ckan/i18n/no/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/no/LC_MESSAGES/ckan.po b/ckan/i18n/no/LC_MESSAGES/ckan.po index 29874ca7b33..b6e714a1d5a 100644 --- a/ckan/i18n/no/LC_MESSAGES/ckan.po +++ b/ckan/i18n/no/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Hilde Austlid , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Norwegian (https://www.transifex.com/okfn/teams/11162/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -113,15 +113,22 @@ msgstr "Fant ikke DataStore-ressurs" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Ugyldige data (f.eks. et tall utenfor tillatt verdi eller tekst i et felt " +"for tall)." + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" "Ugyldige data (f.eks. et tall utenfor tillatt verdi eller tekst i et felt " "for tall)." -#: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 -#: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 -#: ckanext/datastore/logic/action.py:534 ckanext/datastore/logic/action.py:559 +#: ckanext/datastore/logic/action.py:258 ckanext/datastore/logic/action.py:286 +#: ckanext/datastore/logic/action.py:344 ckanext/datastore/logic/action.py:457 msgid "Resource \"{0}\" was not found." msgstr "Fant ikke ressursen \"{0}\"" @@ -259,7 +266,17 @@ msgstr "Laster..." msgid "Data API" msgstr "Data-API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Les mer i dokumentasjonen for data-API i CKAN og DataStore.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabell" @@ -3008,21 +3025,21 @@ msgstr "Hvis du vil invitere en ny bruker, oppgi e-postadressen deres" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rolle" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Er du sikker på at du vil slette dette medlemmet?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3493,8 +3510,8 @@ msgstr "Litt informasjon om min organisasjon..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Er du sikker på at du vil slette denne organisasjon? Dette vil slette alle " "de offentlige og private datasettene som er knyttet til denne " @@ -4676,3 +4693,7 @@ msgstr "Ingen følgere" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Søk brukere" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/pl/LC_MESSAGES/ckan.mo b/ckan/i18n/pl/LC_MESSAGES/ckan.mo index bfab2c6bb23..99e4d478573 100644 Binary files a/ckan/i18n/pl/LC_MESSAGES/ckan.mo and b/ckan/i18n/pl/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/pl/LC_MESSAGES/ckan.po b/ckan/i18n/pl/LC_MESSAGES/ckan.po index 66bb25d3b21..ee6472befd3 100644 --- a/ckan/i18n/pl/LC_MESSAGES/ckan.po +++ b/ckan/i18n/pl/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Polish (https://www.transifex.com/okfn/teams/11162/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "Ładowanie..." msgid "Data API" msgstr "" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -853,15 +866,16 @@ msgid "Request params must be in form of a json encoded dictionary." msgstr "" "Parametry żądania muszą mieć postać tablicy asocjacyjnej w formacie json." -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Grupa nie została znaleziona" @@ -2994,21 +3008,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3438,8 +3452,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4589,3 +4603,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/pt_BR/LC_MESSAGES/ckan.mo b/ckan/i18n/pt_BR/LC_MESSAGES/ckan.mo index e2fa8a045fc..53170d6b77f 100644 Binary files a/ckan/i18n/pt_BR/LC_MESSAGES/ckan.mo and b/ckan/i18n/pt_BR/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/pt_BR/LC_MESSAGES/ckan.po b/ckan/i18n/pt_BR/LC_MESSAGES/ckan.po index e337528b00c..18ff60e52ac 100644 --- a/ckan/i18n/pt_BR/LC_MESSAGES/ckan.po +++ b/ckan/i18n/pt_BR/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Augusto Herrmann , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/okfn/teams/11162/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -111,7 +111,13 @@ msgstr "formato: deve ser um de %s" msgid "DataStore resource not found" msgstr "recurso DataStore não encontrado" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -260,7 +266,18 @@ msgstr "Carregando ..." msgid "Data API" msgstr "API de dados" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Maiores informações no documentação principal da API de dados do CKAN Data API e " +"do DataStore.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabela" @@ -862,15 +879,16 @@ msgstr "" "Parâmetros de requisição devem estar na forma de um dicionário codificado em" " json." -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Grupo não encontrado" @@ -3035,21 +3053,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Papel" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Você tem certeza de que deseja apagar este usuário?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3526,8 +3544,8 @@ msgstr "Um pouco de informações sobre a minha organização..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Tem certeza que deseja apagar esta Organização ? Isso irá apagar todos os " "conjuntos de dados públicos e privados pertencentes a ela." @@ -4717,3 +4735,7 @@ msgstr "Sem seguidores" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Buscar Usuários" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/pt_PT/LC_MESSAGES/ckan.mo b/ckan/i18n/pt_PT/LC_MESSAGES/ckan.mo index a2ce2daf697..410c576216e 100644 Binary files a/ckan/i18n/pt_PT/LC_MESSAGES/ckan.mo and b/ckan/i18n/pt_PT/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/pt_PT/LC_MESSAGES/ckan.po b/ckan/i18n/pt_PT/LC_MESSAGES/ckan.po index f5a14e06fac..8e30bca0f39 100644 --- a/ckan/i18n/pt_PT/LC_MESSAGES/ckan.po +++ b/ckan/i18n/pt_PT/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Portuguese (Portugal) (https://www.transifex.com/okfn/teams/11162/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "O recurso DataStore não foi encontrado" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -262,7 +268,18 @@ msgstr "A carregar ..." msgid "Data API" msgstr "Dados API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Mais informações sobre o API principal dos dados CKAN e a documentação sobre o " +"armazenamento de dados.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabela " @@ -863,15 +880,16 @@ msgid "Request params must be in form of a json encoded dictionary." msgstr "" "A solicitação de parâmetros ao dicionário deve ser na forma de código json." -#: ckan/controllers/feed.py:233 ckan/controllers/group.py:137 -#: ckan/controllers/group.py:225 ckan/controllers/group.py:393 -#: ckan/controllers/group.py:503 ckan/controllers/group.py:536 -#: ckan/controllers/group.py:566 ckan/controllers/group.py:577 -#: ckan/controllers/group.py:631 ckan/controllers/group.py:649 -#: ckan/controllers/group.py:707 ckan/controllers/group.py:739 -#: ckan/controllers/group.py:772 ckan/controllers/group.py:829 -#: ckan/controllers/group.py:926 ckan/controllers/package.py:1243 -#: ckan/controllers/package.py:1258 ckan/logic/action/create.py:1396 +#: ckan/controllers/feed.py:234 ckan/controllers/group.py:128 +#: ckan/controllers/group.py:226 ckan/controllers/group.py:394 +#: ckan/controllers/group.py:504 ckan/controllers/group.py:537 +#: ckan/controllers/group.py:567 ckan/controllers/group.py:578 +#: ckan/controllers/group.py:632 ckan/controllers/group.py:653 +#: ckan/controllers/group.py:714 ckan/controllers/group.py:746 +#: ckan/controllers/group.py:779 ckan/controllers/group.py:836 +#: ckan/controllers/group.py:933 ckan/controllers/package.py:1265 +#: ckan/controllers/package.py:1280 ckan/logic/action/create.py:1373 +#: ckan/views/feed.py:143 msgid "Group not found" msgstr "Grupo não encontrado" @@ -2301,14 +2319,6 @@ msgid "User %s not authorized to update term_translation table" msgstr "" "Utilizador %s não está autorizado a atualizar a tabela term_translation" -#: ckan/logic/auth/update.py:262 -msgid "Valid API key needed to edit a package" -msgstr "É necessária uma chave API válida para editar um pacote" - -#: ckan/logic/auth/update.py:272 -msgid "Valid API key needed to edit a group" -msgstr "É necessária uma chave API válida para editar um grupo" - #: ckan/model/license.py:222 msgid "License not specified" msgstr "Licença não especificada" @@ -3038,21 +3048,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Função" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Tem a certeza que deseja apagar este membro?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3524,8 +3534,8 @@ msgstr "Alguma informação sobre a minha organização ..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Tem certeza de que deseja eliminar esta Organização? Irá apagar todos os " "conjuntos de dados públicos e privados pertencentes a esta organização." @@ -4710,3 +4720,7 @@ msgstr "Sem seguidores" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Pesquisar por utilizadores" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/ro/LC_MESSAGES/ckan.mo b/ckan/i18n/ro/LC_MESSAGES/ckan.mo index f0f1f3a8575..e5a1ef0d697 100644 Binary files a/ckan/i18n/ro/LC_MESSAGES/ckan.mo and b/ckan/i18n/ro/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/ro/LC_MESSAGES/ckan.po b/ckan/i18n/ro/LC_MESSAGES/ckan.po index 65ee250f2f7..f6bf9575e49 100644 --- a/ckan/i18n/ro/LC_MESSAGES/ckan.po +++ b/ckan/i18n/ro/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Bogdan Mateescu, 2018\n" "Language-Team: Romanian (https://www.transifex.com/okfn/teams/11162/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" @@ -25,7 +25,7 @@ msgstr "" #: ckanext/datapusher/helpers.py:22 msgid "Pending" -msgstr "" +msgstr "În aşteptare" #: ckanext/datapusher/helpers.py:23 msgid "Submitting" @@ -84,15 +84,15 @@ msgstr "Ultima actualizare" #: ckanext/datapusher/templates/datapusher/resource_data.html:56 msgid "Never" -msgstr "" +msgstr "Niciodată" #: ckanext/datapusher/templates/datapusher/resource_data.html:62 msgid "Upload Log" -msgstr "" +msgstr "Încărcați Jurnalul" #: ckanext/datapusher/templates/datapusher/resource_data.html:76 msgid "Details" -msgstr "" +msgstr "Detalii" #: ckanext/datapusher/templates/datapusher/resource_data.html:83 msgid "End of log" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -256,7 +262,14 @@ msgstr "Se încarcă..." msgid "Data API" msgstr "Date API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -371,9 +384,9 @@ msgstr "Aceast grup nu are descriere" #: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:22 msgid "{num} Dataset" msgid_plural "{num} Datasets" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{num} set de date" +msgstr[1] "{num} seturi de date" +msgstr[2] "{num} de seturi de date" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -398,7 +411,7 @@ msgstr "" #: ckan/templates/user/read_base.html:49 #: ckanext/example_theme_docs/v18_snippet_api/templates/ajax_snippets/example_theme_popover.html:12 msgid "Followers" -msgstr "Follower-i" +msgstr "Urmăritori" #: ckan/logic/__init__.py:98 ckan/logic/action/__init__.py:60 #: ckan/templates/package/edit_base.html:21 @@ -1015,7 +1028,7 @@ msgstr "Nu mai urmăriți {0}." #: ckan/controllers/group.py:894 ckan/controllers/user.py:580 #, python-format msgid "Unauthorized to view followers %s" -msgstr "Nu sunteți autorizat să vizualizați follower-ii %s" +msgstr "Nu sunteți autorizat să vizualizați urmăritorii %s" #: ckan/controllers/home.py:35 msgid "This site is currently off-line. Database is not initialised." @@ -1444,9 +1457,9 @@ msgstr "" #: ckan/lib/email_notifications.py:103 msgid "{n} new activity from {site_title}" msgid_plural "{n} new activities from {site_title}" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{n} activitate nouă de la {site_title}" +msgstr[1] "{n} activităţi noi de la {site_title}" +msgstr[2] "{n} de activităţi noi de la {site_title}" #: ckan/lib/formatters.py:19 msgid "January" @@ -1503,37 +1516,37 @@ msgstr "Chiar acum" #: ckan/lib/formatters.py:116 msgid "{mins} minute ago" msgid_plural "{mins} minutes ago" -msgstr[0] "{mins} minut în urmâ" +msgstr[0] "{mins} minut în urmă" msgstr[1] "{mins} minute în urmă" -msgstr[2] "{mins} minute în urmă" +msgstr[2] "{mins} de minute în urmă" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" msgid_plural "{hours} hours ago" msgstr[0] "{hours} oră în urmă" msgstr[1] "{hours} ore în urmă" -msgstr[2] "{hours} ore în urmă" +msgstr[2] "{hours} de ore în urmă" #: ckan/lib/formatters.py:125 msgid "{days} day ago" msgid_plural "{days} days ago" -msgstr[0] "{days} o zi în urmă" -msgstr[1] "{days} cîteva zile în urmă" -msgstr[2] "{days} zile în urmă" +msgstr[0] "{days} zi în urmă" +msgstr[1] "{days} zile în urmă" +msgstr[2] "{days} de zile în urmă" #: ckan/lib/formatters.py:128 msgid "{months} month ago" msgid_plural "{months} months ago" msgstr[0] "{months} lună în urmă" msgstr[1] "{months} luni în urmă" -msgstr[2] "{months} luni în urmă" +msgstr[2] "{months} de luni în urmă" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" msgid_plural "over {years} years ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "cu peste {years} an în urmă" +msgstr[1] "cu peste {years} ani în urmă" +msgstr[2] "cu peste {years} de ani în urmă" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1628,14 +1641,14 @@ msgid "{number} view" msgid_plural "{number} views" msgstr[0] "{number} vizualizare" msgstr[1] "{number} vizualizări" -msgstr[2] "{number} vizualizări" +msgstr[2] "{number} de vizualizări" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" msgid_plural "{number} recent views" msgstr[0] "{number} vizualizare recentă" msgstr[1] "{number} vizualizări recente" -msgstr[2] "{number} vizualizări recente" +msgstr[2] "{number} de vizualizări recente" #: ckan/lib/mailer.py:39 #, python-format @@ -2575,6 +2588,105 @@ msgstr "Mai mult" msgid "Hide" msgstr "Ascunde" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "%(num)d traducere lipsă" +msgstr[1] "%(num)d traduceri lipsă" +msgstr[2] "%(num)d de traduceri lipsă" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2614,7 +2726,7 @@ msgid "Dashboard (%(num)d new item)" msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "Tablou de bord (%(num)d element nou)" msgstr[1] "Tablou de bord (%(num)d elemente noi)" -msgstr[2] "Tablou de bord (%(num)d elemente noi)" +msgstr[2] "Tablou de bord (%(num)d de elemente noi)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -3001,21 +3113,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rolul" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Sunteți sigur că doriți să ștergeți acest membru?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3400,9 +3512,9 @@ msgstr "" #: ckan/templates/organization/members.html:14 msgid "{count} member" msgid_plural "{count} members" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{count} membru" +msgstr[1] "{count} membri" +msgstr[2] "{count} de membri" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3465,8 +3577,8 @@ msgstr "Informație scurtă despre organizația mea" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Sigur doriți să ștergeți această Organizație? Aceasta va șterge toate " "seturile de date publice și private care aparțin aceastei organizație." @@ -4217,9 +4329,9 @@ msgstr "" #: ckan/templates/snippets/search_result_text.html:15 msgid "{number} dataset found for \"{query}\"" msgid_plural "{number} datasets found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{number} set de date găsit pentru \"{query}\"" +msgstr[1] "{number} seturi de date găsite pentru \"{query}\"" +msgstr[2] "{number} de seturi de date găsite pentru \"{query}\"" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4228,9 +4340,9 @@ msgstr "" #: ckan/templates/snippets/search_result_text.html:17 msgid "{number} dataset found" msgid_plural "{number} datasets found" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{number} set de date găsit" +msgstr[1] "{number} seturi de date găsite" +msgstr[2] "{number} de seturi de date găsite" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4239,9 +4351,9 @@ msgstr "" #: ckan/templates/snippets/search_result_text.html:21 msgid "{number} group found for \"{query}\"" msgid_plural "{number} groups found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{number} grup găsit pentru \"{query}\"" +msgstr[1] "{number} grupuri găsite pentru \"{query}\"" +msgstr[2] "{number} de grupuri găsite pentru \"{query}\"" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4250,9 +4362,9 @@ msgstr "" #: ckan/templates/snippets/search_result_text.html:23 msgid "{number} group found" msgid_plural "{number} groups found" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{number} grup găsit" +msgstr[1] "{number} grupuri găsite" +msgstr[2] "{number} de grupuri găsite" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4261,9 +4373,9 @@ msgstr "" #: ckan/templates/snippets/search_result_text.html:27 msgid "{number} organization found for \"{query}\"" msgid_plural "{number} organizations found for \"{query}\"" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{number} organizaţie găsită pentru \"{query}\"" +msgstr[1] "{number} organizaţii găsite pentru \"{query}\"" +msgstr[2] "{number} de organizaţii găsite pentru \"{query}\"" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4272,9 +4384,9 @@ msgstr "" #: ckan/templates/snippets/search_result_text.html:29 msgid "{number} organization found" msgid_plural "{number} organizations found" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{number} organizaţie găsită" +msgstr[1] "{number} organizaţii găsite" +msgstr[2] "{number} de organizaţii găsite" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4286,7 +4398,7 @@ msgstr "" #: ckan/templates/snippets/subscribe.html:2 msgid "Subscribe" -msgstr "" +msgstr "Abonează-te" #: ckan/templates/snippets/subscribe.html:4 #: ckan/templates/user/edit_user_form.html:12 @@ -4389,7 +4501,7 @@ msgstr "" #: ckan/templates/user/edit_user_form.html:17 msgid "Subscribe to notification emails" -msgstr "" +msgstr "Abonează-te la e-mailurile de notificare" #: ckan/templates/user/edit_user_form.html:26 msgid "Change password" @@ -4607,8 +4719,12 @@ msgstr "Nu urmăriți nimic" #: ckan/templates/user/snippets/followers.html:9 msgid "No followers" -msgstr "" +msgstr "Niciun urmăritor" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Caută Utilizatori" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/ru/LC_MESSAGES/ckan.mo b/ckan/i18n/ru/LC_MESSAGES/ckan.mo index 8616590ea57..6bcee8ce23c 100644 Binary files a/ckan/i18n/ru/LC_MESSAGES/ckan.mo and b/ckan/i18n/ru/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/ru/LC_MESSAGES/ckan.po b/ckan/i18n/ru/LC_MESSAGES/ckan.po index d9dc939f6fc..2576bd9516e 100644 --- a/ckan/i18n/ru/LC_MESSAGES/ckan.po +++ b/ckan/i18n/ru/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Sergey Motornyuk , 2017\n" +"Last-Translator: Ivan Begtin , 2018\n" "Language-Team: Russian (https://www.transifex.com/okfn/teams/11162/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" @@ -111,11 +111,21 @@ msgstr "" msgid "DataStore resource not found" msgstr "Ресурс DataStore не найден" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" +"Дата словарь сохранён. Любая перезапись будет действовать когда ресурс в " +"следующий раз будет загружен в хранилище данных" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" +"Данные некорректны (например: численное значение за пределами ограничений " +"или введено в текстовое поле)." #: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 #: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 @@ -199,10 +209,16 @@ msgstr "Пример: Python" #: ckanext/datastore/templates/datastore/dictionary.html:16 msgid "Field {num}." -msgstr "" +msgstr "Поле {номер}." + +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:12 +msgid "Type Override" +msgstr "Перезапись типа" -#: ckanext/datastore/templates/datastore/dictionary.html:18 -#: ckanext/datastore/templates/package/resource_read.html:20 +#: ckanext/datastore/templates-bs2/datastore/dictionary.html:18 +#: ckanext/datastore/templates-bs2/package/resource_read.html:20 +#: ckanext/datastore/templates/datastore/snippets/dictionary_form.html:20 +#: ckanext/datastore/templates/package/resource_read.html:21 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" msgstr "Лейбл" @@ -225,7 +241,7 @@ msgstr "Сохранить" #: ckanext/datastore/templates/package/resource_edit_base.html:6 #: ckanext/datastore/templates/package/resource_read.html:14 msgid "Data Dictionary" -msgstr "" +msgstr "Словарь данных" #: ckanext/datastore/templates/package/resource_read.html:18 #: ckanext/datatablesview/templates/datatables/datatables_form.html:17 @@ -255,7 +271,14 @@ msgstr "Идет загрузка..." msgid "Data API" msgstr "Данные API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "таблица" @@ -277,7 +300,7 @@ msgstr "Наборов данных на странице" #: ckanext/example_iconfigurer/templates/admin/config.html:13 msgid "Test conf" -msgstr "" +msgstr "Тестовый конфиг" #: ckan/templates/group/read.html:15 ckan/templates/organization/read.html:19 #: ckan/templates/package/search.html:29 @@ -357,7 +380,7 @@ msgstr "" #: ckanext/example_itranslation/templates/home/index.html:4 msgid "This is an untranslated string" -msgstr "" +msgstr "Это непереведённая строка" #: ckanext/example_theme_docs/v10_custom_snippet/templates/snippets/example_theme_most_popular_groups.html:20 #: ckanext/example_theme_docs/v11_HTML_and_CSS/templates/snippets/example_theme_most_popular_groups.html:19 @@ -427,7 +450,7 @@ msgstr "" #: ckanext/reclineview/plugin.py:101 msgid "Data Explorer" -msgstr "" +msgstr "Проводник данных" #: ckanext/reclineview/plugin.py:171 #: ckanext/reclineview/theme/public/recline_view.js:200 @@ -457,7 +480,7 @@ msgstr "" #: ckanext/reclineview/theme/public/recline_view.js:193 msgid "Grid" -msgstr "" +msgstr "Сетка" #: ckan/templates/package/snippets/view_form_filters.html:46 #: ckanext/reclineview/theme/public/recline_view.js:215 @@ -467,7 +490,7 @@ msgstr "Фильтры" #: ckanext/reclineview/theme/templates/recline_graph_form.html:3 #: ckanext/reclineview/theme/templates/recline_map_form.html:3 msgid "Row offset" -msgstr "" +msgstr "Сдвиг в строке" #: ckanext/reclineview/theme/templates/recline_graph_form.html:3 #: ckanext/reclineview/theme/templates/recline_map_form.html:3 @@ -498,19 +521,19 @@ msgstr "" #: ckanext/reclineview/theme/templates/recline_map_form.html:6 msgid "Field type" -msgstr "" +msgstr "Тип поля" #: ckanext/reclineview/theme/templates/recline_map_form.html:7 msgid "Latitude field" -msgstr "" +msgstr "Поле широты" #: ckanext/reclineview/theme/templates/recline_map_form.html:8 msgid "Longitude field" -msgstr "" +msgstr "Поле долготы" #: ckanext/reclineview/theme/templates/recline_map_form.html:9 msgid "GeoJSON field" -msgstr "" +msgstr "Поле GeoJSON" #: ckanext/reclineview/theme/templates/recline_map_form.html:10 msgid "Auto zoom to features" @@ -518,7 +541,7 @@ msgstr "" #: ckanext/reclineview/theme/templates/recline_map_form.html:11 msgid "Cluster markers" -msgstr "" +msgstr "Маркеры кластера" #: ckanext/stats/templates/ckanext/stats/index.html:10 msgid "Total number of Datasets" @@ -1140,11 +1163,11 @@ msgstr "Недостаточно прав для удаления ресурса #: ckan/controllers/package.py:1111 ckan/controllers/package.py:1554 msgid "Resource view not found" -msgstr "" +msgstr "Просмотр ресурса не найден" #: ckan/controllers/package.py:1150 msgid "Resource data not found" -msgstr "" +msgstr "Данные ресурса не найдены" #: ckan/controllers/package.py:1159 msgid "No download is available" @@ -1763,7 +1786,7 @@ msgstr "Тип процесса" #: ckan/logic/validators.py:331 msgid "Names must be strings" -msgstr "" +msgstr "Названия должны быть строками" #: ckan/logic/validators.py:335 msgid "That name cannot be used" @@ -1847,7 +1870,7 @@ msgstr "Пожалуйста укажите оба пароля." #: ckan/logic/validators.py:578 msgid "Passwords must be strings" -msgstr "" +msgstr "Пароль должны быть строками" #: ckan/logic/validators.py:582 msgid "Your password must be 4 characters or longer" @@ -2526,7 +2549,7 @@ msgstr "Файл" #: ckan/public/base/javascript/modules/resource-reorder.js:56 #: ckan/public/base/javascript/modules/resource-view-reorder.js:50 msgid "Save order" -msgstr "" +msgstr "Сохранить порядок" #: ckan/public/base/javascript/modules/resource-reorder.js:69 #: ckan/public/base/javascript/modules/resource-view-reorder.js:59 @@ -3023,21 +3046,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Роль" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Вы уверены, что хотите удалить этого участника?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3255,6 +3278,10 @@ msgstr "Например, окружающая среда" msgid "Search data" msgstr "Поиск данных" +#: ckan/templates/home/snippets/search.html:8 +msgid "Search datasets" +msgstr "Поиск датасетов" + #: ckan/templates/home/snippets/search.html:16 msgid "Popular tags" msgstr "Популярные теги" @@ -3489,8 +3516,8 @@ msgstr "Кратко о моей организации..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Вы уверены что хотите удалить эту организацию? Это удалит все публичные и " "непубличные массивы данных принадлежащие данной организации." @@ -3720,7 +3747,7 @@ msgstr "неизвестно" #: ckan/templates/package/resource_read.html:158 msgid "Metadata last updated" -msgstr "" +msgstr "Метаданные обновлены" #: ckan/templates/package/resource_read.html:162 #: ckan/templates/package/snippets/additional_info.html:70 @@ -4032,7 +4059,11 @@ msgstr "Исследуй" msgid "More information" msgstr "Больше информации" -#: ckan/templates/package/snippets/resource_view.html:11 +#: ckan/templates/package/snippets/resource_view.html:10 +msgid "Fullscreen" +msgstr "Полноэкранно" + +#: ckan/templates/package/snippets/resource_view.html:18 msgid "Embed" msgstr "Внедрить" @@ -4660,3 +4691,7 @@ msgstr "Нет подписчиков" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Поиск пользователей" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/sk/LC_MESSAGES/ckan.mo b/ckan/i18n/sk/LC_MESSAGES/ckan.mo index 520d720ec60..6a6ed55fb8f 100644 Binary files a/ckan/i18n/sk/LC_MESSAGES/ckan.mo and b/ckan/i18n/sk/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/sk/LC_MESSAGES/ckan.po b/ckan/i18n/sk/LC_MESSAGES/ckan.po index b779e7791aa..bf9c7ef2564 100644 --- a/ckan/i18n/sk/LC_MESSAGES/ckan.po +++ b/ckan/i18n/sk/LC_MESSAGES/ckan.po @@ -1,23 +1,23 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Slovak (https://www.transifex.com/okfn/teams/11162/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: sk\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" #: ckanext/datapusher/helpers.py:21 msgid "Complete" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Požadovaný zdroj z DataStore nebol nájdený" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -262,7 +268,18 @@ msgstr "Prebieha načítavanie..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Viac informácií na hlavná dokumentácia CKAN Data API a CKAN " +"DataStore.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabuľka" @@ -380,6 +397,7 @@ msgid_plural "{num} Datasets" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -1457,6 +1475,7 @@ msgid_plural "{n} new activities from {site_title}" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:19 msgid "January" @@ -1516,6 +1535,7 @@ msgid_plural "{mins} minutes ago" msgstr[0] "pred {mins} minutami" msgstr[1] "pred {mins} minútou" msgstr[2] "pred {mins} minutami" +msgstr[3] "pred {mins} minutami" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" @@ -1523,6 +1543,7 @@ msgid_plural "{hours} hours ago" msgstr[0] "pred {hours} hodinami" msgstr[1] "pred {hours} hodinou" msgstr[2] "pred {hours} hodinami" +msgstr[3] "pred {hours} hodinami" #: ckan/lib/formatters.py:125 msgid "{days} day ago" @@ -1530,6 +1551,7 @@ msgid_plural "{days} days ago" msgstr[0] "pred {days} dňami" msgstr[1] "pred {days} dňom" msgstr[2] "pred {days} dňami" +msgstr[3] "pred {days} dňami" #: ckan/lib/formatters.py:128 msgid "{months} month ago" @@ -1537,6 +1559,7 @@ msgid_plural "{months} months ago" msgstr[0] "pred {months} mesiacmi" msgstr[1] "pred {months} mesiacom" msgstr[2] "pred {months} mesiacmi" +msgstr[3] "pred {months} mesiacmi" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" @@ -1544,6 +1567,7 @@ msgid_plural "over {years} years ago" msgstr[0] "pred viac než {years} rokmi" msgstr[1] "pred viac než {years} rokom" msgstr[2] "pred viac než {years} rokmi" +msgstr[3] "pred viac než {years} rokmi" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1639,6 +1663,7 @@ msgid_plural "{number} views" msgstr[0] "{number} videní" msgstr[1] "{number} videnie" msgstr[2] "{number} videní" +msgstr[3] "{number} videní" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" @@ -1646,6 +1671,7 @@ msgid_plural "{number} recent views" msgstr[0] "{number} nedávnych videní" msgstr[1] "{number} nedávne videnie" msgstr[2] "{number} nedávnych videní" +msgstr[3] "{number} nedávnych videní" #: ckan/lib/mailer.py:39 #, python-format @@ -2428,6 +2454,7 @@ msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2578,6 +2605,111 @@ msgstr "Ukázať viac" msgid "Hide" msgstr "Skryť" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2618,6 +2750,7 @@ msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "Zobraziť (%(num)d novú položku)" msgstr[1] "Zobraziť (%(num)d nové položky)" msgstr[2] "Zobraziť (%(num)d nové položky)" +msgstr[3] "Zobraziť (%(num)d nové položky)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -3023,21 +3156,21 @@ msgstr "Pokiaľ chcete pozvať nového používateľa, zadajte jeho e-mail" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Rola" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Skutočne chcete odstrániť tohto člena?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3439,6 +3572,7 @@ msgid_plural "{count} members" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3504,8 +3638,8 @@ msgstr "Zopár informácií o mojej organizácií" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Ste si istý, že chcete zmazať Organizáciu? Súčasne zmažete aj všetky verejné" " a súkromné datasety, ktoré boli vytvorené za túto organizáciu." @@ -4289,6 +4423,7 @@ msgid_plural "{number} datasets found for \"{query}\"" msgstr[0] "{number} dataset nájdený na dopyt \"{query}\"" msgstr[1] "{number} datasety nájdené na dopyt \"{query}\"" msgstr[2] "{number} datasetov nájdených na dopyt\"{query}\"" +msgstr[3] "{number} datasetov nájdených na dopyt\"{query}\"" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4300,6 +4435,7 @@ msgid_plural "{number} datasets found" msgstr[0] "{number} dataset nájdený" msgstr[1] "{number} datasety nájdené" msgstr[2] "{number} datasetov nájdených" +msgstr[3] "{number} datasetov nájdených" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4311,6 +4447,7 @@ msgid_plural "{number} groups found for \"{query}\"" msgstr[0] "{number} skupina nájdená na dopyt \"{query}\"" msgstr[1] "{number} skupiny nájdené na dopyt \"{query}\"" msgstr[2] "{number} skupín nájdených na dopyt \"{query}\"" +msgstr[3] "{number} skupín nájdených na dopyt \"{query}\"" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4322,6 +4459,7 @@ msgid_plural "{number} groups found" msgstr[0] "{number} skupina nájdená" msgstr[1] "{number} skupiny nájdené" msgstr[2] "{number} skupín nájdených" +msgstr[3] "{number} skupín nájdených" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4333,6 +4471,7 @@ msgid_plural "{number} organizations found for \"{query}\"" msgstr[0] "{number} organizácia nájdená na dopyt \"{query}\"" msgstr[1] "{number} organizácie nájdené na dopyt \"{query}\"" msgstr[2] "{number} organizácií nájdených na dopyt \"{query}\"" +msgstr[3] "{number} organizácií nájdených na dopyt \"{query}\"" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4344,6 +4483,7 @@ msgid_plural "{number} organizations found" msgstr[0] "{number} organizácia nájdená" msgstr[1] "{number} organizácie nájdené" msgstr[2] "{number} organizácií nájdených" +msgstr[3] "{number} organizácií nájdených" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4688,3 +4828,7 @@ msgstr "Žiadny nasledovatelia" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Hľadať používateľov" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/sl/LC_MESSAGES/ckan.mo b/ckan/i18n/sl/LC_MESSAGES/ckan.mo index b888321fa95..0bc99a612bc 100644 Binary files a/ckan/i18n/sl/LC_MESSAGES/ckan.mo and b/ckan/i18n/sl/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/sl/LC_MESSAGES/ckan.po b/ckan/i18n/sl/LC_MESSAGES/ckan.po index cdf2597646a..33b6744f2c7 100644 --- a/ckan/i18n/sl/LC_MESSAGES/ckan.po +++ b/ckan/i18n/sl/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Slovenian (https://www.transifex.com/okfn/teams/11162/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "DataStore vir ni na voljo" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -263,7 +269,18 @@ msgstr "Nalaganje..." msgid "Data API" msgstr "Podatkovni API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Več informacij o glavnem CKAN podatkovnem API-ju in DataStore " +"dokumentacija.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabela" @@ -3029,21 +3046,21 @@ msgstr "Če želite povabiti novega člana, vnesite njihov email naslov." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Vloga" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Ste preprićani da želite izbrisati tega člana?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3518,8 +3535,8 @@ msgstr "Nekaj informacij o moji organizaciji..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Ste prepričani, da želite izbrisati to organizacijo? To bo izbrisalo vse " "javne in zasebne nabore podatkov, ki pripadajo tej organizaciji." @@ -4706,3 +4723,7 @@ msgstr "Ni sledilcev" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Preišči uporabnike" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/sq/LC_MESSAGES/ckan.mo b/ckan/i18n/sq/LC_MESSAGES/ckan.mo index f61188bd218..213c77d8f9a 100644 Binary files a/ckan/i18n/sq/LC_MESSAGES/ckan.mo and b/ckan/i18n/sq/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/sq/LC_MESSAGES/ckan.po b/ckan/i18n/sq/LC_MESSAGES/ckan.po index c63924834f0..6b7a34c0a72 100644 --- a/ckan/i18n/sq/LC_MESSAGES/ckan.po +++ b/ckan/i18n/sq/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Albanian (https://www.transifex.com/okfn/teams/11162/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Burimi i depove të të dhënave nuk u gjet" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -264,7 +270,18 @@ msgstr "Duke u ngarkuar..." msgid "Data API" msgstr "API i të dhënave" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Informata shtesë në API kryesor të të dhënave të CKAN dhe dokumentimi i depos " +"të të dhënave.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Tabela" @@ -2294,14 +2311,6 @@ msgid "User %s not authorized to update term_translation table" msgstr "" "Përdoruesi %s nuk është i autorizuar të ndryshoj tabelën e term_translation" -#: ckan/logic/auth/update.py:262 -msgid "Valid API key needed to edit a package" -msgstr "Çelës valid i API-së nevojitet për t'a redaktuar një paketë" - -#: ckan/logic/auth/update.py:272 -msgid "Valid API key needed to edit a group" -msgstr "Çelës valid i API-së nevojitet për t'a redaktuar një grup" - #: ckan/model/license.py:222 msgid "License not specified" msgstr "Licenca nuk është specifikuar" @@ -3016,21 +3025,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Roli" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "A jeni i sigurtë që dëshironi të fshini këtë anëtar?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3488,8 +3497,8 @@ msgstr "Disa informacione rreth organizatës time..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Jeni të sigurtë që doni ta fshini këtë organizatë? Kjo do të fshijë të " "gjitha setet e të dhënave publike dhe private që i përkasin kësaj " @@ -4664,3 +4673,7 @@ msgstr "Asnjë ndjekës" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Kërko përdorues" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/sr/LC_MESSAGES/ckan.mo b/ckan/i18n/sr/LC_MESSAGES/ckan.mo index ae979eed94e..d5edc0d36d5 100644 Binary files a/ckan/i18n/sr/LC_MESSAGES/ckan.mo and b/ckan/i18n/sr/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/sr/LC_MESSAGES/ckan.po b/ckan/i18n/sr/LC_MESSAGES/ckan.po index d091025ebb5..d127892c439 100644 --- a/ckan/i18n/sr/LC_MESSAGES/ckan.po +++ b/ckan/i18n/sr/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Serbian (https://www.transifex.com/okfn/teams/11162/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "Учитавање ..." msgid "Data API" msgstr "АПИ података" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -2985,21 +2998,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3428,8 +3441,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4573,3 +4586,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.mo b/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.mo index 365e98e94f2..720a69c84e6 100644 Binary files a/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.mo and b/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.po b/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.po index 6170b3e47ef..9ffce7b5e33 100644 --- a/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.po +++ b/ckan/i18n/sr_Latn/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" -"Language-Team: Serbian (Latin) (https://www.transifex.com/okfn/teams/11162/sr@latin/)\n" +"Last-Translator: Adrià Mercader , 2018\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/okfn/teams/11162/sr%40latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" @@ -113,13 +113,18 @@ msgstr "" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" -#: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 -#: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 -#: ckanext/datastore/logic/action.py:534 ckanext/datastore/logic/action.py:559 +#: ckanext/datastore/logic/action.py:258 ckanext/datastore/logic/action.py:286 +#: ckanext/datastore/logic/action.py:344 ckanext/datastore/logic/action.py:457 msgid "Resource \"{0}\" was not found." msgstr "" @@ -254,7 +259,14 @@ msgstr "Učitаvаnje ..." msgid "Data API" msgstr "API podаtаkа" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -2985,21 +2997,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3428,8 +3440,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4573,3 +4585,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/sv/LC_MESSAGES/ckan.mo b/ckan/i18n/sv/LC_MESSAGES/ckan.mo index b6dceb8c9a5..e32c57be26f 100644 Binary files a/ckan/i18n/sv/LC_MESSAGES/ckan.mo and b/ckan/i18n/sv/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/sv/LC_MESSAGES/ckan.po b/ckan/i18n/sv/LC_MESSAGES/ckan.po index 5d7cb535723..c92b201e15a 100644 --- a/ckan/i18n/sv/LC_MESSAGES/ckan.po +++ b/ckan/i18n/sv/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Swedish (https://www.transifex.com/okfn/teams/11162/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Hittade inte DataStore-resursen" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -260,7 +266,17 @@ msgstr "Laddar..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +" Mer information finns i main CKAN Data API and DataStore documentation.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "tabell" @@ -2278,14 +2294,6 @@ msgid "User %s not authorized to update term_translation table" msgstr "" "Användare %s saknar behörighet att uppdatera tabellen term_translation" -#: ckan/logic/auth/update.py:262 -msgid "Valid API key needed to edit a package" -msgstr "Giltig API-nyckel behövs för att redigera ett paket" - -#: ckan/logic/auth/update.py:272 -msgid "Valid API key needed to edit a group" -msgstr "Giltig API-nyckeln behövs för att redigera en grupp" - #: ckan/model/license.py:222 msgid "License not specified" msgstr "Licens har inte angetts" @@ -3011,21 +3019,21 @@ msgstr "Om du vill bjuda in en ny användare, mata in dess e-postadress." #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Roll" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Vill du verkligen radera denna medlem?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3498,8 +3506,8 @@ msgstr "Lite information om min organisation..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Vill du verkligen radera denna organisation? Detta kommer att radera alla " "publika och privata dataset som hör till denna organisation." @@ -4674,3 +4682,7 @@ msgstr "Inga följare" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Sök användare" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/th/LC_MESSAGES/ckan.mo b/ckan/i18n/th/LC_MESSAGES/ckan.mo index 8e6340880c2..e9ed1f260a8 100644 Binary files a/ckan/i18n/th/LC_MESSAGES/ckan.mo and b/ckan/i18n/th/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/th/LC_MESSAGES/ckan.po b/ckan/i18n/th/LC_MESSAGES/ckan.po index 47cf4854751..8727b015794 100644 --- a/ckan/i18n/th/LC_MESSAGES/ckan.po +++ b/ckan/i18n/th/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Pongkiat Jongtriluck , 2018\n" "Language-Team: Thai (https://www.transifex.com/okfn/teams/11162/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: th\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -109,13 +109,21 @@ msgstr "" #: ckanext/datastore/controller.py:58 msgid "DataStore resource not found" -msgstr "ไม่พบคลังข้อมูลทรัพยากร" +msgstr "ไม่พบทรัพยากรที่จัดเก็บข้อมูล" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "" +"ข้อมูลไม่ถูกต้อง (ตัวอย่างเช่น " +"ค่าของตัวเลขอยู่นอกขอบเขตที่กำหนดหรือถูกนำไปใส่ในฟิลด์สำหรับข้อความ)" #: ckanext/datastore/logic/action.py:262 ckanext/datastore/logic/action.py:290 #: ckanext/datastore/logic/action.py:348 ckanext/datastore/logic/action.py:459 @@ -204,7 +212,7 @@ msgstr "" #: ckanext/datastore/templates/package/resource_read.html:20 #: ckanext/datatablesview/templates/datatables/datatables_form.html:18 msgid "Label" -msgstr "" +msgstr "ป้ายกำกับ" #: ckan/templates/group/snippets/group_form.html:20 #: ckan/templates/organization/snippets/organization_form.html:20 @@ -229,11 +237,11 @@ msgstr "" #: ckanext/datastore/templates/package/resource_read.html:18 #: ckanext/datatablesview/templates/datatables/datatables_form.html:17 msgid "Column" -msgstr "" +msgstr "หลัก" #: ckanext/datastore/templates/package/resource_read.html:19 msgid "Type" -msgstr "" +msgstr "ประเภท" #: ckan/public/base/javascript/modules/activity-stream.js:97 #: ckan/public/base/javascript/modules/popover-context.js:62 @@ -254,25 +262,32 @@ msgstr "กำลังโหลด..." msgid "Data API" msgstr "Data API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 -msgid "Table" +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" msgstr "" +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 +msgid "Table" +msgstr "ตาราง" + #: ckanext/datatablesview/templates/datatables/datatables_form.html:6 msgid "Responsive display" -msgstr "" +msgstr "การแสดงผลแบบ Responsive" #: ckanext/datatablesview/templates/datatables/datatables_form.html:12 msgid "Show Columns" -msgstr "" +msgstr "แสดงหลัก" #: ckanext/datatablesview/templates/datatables/datatables_view.html:28 msgid "Hide/Unhide Columns" -msgstr "" +msgstr "แสดง/ซ่อนหลัก" #: ckanext/example_iconfigurer/templates/admin/config.html:11 msgid "Datasets per page" -msgstr "" +msgstr "ชุดข้อมูลต่อหน้า" #: ckanext/example_iconfigurer/templates/admin/config.html:13 msgid "Test conf" @@ -381,6 +396,7 @@ msgstr "0 ชุดข้อมูล" #: ckanext/example_theme_docs/v12_extra_public_dir/templates/home/snippets/promoted.html:4 msgid "CKAN's data previewing tool has many powerful features" msgstr "" +"เครื่องมือสำหรับการดูตัวอย่างข้อมูลของ CKAN มีฟีเจอร์ที่ทรงพลังจำนวนมาก" #: ckan/templates/group/followers.html:3 ckan/templates/group/followers.html:6 #: ckan/templates/group/snippets/info.html:32 @@ -427,12 +443,12 @@ msgstr "" #: ckanext/reclineview/plugin.py:171 #: ckanext/reclineview/theme/public/recline_view.js:200 msgid "Graph" -msgstr "" +msgstr "กราฟ" #: ckanext/reclineview/plugin.py:231 #: ckanext/reclineview/theme/public/recline_view.js:207 msgid "Map" -msgstr "" +msgstr "แผนที่" #: ckanext/reclineview/theme/public/recline_view.js:28 msgid "error loading view" @@ -440,7 +456,7 @@ msgstr "" #: ckanext/reclineview/theme/public/recline_view.js:75 msgid "Could not load view" -msgstr "" +msgstr "ไม่สามารถโหลดวิวได้" #: ckanext/reclineview/theme/public/recline_view.js:77 msgid "DataStore returned an error" @@ -472,7 +488,7 @@ msgstr "" #: ckanext/reclineview/theme/templates/recline_graph_form.html:4 #: ckanext/reclineview/theme/templates/recline_map_form.html:4 msgid "Number of rows" -msgstr "" +msgstr "จำนวนแถว" #: ckanext/reclineview/theme/templates/recline_graph_form.html:4 #: ckanext/reclineview/theme/templates/recline_map_form.html:4 @@ -481,7 +497,7 @@ msgstr "" #: ckanext/reclineview/theme/templates/recline_graph_form.html:6 msgid "Graph type" -msgstr "" +msgstr "ประเภทกราฟ" #: ckanext/reclineview/theme/templates/recline_graph_form.html:7 msgid "Group (Axis 1)" @@ -493,19 +509,19 @@ msgstr "" #: ckanext/reclineview/theme/templates/recline_map_form.html:6 msgid "Field type" -msgstr "" +msgstr "ประเภทฟิลด์" #: ckanext/reclineview/theme/templates/recline_map_form.html:7 msgid "Latitude field" -msgstr "" +msgstr "ฟิลด์ละติจูด" #: ckanext/reclineview/theme/templates/recline_map_form.html:8 msgid "Longitude field" -msgstr "" +msgstr "ฟิลด์ลองจิจูด" #: ckanext/reclineview/theme/templates/recline_map_form.html:9 msgid "GeoJSON field" -msgstr "" +msgstr "ฟิลด์ GeoJSON" #: ckanext/reclineview/theme/templates/recline_map_form.html:10 msgid "Auto zoom to features" @@ -632,19 +648,20 @@ msgstr "จำนวนชุดข้อมูลทั้งหมด" #: ckanext/textview/plugin.py:67 ckanext/textview/plugin.py:69 msgid "Text" -msgstr "" +msgstr "ข้อความ" #: ckanext/webpageview/plugin.py:21 ckanext/webpageview/plugin.py:26 msgid "Website" -msgstr "" +msgstr "เว็บไซต์" #: ckanext/webpageview/theme/templates/webpage_form.html:3 msgid "Web Page url" -msgstr "" +msgstr "URL ของเว็บเพจ" #: ckanext/webpageview/theme/templates/webpage_form.html:3 msgid "eg. http://example.com (if blank uses resource url)" msgstr "" +"ตัวอย่างเช่น http://example.com (ถ้าปล่อยว่างจะใช้ URL ของแหล่งข้อมูล)" #: ckan/templates/dataviewer/snippets/data_preview.html:23 #: ckan/templates/package/snippets/resource_view.html:56 @@ -958,17 +975,22 @@ msgstr "กลุ่มถูกลบออกแล้ว" #: ckan/controllers/group.py:624 #, python-format msgid "%s has been deleted." -msgstr "" +msgstr "%s ถูกลบไปแล้ว" #: ckan/controllers/group.py:653 #, python-format msgid "User %r not authorized to edit members of %s" -msgstr "" +msgstr "ผู้ใช้ %r ไม่ได้รับอนุญาตให้แก้ไขสมาชิกของ %s" + +#: ckan/controllers/group.py:670 +#, python-format +msgid "Unauthorized to create group %s members" +msgstr "ไม่ได้รับอนุญาตให้สร้างสมาชิกในกลุ่ม %s" -#: ckan/controllers/group.py:705 +#: ckan/controllers/group.py:712 #, python-format msgid "Unauthorized to add member to group %s" -msgstr "ไม่ได้รับการอนุญาตให้เพิ่มสมาชิกลงในกลุ่ม %s" +msgstr "ไม่ได้รับอนุญาตให้เพิ่มสมาชิกในกลุ่ม %s" #: ckan/controllers/group.py:724 ckan/controllers/group.py:737 #, python-format @@ -1026,11 +1048,11 @@ msgstr "%s ใช้อีเมลสำหรับการตั้งค่ #: ckan/controllers/package.py:288 msgid "Invalid search query: {error_message}" -msgstr "" +msgstr "คำค้นไม่ถูกต้อง:{error_message}" #: ckan/controllers/package.py:304 msgid "Parameter \"{parameter_name}\" is not an integer" -msgstr "พารามิเตอร์ \"{parameter_name}\" ไม่ใช่ตัวเลข" +msgstr "พารามิเตอร์ \"{parameter_name}\" ไม่ใช่เลขจำนวนเต็ม" #: ckan/controllers/package.py:324 ckan/controllers/package.py:332 #: ckan/controllers/package.py:370 ckan/controllers/package.py:437 @@ -1052,7 +1074,7 @@ msgstr "รูปแบบรุ่นไม่ถูกต้อง: %r" #: ckan/controllers/package.py:396 msgid "Viewing datasets of type \"{package_type}\" is not supported ({file_!r})." -msgstr "" +msgstr "({file_!r}) ไม่สนับสนุนการดูชุดข้อมูลประเภท \"{package_type}\"" #: ckan/controllers/package.py:435 ckan/controllers/package.py:817 #: ckan/controllers/package.py:918 ckan/controllers/package.py:966 @@ -1096,7 +1118,7 @@ msgstr "ไม่ได้รับการอนุญาตให้สร้ #: ckan/controllers/package.py:714 msgid "Unauthorized to create a resource for this package" -msgstr "" +msgstr "ไม่ได้รับอนุญาตให้สร้างทรัพยากรสำหรับแพกเกจนี้" #: ckan/controllers/package.py:928 msgid "Unable to add package to search index." @@ -1148,7 +1170,7 @@ msgstr "ไม่ได้รับการอนุญาตให้อ่า #: ckan/controllers/package.py:1468 msgid "Unauthorized to edit resource" -msgstr "" +msgstr "ไม่ได้รับอนุญาตให้แก้ไขทรัพยากร" #: ckan/controllers/package.py:1486 msgid "View not found" @@ -2971,21 +2993,21 @@ msgstr "ถ้าคุณต้องการเชิญผู้ใช้ใ #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "หน้าที่" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "คุณแน่ใจว่าต้องการลบสมาชิกนี้?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3447,9 +3469,9 @@ msgstr "ข้อมูลเบื้องต้นเกี่ยวกับ #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." -msgstr "คุณแน่ใจว่าคุณต้องการลบองค์กรนี้ ซึ่งจะลบชุดข้อมูลทั้งหมดขององค์กรนี้" +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." +msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -3623,7 +3645,7 @@ msgstr "แหล่ง: %(dataset)s" #: ckan/templates/package/resource_read.html:109 msgid "There are no views created for this resource yet." -msgstr "" +msgstr "ยังไม่มีการสร้างวิวสำหรับทรัพยากรนี้" #: ckan/templates/package/resource_read.html:113 msgid "Not seeing the views you were expecting?" @@ -3635,7 +3657,7 @@ msgstr "" #: ckan/templates/package/resource_read.html:120 msgid "No view has been created that is suitable for this resource" -msgstr "" +msgstr "ไม่มีวิวที่สร้างไว้แล้วซึ่งเหมาะสมกับทรัพยากรนี้" #: ckan/templates/package/resource_read.html:121 msgid "The site administrators may not have enabled the relevant view plugins" @@ -3703,7 +3725,7 @@ msgstr "" #: ckan/templates/package/resource_views.html:28 msgid "This resource has no views" -msgstr "" +msgstr "ทรัพยากรนี้ยังไม่มีวิว" #: ckan/templates/package/resources.html:8 msgid "Add new resource" @@ -3971,7 +3993,7 @@ msgstr "สิ้นสุด" #: ckan/templates/package/snippets/resource_help.html:2 msgid "What's a resource?" -msgstr "อะไรคือทรัพยากร" +msgstr "อะไรคือทรัพยากร?" #: ckan/templates/package/snippets/resource_help.html:4 msgid "A resource can be any file or link to a file containing useful data." @@ -3996,7 +4018,7 @@ msgstr "" #: ckan/templates/package/snippets/resource_view.html:63 msgid "Embed resource view" -msgstr "" +msgstr "ฝังวิวของทรัพยากร" #: ckan/templates/package/snippets/resource_view.html:66 msgid "" @@ -4593,3 +4615,7 @@ msgstr "ไม่มีผู้ติดตาม" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "ค้นหาผู้ใช้" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/tl/LC_MESSAGES/ckan.mo b/ckan/i18n/tl/LC_MESSAGES/ckan.mo index ae6726a5392..297944c2c18 100644 Binary files a/ckan/i18n/tl/LC_MESSAGES/ckan.mo and b/ckan/i18n/tl/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/tr/LC_MESSAGES/ckan.mo b/ckan/i18n/tr/LC_MESSAGES/ckan.mo index f89075cb9fa..e15f3932905 100644 Binary files a/ckan/i18n/tr/LC_MESSAGES/ckan.mo and b/ckan/i18n/tr/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/tr/LC_MESSAGES/ckan.po b/ckan/i18n/tr/LC_MESSAGES/ckan.po index 12743ac080e..946d4edf907 100644 --- a/ckan/i18n/tr/LC_MESSAGES/ckan.po +++ b/ckan/i18n/tr/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Turkish (https://www.transifex.com/okfn/teams/11162/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "" msgid "Data API" msgstr "" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -2964,21 +2977,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3406,8 +3419,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4547,3 +4560,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Kullanıcı arama" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/uk/LC_MESSAGES/ckan.mo b/ckan/i18n/uk/LC_MESSAGES/ckan.mo index 9aa014c22a6..7a0a0a72306 100644 Binary files a/ckan/i18n/uk/LC_MESSAGES/ckan.mo and b/ckan/i18n/uk/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/uk/LC_MESSAGES/ckan.po b/ckan/i18n/uk/LC_MESSAGES/ckan.po index f4461acadbf..3295d8a4c1c 100644 --- a/ckan/i18n/uk/LC_MESSAGES/ckan.po +++ b/ckan/i18n/uk/LC_MESSAGES/ckan.po @@ -1,23 +1,23 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kate Svetocheva , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Ukrainian (https://www.transifex.com/okfn/teams/11162/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: uk\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: ckanext/datapusher/helpers.py:21 msgid "Complete" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -254,7 +260,14 @@ msgstr "Завантаження..." msgid "Data API" msgstr "" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Таблиця" @@ -372,6 +385,7 @@ msgid_plural "{num} Datasets" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -1438,6 +1452,7 @@ msgid_plural "{n} new activities from {site_title}" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:19 msgid "January" @@ -1497,6 +1512,7 @@ msgid_plural "{mins} minutes ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" @@ -1504,6 +1520,7 @@ msgid_plural "{hours} hours ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:125 msgid "{days} day ago" @@ -1511,6 +1528,7 @@ msgid_plural "{days} days ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:128 msgid "{months} month ago" @@ -1518,6 +1536,7 @@ msgid_plural "{months} months ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" @@ -1525,6 +1544,7 @@ msgid_plural "over {years} years ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1620,6 +1640,7 @@ msgid_plural "{number} views" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" @@ -1627,6 +1648,7 @@ msgid_plural "{number} recent views" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/lib/mailer.py:39 #, python-format @@ -2399,6 +2421,7 @@ msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2549,6 +2572,111 @@ msgstr "" msgid "Hide" msgstr "" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2587,6 +2715,7 @@ msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -2973,21 +3102,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3354,6 +3483,7 @@ msgid_plural "{count} members" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3416,8 +3546,8 @@ msgstr "" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 @@ -4169,6 +4299,7 @@ msgid_plural "{number} datasets found for \"{query}\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4180,6 +4311,7 @@ msgid_plural "{number} datasets found" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4191,6 +4323,7 @@ msgid_plural "{number} groups found for \"{query}\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4202,6 +4335,7 @@ msgid_plural "{number} groups found" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4213,6 +4347,7 @@ msgid_plural "{number} organizations found for \"{query}\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4224,6 +4359,7 @@ msgid_plural "{number} organizations found" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4561,3 +4697,7 @@ msgstr "" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/uk_UA/LC_MESSAGES/ckan.mo b/ckan/i18n/uk_UA/LC_MESSAGES/ckan.mo index 0e00a8f4a1e..d2debdf2e9a 100644 Binary files a/ckan/i18n/uk_UA/LC_MESSAGES/ckan.mo and b/ckan/i18n/uk_UA/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/uk_UA/LC_MESSAGES/ckan.po b/ckan/i18n/uk_UA/LC_MESSAGES/ckan.po index 3727ff10be0..a2b0771dd15 100644 --- a/ckan/i18n/uk_UA/LC_MESSAGES/ckan.po +++ b/ckan/i18n/uk_UA/LC_MESSAGES/ckan.po @@ -1,23 +1,23 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Zoriana Zaiats , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Ukrainian (Ukraine) (https://www.transifex.com/okfn/teams/11162/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: uk_UA\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: ckanext/datapusher/helpers.py:21 msgid "Complete" @@ -111,7 +111,13 @@ msgstr "Формат: має бути один з %s" msgid "DataStore resource not found" msgstr "Ресурс DataStore не знайдено" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -261,7 +267,18 @@ msgstr "Завантаження..." msgid "Data API" msgstr "API даних" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"Більше інформаціі в головній документації по CKAN Data API та " +"DataStore.

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "Таблиця" @@ -379,6 +396,7 @@ msgid_plural "{num} Datasets" msgstr[0] "{num} набір даних" msgstr[1] "{num} набори даних" msgstr[2] "{num} наборів даних" +msgstr[3] "{num} наборів даних" #: ckan/templates/group/snippets/group_item.html:34 #: ckan/templates/organization/snippets/organization_item.html:33 @@ -1461,6 +1479,7 @@ msgid_plural "{n} new activities from {site_title}" msgstr[0] "{n} нова активність від {site_title}" msgstr[1] "{n} нові активності від {site_title}" msgstr[2] "{n} нових активностей від {site_title}" +msgstr[3] "{n} нових активностей від {site_title}" #: ckan/lib/formatters.py:19 msgid "January" @@ -1520,6 +1539,7 @@ msgid_plural "{mins} minutes ago" msgstr[0] "{mins} хвилину тому" msgstr[1] "{mins} хвилини тому" msgstr[2] "{mins} хвилин тому" +msgstr[3] "{mins} хвилин тому" #: ckan/lib/formatters.py:119 msgid "{hours} hour ago" @@ -1527,6 +1547,7 @@ msgid_plural "{hours} hours ago" msgstr[0] "{hours} годину тому" msgstr[1] "{hours} години тому" msgstr[2] "{hours} годин тому" +msgstr[3] "{hours} годин тому" #: ckan/lib/formatters.py:125 msgid "{days} day ago" @@ -1534,6 +1555,7 @@ msgid_plural "{days} days ago" msgstr[0] "{days} день тому" msgstr[1] "{days} дні тому" msgstr[2] "{days} днів тому" +msgstr[3] "{days} днів тому" #: ckan/lib/formatters.py:128 msgid "{months} month ago" @@ -1541,6 +1563,7 @@ msgid_plural "{months} months ago" msgstr[0] "{months} місяць назад" msgstr[1] "{months} місяці назад" msgstr[2] "{months} місяців назад" +msgstr[3] "{months} місяців назад" #: ckan/lib/formatters.py:130 msgid "over {years} year ago" @@ -1548,6 +1571,7 @@ msgid_plural "over {years} years ago" msgstr[0] "більше {years} року назад" msgstr[1] "більше {years} років назад" msgstr[2] "більше {years} років назад" +msgstr[3] "більше {years} років назад" #: ckan/lib/formatters.py:146 msgid "{month} {day}, {year}, {hour:02}:{min:02} ({timezone})" @@ -1643,6 +1667,7 @@ msgid_plural "{number} views" msgstr[0] "{number} перегляд" msgstr[1] "{number} перегляди" msgstr[2] "{number} переглядів" +msgstr[3] "{number} переглядів" #: ckan/lib/helpers.py:1650 msgid "{number} recent view" @@ -1650,6 +1675,7 @@ msgid_plural "{number} recent views" msgstr[0] "{number} недавній перегляд" msgstr[1] "{number} недавніх переглядів" msgstr[2] "{number} недавніх переглядів" +msgstr[3] "{number} недавніх переглядів" #: ckan/lib/mailer.py:39 #, python-format @@ -2306,10 +2332,6 @@ msgid "User %s not authorized to update term_translation table" msgstr "" "Користувач %s не має достатньо прав для оновлення таблиці term_translation" -#: ckan/logic/auth/update.py:262 -msgid "Valid API key needed to edit a package" -msgstr "Для редагування пакету необхідний дійсний ключ API" - #: ckan/logic/auth/update.py:272 msgid "Valid API key needed to edit a group" msgstr "Для редагування групи необхідний дійсний ключ API" @@ -2442,6 +2464,7 @@ msgid_plural "Input is too short, must be at least %(num)d characters" msgstr[0] "Ввід надто короткий, має бути хоча би один символ" msgstr[1] "Ввід надто короткий, має бути хоча би %(num)d символа" msgstr[2] "Ввід надто короткий, має бути хоча би %(num)d символ" +msgstr[3] "Ввід надто короткий, має бути хоча би %(num)d символ" #: ckan/public/base/javascript/modules/basic-form.js:4 msgid "There are unsaved modifications to this form" @@ -2594,6 +2617,111 @@ msgstr "Показати більше" msgid "Hide" msgstr "Сховати" +#: ckan/public-bs2/base/test/spec/i18n.spec.js:13 +#: ckan/public-bs2/base/test/spec/module.spec.js:385 +#: ckan/public/base/test/spec/i18n.spec.js:13 +#: ckan/public/base/test/spec/module.spec.js:385 +msgid "foo" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:17 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:46 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:50 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:54 +#: ckan/public/base/test/spec/i18n.spec.js:17 +#: ckan/public/base/test/spec/i18n.spec.js:46 +#: ckan/public/base/test/spec/i18n.spec.js:50 +#: ckan/public/base/test/spec/i18n.spec.js:54 +msgid "no translation" +msgid_plural "no translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:22 +#: ckan/public/base/test/spec/i18n.spec.js:22 +#, python-format +msgid "hello %(name)s!" +msgstr "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:29 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:76 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:81 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:86 +#: ckan/public/base/test/spec/i18n.spec.js:29 +#: ckan/public/base/test/spec/i18n.spec.js:76 +#: ckan/public/base/test/spec/i18n.spec.js:81 +#: ckan/public/base/test/spec/i18n.spec.js:86 +#, python-format +msgid "no %(attr)s translation" +msgid_plural "no %(attr)s translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:39 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:40 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:41 +#: ckan/public-bs2/base/test/spec/module.spec.js:395 +#: ckan/public-bs2/base/test/spec/module.spec.js:396 +#: ckan/public-bs2/base/test/spec/module.spec.js:397 +#: ckan/public/base/test/spec/i18n.spec.js:39 +#: ckan/public/base/test/spec/i18n.spec.js:40 +#: ckan/public/base/test/spec/i18n.spec.js:41 +#: ckan/public/base/test/spec/module.spec.js:395 +#: ckan/public/base/test/spec/module.spec.js:396 +#: ckan/public/base/test/spec/module.spec.js:397 +msgid "bar" +msgid_plural "bars" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:61 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:65 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:69 +#: ckan/public/base/test/spec/i18n.spec.js:61 +#: ckan/public/base/test/spec/i18n.spec.js:65 +#: ckan/public/base/test/spec/i18n.spec.js:69 +#, python-format +msgid "%(color)s shirt" +msgid_plural "%(color)s shirts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:93 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:94 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:95 +#: ckan/public/base/test/spec/i18n.spec.js:93 +#: ckan/public/base/test/spec/i18n.spec.js:94 +#: ckan/public/base/test/spec/i18n.spec.js:95 +#, python-format +msgid "%(num)d item" +msgid_plural "%(num)d items" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ckan/public-bs2/base/test/spec/i18n.spec.js:100 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:105 +#: ckan/public-bs2/base/test/spec/i18n.spec.js:110 +#: ckan/public/base/test/spec/i18n.spec.js:100 +#: ckan/public/base/test/spec/i18n.spec.js:105 +#: ckan/public/base/test/spec/i18n.spec.js:110 +#, python-format +msgid "%(num)d missing translation" +msgid_plural "%(num)d missing translations" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: ckan/templates/error_document_template.html:3 #, python-format msgid "Error %(error_code)s" @@ -2634,6 +2762,7 @@ msgid_plural "Dashboard (%(num)d new items)" msgstr[0] "Панель приладів (%(num)d новий елемент)" msgstr[1] "Панель приладів (%(num)d нові елементи)" msgstr[2] "Панель приладів (%(num)d нових елементів)" +msgstr[3] "Панель приладів (%(num)d нових елементів)" #: ckan/templates/header.html:29 ckan/templates/user/dashboard.html:6 msgid "Dashboard" @@ -3027,21 +3156,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Роль" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Ви впевнені, що хочете видалити цього учасника?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3443,6 +3572,7 @@ msgid_plural "{count} members" msgstr[0] "{count} член" msgstr[1] "{count} члена" msgstr[2] "{count} членів" +msgstr[3] "{count} членів" #: ckan/templates/organization/new.html:3 #: ckan/templates/organization/new.html:5 @@ -3514,8 +3644,8 @@ msgstr "Коротко про мою організацію..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Ви впевнені, що хочете видалити цю Організацію? Це призведе до видалення " "всіх публічних і приватних наборів даних, що належать до цієї організації." @@ -4304,6 +4434,7 @@ msgid_plural "{number} datasets found for \"{query}\"" msgstr[0] "{number} набір даних знайдений за запитом \"{query}\"" msgstr[1] "{number} набори даних знайдено за запитом \"{query}\"" msgstr[2] "{number} наборів даних знайдено за запитом \"{query}\"" +msgstr[3] "{number} наборів даних знайдено за запитом \"{query}\"" #: ckan/templates/snippets/search_result_text.html:16 msgid "No datasets found for \"{query}\"" @@ -4315,6 +4446,7 @@ msgid_plural "{number} datasets found" msgstr[0] "{number} набір даних знайдено" msgstr[1] "{number} набори даних знайдено" msgstr[2] "{number} наборів даних знайдено" +msgstr[3] "{number} наборів даних знайдено" #: ckan/templates/snippets/search_result_text.html:18 msgid "No datasets found" @@ -4326,6 +4458,7 @@ msgid_plural "{number} groups found for \"{query}\"" msgstr[0] "{number} групу знайдено за запитом \"{query}\"" msgstr[1] "{number} групи знайдено за запитом \"{query}\"" msgstr[2] "{number} груп знайдено за запитом \"{query}\"" +msgstr[3] "{number} груп знайдено за запитом \"{query}\"" #: ckan/templates/snippets/search_result_text.html:22 msgid "No groups found for \"{query}\"" @@ -4337,6 +4470,7 @@ msgid_plural "{number} groups found" msgstr[0] "{number} групу знайдено" msgstr[1] "{number} групи знайдено" msgstr[2] "{number} груп знайдено" +msgstr[3] "{number} груп знайдено" #: ckan/templates/snippets/search_result_text.html:24 msgid "No groups found" @@ -4348,6 +4482,7 @@ msgid_plural "{number} organizations found for \"{query}\"" msgstr[0] "{number} організацію знайдено за запитом \"{query}\"" msgstr[1] "{number} організації знайдено за запитом \"{query}\"" msgstr[2] "{number} організацій знайдено за запитом \"{query}\"" +msgstr[3] "{number} організацій знайдено за запитом \"{query}\"" #: ckan/templates/snippets/search_result_text.html:28 msgid "No organizations found for \"{query}\"" @@ -4359,6 +4494,7 @@ msgid_plural "{number} organizations found" msgstr[0] "{number} організацію знайдено" msgstr[1] "{number} організації знайдено" msgstr[2] "{number} організацій знайдено" +msgstr[3] "{number} організацій знайдено" #: ckan/templates/snippets/search_result_text.html:30 msgid "No organizations found" @@ -4703,3 +4839,7 @@ msgstr "Підписників немає" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Шукати користувача" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/vi/LC_MESSAGES/ckan.mo b/ckan/i18n/vi/LC_MESSAGES/ckan.mo index bc69eb74b4d..16a39b05408 100644 Binary files a/ckan/i18n/vi/LC_MESSAGES/ckan.mo and b/ckan/i18n/vi/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/vi/LC_MESSAGES/ckan.po b/ckan/i18n/vi/LC_MESSAGES/ckan.po index 3bfc250152a..0f5f295d954 100644 --- a/ckan/i18n/vi/LC_MESSAGES/ckan.po +++ b/ckan/i18n/vi/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Vietnamese (https://www.transifex.com/okfn/teams/11162/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -111,7 +111,13 @@ msgstr "" msgid "DataStore resource not found" msgstr "Không tìm thấy nguồn kho dữ liệu" -#: ckanext/datastore/backend/postgres.py:1052 +#: ckanext/datastore/controller.py:101 +msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." @@ -257,7 +263,14 @@ msgstr "Đang tải" msgid "Data API" msgstr "Dữ liệu API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "" @@ -2983,21 +2996,21 @@ msgstr "" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "Vai trò" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "Bạn có muốn xóa thành viên này không?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3458,8 +3471,8 @@ msgstr "Một vài thông tin về tổ chức của tôi..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." msgstr "" "Bạn có chắc muốn xóa Tổ chức này không? Tất cả những bộ dữ liệu công khai và" " cá nhân thuộc về tổ chức này cũng sẽ bị xóa." @@ -4612,3 +4625,7 @@ msgstr "Không có người theo dõi" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "Tìm kiếm người sử dụng" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/zh_CN/LC_MESSAGES/ckan.mo b/ckan/i18n/zh_CN/LC_MESSAGES/ckan.mo index af742cf989e..afbf3f613cc 100644 Binary files a/ckan/i18n/zh_CN/LC_MESSAGES/ckan.mo and b/ckan/i18n/zh_CN/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/zh_CN/LC_MESSAGES/ckan.po b/ckan/i18n/zh_CN/LC_MESSAGES/ckan.po index 6b500cbb4ba..f73eea23d41 100644 --- a/ckan/i18n/zh_CN/LC_MESSAGES/ckan.po +++ b/ckan/i18n/zh_CN/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Chinese (China) (https://www.transifex.com/okfn/teams/11162/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -113,6 +113,12 @@ msgstr "" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "数据不合法(比如: 数值越界或数值插入字符字段)" @@ -256,7 +262,14 @@ msgstr "读取中..." msgid "Data API" msgstr "数据 API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "表格" @@ -2972,21 +2985,21 @@ msgstr "如果你想邀请一个新用户,请输入他的邮件地址。" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "角色" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "你确定要删除此成员吗?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3441,9 +3454,9 @@ msgstr "关于我的组织的一些资讯" #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." -msgstr "你是否确定要删除这个组织?这将会同时删除与组织关联的所有公开以及私有的数据集。" +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." +msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -4579,3 +4592,7 @@ msgstr "没有粉丝" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "搜索用户" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/i18n/zh_TW/LC_MESSAGES/ckan.mo b/ckan/i18n/zh_TW/LC_MESSAGES/ckan.mo index abf8ba18ab6..22e1b3e7f9e 100644 Binary files a/ckan/i18n/zh_TW/LC_MESSAGES/ckan.mo and b/ckan/i18n/zh_TW/LC_MESSAGES/ckan.mo differ diff --git a/ckan/i18n/zh_TW/LC_MESSAGES/ckan.po b/ckan/i18n/zh_TW/LC_MESSAGES/ckan.po index 24611d1df47..d6bcaf59083 100644 --- a/ckan/i18n/zh_TW/LC_MESSAGES/ckan.po +++ b/ckan/i18n/zh_TW/LC_MESSAGES/ckan.po @@ -1,21 +1,21 @@ # Translations template for ckan. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2018 ORGANIZATION # This file is distributed under the same license as the ckan project. -# FIRST AUTHOR , 2017. -# +# FIRST AUTHOR , 2018. +# #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ckan 2.7.0b0\n" +"Project-Id-Version: ckan 2.8.0b0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2017-06-21 15:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Adrià Mercader , 2017\n" +"Last-Translator: Adrià Mercader , 2018\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/okfn/teams/11162/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.4.0\n" +"Generated-By: Babel 2.5.3\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" @@ -113,6 +113,12 @@ msgstr "資料儲存之資源不存在" #: ckanext/datastore/backend/postgres.py:1052 msgid "" +"Data Dictionary saved. Any type overrides will take effect when the resource" +" is next uploaded to DataStore" +msgstr "" + +#: ckanext/datastore/backend/postgres.py:1032 +msgid "" "The data was invalid (for example: a numeric value is out of range or was " "inserted into a text field)." msgstr "無效的資料(例如:填入超出範圍的數值,或將數值填入文字欄位中)。" @@ -257,7 +263,17 @@ msgstr "讀取中..." msgid "Data API" msgstr "資料API" -#: ckanext/datatablesview/plugin.py:46 ckanext/reclineview/plugin.py:128 +#: ckanext/datastore/templates-bs2/ajax_snippets/api_info.html:24 +msgid "" +" Further information in the main CKAN Data API and DataStore documentation.

" +msgstr "" +"進一步的資訊位於 CKAN 資料 API 與 DataStore 文件

" + +#: ckanext/datatablesview/plugin.py:47 ckanext/reclineview/plugin.py:128 msgid "Table" msgstr "表格" @@ -2967,21 +2983,21 @@ msgstr "請在此輸入電子郵件位址,以邀請使用者加入" #: ckan/templates/group/member_new.html:55 #: ckan/templates/group/members.html:15 -#: ckan/templates/organization/member_new.html:56 +#: ckan/templates/organization/member_new.html:54 #: ckan/templates/organization/members.html:20 msgid "Role" msgstr "角色" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/organization/member_new.html:59 +#: ckan/templates/organization/member_new.html:57 #: ckan/templates/organization/members.html:36 msgid "Are you sure you want to delete this member?" msgstr "確定要刪除這個成員嗎?" #: ckan/templates/group/member_new.html:58 #: ckan/templates/group/members.html:31 -#: ckan/templates/group/snippets/group_form.html:60 +#: ckan/templates/group/snippets/group_form.html:38 #: ckan/templates/organization/bulk_process.html:47 #: ckan/templates/organization/member_new.html:59 #: ckan/templates/organization/members.html:36 @@ -3427,9 +3443,9 @@ msgstr "一些關於我的組織的資訊..." #: ckan/templates/organization/snippets/organization_form.html:60 msgid "" -"Are you sure you want to delete this Organization? This will delete all the " -"public and private datasets belonging to this organization." -msgstr "你確定要刪除這個組織嗎?這樣會刪除屬於這個組織的所有公開和非公開之資料集。" +"Are you sure you want to delete this Organization? Note*: Deleting cannot be" +" performed while public or private datasets belong to this organization." +msgstr "" #: ckan/templates/organization/snippets/organization_form.html:63 msgid "Save Organization" @@ -4571,3 +4587,7 @@ msgstr "沒有跟隨者" #: ckan/templates/user/snippets/user_search.html:5 msgid "Search Users" msgstr "搜尋使用者" + +#: ckan/views/user.py:588 +msgid "Your password must be 8 characters or longer." +msgstr "" diff --git a/ckan/lib/alphabet_paginate.py b/ckan/lib/alphabet_paginate.py index 99e570af055..b04b7aa409b 100644 --- a/ckan/lib/alphabet_paginate.py +++ b/ckan/lib/alphabet_paginate.py @@ -18,6 +18,7 @@ from itertools import dropwhile import re +from six import text_type from sqlalchemy import __version__ as sqav from sqlalchemy.orm.query import Query from webhelpers.html.builder import HTML @@ -54,7 +55,7 @@ def __init__(self, collection, alpha_attribute, page, other_text, paging_thresho # because we grey-out those which aren't. self.available = dict( (c,0,) for c in self.letters ) for c in self.collection: - if isinstance(c, unicode): + if isinstance(c, text_type): x = c[0] elif isinstance(c, dict): x = c[self.alpha_attribute][0] @@ -131,7 +132,7 @@ def items(self): if self.page != self.other_text: if isinstance(self.collection[0], dict): items = [x for x in self.collection if x[self.alpha_attribute][0:1].lower() == self.page.lower()] - elif isinstance(self.collection[0], unicode): + elif isinstance(self.collection[0], text_type): items = [x for x in self.collection if x[0:1].lower() == self.page.lower()] else: items = [x for x in self.collection if getattr(x,self.alpha_attribute)[0:1].lower() == self.page.lower()] diff --git a/ckan/lib/app_globals.py b/ckan/lib/app_globals.py index 31054ae2578..0b7a5889be1 100644 --- a/ckan/lib/app_globals.py +++ b/ckan/lib/app_globals.py @@ -42,7 +42,6 @@ # has been setup in load_environment(): 'ckan.site_id': {}, 'ckan.recaptcha.publickey': {'name': 'recaptcha_publickey'}, - 'ckan.recaptcha.version': {'name': 'recaptcha_version', 'default': '1'}, 'ckan.template_title_deliminater': {'default': '-'}, 'ckan.template_head_end': {}, 'ckan.template_footer_end': {}, @@ -212,7 +211,7 @@ def _init(self): self.ckan_version = ckan.__version__ self.ckan_base_version = re.sub('[^0-9\.]', '', self.ckan_version) if self.ckan_base_version == self.ckan_version: - self.ckan_doc_version = 'ckan-{0}'.format(self.ckan_version) + self.ckan_doc_version = self.ckan_version[:3] else: self.ckan_doc_version = 'latest' diff --git a/ckan/lib/base.py b/ckan/lib/base.py index 62fb607610e..15f1fd62225 100644 --- a/ckan/lib/base.py +++ b/ckan/lib/base.py @@ -9,6 +9,7 @@ import inspect import sys + from pylons import cache from pylons.controllers import WSGIController from pylons.controllers.util import abort as _abort diff --git a/ckan/lib/captcha.py b/ckan/lib/captcha.py index bee39f68406..9ba1ce01c4d 100644 --- a/ckan/lib/captcha.py +++ b/ckan/lib/captcha.py @@ -13,48 +13,29 @@ def check_recaptcha(request): if not recaptcha_private_key: # Recaptcha not enabled return - + client_ip_address = request.environ.get('REMOTE_ADDR', 'Unknown IP Address') - - recaptcha_version = config.get('ckan.recaptcha.version', '1') - if recaptcha_version is '1': - recaptcha_response_field = request.params.get('recaptcha_response_field', '') - recaptcha_server_name = 'http://api-verify.recaptcha.net/verify' - recaptcha_challenge_field = request.params.get('recaptcha_challenge_field') - - # recaptcha_response_field will be unicode if there are foreign chars in - # the user input. So we need to encode it as utf8 before urlencoding or - # we get an exception (#1431). - params = urllib.urlencode(dict(privatekey=recaptcha_private_key, - remoteip=client_ip_address, - challenge=recaptcha_challenge_field, - response=recaptcha_response_field.encode('utf8'))) - f = urllib2.urlopen(recaptcha_server_name, params) - data = f.read() - f.close() - - if not data.lower().startswith('true'): - raise CaptchaError() - elif recaptcha_version is '2': - recaptcha_response_field = request.params.get('g-recaptcha-response', '') - recaptcha_server_name = 'https://www.google.com/recaptcha/api/siteverify' - - # recaptcha_response_field will be unicode if there are foreign chars in - # the user input. So we need to encode it as utf8 before urlencoding or - # we get an exception (#1431). - params = urllib.urlencode(dict(secret=recaptcha_private_key, - remoteip=client_ip_address, - response=recaptcha_response_field.encode('utf8'))) - f = urllib2.urlopen(recaptcha_server_name, params) - data = json.load(f) - f.close() - - try: - if not data['success']: - raise CaptchaError() - except IndexError: - # Something weird with recaptcha response + + # reCAPTCHA v2 + recaptcha_response_field = request.params.get('g-recaptcha-response', '') + recaptcha_server_name = 'https://www.google.com/recaptcha/api/siteverify' + + # recaptcha_response_field will be unicode if there are foreign chars in + # the user input. So we need to encode it as utf8 before urlencoding or + # we get an exception (#1431). + params = urllib.urlencode(dict(secret=recaptcha_private_key, + remoteip=client_ip_address, + response=recaptcha_response_field.encode('utf8'))) + f = urllib2.urlopen(recaptcha_server_name, params) + data = json.load(f) + f.close() + + try: + if not data['success']: raise CaptchaError() + except IndexError: + # Something weird with recaptcha response + raise CaptchaError() class CaptchaError(ValueError): - pass \ No newline at end of file + pass diff --git a/ckan/lib/celery_app.py b/ckan/lib/celery_app.py deleted file mode 100644 index 572021d62b3..00000000000 --- a/ckan/lib/celery_app.py +++ /dev/null @@ -1,77 +0,0 @@ -# encoding: utf-8 - -''' -Celery background tasks management. - -This module is DEPRECATED, use ``ckan.lib.jobs`` instead. -''' - -import ConfigParser -import logging -import os - -from ckan.common import config as ckan_config -from pkg_resources import iter_entry_points, VersionConflict - -from celery import __version__ as celery_version, Celery -if not celery_version.startswith(u'3.'): - raise ImportError(u'Only Celery version 3.x is supported.') - - -log = logging.getLogger(__name__) - -log.warning('ckan.lib.celery_app is deprecated, use ckan.lib.jobs instead.') - -LIST_PARAMS = """CELERY_IMPORTS ADMINS ROUTES""".split() - -celery = Celery() - -config = ConfigParser.ConfigParser() - -config_file = os.environ.get('CKAN_CONFIG') - -if not config_file: - config_file = os.path.join( - os.path.dirname(os.path.abspath(__file__)), '../../development.ini') -config.read(config_file) - - -sqlalchemy_url = ckan_config.get('sqlalchemy.url') -if not sqlalchemy_url: - sqlalchemy_url = config.get('app:main', 'sqlalchemy.url') - - -default_config = dict( - BROKER_BACKEND='sqlalchemy', - BROKER_HOST=sqlalchemy_url, - CELERY_RESULT_DBURI=sqlalchemy_url, - CELERY_RESULT_BACKEND='database', - CELERY_RESULT_SERIALIZER='json', - CELERY_TASK_SERIALIZER='json', - CELERY_IMPORTS=[], -) - -for entry_point in iter_entry_points(group='ckan.celery_task'): - try: - default_config['CELERY_IMPORTS'].extend( - entry_point.load()() - ) - except VersionConflict as e: - error = 'ERROR in entry point load: %s %s' % (entry_point, e) - log.critical(error) - pass - -try: - for key, value in config.items('app:celery'): - key = key.upper() - if key in LIST_PARAMS: - default_config.setdefault(key, []).extend(value.split()) - else: - default_config[key] = value -except ConfigParser.NoSectionError: - pass - -# Thes update of configuration means it is only possible to set each -# key once so this is done once all of the options have been decided. -celery.conf.update(default_config) -celery.loader.conf.update(default_config) diff --git a/ckan/lib/cli.py b/ckan/lib/cli.py index 3233c3afece..8c17a80d2c3 100644 --- a/ckan/lib/cli.py +++ b/ckan/lib/cli.py @@ -1,5 +1,7 @@ # encoding: utf-8 +from __future__ import print_function + import collections import csv import multiprocessing as mp @@ -11,10 +13,15 @@ import itertools import json import logging -import urlparse from optparse import OptionConflictError import traceback +from six import text_type +from six.moves import input, xrange +from six.moves.urllib.error import HTTPError +from six.moves.urllib.parse import urljoin, urlparse +from six.moves.urllib.request import urlopen + import sqlalchemy as sa import routes import paste.script @@ -110,8 +117,8 @@ def user_add(args): ) # Required - while not data_dict.get('email'): - data_dict['email'] = raw_input('Email address: ') + while '@' not in data_dict.get('email', ''): + data_dict['email'] = input('Email address: ').strip() if 'password' not in data_dict: data_dict['password'] = UserCmd.password_prompt() @@ -146,7 +153,7 @@ def user_add(args): ## from http://code.activestate.com/recipes/577058/ MIT licence. ## Written by Trent Mick def query_yes_no(question, default="yes"): - """Ask a yes/no question via raw_input() and return their answer. + """Ask a yes/no question via input() and return their answer. "question" is a string that is presented to the user. "default" is the presumed answer if the user just hits . @@ -168,13 +175,13 @@ def query_yes_no(question, default="yes"): while 1: sys.stdout.write(question + prompt) - choice = raw_input().lower() + choice = input().strip().lower() if default is not None and choice == '': return default elif choice in valid.keys(): return valid[choice] else: - sys.stdout.write("Please respond with 'yes' or 'no' "\ + sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") @@ -257,7 +264,7 @@ def load_config(config, load_site_user=True): pylons.c.userobj = model.User.get(site_user['name']) ## give routes enough information to run url_for - parsed = urlparse.urlparse(conf.get('ckan.site_url', 'http://0.0.0.0')) + parsed = urlparse(conf.get('ckan.site_url', 'http://0.0.0.0')) request_config = routes.request_config() request_config.host = parsed.netloc + parsed.path request_config.protocol = parsed.scheme @@ -332,10 +339,6 @@ class ManageDb(CkanCommand): search index db upgrade [version no.] - Data migrate db version - returns current version of data schema - db dump FILE_PATH - dump to a pg_dump file [DEPRECATED] - db load FILE_PATH - load a pg_dump from a file [DEPRECATED] - db load-only FILE_PATH - load a pg_dump from a file but don\'t do - the schema upgrade or search indexing [DEPRECATED] db create-from-model - create database from the model (indexes not made) db migrate-filestore - migrate all uploaded data from the 2.1 filesore. ''' @@ -355,7 +358,7 @@ def command(self): model.repo.init_db() if self.verbose: - print 'Initialising DB: SUCCESS' + print('Initialising DB: SUCCESS') elif cmd == 'clean' or cmd == 'drop': # remove any *.pyc version files to prevent conflicts @@ -369,7 +372,7 @@ def command(self): model.repo.clean_db() search.clear_all() if self.verbose: - print 'Cleaning DB: SUCCESS' + print('Cleaning DB: SUCCESS') elif cmd == 'upgrade': if len(self.args) > 1: model.repo.upgrade_db(self.args[1]) @@ -377,94 +380,15 @@ def command(self): model.repo.upgrade_db() elif cmd == 'version': self.version() - elif cmd == 'dump': - self.dump() - elif cmd == 'load': - self.load() - elif cmd == 'load-only': - self.load(only_load=True) elif cmd == 'create-from-model': model.repo.create_db() if self.verbose: - print 'Creating DB: SUCCESS' + print('Creating DB: SUCCESS') elif cmd == 'migrate-filestore': self.migrate_filestore() else: error('Command %s not recognized' % cmd) - def _get_db_config(self): - return parse_db_config() - - def _get_postgres_cmd(self, command): - self.db_details = self._get_db_config() - if self.db_details.get('db_type') not in ('postgres', 'postgresql'): - raise AssertionError('Expected postgres database - not %r' % self.db_details.get('db_type')) - pg_cmd = command - pg_cmd += ' -U %(db_user)s' % self.db_details - if self.db_details.get('db_pass') not in (None, ''): - pg_cmd = 'export PGPASSWORD=%(db_pass)s && ' % self.db_details + pg_cmd - if self.db_details.get('db_host') not in (None, ''): - pg_cmd += ' -h %(db_host)s' % self.db_details - if self.db_details.get('db_port') not in (None, ''): - pg_cmd += ' -p %(db_port)s' % self.db_details - return pg_cmd - - def _get_psql_cmd(self): - psql_cmd = self._get_postgres_cmd('psql') - psql_cmd += ' -d %(db_name)s' % self.db_details - return psql_cmd - - def _postgres_dump(self, filepath): - pg_dump_cmd = self._get_postgres_cmd('pg_dump') - pg_dump_cmd += ' %(db_name)s' % self.db_details - pg_dump_cmd += ' > %s' % filepath - self._run_cmd(pg_dump_cmd) - print 'Dumped database to: %s' % filepath - - def _postgres_load(self, filepath): - import ckan.model as model - assert not model.repo.are_tables_created(), "Tables already found. You need to 'db clean' before a load." - pg_cmd = self._get_psql_cmd() + ' -f %s' % filepath - self._run_cmd(pg_cmd) - print 'Loaded CKAN database: %s' % filepath - - def _run_cmd(self, command_line): - import subprocess - retcode = subprocess.call(command_line, shell=True) - if retcode != 0: - raise SystemError('Command exited with errorcode: %i' % retcode) - - def dump(self): - deprecation_warning(u"Use PostgreSQL's pg_dump instead.") - if len(self.args) < 2: - print 'Need pg_dump filepath' - return - dump_path = self.args[1] - - psql_cmd = self._get_psql_cmd() + ' -f %s' - pg_cmd = self._postgres_dump(dump_path) - - def load(self, only_load=False): - deprecation_warning(u"Use PostgreSQL's pg_restore instead.") - if len(self.args) < 2: - print 'Need pg_dump filepath' - return - dump_path = self.args[1] - - psql_cmd = self._get_psql_cmd() + ' -f %s' - pg_cmd = self._postgres_load(dump_path) - if not only_load: - print 'Upgrading DB' - import ckan.model as model - model.repo.upgrade_db() - - print 'Rebuilding search index' - import ckan.lib.search - ckan.lib.search.rebuild() - else: - print 'Now remember you have to call \'db upgrade\' and then \'search-index rebuild\'.' - print 'Done' - def migrate_filestore(self): from ckan.model import Session import requests @@ -476,8 +400,8 @@ def migrate_filestore(self): for id, revision_id, url in results: response = requests.get(url, stream=True) if response.status_code != 200: - print "failed to fetch %s (code %s)" % (url, - response.status_code) + print("failed to fetch %s (code %s)" % (url, + response.status_code)) continue resource_upload = ResourceUpload({'id': id}) assert resource_upload.storage_path, "no storage configured aborting" @@ -486,7 +410,7 @@ def migrate_filestore(self): filepath = resource_upload.get_path(id) try: os.makedirs(directory) - except OSError, e: + except OSError as e: ## errno 17 is file already exists if e.errno != 17: raise @@ -503,11 +427,12 @@ def migrate_filestore(self): "revision_id = :revision_id", {'id': id, 'revision_id': revision_id}) Session.commit() - print "Saved url %s" % url + print("Saved url %s" % url) def version(self): from ckan.model import Session - print Session.execute('select version from migrate_version;').fetchall() + print(Session.execute('select version from ' + 'migrate_version;').fetchall()) class SearchIndexCommand(CkanCommand): @@ -557,7 +482,7 @@ def __init__(self, name): def command(self): if not self.args: # default to printing help - print self.usage + print(self.usage) return cmd = self.args[0] @@ -576,7 +501,7 @@ def command(self): elif cmd == 'clear': self.clear() else: - print 'Command %s not recognized' % cmd + print('Command %s not recognized' % cmd) def rebuild(self): from ckan.lib.search import rebuild, commit @@ -604,7 +529,7 @@ def show(self): from ckan.lib.search import show if not len(self.args) == 2: - print 'Missing parameter: dataset-name' + print('Missing parameter: dataset-name') return index = show(self.args[1]) pprint(index) @@ -686,7 +611,7 @@ def command(self): for package in Session.query(Package): dome.notify(package, DomainObjectOperation.changed) else: - print 'Command %s not recognized' % cmd + print('Command %s not recognized' % cmd) class RDFExport(CkanCommand): @@ -705,7 +630,7 @@ def command(self): if not self.args: # default to run - print RDFExport.__doc__ + print(RDFExport.__doc__) else: self.export_datasets(self.args[0]) @@ -713,8 +638,6 @@ def export_datasets(self, out_folder): ''' Export datasets as RDF to an output folder. ''' - import urlparse - import urllib2 from ckan.common import config import ckan.model as model import ckan.logic as logic @@ -733,20 +656,20 @@ def export_datasets(self, out_folder): if not dd['state'] == 'active': continue - url = h.url_for(controller='package', action='read', id=dd['name']) + url = h.url_for('dataset.read', id=dd['name']) - url = urlparse.urljoin(fetch_url, url[1:]) + '.rdf' + url = urljoin(fetch_url, url[1:]) + '.rdf' try: fname = os.path.join(out_folder, dd['name']) + ".rdf" try: - r = urllib2.urlopen(url).read() - except urllib2.HTTPError, e: + r = urlopen(url).read() + except HTTPError as e: if e.code == 404: error('Please install ckanext-dcat and enable the ' + '`dcat` plugin to use the RDF serializations') with open(fname, 'wb') as f: f.write(r) - except IOError, ioe: + except IOError as ioe: sys.stderr.write(str(ioe) + "\n") @@ -783,56 +706,56 @@ def command(self): elif cmd == 'remove': self.remove() else: - print 'Command %s not recognized' % cmd + print('Command %s not recognized' % cmd) def list(self): import ckan.model as model - print 'Sysadmins:' + print('Sysadmins:') sysadmins = model.Session.query(model.User).filter_by(sysadmin=True, state='active') - print 'count = %i' % sysadmins.count() + print('count = %i' % sysadmins.count()) for sysadmin in sysadmins: - print '%s name=%s email=%s id=%s' % ( + print('%s name=%s email=%s id=%s' % ( sysadmin.__class__.__name__, sysadmin.name, sysadmin.email, - sysadmin.id) + sysadmin.id)) def add(self): import ckan.model as model if len(self.args) < 2: - print 'Need name of the user to be made sysadmin.' + print('Need name of the user to be made sysadmin.') return username = self.args[1] - user = model.User.by_name(unicode(username)) + user = model.User.by_name(text_type(username)) if not user: - print 'User "%s" not found' % username - makeuser = raw_input('Create new user: %s? [y/n]' % username) + print('User "%s" not found' % username) + makeuser = input('Create new user: %s? [y/n]' % username) if makeuser == 'y': user_add(self.args[1:]) - user = model.User.by_name(unicode(username)) + user = model.User.by_name(text_type(username)) else: - print 'Exiting ...' + print('Exiting ...') return user.sysadmin = True model.Session.add(user) model.repo.commit_and_remove() - print 'Added %s as sysadmin' % username + print('Added %s as sysadmin' % username) def remove(self): import ckan.model as model if len(self.args) < 2: - print 'Need name of the user to be made sysadmin.' + print('Need name of the user to be made sysadmin.') return username = self.args[1] - user = model.User.by_name(unicode(username)) + user = model.User.by_name(text_type(username)) if not user: - print 'Error: user "%s" not found!' % username + print('Error: user "%s" not found!' % username) return user.sysadmin = False model.repo.commit_and_remove() @@ -888,24 +811,24 @@ def get_user_str(self, user): def list(self): import ckan.model as model - print 'Users:' + print('Users:') users = model.Session.query(model.User).filter_by(state='active') - print 'count = %i' % users.count() + print('count = %i' % users.count()) for user in users: - print self.get_user_str(user) + print(self.get_user_str(user)) def show(self): import ckan.model as model username = self.args[0] - user = model.User.get(unicode(username)) - print 'User: \n', user + user = model.User.get(text_type(username)) + print('User: \n', user) def setpass(self): import ckan.model as model if len(self.args) < 2: - print 'Need name of the user.' + print('Need name of the user.') return username = self.args[1] user = model.User.get(username) @@ -914,20 +837,20 @@ def setpass(self): password = self.password_prompt() user.password = password model.repo.commit_and_remove() - print 'Done' + print('Done') def search(self): import ckan.model as model if len(self.args) < 2: - print 'Need user name query string.' + print('Need user name query string.') return query_str = self.args[1] query = model.User.search(query_str) - print '%i users matching %r:' % (query.count(), query_str) + print('%i users matching %r:' % (query.count(), query_str)) for user in query.all(): - print self.get_user_str(user) + print(self.get_user_str(user)) @classmethod def password_prompt(cls): @@ -947,7 +870,7 @@ def remove(self): import ckan.model as model if len(self.args) < 2: - print 'Need name of the user.' + print('Need name of the user.') return username = self.args[1] @@ -976,7 +899,7 @@ def command(self): self._load_config() if not self.args: - print self.usage + print(self.usage) else: cmd = self.args[0] if cmd == 'delete': @@ -992,16 +915,16 @@ def command(self): def list(self): import ckan.model as model - print 'Datasets:' + print('Datasets:') datasets = model.Session.query(model.Package) - print 'count = %i' % datasets.count() + print('count = %i' % datasets.count()) for dataset in datasets: state = ('(%s)' % dataset.state) if dataset.state != 'active' else '' - print '%s %s %s' % (dataset.id, dataset.name, state) + print('%s %s %s' % (dataset.id, dataset.name, state)) def _get_dataset(self, dataset_ref): import ckan.model as model - dataset = model.Package.get(unicode(dataset_ref)) + dataset = model.Package.get(text_type(dataset_ref)) assert dataset, 'Could not find dataset matching reference: %r' % dataset_ref return dataset @@ -1019,7 +942,7 @@ def delete(self, dataset_ref): dataset.delete() model.repo.commit_and_remove() dataset = self._get_dataset(dataset_ref) - print '%s %s -> %s' % (dataset.name, old_state, dataset.state) + print('%s %s -> %s' % (dataset.name, old_state, dataset.state)) def purge(self, dataset_ref): import ckan.logic as logic @@ -1030,89 +953,7 @@ def purge(self, dataset_ref): context = {'user': site_user['name']} logic.get_action('dataset_purge')( context, {'id': dataset_ref}) - print '%s purged' % name - - -class Celery(CkanCommand): - '''Celery daemon [DEPRECATED] - - This command is DEPRECATED, use `paster jobs` instead. - - Usage: - celeryd - run the celery daemon - celeryd run concurrency - run the celery daemon with - argument 'concurrency' - celeryd view - view all tasks in the queue - celeryd clean - delete all tasks in the queue - ''' - min_args = 0 - max_args = 2 - summary = __doc__.split('\n')[0] - usage = __doc__ - - def command(self): - if not self.args: - self.run_() - else: - cmd = self.args[0] - if cmd == 'run': - self.run_() - elif cmd == 'view': - self.view() - elif cmd == 'clean': - self.clean() - else: - error('Command %s not recognized' % cmd) - - def run_(self): - deprecation_warning(u'Use `paster jobs worker` instead.') - default_ini = os.path.join(os.getcwd(), 'development.ini') - - if self.options.config: - os.environ['CKAN_CONFIG'] = os.path.abspath(self.options.config) - elif os.path.isfile(default_ini): - os.environ['CKAN_CONFIG'] = default_ini - else: - error('No .ini specified and none was found in current directory') - - from ckan.lib.celery_app import celery - celery_args = [] - if len(self.args) == 2 and self.args[1] == 'concurrency': - celery_args.append('--concurrency=1') - celery.worker_main(argv=['celeryd', '--loglevel=INFO'] + celery_args) - - def view(self): - deprecation_warning(u'Use `paster jobs list` instead.') - self._load_config() - import ckan.model as model - from kombu.transport.sqlalchemy.models import Message - q = model.Session.query(Message) - q_visible = q.filter_by(visible=True) - print '%i messages (total)' % q.count() - print '%i visible messages' % q_visible.count() - for message in q: - if message.visible: - print '%i: Visible' % (message.id) - else: - print '%i: Invisible Sent:%s' % (message.id, message.sent_at) - - def clean(self): - deprecation_warning(u'Use `paster jobs clear` instead.') - self._load_config() - import ckan.model as model - query = model.Session.execute("select * from kombu_message") - tasks_initially = query.rowcount - if not tasks_initially: - print 'No tasks to delete' - sys.exit(0) - query = model.Session.execute("delete from kombu_message") - query = model.Session.execute("select * from kombu_message") - tasks_afterwards = query.rowcount - print '%i of %i tasks deleted' % (tasks_initially - tasks_afterwards, - tasks_initially) - if tasks_afterwards: - error('Failed to delete all tasks') - model.repo.commit_and_remove() + print('%s purged' % name) class Ratings(CkanCommand): @@ -1141,22 +982,22 @@ def command(self): elif cmd == 'clean-anonymous': self.clean(user_ratings=False) else: - print 'Command %s not recognized' % cmd + print('Command %s not recognized' % cmd) def count(self): import ckan.model as model q = model.Session.query(model.Rating) - print "%i ratings" % q.count() + print("%i ratings" % q.count()) q = q.filter(model.Rating.user_id is None) - print "of which %i are anonymous ratings" % q.count() + print("of which %i are anonymous ratings" % q.count()) def clean(self, user_ratings=True): import ckan.model as model q = model.Session.query(model.Rating) - print "%i ratings" % q.count() + print("%i ratings" % q.count()) if not user_ratings: q = q.filter(model.Rating.user_id is None) - print "of which %i are anonymous ratings" % q.count() + print("of which %i are anonymous ratings" % q.count()) ratings = q.all() for rating in ratings: rating.purge() @@ -1223,7 +1064,7 @@ def update_all(self, engine, start_date=None): while start_date < end_date: stop_date = start_date + datetime.timedelta(1) self.update_tracking(engine, start_date) - print 'tracking updated for %s' % start_date + print('tracking updated for %s' % start_date) start_date = stop_date self.update_tracking_solr(engine, start_date_solrsync) @@ -1357,21 +1198,21 @@ def update_tracking_solr(self, engine, start_date): total = len(package_ids) not_found = 0 - print '%i package index%s to be rebuilt starting from %s' % (total, '' if total < 2 else 'es', start_date) + print('%i package index%s to be rebuilt starting from %s' % (total, '' if total < 2 else 'es', start_date)) from ckan.lib.search import rebuild for package_id in package_ids: try: rebuild(package_id) except logic.NotFound: - print "Error: package %s not found." % (package_id) + print("Error: package %s not found." % (package_id)) not_found += 1 except KeyboardInterrupt: - print "Stopped." + print("Stopped.") return except: raise - print 'search index rebuilding done.' + (' %i not found.' % (not_found) if not_found else "") + print('search index rebuilding done.' + (' %i not found.' % (not_found) if not_found else "")) class PluginInfo(CkanCommand): @@ -1411,20 +1252,20 @@ def get_info(self): for plugin in plugins: p = plugins[plugin] - print plugin + ':' - print '-' * (len(plugin) + 1) + print(plugin + ':') + print('-' * (len(plugin) + 1)) if p['doc']: - print p['doc'] - print 'Implements:' + print(p['doc']) + print('Implements:') for i in p['implements']: extra = None if i == 'ITemplateHelpers': extra = self.template_helpers(p['class']) if i == 'IActions': extra = self.actions(p['class']) - print ' %s' % i + print(' %s' % i) if extra: - print extra + print(extra) print def actions(self, cls): @@ -1497,13 +1338,13 @@ def command(self): else: cmd = 'basic' if self.verbose: - print 'Creating %s test data' % cmd + print('Creating %s test data' % cmd) if cmd == 'basic': CreateTestData.create_basic_test_data() elif cmd == 'user': CreateTestData.create_test_user() - print 'Created user %r with password %r and apikey %r' % ('tester', - 'tester', 'tester') + print('Created user %r with password %r and apikey %r' % + ('tester', 'tester', 'tester')) elif cmd == 'search': CreateTestData.create_search_test_data() elif cmd == 'gov': @@ -1517,10 +1358,10 @@ def command(self): elif cmd == 'hierarchy': CreateTestData.create_group_hierarchy_test_data() else: - print 'Command %s not recognized' % cmd + print('Command %s not recognized' % cmd) raise NotImplementedError if self.verbose: - print 'Creating %s test data: Complete!' % cmd + print('Creating %s test data: Complete!' % cmd) class Profile(CkanCommand): @@ -1577,7 +1418,7 @@ def profile_url(url): res = self.app.get(url, status=[200], extra_environ={'REMOTE_USER': user}) except paste.fixture.AppError: - print 'App error: ', url.strip() + print('App error: ', url.strip()) except KeyboardInterrupt: raise except Exception: @@ -1590,8 +1431,8 @@ def profile_url(url): stats = pstats.Stats(output_filename) stats.sort_stats('cumulative') stats.print_stats(0.1) # show only top 10% of lines - print 'Only top 10% of lines shown' - print 'Written profile to: %s' % output_filename + print('Only top 10% of lines shown') + print('Written profile to: %s' % output_filename) class CreateColorSchemeCommand(CkanCommand): @@ -1780,7 +1621,7 @@ def create_colors(self, hue, num_colors=5, saturation=None, lightness=None): import math saturation -= math.trunc(saturation) - print hue, saturation + print(hue, saturation) import colorsys ''' Create n related colours ''' colors = [] @@ -1814,7 +1655,7 @@ def command(self): rgb = None if arg == 'clear': os.remove(path) - print 'custom colors removed.' + print('custom colors removed.') elif arg.startswith('#'): color = arg[1:] if len(color) == 3: @@ -1822,7 +1663,7 @@ def command(self): elif len(color) == 6: rgb = [int(x, 16) for x in re.findall('..', color)] else: - print 'ERROR: invalid color' + print('ERROR: invalid color') elif arg.lower() in self.color_list: color = self.color_list[arg.lower()][1:] rgb = [int(x, 16) for x in re.findall('..', color)] @@ -1830,7 +1671,7 @@ def command(self): try: hue = float(self.args[0]) except ValueError: - print 'ERROR argument `%s` not recognised' % arg + print('ERROR argument `%s` not recognised' % arg) if rgb: import colorsys hue, lightness, saturation = colorsys.rgb_to_hls(*rgb) @@ -1846,10 +1687,10 @@ def command(self): colors = self.create_colors(hue, saturation=saturation, lightness=lightness) for i in xrange(len(self.rules)): f.write('%s: %s;\n' % (self.rules[i], colors[i])) - print '%s: %s;\n' % (self.rules[i], colors[i]) + print('%s: %s;\n' % (self.rules[i], colors[i])) f.close - print 'Color scheme has been created.' - print 'Make sure less is run for changes to take effect.' + print('Color scheme has been created.') + print('Make sure less is run for changes to take effect.') class TranslationsCommand(CkanCommand): @@ -1877,7 +1718,7 @@ def command(self): elif command == 'js': build_js_translations() else: - print 'command not recognised' + print('command not recognised') def mangle_po(self): ''' This will mangle the zh_TW translations for translation coverage @@ -1922,7 +1763,7 @@ def mangle_po(self): out_mo = os.path.join(out_dir, 'ckan.mo') po.save(out_po) po.save_as_mofile(out_mo) - print 'zh_TW has been mangled' + print('zh_TW has been mangled') class MinifyCommand(CkanCommand): @@ -1985,7 +1826,7 @@ def clear_minifyed(self, path): return if path_only.endswith('.min'): - print 'removing %s' % path + print('removing %s' % path) os.remove(path) def minify_file(self, path): @@ -2019,7 +1860,7 @@ def minify_file(self, path): elif path.endswith('.js'): f.write(rjsmin.jsmin(source)) f.close() - print "Minified file '{0}'".format(path) + print("Minified file '{0}'".format(path)) class LessCommand(CkanCommand): @@ -2079,10 +1920,17 @@ def command(self): def less(self): ''' Compile less files ''' import subprocess - command = 'npm bin' - process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) + command = ('npm', 'bin') + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True) output = process.communicate() directory = output[0].strip() + if not directory: + raise error('Command "{}" returned nothing. Check that npm is ' + 'installed.'.format(' '.join(command))) less_bin = os.path.join(directory, 'lessc') public = config.get(u'ckan.base_public_folder') @@ -2101,16 +1949,19 @@ def less(self): self.compile_less(root, less_bin, 'main') def compile_less(self, root, less_bin, color): - print 'compile %s.css' % color + print('compile %s.css' % color) import subprocess main_less = os.path.join(root, 'less', 'main.less') main_css = os.path.join(root, 'css', '%s.css' % color) - command = '%s %s %s' % (less_bin, main_less, main_css) - - process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) + command = (less_bin, main_less, main_css) + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True) output = process.communicate() - print output + print(output) class FrontEndBuildCommand(CkanCommand): @@ -2216,7 +2067,7 @@ def __init__(self, name): def command(self): self._load_config() if not self.args: - print self.usage + print(self.usage) elif self.args[0] == 'create': view_plugin_types = self.args[1:] self.create_views(view_plugin_types) @@ -2226,7 +2077,7 @@ def command(self): elif self.args[0] == 'clean': self.clean_views() else: - print self.usage + print(self.usage) _page_size = 100 @@ -2355,7 +2206,7 @@ def _update_search_params(self, search_data_dict): try: user_search_params = json.loads(self.options.search_params) - except ValueError, e: + except ValueError as e: error('Unable to parse JSON search parameters: {0}'.format(e)) if user_search_params.get('q'): @@ -2503,22 +2354,22 @@ def clean_views(self): results = model.ResourceView.get_count_not_in_view_types(names) if not results: - print 'No resource views to delete' + print('No resource views to delete') return - print 'This command will delete.\n' + print('This command will delete.\n') for row in results: - print '%s of type %s' % (row[1], row[0]) + print('%s of type %s' % (row[1], row[0])) result = query_yes_no('Do you want to delete these resource views:', default='no') if result == 'no': - print 'Not Deleting.' + print('Not Deleting.') return model.ResourceView.delete_not_in_view_types(names) model.Session.commit() - print 'Deleted resource views.' + print('Deleted resource views.') class ConfigToolCommand(paste.script.command.Command): @@ -2573,7 +2424,7 @@ def command(self): config_tool.config_edit_using_option_strings( config_filepath, options, self.options.section, edit=self.options.edit) - except config_tool.ConfigToolError, e: + except config_tool.ConfigToolError as e: error(traceback.format_exc()) diff --git a/ckan/lib/config_tool.py b/ckan/lib/config_tool.py index 54060b77671..b90cda7564f 100644 --- a/ckan/lib/config_tool.py +++ b/ckan/lib/config_tool.py @@ -170,8 +170,8 @@ def insert_new_sections(new_sections): for option in changes.get(section, 'add'): write_option(option) write_option('') - print 'Created option %s = "%s" (NEW section "%s")' % \ - (option.key, option.value, section) + print('Created option %s = "%s" (NEW section "%s")' % + (option.key, option.value, section)) for line in input_lines: # leave blank lines alone @@ -205,12 +205,12 @@ def insert_new_sections(new_sections): key = existing_option.key if existing_option.id in options_already_edited: if not existing_option.is_commented_out: - print 'Commented out repeat of %s (section "%s")' % \ - (key, section) + print('Commented out repeat of %s (section "%s")' % + (key, section)) existing_option.comment_out() else: - print 'Left commented out repeat of %s (section "%s")' % \ - (key, section) + print('Left commented out repeat of %s (section "%s")' % + (key, section)) elif not existing_option.is_commented_out and \ updated_option.is_commented_out: changes_made = 'Commented out %s (section "%s")' % \ @@ -233,7 +233,7 @@ def insert_new_sections(new_sections): (key, existing_option.value, section) if changes_made: - print changes_made + print(changes_made) write_option(updated_option) options_already_edited.add(updated_option.id) else: diff --git a/ckan/lib/create_test_data.py b/ckan/lib/create_test_data.py index fe86010fedf..f6929c6e0de 100644 --- a/ckan/lib/create_test_data.py +++ b/ckan/lib/create_test_data.py @@ -4,6 +4,8 @@ from collections import defaultdict import datetime +from six import string_types, text_type + import ckan.model as model log = logging.getLogger(__name__) @@ -162,7 +164,7 @@ def create_arbitrary(cls, package_dicts, relationships=[], pkg_dict = {} for field in cls.pkg_core_fields: if item.has_key(field): - pkg_dict[field] = unicode(item[field]) + pkg_dict[field] = text_type(item[field]) if model.Package.by_name(pkg_dict['name']): log.warning('Cannot create package "%s" as it already exists.' % \ (pkg_dict['name'])) @@ -171,13 +173,13 @@ def create_arbitrary(cls, package_dicts, relationships=[], model.Session.add(pkg) for attr, val in item.items(): if isinstance(val, str): - val = unicode(val) + val = text_type(val) if attr=='name': continue if attr in cls.pkg_core_fields: pass elif attr == 'download_url': - pkg.add_resource(unicode(val)) + pkg.add_resource(text_type(val)) elif attr == 'resources': assert isinstance(val, (list, tuple)) for res_dict in val: @@ -185,19 +187,19 @@ def create_arbitrary(cls, package_dicts, relationships=[], for k, v in res_dict.items(): if k != 'extras': if not isinstance(v, datetime.datetime): - v = unicode(v) + v = text_type(v) non_extras[str(k)] = v - extras = {str(k): unicode(v) for k, v in res_dict.get('extras', {}).items()} + extras = {str(k): text_type(v) for k, v in res_dict.get('extras', {}).items()} pkg.add_resource(extras=extras, **non_extras) elif attr == 'tags': - if isinstance(val, (str, unicode)): + if isinstance(val, string_types): tags = val.split() elif isinstance(val, list): tags = val else: raise NotImplementedError for tag_name in tags: - tag_name = unicode(tag_name) + tag_name = text_type(tag_name) tag = model.Tag.by_name(tag_name) if not tag: tag = model.Tag(name=tag_name) @@ -207,18 +209,18 @@ def create_arbitrary(cls, package_dicts, relationships=[], model.Session.flush() elif attr == 'groups': model.Session.flush() - if isinstance(val, (str, unicode)): + if isinstance(val, string_types): group_names = val.split() elif isinstance(val, list): group_names = val else: raise NotImplementedError for group_name in group_names: - group = model.Group.by_name(unicode(group_name)) + group = model.Group.by_name(text_type(group_name)) if not group: if not group_name in new_groups: group = model.Group(name= - unicode(group_name)) + text_type(group_name)) model.Session.add(group) new_group_names.add(group_name) new_groups[group_name] = group @@ -254,7 +256,7 @@ def create_arbitrary(cls, package_dicts, relationships=[], rev = model.repo.new_revision() for group_name in extra_group_names: - group = model.Group(name=unicode(group_name)) + group = model.Group(name=text_type(group_name)) model.Session.add(group) new_group_names.add(group_name) needs_commit = True @@ -265,8 +267,8 @@ def create_arbitrary(cls, package_dicts, relationships=[], # create users that have been identified as being needed for user_name in new_user_names: - if not model.User.by_name(unicode(user_name)): - user = model.User(name=unicode(user_name)) + if not model.User.by_name(text_type(user_name)): + user = model.User(name=text_type(user_name)) model.Session.add(user) cls.user_refs.append(user_name) needs_commit = True @@ -277,7 +279,7 @@ def create_arbitrary(cls, package_dicts, relationships=[], # setup authz for groups just created for group_name in new_group_names: - group = model.Group.by_name(unicode(group_name)) + group = model.Group.by_name(text_type(group_name)) cls.group_names.add(group_name) needs_commit = True @@ -291,10 +293,10 @@ def create_arbitrary(cls, package_dicts, relationships=[], rev.message = u'Creating package relationships.' def pkg(pkg_name): - return model.Package.by_name(unicode(pkg_name)) + return model.Package.by_name(text_type(pkg_name)) for subject_name, relationship, object_name in relationships: pkg(subject_name).add_relationship( - unicode(relationship), pkg(object_name)) + text_type(relationship), pkg(object_name)) needs_commit = True model.repo.commit_and_remove() @@ -315,12 +317,12 @@ def create_groups(cls, group_dicts, admin_user_name=None, auth_profile=""): group_attributes = set(('name', 'title', 'description', 'parent_id', 'type', 'is_organization')) for group_dict in group_dicts: - if model.Group.by_name(unicode(group_dict['name'])): + if model.Group.by_name(text_type(group_dict['name'])): log.warning('Cannot create group "%s" as it already exists.' % group_dict['name']) continue pkg_names = group_dict.pop('packages', []) - group = model.Group(name=unicode(group_dict['name'])) + group = model.Group(name=text_type(group_dict['name'])) group.type = auth_profile or 'group' for key in group_dict: if key in group_attributes: @@ -329,7 +331,7 @@ def create_groups(cls, group_dicts, admin_user_name=None, auth_profile=""): group.extras[key] = group_dict[key] assert isinstance(pkg_names, (list, tuple)) for pkg_name in pkg_names: - pkg = model.Package.by_name(unicode(pkg_name)) + pkg = model.Package.by_name(text_type(pkg_name)) assert pkg, pkg_name member = model.Member(group=group, table_id=pkg.id, table_name='package') @@ -358,7 +360,7 @@ def create_groups(cls, group_dicts, admin_user_name=None, auth_profile=""): rev.author = cls.author # add it to a parent's group if 'parent' in group_dict: - parent = model.Group.by_name(unicode(group_dict['parent'])) + parent = model.Group.by_name(text_type(group_dict['parent'])) assert parent, group_dict['parent'] member = model.Member(group=group, table_id=parent.id, table_name='group', capacity='parent') @@ -512,8 +514,8 @@ def _create_user_without_commit(cls, name='', **user_dict): for k, v in user_dict.items(): if v: # avoid unicode warnings - user_dict[k] = unicode(v) - user = model.User(name=unicode(name), **user_dict) + user_dict[k] = text_type(v) + user = model.User(name=text_type(name), **user_dict) model.Session.add(user) cls.user_refs.append(user_ref) return user @@ -530,7 +532,7 @@ def flag_for_deletion(cls, pkg_names=[], tag_names=[], group_names=[], '''If you create a domain object manually in your test then you can name it here (flag it up) and it will be deleted when you next call CreateTestData.delete().''' - if isinstance(pkg_names, basestring): + if isinstance(pkg_names, string_types): pkg_names = [pkg_names] cls.pkg_names.extend(pkg_names) cls.tag_names.extend(tag_names) @@ -542,15 +544,15 @@ def delete(cls): '''Purges packages etc. that were created by this class.''' for pkg_name in cls.pkg_names: model.Session().autoflush = False - pkg = model.Package.by_name(unicode(pkg_name)) + pkg = model.Package.by_name(text_type(pkg_name)) if pkg: pkg.purge() for tag_name in cls.tag_names: - tag = model.Tag.by_name(unicode(tag_name)) + tag = model.Tag.by_name(text_type(tag_name)) if tag: tag.purge() for group_name in cls.group_names: - group = model.Group.by_name(unicode(group_name)) + group = model.Group.by_name(text_type(group_name)) if group: model.Session.delete(group) revs = model.Session.query(model.Revision).filter_by(author=cls.author) @@ -562,7 +564,7 @@ def delete(cls): model.Session.commit() model.Session.delete(rev) for user_name in cls.user_refs: - user = model.User.get(unicode(user_name)) + user = model.User.get(text_type(user_name)) if user: user.purge() model.Session.commit() @@ -648,7 +650,7 @@ def make_some_vocab_tags(cls): 'tags':'registry,country-usa,government,federal,gov,workshop-20081101,penguin'.split(','), 'resources':[{'url':'http://www.dcsf.gov.uk/rsgateway/DB/SFR/s000859/SFR17_2009_tables.xls', 'format':'XLS', - 'last_modified': datetime.datetime(2005,10,01), + 'last_modified': datetime.datetime(2005, 10, 1), 'description':'December 2009 | http://www.statistics.gov.uk/hub/id/119-36345'}, {'url':'http://www.dcsf.gov.uk/rsgateway/DB/SFR/s000860/SFR17_2009_key.doc', 'format':'DOC', diff --git a/ckan/lib/dictization/__init__.py b/ckan/lib/dictization/__init__.py index b3dec3bf19c..3d8e1576065 100644 --- a/ckan/lib/dictization/__init__.py +++ b/ckan/lib/dictization/__init__.py @@ -3,6 +3,7 @@ import datetime from sqlalchemy.orm import class_mapper import sqlalchemy +from six import text_type from ckan.common import config from ckan.model.core import State @@ -58,7 +59,7 @@ def table_dictize(obj, context, **kw): elif isinstance(value, list): result_dict[name] = value else: - result_dict[name] = unicode(value) + result_dict[name] = text_type(value) result_dict.update(kw) diff --git a/ckan/lib/dictization/model_dictize.py b/ckan/lib/dictization/model_dictize.py index f39c9c3057a..23b6f5ae524 100644 --- a/ckan/lib/dictization/model_dictize.py +++ b/ckan/lib/dictization/model_dictize.py @@ -109,8 +109,7 @@ def resource_dictize(res, context): ## in the frontend. Without for_edit the whole qualified url is returned. if resource.get('url_type') == 'upload' and not context.get('for_edit'): cleaned_name = munge.munge_filename(url) - resource['url'] = h.url_for(controller='package', - action='resource_download', + resource['url'] = h.url_for('resource.download', id=resource['package_id'], resource_id=res.id, filename=cleaned_name, @@ -764,4 +763,3 @@ def resource_view_list_dictize(resource_views, context): for view in resource_views: resource_view_dicts.append(resource_view_dictize(view, context)) return resource_view_dicts - diff --git a/ckan/lib/dictization/model_save.py b/ckan/lib/dictization/model_save.py index 60476666682..b0abf1abcea 100644 --- a/ckan/lib/dictization/model_save.py +++ b/ckan/lib/dictization/model_save.py @@ -5,6 +5,7 @@ import logging from sqlalchemy.orm import class_mapper +from six import string_types import ckan.lib.dictization as d import ckan.lib.helpers as h @@ -132,19 +133,6 @@ def package_extras_save(extra_dicts, obj, context): state = 'deleted' extra.state = state -def group_extras_save(extras_dicts, context): - - model = context["model"] - session = context["session"] - - result_dict = {} - for extra_dict in extras_dicts: - if extra_dict.get("deleted"): - continue - result_dict[extra_dict["key"]] = extra_dict["value"] - - return result_dict - def package_tag_list_save(tag_dicts, package, context): allow_partial_update = context.get("allow_partial_update", False) if tag_dicts is None and allow_partial_update: @@ -411,14 +399,17 @@ def group_dict_save(group_dict, context, prevent_packages_update=False): 'Groups: %r Tags: %r', pkgs_edited, group_users_changed, group_groups_changed, group_tags_changed) - extras = group_extras_save(group_dict.get("extras", {}), context) - if extras or not allow_partial_update: - old_extras = set(group.extras.keys()) - new_extras = set(extras.keys()) - for key in old_extras - new_extras: + extras = group_dict.get("extras", []) + new_extras = {i['key'] for i in extras} + if extras: + old_extras = group.extras + for key in set(old_extras) - new_extras: del group.extras[key] - for key in new_extras: - group.extras[key] = extras[key] + for x in extras: + if 'deleted' in x and x['key'] in old_extras: + del group.extras[x['key']] + continue + group.extras[x['key']] = x['value'] # We will get a list of packages that we have either added or # removed from the group, and trigger a re-index. @@ -460,7 +451,7 @@ def package_api_to_dict(api1_dict, context): for key, value in api1_dict.iteritems(): new_value = value if key == 'tags': - if isinstance(value, basestring): + if isinstance(value, string_types): new_value = [{"name": item} for item in value.split()] else: new_value = [{"name": item} for item in value] diff --git a/ckan/lib/extract.py b/ckan/lib/extract.py index 927e53f5ca2..6a57ce664ac 100644 --- a/ckan/lib/extract.py +++ b/ckan/lib/extract.py @@ -3,6 +3,7 @@ import re from jinja2.ext import babel_extract as extract_jinja2 import lib.jinja_extensions +from six import string_types jinja_extensions = ''' jinja2.ext.do, jinja2.ext.with_, @@ -24,7 +25,7 @@ def jinja2_cleaner(fileobj, *args, **kw): for lineno, func, message, finder in raw_extract: - if isinstance(message, basestring): + if isinstance(message, string_types): message = lib.jinja_extensions.regularise_html(message) elif message is not None: message = (lib.jinja_extensions.regularise_html(message[0]) diff --git a/ckan/lib/helpers.py b/ckan/lib/helpers.py index 46f98164da7..c912dbde4e7 100644 --- a/ckan/lib/helpers.py +++ b/ckan/lib/helpers.py @@ -35,6 +35,7 @@ from flask import url_for as _flask_default_url_for from werkzeug.routing import BuildError as FlaskRouteBuildError import i18n +from six import string_types, text_type import ckan.exceptions import ckan.model as model @@ -64,6 +65,13 @@ MARKDOWN_ATTRIBUTES = copy.deepcopy(ALLOWED_ATTRIBUTES) MARKDOWN_ATTRIBUTES.setdefault('img', []).extend(['src', 'alt', 'title']) +LEGACY_ROUTE_NAMES = { + 'home': 'home.index', + 'about': 'home.about', + 'search': 'dataset.search', + 'organizations_index': 'organization.index' +} + class HelperAttributeDict(dict): def __init__(self, *args, **kwargs): @@ -111,7 +119,7 @@ def _datestamp_to_datetime(datetime_): :rtype: datetime ''' - if isinstance(datetime_, basestring): + if isinstance(datetime_, string_types): try: datetime_ = date_str_to_datetime(datetime_) except TypeError: @@ -147,12 +155,12 @@ def redirect_to(*args, **kw): import ckan.plugins.toolkit as toolkit # Redirect to /dataset/my_dataset. - toolkit.redirect_to(controller='package', action='read', + toolkit.redirect_to('dataset.read', id='my_dataset') Or, using a named route:: - toolkit.redirect_to('dataset_read', id='changed') + toolkit.redirect_to('dataset.read', id='changed') If given a single string as argument, this redirects without url parsing @@ -165,13 +173,13 @@ def redirect_to(*args, **kw): kw['__no_cache__'] = True # Routes router doesn't like unicode args - uargs = map(lambda arg: str(arg) if isinstance(arg, unicode) else arg, + uargs = map(lambda arg: str(arg) if isinstance(arg, text_type) else arg, args) _url = '' skip_url_parsing = False parse_url = kw.pop('parse_url', False) - if uargs and len(uargs) is 1 and isinstance(uargs[0], basestring) \ + if uargs and len(uargs) is 1 and isinstance(uargs[0], string_types) \ and (uargs[0].startswith('/') or is_url(uargs[0])) \ and parse_url is False: skip_url_parsing = True @@ -268,12 +276,12 @@ def url_for(*args, **kw): URLs built by Pylons use the Routes syntax:: - url_for(controller='package', action='read', id='my_dataset') + url_for(controller='my_ctrl', action='my_action', id='my_dataset') # Returns '/dataset/my_dataset' Or, using a named route:: - url_for('dataset_read', id='changed') + url_for('dataset.read', id='changed') # Returns '/dataset/changed' Use ``qualified=True`` for a fully qualified URL when targeting a Pylons @@ -304,6 +312,9 @@ def url_for(*args, **kw): _auto_flask_context.push() # First try to build the URL with the Flask router + # Temporary mapping for pylons to flask route names + if len(args): + args = (map_pylons_to_flask_route_name(args[0]),) my_url = _url_for_flask(*args, **kw) except FlaskRouteBuildError: @@ -358,7 +369,7 @@ def _url_for_flask(*args, **kw): # The API routes used to require a slash on the version number, make sure # we remove it if (args and args[0].startswith('api.') and - isinstance(kw.get('ver'), basestring) and + isinstance(kw.get('ver'), string_types) and kw['ver'].startswith('/')): kw['ver'] = kw['ver'].replace('/', '') @@ -756,6 +767,7 @@ def nav_link_flask(text, *args, **kwargs): blueprint, endpoint = request.url_rule.endpoint.split('.') if args: kwargs['controller'] = blueprint or None + kwargs['action'] = endpoint or None named_route = kwargs.pop('named_route', '') if kwargs.pop('condition', True): if named_route: @@ -871,6 +883,21 @@ def build_nav(menu_item, title, **kw): return _make_menu_item(menu_item, title, icon=None, **kw) +def map_pylons_to_flask_route_name(menu_item): + '''returns flask routes for old fashioned route names''' + # Pylons to Flask legacy route names mappings + if config.get('ckan.legacy_route_mappings'): + if isinstance(config.get('ckan.legacy_route_mappings'), string_types): + LEGACY_ROUTE_NAMES.update(json.loads(config.get( + 'ckan.legacy_route_mappings'))) + + if menu_item in LEGACY_ROUTE_NAMES: + log.info('Route name "{}" is deprecated and will be removed.\ + Please update calls to use "{}" instead'.format( + menu_item, LEGACY_ROUTE_NAMES[menu_item])) + return LEGACY_ROUTE_NAMES.get(menu_item, menu_item) + + @core_helper def build_extra_admin_nav(): '''Build extra navigation items used in ``admin/base.html`` for values @@ -904,6 +931,7 @@ def _make_menu_item(menu_item, title, **kw): This function is called by wrapper functions. ''' + menu_item = map_pylons_to_flask_route_name(menu_item) _menu_items = config['routes.named_routes'] if menu_item not in _menu_items: raise Exception('menu item `%s` cannot be found' % menu_item) @@ -927,7 +955,8 @@ def default_group_type(): @core_helper -def get_facet_items_dict(facet, limit=None, exclude_active=False): +def get_facet_items_dict( + facet, search_facets=None, limit=None, exclude_active=False): '''Return the list of unselected facet items for the given facet, sorted by count. @@ -942,16 +971,19 @@ def get_facet_items_dict(facet, limit=None, exclude_active=False): Arguments: facet -- the name of the facet to filter. + search_facets -- dict with search facets(c.search_facets in Pylons) limit -- the max. number of facet items to return. exclude_active -- only return unselected facets. ''' - if not c.search_facets or \ - not c.search_facets.get(facet) or \ - not c.search_facets.get(facet).get('items'): + if search_facets is None: + search_facets = getattr(c, u'search_facets', None) + + if not search_facets or not search_facets.get( + facet, {}).get('items'): return [] facets = [] - for facet_item in c.search_facets.get(facet)['items']: + for facet_item in search_facets.get(facet)['items']: if not len(facet_item['name'].strip()): continue if not (facet, facet_item['name']) in request.params.items(): @@ -970,7 +1002,7 @@ def get_facet_items_dict(facet, limit=None, exclude_active=False): @core_helper -def has_more_facets(facet, limit=None, exclude_active=False): +def has_more_facets(facet, search_facets, limit=None, exclude_active=False): ''' Returns True if there are more facet items for the given facet than the limit. @@ -981,12 +1013,13 @@ def has_more_facets(facet, limit=None, exclude_active=False): Arguments: facet -- the name of the facet to filter. + search_facets -- dict with search facets(c.search_facets in Pylons) limit -- the max. number of facet items. exclude_active -- only return unselected facets. ''' facets = [] - for facet_item in c.search_facets.get(facet)['items']: + for facet_item in search_facets.get(facet)['items']: if not len(facet_item['name'].strip()): continue if not (facet, facet_item['name']) in request.params.items(): @@ -1019,7 +1052,8 @@ def unselected_facet_items(facet, limit=10): limit -- the max. number of facet items to return. ''' - return get_facet_items_dict(facet, limit=limit, exclude_active=True) + return get_facet_items_dict( + facet, c.search_facets, limit=limit, exclude_active=True) @core_helper @@ -1051,13 +1085,13 @@ def get_param_int(name, default=10): def _url_with_params(url, params): if not params: return url - params = [(k, v.encode('utf-8') if isinstance(v, basestring) else str(v)) + params = [(k, v.encode('utf-8') if isinstance(v, string_types) else str(v)) for k, v in params] return url + u'?' + urlencode(params) def _search_url(params): - url = url_for(controller='package', action='search') + url = url_for('dataset.search') return _url_with_params(url, params) @@ -1090,7 +1124,7 @@ def sorted_extras(package_extras, auto_clean=False, subs=None, exclude=None): elif auto_clean: k = k.replace('_', ' ').replace('-', ' ').title() if isinstance(v, (list, tuple)): - v = ", ".join(map(unicode, v)) + v = ", ".join(map(text_type, v)) output.append((k, v)) return output @@ -1125,7 +1159,7 @@ def get_action(action_name, data_dict=None): @core_helper def linked_user(user, maxlength=0, avatar=20): if not isinstance(user, model.User): - user_name = unicode(user) + user_name = text_type(user) user = model.User.get(user_name) if not user: return user_name @@ -1168,7 +1202,7 @@ def markdown_extract(text, extract_length=190): return literal(plain) return literal( - unicode( + text_type( whtext.truncate( plain, length=extract_length, @@ -1565,7 +1599,7 @@ def dataset_link(package_or_package_dict): text = dataset_display_name(package_or_package_dict) return tags.link_to( text, - url_for(controller='package', action='read', id=name) + url_for('dataset.read', id=name) ) @@ -1589,8 +1623,7 @@ def resource_display_name(resource_dict): @core_helper def resource_link(resource_dict, package_id): text = resource_display_name(resource_dict) - url = url_for(controller='package', - action='resource_read', + url = url_for('resource.read', id=package_id, resource_id=resource_dict['id']) return tags.link_to(text, url) @@ -1604,7 +1637,7 @@ def tag_link(tag): @core_helper def group_link(group): - url = url_for(controller='group', action='read', id=group['name']) + url = url_for('group.read', id=group['name']) return tags.link_to(group['title'], url) @@ -1612,7 +1645,7 @@ def group_link(group): def organization_link(organization): url = url_for(controller='organization', action='read', id=organization['name']) - return tags.link_to(organization['name'], url) + return tags.link_to(organization['title'], url) @core_helper @@ -1746,11 +1779,10 @@ def follow_count(obj_type, obj_id): def _create_url_with_params(params=None, controller=None, action=None, extras=None): ''' internal function for building urls with parameters. ''' - if not controller: - controller = c.controller + controller = getattr(c, 'controller', False) or request.blueprint if not action: - action = c.action + action = getattr(c, 'action', False) or request.endpoint.split('.')[1] if not extras: extras = {} @@ -1802,7 +1834,7 @@ def remove_url_param(key, value=None, replace=None, controller=None, instead. ''' - if isinstance(key, basestring): + if isinstance(key, string_types): keys = [key] else: keys = key @@ -2137,7 +2169,7 @@ def format_resource_items(items): # Sometimes values that can't be converted to ints can sneak # into the db. In this case, just leave them as they are. pass - elif isinstance(value, basestring): + elif isinstance(value, string_types): # check if strings are actually datetime/number etc if re.search(reg_ex_datetime, value): datetime_ = date_str_to_datetime(value) @@ -2172,7 +2204,7 @@ def resource_preview(resource, package): data_dict = {'resource': resource, 'package': package} if datapreview.get_preview_plugin(data_dict, return_first=True): - url = url_for(controller='package', action='resource_datapreview', + url = url_for('resource.datapreview', resource_id=resource['id'], id=package['id'], qualified=True) else: @@ -2295,7 +2327,7 @@ def resource_view_full_page(resource_view): @core_helper def remove_linebreaks(string): '''Remove linebreaks from string to make it usable in JavaScript''' - return unicode(string).replace('\n', '') + return text_type(string).replace('\n', '') @core_helper @@ -2534,7 +2566,7 @@ def get_translated(data_dict, field): return data_dict[field + u'_translated'][language] except KeyError: val = data_dict.get(field, '') - return _(val) if val and isinstance(val, basestring) else val + return _(val) if val and isinstance(val, string_types) else val @core_helper @@ -2562,7 +2594,7 @@ def radio(selected, id, checked): @core_helper def clean_html(html): - return bleach_clean(unicode(html)) + return bleach_clean(text_type(html)) core_helper(flash, name='flash') diff --git a/ckan/lib/io.py b/ckan/lib/io.py index edafe8fc549..7d4f78d047d 100644 --- a/ckan/lib/io.py +++ b/ckan/lib/io.py @@ -6,9 +6,10 @@ import sys +from six import text_type -_FILESYSTEM_ENCODING = unicode(sys.getfilesystemencoding() - or sys.getdefaultencoding()) +_FILESYSTEM_ENCODING = text_type(sys.getfilesystemencoding() + or sys.getdefaultencoding()) def encode_path(p): @@ -28,7 +29,7 @@ def encode_path(p): Raises a ``TypeError`` is the input is not a Unicode string. ''' - if not isinstance(p, unicode): + if not isinstance(p, text_type): raise TypeError(u'Can only encode unicode, not {}'.format(type(p))) return p.encode(_FILESYSTEM_ENCODING) diff --git a/ckan/lib/jinja_extensions.py b/ckan/lib/jinja_extensions.py index f3c54163b55..82851fd7919 100644 --- a/ckan/lib/jinja_extensions.py +++ b/ckan/lib/jinja_extensions.py @@ -10,14 +10,34 @@ from jinja2.exceptions import TemplateNotFound from jinja2.utils import open_if_exists, escape from jinja2 import Environment +from jinja2 import FileSystemBytecodeCache +from six import text_type from six.moves import xrange import ckan.lib.base as base import ckan.lib.helpers as h +from ckan.common import config log = logging.getLogger(__name__) + + +def get_jinja_env_options(): + return dict( + loader=CkanFileSystemLoader(config['computed_template_paths']), + autoescape=True, + extensions=['jinja2.ext.do', 'jinja2.ext.with_', + SnippetExtension, + CkanExtend, + CkanInternationalizationExtension, + LinkForExtension, + ResourceExtension, + UrlForStaticExtension, + UrlForExtension], + ) + + ### Filters def empty_and_escape(value): @@ -60,7 +80,7 @@ def parse(self, parser): for arg in args: if isinstance(arg, nodes.Const): value = arg.value - if isinstance(value, unicode): + if isinstance(value, text_type): arg.value = regularise_html(value) return node diff --git a/ckan/lib/lazyjson.py b/ckan/lib/lazyjson.py index 05eb8be8a54..54dd9242856 100644 --- a/ckan/lib/lazyjson.py +++ b/ckan/lib/lazyjson.py @@ -1,7 +1,7 @@ # encoding: utf-8 - from simplejson import loads, RawJSON, dumps +from six import text_type class LazyJSONObject(RawJSON): @@ -12,7 +12,7 @@ class LazyJSONObject(RawJSON): unicode strings containing a single JSON object. ''' def __init__(self, json_string): - assert isinstance(json_string, unicode), json_string + assert isinstance(json_string, text_type), json_string self._json_string = json_string self._json_dict = None diff --git a/ckan/lib/mailer.py b/ckan/lib/mailer.py index d40a0d5b5e9..00c111bf888 100644 --- a/ckan/lib/mailer.py +++ b/ckan/lib/mailer.py @@ -1,5 +1,7 @@ # encoding: utf-8 +import codecs +import os import smtplib import socket import logging @@ -11,6 +13,7 @@ from ckan.common import config import paste.deploy.converters +from six import text_type import ckan import ckan.model as model @@ -28,7 +31,11 @@ class MailerException(Exception): def _mail_recipient(recipient_name, recipient_email, sender_name, sender_url, subject, - body, headers={}): + body, headers=None): + + if not headers: + headers = {} + mail_from = config.get('smtp.mail_from') msg = MIMEText(body.encode('utf-8'), 'plain', 'utf-8') for k, v in headers.items(): @@ -182,12 +189,12 @@ def send_invite(user, group_dict=None, role=None): def create_reset_key(user): - user.reset_key = unicode(make_key()) + user.reset_key = text_type(make_key()) model.repo.commit_and_remove() def make_key(): - return uuid.uuid4().hex[:10] + return codecs.encode(os.urandom(16), 'hex') def verify_reset_link(user, key): diff --git a/ckan/lib/munge.py b/ckan/lib/munge.py index 2c5f96695c3..3ef97ba1c16 100644 --- a/ckan/lib/munge.py +++ b/ckan/lib/munge.py @@ -8,6 +8,8 @@ import os.path import re +from six import text_type + from ckan import model from ckan.lib.io import decode_path @@ -24,7 +26,7 @@ def munge_name(name): '''Munges the package name field in case it is not to spec.''' # substitute non-ascii characters - if isinstance(name, unicode): + if isinstance(name, text_type): name = substitute_ascii_equivalents(name) # separators become dashes name = re.sub('[ .:/]', '-', name) @@ -39,7 +41,7 @@ def munge_name(name): def munge_title_to_name(name): '''Munge a package title into a package name.''' # substitute non-ascii characters - if isinstance(name, unicode): + if isinstance(name, text_type): name = substitute_ascii_equivalents(name) # convert spaces and separators name = re.sub('[ .:/]', '-', name) @@ -147,7 +149,7 @@ def munge_filename(filename): Returns a Unicode string. ''' - if not isinstance(filename, unicode): + if not isinstance(filename, text_type): filename = decode_path(filename) # Ignore path @@ -156,8 +158,8 @@ def munge_filename(filename): # Clean up filename = filename.lower().strip() filename = substitute_ascii_equivalents(filename) - filename = re.sub(ur'[^a-zA-Z0-9_. -]', '', filename).replace(u' ', u'-') - filename = re.sub(ur'-+', u'-', filename) + filename = re.sub(u'[^a-zA-Z0-9_. -]', '', filename).replace(u' ', u'-') + filename = re.sub(u'-+', u'-', filename) # Enforce length constraints name, ext = os.path.splitext(filename) diff --git a/ckan/lib/navl/dictization_functions.py b/ckan/lib/navl/dictization_functions.py index fcb9af250d1..00d6c067d71 100644 --- a/ckan/lib/navl/dictization_functions.py +++ b/ckan/lib/navl/dictization_functions.py @@ -4,6 +4,8 @@ import formencode as fe import inspect import json + +from six import text_type from ckan.common import config from ckan.common import _ @@ -47,7 +49,7 @@ class State(object): class DictizationError(Exception): def __str__(self): - return unicode(self).encode('utf8') + return text_type(self).encode('utf8') def __unicode__(self): if hasattr(self, 'error') and self.error: diff --git a/ckan/lib/navl/validators.py b/ckan/lib/navl/validators.py index 97a31b93369..2fa55411845 100644 --- a/ckan/lib/navl/validators.py +++ b/ckan/lib/navl/validators.py @@ -1,5 +1,7 @@ # encoding: utf-8 +from six import text_type + import ckan.lib.navl.dictization_functions as df from ckan.common import _, json @@ -120,7 +122,7 @@ def convert_int(value, context): def unicode_only(value): '''Accept only unicode values''' - if not isinstance(value, unicode): + if not isinstance(value, text_type): raise Invalid(_('Must be a Unicode string value')) return value @@ -137,7 +139,7 @@ def unicode_safe(value): converts binary strings assuming either UTF-8 or CP1252 encodings (not ASCII, with occasional decoding errors) ''' - if isinstance(value, unicode): + if isinstance(value, text_type): return value if hasattr(value, 'filename'): # cgi.FieldStorage instance for uploaded files, show the name @@ -156,6 +158,6 @@ def unicode_safe(value): except Exception: # at this point we have given up. Just don't error out try: - return unicode(value) + return text_type(value) except Exception: return u'\N{REPLACEMENT CHARACTER}' diff --git a/ckan/lib/plugins.py b/ckan/lib/plugins.py index c3bec355ed8..931b7128adf 100644 --- a/ckan/lib/plugins.py +++ b/ckan/lib/plugins.py @@ -3,14 +3,17 @@ import logging import os import sys +from importlib import import_module -from ckan.common import c -from ckan.lib import base +from flask import Blueprint + +from ckan.common import c, g from ckan import logic import logic.schema from ckan import plugins import ckan.authz import ckan.plugins.toolkit as toolkit +from flask import Blueprint log = logging.getLogger(__name__) @@ -23,8 +26,11 @@ _group_plugins = {} # The fallback behaviour _default_group_plugin = None +_default_organization_plugin = None # Mapping from group-type strings to controllers _group_controllers = {} +# Mapping from group-type strings to blueprints +_group_blueprints = {} def reset_package_plugins(): @@ -32,8 +38,13 @@ def reset_package_plugins(): _default_package_plugin = None global _package_plugins _package_plugins = {} + + +def reset_group_plugins(): global _default_group_plugin _default_group_plugin = None + global _default_organization_plugin + _default_organization_plugin = None global _group_plugins _group_plugins = {} global _group_controllers @@ -46,6 +57,7 @@ def lookup_package_plugin(package_type=None): If the package type is None or cannot be found in the mapping, then the fallback behaviour is used. + """ if package_type is None: return _default_package_plugin @@ -73,7 +85,14 @@ def lookup_group_controller(group_type=None): return _group_controllers.get(group_type) -def register_package_plugins(map): +def lookup_group_blueprints(group_type=None): + """ + Returns the group blueprint + """ + return _group_blueprints.get(group_type) + + +def register_package_plugins(app): """ Register the various IDatasetForm instances. @@ -83,72 +102,72 @@ def register_package_plugins(map): """ global _default_package_plugin - # This function should have not effect if called more than once. - # This should not occur in normal deployment, but it may happen when - # running unit tests. - if _default_package_plugin is not None: - return + from ckan.views.dataset import dataset, register_dataset_plugin_rules + from ckan.views.resource import resource, register_dataset_plugin_rules as dataset_resource_rules # Create the mappings and register the fallback behaviour if one is found. for plugin in plugins.PluginImplementations(plugins.IDatasetForm): if plugin.is_fallback(): - if _default_package_plugin is not None: + if _default_package_plugin is not None and not isinstance(_default_package_plugin, DefaultDatasetForm): raise ValueError("More than one fallback " "IDatasetForm has been registered") _default_package_plugin = plugin - for package_type in plugin.package_types(): - # Create a connection between the newly named type and the - # package controller - - map.connect('%s_search' % package_type, '/%s' % package_type, - controller='package', action='search') - - map.connect('%s_new' % package_type, '/%s/new' % package_type, - controller='package', action='new') - map.connect('%s_read' % package_type, '/%s/{id}' % package_type, - controller='package', action='read') - for action in ['edit', 'authz', 'history']: - map.connect('%s_%s' % (package_type, action), - '/%s/%s/{id}' % (package_type, action), - controller='package', - action=action) + if package_type == u'dataset': + # The default routes are registered with the core + # 'dataset' blueprint + continue - if package_type in _package_plugins: + elif package_type in _package_plugins: raise ValueError("An existing IDatasetForm is " "already associated with the package type " "'%s'" % package_type) + _package_plugins[package_type] = plugin + dataset_blueprint = Blueprint( + package_type, + dataset.import_name, + url_prefix='/{}'.format(package_type), + url_defaults={'package_type': package_type}) + register_dataset_plugin_rules(dataset_blueprint) + app.register_blueprint(dataset_blueprint) + + resource_blueprint = Blueprint( + u'{}_resource'.format(package_type), + resource.import_name, + url_prefix=u'/{}//resource'.format(package_type), + url_defaults={u'package_type': package_type}) + dataset_resource_rules(resource_blueprint) + app.register_blueprint(resource_blueprint) + # Setup the fallback behaviour if one hasn't been defined. + set_default_package_plugin() + + +def set_default_package_plugin(): + global _default_package_plugin if _default_package_plugin is None: _default_package_plugin = DefaultDatasetForm() -def register_group_plugins(map): +def register_group_plugins(app): """ Register the various IGroupForm instances. This method will setup the mappings between group types and the registered IGroupForm instances. If it's called more than once an exception will be raised. + + It will register IGroupForm instances for both groups and organizations """ global _default_group_plugin + global _default_organization_plugin - # This function should have not effect if called more than once. - # This should not occur in normal deployment, but it may happen when - # running unit tests. - if _default_group_plugin is not None: - return - + from ckan.views.group import group, register_group_plugin_rules # Create the mappings and register the fallback behaviour if one is found. for plugin in plugins.PluginImplementations(plugins.IGroupForm): - if plugin.is_fallback(): - if _default_group_plugin is not None: - raise ValueError("More than one fallback IGroupForm has been " - "registered") - _default_group_plugin = plugin # Get group_controller from plugin if there is one, # otherwise use 'group' @@ -157,72 +176,61 @@ def register_group_plugins(map): except AttributeError: group_controller = 'group' + if hasattr(plugin, 'is_organization'): + is_organization = plugin.is_organization + else: + is_organization = group_controller == 'organization' + + if plugin.is_fallback(): + + if is_organization: + if _default_organization_plugin is not None and \ + not isinstance(_default_organization_plugin, DefaultOrganizationForm): + raise ValueError("More than one fallback IGroupForm for " + "organizations has been registered") + _default_organization_plugin = plugin + + else: + if _default_group_plugin is not None and \ + not isinstance(_default_group_plugin, DefaultGroupForm): + raise ValueError("More than one fallback IGroupForm for " + "groups has been registered") + _default_group_plugin = plugin + for group_type in plugin.group_types(): - # Create the routes based on group_type here, this will - # allow us to have top level objects that are actually - # Groups, but first we need to make sure we are not - # clobbering an existing domain - - # Our version of routes doesn't allow the environ to be - # passed into the match call and so we have to set it on the - # map instead. This looks like a threading problem waiting - # to happen but it is executed sequentially from inside the - # routing setup - - map.connect('%s_index' % group_type, '/%s' % group_type, - controller=group_controller, action='index') - map.connect('%s_new' % group_type, '/%s/new' % group_type, - controller=group_controller, action='new') - map.connect('%s_read' % group_type, '/%s/{id}' % group_type, - controller=group_controller, action='read') - map.connect('%s_action' % group_type, - '/%s/{action}/{id}' % group_type, - controller=group_controller, - requirements=dict(action='|'.join( - ['edit', 'authz', 'delete', 'history', 'member_new', - 'member_delete', 'followers', 'follow', - 'unfollow', 'admins', 'activity']))) - map.connect('%s_edit' % group_type, '/%s/edit/{id}' % group_type, - controller=group_controller, action='edit', - ckan_icon='pencil-square-o') - map.connect('%s_members' % group_type, - '/%s/members/{id}' % group_type, - controller=group_controller, - action='members', - ckan_icon='users') - map.connect('%s_activity' % group_type, - '/%s/activity/{id}/{offset}' % group_type, - controller=group_controller, - action='activity', ckan_icon='clock-o'), - map.connect('%s_about' % group_type, '/%s/about/{id}' % group_type, - controller=group_controller, - action='about', ckan_icon='info-circle') - map.connect('%s_bulk_process' % group_type, - '/%s/bulk_process/{id}' % group_type, - controller=group_controller, - action='bulk_process', ckan_icon='sitemap') - - if group_type in _group_plugins: + + if group_type in (u'group', u'organization'): + # The default routes are registered with the core + # 'group' or 'organization' blueprint + _group_plugins[group_type] = plugin + continue + elif group_type in _group_plugins: raise ValueError("An existing IGroupForm is " "already associated with the group type " "'%s'" % group_type) _group_plugins[group_type] = plugin _group_controllers[group_type] = group_controller - controller_obj = None - # If using one of the default controllers, tell it that it is allowed - # to handle other group_types. - # Import them here to avoid circular imports. - if group_controller == 'group': - from ckan.controllers.group import GroupController as controller_obj - elif group_controller == 'organization': - from ckan.controllers.organization import OrganizationController as controller_obj - if controller_obj is not None: - controller_obj.add_group_type(group_type) + blueprint = Blueprint(group_type, + group.import_name, + url_prefix='/{}'.format(group_type), + url_defaults={u'group_type': group_type, + u'is_organization': is_organization}) + register_group_plugin_rules(blueprint) + app.register_blueprint(blueprint) + + set_default_group_plugin() + +def set_default_group_plugin(): + global _default_group_plugin + global _default_organization_plugin + global _group_controllers # Setup the fallback behaviour if one hasn't been defined. if _default_group_plugin is None: _default_group_plugin = DefaultGroupForm() + if _default_organization_plugin is None: + _default_organization_plugin = DefaultOrganizationForm() if 'group' not in _group_controllers: _group_controllers['group'] = 'group' if 'organization' not in _group_controllers: @@ -282,35 +290,15 @@ def show_package_schema(self): return ckan.logic.schema.default_show_package_schema() def setup_template_variables(self, context, data_dict): - authz_fn = logic.get_action('group_list_authz') - c.groups_authz = authz_fn(context, data_dict) data_dict.update({'available_only': True}) - c.groups_available = authz_fn(context, data_dict) - - c.licenses = [('', '')] + base.model.Package.get_license_options() - c.is_sysadmin = ckan.authz.is_sysadmin(c.user) - - if context.get('revision_id') or context.get('revision_date'): - if context.get('revision_id'): - rev = base.model.Session.query(base.model.Revision) \ - .filter_by(id=context['revision_id']) \ - .first() - c.revision_date = rev.timestamp if rev else '?' - else: - c.revision_date = context.get('revision_date') - ## This is messy as auths take domain object not data_dict context_pkg = context.get('package', None) - pkg = context_pkg or c.pkg + pkg = context_pkg or getattr(g, 'pkg', None) + if pkg: - try: - if not context_pkg: - context['package'] = pkg - logic.check_access('package_change_state', context) - c.auth_for_change_state = True - except logic.NotAuthorized: - c.auth_for_change_state = False + if not context_pkg: + context['package'] = pkg def new_template(self): return 'package/new.html' @@ -494,7 +482,7 @@ def setup_template_variables(self, context, data_dict): ## This is messy as auths take domain object not data_dict context_group = context.get('group', None) - group = context_group or c.group + group = context_group or getattr(c, 'group', '') if group: try: if not context_group: @@ -503,6 +491,9 @@ def setup_template_variables(self, context, data_dict): c.auth_for_change_state = True except logic.NotAuthorized: c.auth_for_change_state = False + else: + # needs to be set to get template displayed when flask request + c.group = '' class DefaultOrganizationForm(DefaultGroupForm): @@ -541,8 +532,6 @@ def edit_template(self): def activity_template(self): return 'organization/activity_stream.html' -_default_organization_plugin = DefaultOrganizationForm() - class DefaultTranslation(object): def i18n_directory(self): diff --git a/ckan/lib/render.py b/ckan/lib/render.py index 2fc0348d1ea..6836fca0657 100644 --- a/ckan/lib/render.py +++ b/ckan/lib/render.py @@ -4,8 +4,6 @@ import re import logging -from jinja2 import FileSystemLoader - from ckan.common import config log = logging.getLogger(__name__) @@ -49,16 +47,3 @@ def template_info(template_name): 'template_type' : t_type,} _template_info_cache[template_name] = t_data return template_path, t_type - - -class CkanextTemplateLoader(FileSystemLoader): - def __init__(self): - super(CkanextTemplateLoader, self).__init__([]) - - @property - def searchpath(self): - return config['computed_template_paths'] - - @searchpath.setter - def searchpath(self, _): - pass diff --git a/ckan/lib/search/__init__.py b/ckan/lib/search/__init__.py index 0d2f2660893..dbc8ac12cc5 100644 --- a/ckan/lib/search/__init__.py +++ b/ckan/lib/search/__init__.py @@ -221,11 +221,11 @@ def check(): pkgs = set([pkg.id for pkg in pkgs_q]) indexed_pkgs = set(package_query.get_all_entity_ids(max_results=len(pkgs))) pkgs_not_indexed = pkgs - indexed_pkgs - print 'Packages not indexed = %i out of %i' % (len(pkgs_not_indexed), - len(pkgs)) + print('Packages not indexed = %i out of %i' % (len(pkgs_not_indexed), + len(pkgs))) for pkg_id in pkgs_not_indexed: pkg = model.Session.query(model.Package).get(pkg_id) - print pkg.revision.timestamp.strftime('%Y-%m-%d'), pkg.name + print(pkg.revision.timestamp.strftime('%Y-%m-%d'), pkg.name) def show(package_reference): diff --git a/ckan/lib/search/common.py b/ckan/lib/search/common.py index 8d031891760..b0ff96a8a27 100644 --- a/ckan/lib/search/common.py +++ b/ckan/lib/search/common.py @@ -5,6 +5,9 @@ import re import pysolr import simplejson +from six import string_types +import urllib + log = logging.getLogger(__name__) @@ -63,6 +66,16 @@ def is_available(): def make_connection(decode_dates=True): solr_url, solr_user, solr_password = SolrSettings.get() + + if solr_url and solr_user: + # Rebuild the URL with the username/password + protocol = re.search('http(?:s)?://', solr_url).group() + solr_url = re.sub(protocol, '', solr_url) + solr_url = "{}{}:{}@{}".format(protocol, + urllib.quote_plus(solr_user), + urllib.quote_plus(solr_password), + solr_url) + if decode_dates: decoder = simplejson.JSONDecoder(object_hook=solr_datetime_decoder) return pysolr.Solr(solr_url, decoder=decoder) @@ -72,7 +85,7 @@ def make_connection(decode_dates=True): def solr_datetime_decoder(d): for k, v in d.items(): - if isinstance(v, basestring): + if isinstance(v, string_types): possible_datetime = re.search(pysolr.DATETIME_REGEX, v) if possible_datetime: date_values = possible_datetime.groupdict() diff --git a/ckan/lib/search/index.py b/ckan/lib/search/index.py index 0d22e9e12b8..d0c73520441 100644 --- a/ckan/lib/search/index.py +++ b/ckan/lib/search/index.py @@ -13,6 +13,7 @@ import pysolr from ckan.common import config from paste.deploy.converters import asbool +from six import text_type from common import SearchIndexError, make_connection from ckan.model import PackageRelationship @@ -140,7 +141,7 @@ def index_package(self, pkg_dict, defer_commit=False): for extra in extras: key, value = extra['key'], extra['value'] if isinstance(value, (tuple, list)): - value = " ".join(map(unicode, value)) + value = " ".join(map(text_type, value)) key = ''.join([c for c in key if c in KEY_CHARS]) pkg_dict['extras_' + key] = value if key not in index_fields: @@ -314,12 +315,10 @@ def commit(self): log.exception(e) raise SearchIndexError(e) - def delete_package(self, pkg_dict): conn = make_connection() - query = "+%s:%s (+id:\"%s\" OR +name:\"%s\") +site_id:\"%s\"" % (TYPE_FIELD, PACKAGE_TYPE, - pkg_dict.get('id'), pkg_dict.get('id'), - config.get('ckan.site_id')) + query = "+%s:%s AND +(id:\"%s\" OR name:\"%s\") AND +site_id:\"%s\"" % \ + (TYPE_FIELD, PACKAGE_TYPE, pkg_dict.get('id'), pkg_dict.get('id'), config.get('ckan.site_id')) try: commit = asbool(config.get('ckan.search.solr_commit', 'true')) conn.delete(q=query, commit=commit) diff --git a/ckan/lib/search/query.py b/ckan/lib/search/query.py index 13d75e7a799..19e26ff1877 100644 --- a/ckan/lib/search/query.py +++ b/ckan/lib/search/query.py @@ -49,7 +49,7 @@ def convert_legacy_parameters_to_solr(legacy_params): non_solr_params = set(legacy_params.keys()) - VALID_SOLR_PARAMETERS for search_key in non_solr_params: value_obj = legacy_params[search_key] - value = value_obj.replace('+', ' ') if isinstance(value_obj, basestring) else value_obj + value = value_obj.replace('+', ' ') if isinstance(value_obj, six.string_types) else value_obj if search_key == 'all_fields': if value: solr_params['fl'] = '*' @@ -62,7 +62,7 @@ def convert_legacy_parameters_to_solr(legacy_params): elif search_key == 'tags': if isinstance(value_obj, list): tag_list = value_obj - elif isinstance(value_obj, basestring): + elif isinstance(value_obj, six.string_types): tag_list = [value_obj] else: raise SearchQueryError('Was expecting either a string or JSON list for the tags parameter: %r' % value) @@ -173,7 +173,7 @@ def run(self, query=None, fields=None, options=None, **kwargs): else: options.update(kwargs) - if isinstance(query, basestring): + if isinstance(query, six.string_types): query = [query] query = query[:] # don't alter caller's query list. @@ -220,7 +220,7 @@ def run(self, fields={}, options=None, **kwargs): # action. query = [] for field, terms in fields.items(): - if isinstance(terms, basestring): + if isinstance(terms, six.string_types): terms = terms.split() for term in terms: query.append(':'.join([field, term])) @@ -266,6 +266,12 @@ def get_index(self,reference): 'wt': 'json', 'fq': 'site_id:"%s"' % config.get('ckan.site_id')} + try: + if query['q'].startswith('{!'): + raise SearchError('Local parameters are not supported.') + except KeyError: + pass + conn = make_connection(decode_dates=False) log.debug('Package query: %r' % query) try: @@ -354,6 +360,12 @@ def run(self, query, permission_labels=None, **kwargs): query['mm'] = query.get('mm', '2<-1 5<80%') query['qf'] = query.get('qf', QUERY_FIELDS) + try: + if query['q'].startswith('{!'): + raise SearchError('Local parameters are not supported.') + except KeyError: + pass + conn = make_connection(decode_dates=False) log.debug('Package query: %r' % query) try: diff --git a/ckan/logic/__init__.py b/ckan/logic/__init__.py index cef5e19e175..a885728927e 100644 --- a/ckan/logic/__init__.py +++ b/ckan/logic/__init__.py @@ -7,6 +7,7 @@ from collections import defaultdict import formencode.validators +from six import string_types, text_type import ckan.model as model import ckan.authz as authz @@ -175,7 +176,7 @@ def clean_dict(data_dict): if not isinstance(value, list): continue for inner_dict in value[:]: - if isinstance(inner_dict, basestring): + if isinstance(inner_dict, string_types): break if not any(inner_dict.values()): value.remove(inner_dict) @@ -305,7 +306,7 @@ def check_access(action, context, data_dict=None): raise NotAuthorized(msg) except NotAuthorized as e: log.debug(u'check access NotAuthorized - %s user=%s "%s"', - action, user, unicode(e)) + action, user, text_type(e)) raise log.debug('check access OK - %s user=%s', action, user) @@ -516,7 +517,7 @@ def get_or_bust(data_dict, keys): not in the given dictionary ''' - if isinstance(keys, basestring): + if isinstance(keys, string_types): keys = [keys] import ckan.logic.schema as schema @@ -577,12 +578,8 @@ def my_custom_action_function(context, data_dict): your action function with CKAN.) ''' - @functools.wraps(action) - def wrapper(*args, **kwargs): - return action(*args, **kwargs) - wrapper.side_effect_free = True - - return wrapper + action.side_effect_free = True + return action def auth_sysadmins_check(action): @@ -599,20 +596,14 @@ def auth_sysadmins_check(action): sysadmin. ''' - @functools.wraps(action) - def wrapper(*args, **kwargs): - return action(*args, **kwargs) - wrapper.auth_sysadmins_check = True - return wrapper + action.auth_sysadmins_check = True + return action def auth_audit_exempt(action): ''' Dirty hack to stop auth audit being done ''' - @functools.wraps(action) - def wrapper(*args, **kwargs): - return action(*args, **kwargs) - wrapper.auth_audit_exempt = True - return wrapper + action.auth_audit_exempt = True + return action def auth_allow_anonymous_access(action): @@ -623,11 +614,8 @@ def auth_allow_anonymous_access(action): auth function can still return False if for some reason access is not granted). ''' - @functools.wraps(action) - def wrapper(*args, **kwargs): - return action(*args, **kwargs) - wrapper.auth_allow_anonymous_access = True - return wrapper + action.auth_allow_anonymous_access = True + return action def auth_disallow_anonymous_access(action): @@ -637,11 +625,8 @@ def auth_disallow_anonymous_access(action): exception if an authenticated user is not provided in the context, without calling the actual auth function. ''' - @functools.wraps(action) - def wrapper(*args, **kwargs): - return action(*args, **kwargs) - wrapper.auth_allow_anonymous_access = False - return wrapper + action.auth_allow_anonymous_access = False + return action def chained_auth_function(func): diff --git a/ckan/logic/action/create.py b/ckan/logic/action/create.py index 6b8c34aa06e..af992db3511 100644 --- a/ckan/logic/action/create.py +++ b/ckan/logic/action/create.py @@ -1099,28 +1099,6 @@ def _get_random_username_from_email(email): return cleaned_localpart -# Modifications for rest api - -def package_create_rest(context, data_dict): - _check_access('package_create_rest', context, data_dict) - dictized_package = model_save.package_api_to_dict(data_dict, context) - dictized_after = _get_action('package_create')(context, dictized_package) - pkg = context['package'] - package_dict = model_dictize.package_to_api(pkg, context) - data_dict['id'] = pkg.id - return package_dict - - -def group_create_rest(context, data_dict): - _check_access('group_create_rest', context, data_dict) - dictized_group = model_save.group_api_to_dict(data_dict, context) - dictized_after = _get_action('group_create')(context, dictized_group) - group = context['group'] - group_dict = model_dictize.group_to_api(group, context) - data_dict['id'] = group.id - return group_dict - - def vocabulary_create(context, data_dict): '''Create a new tag vocabulary. @@ -1218,21 +1196,6 @@ def activity_create(context, activity_dict, **kw): return model_dictize.activity_dictize(activity, context) -def package_relationship_create_rest(context, data_dict): - # rename keys - key_map = {'id': 'subject', - 'id2': 'object', - 'rel': 'type'} - # Don't be destructive to enable parameter values for - # object and type to override the URL parameters. - data_dict = ckan.logic.action.rename_keys(data_dict, key_map, - destructive=False) - - relationship_dict = _get_action('package_relationship_create')( - context, data_dict) - return relationship_dict - - def tag_create(context, data_dict): '''Create a new vocabulary tag. diff --git a/ckan/logic/action/delete.py b/ckan/logic/action/delete.py index a9606735d66..f84bca68c31 100644 --- a/ckan/logic/action/delete.py +++ b/ckan/logic/action/delete.py @@ -598,19 +598,6 @@ def tag_delete(context, data_dict): tag_obj.delete() model.repo.commit() -def package_relationship_delete_rest(context, data_dict): - - # rename keys - key_map = {'id': 'subject', - 'id2': 'object', - 'rel': 'type'} - # We want 'destructive', so that the value of the subject, - # object and rel in the URI overwrite any values for these - # in params. This is because you are not allowed to change - # these values. - data_dict = ckan.logic.action.rename_keys(data_dict, key_map, destructive=True) - - package_relationship_delete(context, data_dict) def _unfollow(context, data_dict, schema, FollowerClass): model = context['model'] diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index d68d3b310d2..7c4cd02a453 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -11,6 +11,7 @@ from ckan.common import config import sqlalchemy from paste.deploy.converters import asbool +from six import string_types, text_type import ckan.lib.dictization import ckan.logic as logic @@ -195,9 +196,9 @@ def revision_list(context, data_dict): parameter ``since_id``. :param since_id: the revision ID after which you want the revisions - :type id: string + :type since_id: string :param since_time: the timestamp after which you want the revisions - :type id: string + :type since_time: string :param sort: the order to sort the related items in, possible values are 'time_asc', 'time_desc' (default). (optional) :type sort: string @@ -516,7 +517,7 @@ def organization_list(context, data_dict): :param include_groups: if all_fields, include the organizations the organizations are in (optional, default: ``False``) - :type all_fields: bool + :type include_groups: bool :param include_users: if all_fields, include the organization users (optional, default: ``False``). :type include_users: bool @@ -541,7 +542,7 @@ def group_list_authz(context, data_dict): a member of, otherwise return all groups that the user is authorized to edit (for example, sysadmin users are authorized to edit all groups) (optional, default: ``False``) - :type am-member: bool + :type am_member: bool :returns: list of dictized groups that the user is authorized to edit :rtype: list of dicts @@ -622,7 +623,7 @@ def organization_list_for_user(context, data_dict): :param id: the name or id of the user to get the organization list for (optional, defaults to the currently authorized user (logged in or via API key)) - :type permission: string + :type id: string :param permission: the permission the user has against the returned organizations, for example ``"read"`` or ``"create_dataset"`` @@ -907,7 +908,7 @@ def package_relationships_list(context, data_dict): :param id: the id or name of the first package :type id: string :param id2: the id or name of the second package - :type id: string + :type id2: string :param rel: relationship as string see :py:func:`~ckan.logic.action.create.package_relationship_create` for the relationship types (optional) @@ -1146,46 +1147,6 @@ def resource_view_list(context, data_dict): return model_dictize.resource_view_list_dictize(resource_views, context) -def resource_status_show(context, data_dict): - '''Return the statuses of a resource's tasks. - - This function is DEPRECATED. - - :param id: the id of the resource - :type id: string - - :rtype: list of (status, date_done, traceback, task_status) dictionaries - - ''' - - _check_access('resource_status_show', context, data_dict) - - try: - import ckan.lib.celery_app as celery_app - except ImportError: - return {'message': 'queue is not installed on this instance'} - - model = context['model'] - id = _get_or_bust(data_dict, 'id') - - # needs to be text query as celery tables are not in our model - q = _text(""" - select status, date_done, traceback, task_status.* - from task_status left join celery_taskmeta - on task_status.value = celery_taskmeta.task_id - and key = 'celery_task_id' - where entity_id = :entity_id - """) - try: - result = model.Session.connection().execute(q, entity_id=id) - except sqlalchemy.exc.ProgrammingError: - # celery tables (celery_taskmeta) may not be created even with celery - # installed, causing ProgrammingError exception. - return {'message': 'queue tables not installed on this instance'} - result_list = [_table_dictize(row, context) for row in result] - return result_list - - @logic.auth_audit_exempt def revision_show(context, data_dict): '''Return the details of a revision. @@ -1222,11 +1183,17 @@ def _group_or_org_show(context, data_dict, is_org=False): else: packages_field = None - include_tags = asbool(data_dict.get('include_tags', True)) - include_users = asbool(data_dict.get('include_users', True)) - include_groups = asbool(data_dict.get('include_groups', True)) - include_extras = asbool(data_dict.get('include_extras', True)) - include_followers = asbool(data_dict.get('include_followers', True)) + try: + include_tags = asbool(data_dict.get('include_tags', True)) + if asbool(config.get('ckan.auth.public_user_details', True)): + include_users = asbool(data_dict.get('include_users', True)) + else: + include_users = asbool(data_dict.get('include_users', False)) + include_groups = asbool(data_dict.get('include_groups', True)) + include_extras = asbool(data_dict.get('include_extras', True)) + include_followers = asbool(data_dict.get('include_followers', True)) + except ValueError: + raise logic.ValidationError(_('Parameter is not an bool')) if group is None: raise NotFound @@ -1292,19 +1259,19 @@ def group_show(context, data_dict): :type include_dataset_count: bool :param include_extras: include the group's extra fields (optional, default: ``True``) - :type id: bool + :type include_extras: bool :param include_users: include the group's users - (optional, default: ``True``) - :type id: bool + (optional, default: ``False``) + :type include_users: bool :param include_groups: include the group's sub groups (optional, default: ``True``) - :type id: bool + :type include_groups: bool :param include_tags: include the group's tags (optional, default: ``True``) - :type id: bool + :type include_tags: bool :param include_followers: include the group's number of followers (optional, default: ``True``) - :type id: bool + :type include_followers: bool :rtype: dictionary @@ -1327,19 +1294,19 @@ def organization_show(context, data_dict): :type include_dataset_count: bool :param include_extras: include the organization's extra fields (optional, default: ``True``) - :type id: bool + :type include_extras: bool :param include_users: include the organization's users (optional, default: ``True``) - :type id: bool + :type include_users: bool :param include_groups: include the organization's sub groups (optional, default: ``True``) - :type id: bool + :type include_groups: bool :param include_tags: include the organization's tags (optional, default: ``True``) - :type id: bool + :type include_tags: bool :param include_followers: include the organization's number of followers (optional, default: ``True``) - :type id: bool + :type include_followers: bool :rtype: dictionary @@ -1519,40 +1486,6 @@ def user_show(context, data_dict): return user_dict -def package_show_rest(context, data_dict): - _check_access('package_show_rest', context, data_dict) - - logic.get_action('package_show')(context, data_dict) - - pkg = context['package'] - - package_dict = model_dictize.package_to_api(pkg, context) - - return package_dict - - -def group_show_rest(context, data_dict): - _check_access('group_show_rest', context, data_dict) - - logic.get_action('group_show')(context, data_dict) - group = context['group'] - - group_dict = model_dictize.group_to_api(group, context) - - return group_dict - - -def tag_show_rest(context, data_dict): - _check_access('tag_show_rest', context, data_dict) - - logic.get_action('tag_show')(context, data_dict) - tag = context['tag'] - - tag_dict = model_dictize.tag_to_api(tag, context) - - return tag_dict - - @logic.validate(logic.schema.default_autocomplete_schema) def package_autocomplete(context, data_dict): '''Return a list of datasets (packages) that match a string. @@ -1788,6 +1721,7 @@ def package_search(context, data_dict): the results. Only private datasets from the user's organizations will be returned and sysadmins will be returned all private datasets. Optional, the default is ``False``. + :type include_private: bool :param use_default_schema: use default package schema instead of a custom schema defined with an IDatasetForm plugin (default: ``False``) :type use_default_schema: bool @@ -2109,7 +2043,7 @@ def resource_search(context, data_dict): {'fields': _('Do not specify if using "query" parameter')}) elif query is not None: - if isinstance(query, basestring): + if isinstance(query, string_types): query = [query] try: fields = dict(pair.split(":", 1) for pair in query) @@ -2125,7 +2059,7 @@ def resource_search(context, data_dict): # So maintain that behaviour split_terms = {} for field, terms in fields.items(): - if isinstance(terms, basestring): + if isinstance(terms, string_types): terms = terms.split() split_terms[field] = terms fields = split_terms @@ -2143,7 +2077,7 @@ def resource_search(context, data_dict): resource_fields = model.Resource.get_columns() for field, terms in fields.items(): - if isinstance(terms, basestring): + if isinstance(terms, string_types): terms = [terms] if field not in resource_fields: @@ -2167,7 +2101,7 @@ def resource_search(context, data_dict): # Treat the has field separately, see docstring. if field == 'hash': - q = q.filter(model_attr.ilike(unicode(term) + '%')) + q = q.filter(model_attr.ilike(text_type(term) + '%')) # Resource extras are stored in a json blob. So searching for # matching fields is a bit trickier. See the docstring. @@ -2184,7 +2118,7 @@ def resource_search(context, data_dict): # Just a regular field else: - q = q.filter(model_attr.ilike('%' + unicode(term) + '%')) + q = q.filter(model_attr.ilike('%' + text_type(term) + '%')) if order_by is not None: if hasattr(model.Resource, order_by): @@ -2215,7 +2149,7 @@ def _tag_search(context, data_dict): model = context['model'] terms = data_dict.get('query') or data_dict.get('q') or [] - if isinstance(terms, basestring): + if isinstance(terms, string_types): terms = [terms] terms = [t.strip() for t in terms if t.strip()] @@ -2340,7 +2274,7 @@ def task_status_show(context, data_dict): :param entity_id: the entity_id of the task status (optional) :type entity_id: string :param task_type: the task_type of the task status (optional) - :type tast_type: string + :type task_type: string :param key: the key of the task status (optional) :type key: string @@ -2402,7 +2336,7 @@ def term_translation_show(context, data_dict): # This action accepts `terms` as either a list of strings, or a single # string. terms = _get_or_bust(data_dict, 'terms') - if isinstance(terms, basestring): + if isinstance(terms, string_types): terms = [terms] if terms: q = q.where(trans_table.c.term.in_(terms)) @@ -2411,7 +2345,7 @@ def term_translation_show(context, data_dict): # string. if 'lang_codes' in data_dict: lang_codes = _get_or_bust(data_dict, 'lang_codes') - if isinstance(lang_codes, basestring): + if isinstance(lang_codes, string_types): lang_codes = [lang_codes] q = q.where(trans_table.c.lang_code.in_(lang_codes)) @@ -3353,6 +3287,7 @@ def dashboard_activity_list(context, data_dict): :param limit: the maximum number of activities to return (optional, default: ``31``, the default value is configurable via the :ref:`ckan.activity_list_limit` setting) + :type limit: int :rtype: list of activity dictionaries @@ -3474,7 +3409,7 @@ def member_roles_list(context, data_dict): :param group_type: the group type, either ``"group"`` or ``"organization"`` (optional, default ``"organization"``) - :type id: string + :type group_type: string :returns: a list of dictionaries each with two keys: ``"text"`` (the display name of the role, e.g. ``"Admin"``) and ``"value"`` (the internal name of the role, e.g. ``"admin"``) diff --git a/ckan/logic/action/update.py b/ckan/logic/action/update.py index d543ac9588c..7e6fdd0d203 100644 --- a/ckan/logic/action/update.py +++ b/ckan/logic/action/update.py @@ -11,6 +11,7 @@ from ckan.common import config import paste.deploy.converters as converters +from six import text_type import ckan.lib.helpers as h import ckan.plugins as plugins @@ -357,7 +358,7 @@ def package_resource_reorder(context, data_dict): :param id: the id or name of the package to update :type id: string :param order: a list of resource ids in the order needed - :type list: list + :type order: list ''' id = _get_or_bust(data_dict, "id") @@ -424,6 +425,7 @@ def package_relationship_update(context, data_dict): :type subject: string :param object: the name or id of the dataset that is the object of the relationship + :type object: string :param type: the type of the relationship, one of ``'depends_on'``, ``'dependency_of'``, ``'derives_from'``, ``'has_derivation'``, ``'links_to'``, ``'linked_from'``, ``'child_of'`` or ``'parent_of'`` @@ -822,9 +824,9 @@ def term_translation_update(context, data_dict): _check_access('term_translation_update', context, data_dict) - schema = {'term': [validators.not_empty, unicode], - 'term_translation': [validators.not_empty, unicode], - 'lang_code': [validators.not_empty, unicode]} + schema = {'term': [validators.not_empty, text_type], + 'term_translation': [validators.not_empty, text_type], + 'lang_code': [validators.not_empty, text_type]} data, errors = _validate(data_dict, schema, context) if errors: @@ -882,58 +884,6 @@ def term_translation_update_many(context, data_dict): return {'success': '%s rows updated' % (num + 1)} -## Modifications for rest api - -def package_update_rest(context, data_dict): - - model = context['model'] - id = data_dict.get("id") - request_id = context['id'] - pkg = model.Package.get(request_id) - - if not pkg: - raise NotFound - - if id and id != pkg.id: - pkg_from_data = model.Package.get(id) - if pkg_from_data != pkg: - error_dict = {id:('Cannot change value of key from %s to %s. ' - 'This key is read-only') % (pkg.id, id)} - raise ValidationError(error_dict) - - context["package"] = pkg - context["allow_partial_update"] = False - dictized_package = model_save.package_api_to_dict(data_dict, context) - - _check_access('package_update_rest', context, dictized_package) - - dictized_after = _get_action('package_update')(context, dictized_package) - - pkg = context['package'] - - package_dict = model_dictize.package_to_api(pkg, context) - - return package_dict - -def group_update_rest(context, data_dict): - - model = context['model'] - id = _get_or_bust(data_dict, "id") - group = model.Group.get(id) - context["group"] = group - context["allow_partial_update"] = True - dictized_group = model_save.group_api_to_dict(data_dict, context) - - _check_access('group_update_rest', context, dictized_group) - - dictized_after = _get_action('group_update')(context, dictized_group) - - group = context['group'] - - group_dict = model_dictize.group_to_api(group, context) - - return group_dict - def vocabulary_update(context, data_dict): '''Update a tag vocabulary. @@ -979,23 +929,6 @@ def vocabulary_update(context, data_dict): return model_dictize.vocabulary_dictize(updated_vocab, context) -def package_relationship_update_rest(context, data_dict): - - # rename keys - key_map = {'id': 'subject', - 'id2': 'object', - 'rel': 'type'} - - # We want 'destructive', so that the value of the subject, - # object and rel in the URI overwrite any values for these - # in params. This is because you are not allowed to change - # these values. - data_dict = logic.action.rename_keys(data_dict, key_map, destructive=True) - - relationship_dict = _get_action('package_relationship_update')(context, data_dict) - - return relationship_dict - def dashboard_mark_activities_old(context, data_dict): '''Mark all the authorized user's new dashboard activities as old. @@ -1044,7 +977,7 @@ def package_owner_org_update(context, data_dict): :type id: string :param organization_id: the name or id of the owning organization - :type id: string + :type organization_id: string ''' model = context['model'] user = context['user'] diff --git a/ckan/logic/auth/__init__.py b/ckan/logic/auth/__init__.py index b340aadcec2..288a7f8467a 100644 --- a/ckan/logic/auth/__init__.py +++ b/ckan/logic/auth/__init__.py @@ -5,6 +5,7 @@ ''' import ckan.logic as logic +import ckan.authz as authz def _get_object(context, data_dict, name, class_name): @@ -42,3 +43,10 @@ def get_group_object(context, data_dict=None): def get_user_object(context, data_dict=None): return _get_object(context, data_dict, 'user_obj', 'User') + + +def restrict_anon(context): + if authz.auth_is_anon_user(context): + return {'success': False} + else: + return {'success': True} diff --git a/ckan/logic/auth/create.py b/ckan/logic/auth/create.py index 267f3bc2a84..70480abcd94 100644 --- a/ckan/logic/auth/create.py +++ b/ckan/logic/auth/create.py @@ -200,23 +200,6 @@ def _check_group_auth(context, data_dict): return True -## Modifications for rest api - -def package_create_rest(context, data_dict): - model = context['model'] - user = context['user'] - if not user: - return {'success': False, 'msg': _('Valid API key needed to create a package')} - - return authz.is_authorized('package_create', context, data_dict) - -def group_create_rest(context, data_dict): - model = context['model'] - user = context['user'] - if not user: - return {'success': False, 'msg': _('Valid API key needed to create a group')} - - return authz.is_authorized('group_create', context, data_dict) def vocabulary_create(context, data_dict): # sysadmins only diff --git a/ckan/logic/auth/get.py b/ckan/logic/auth/get.py index eb78f947a86..7ec753c0580 100644 --- a/ckan/logic/auth/get.py +++ b/ckan/logic/auth/get.py @@ -2,10 +2,11 @@ import ckan.logic as logic import ckan.authz as authz -from ckan.common import _ +from ckan.common import _, config from ckan.logic.auth import (get_package_object, get_group_object, - get_resource_object) + get_resource_object, restrict_anon) from ckan.lib.plugins import get_permission_labels +from paste.deploy.converters import asbool def sysadmin(context, data_dict): @@ -24,10 +25,12 @@ def site_read(context, data_dict): # FIXME we need to remove this for now we allow site read return {'success': True} + def package_search(context, data_dict): # Everyone can search by default return {'success': True} + def package_list(context, data_dict): # List of all active packages are visible by default return {'success': True} @@ -71,24 +74,33 @@ def organization_list(context, data_dict): # List of all active organizations are visible by default return {'success': True} + def organization_list_for_user(context, data_dict): return {'success': True} + def license_list(context, data_dict): # Licenses list is visible by default return {'success': True} + def vocabulary_list(context, data_dict): # List of all vocabularies are visible by default return {'success': True} + def tag_list(context, data_dict): # Tags list is visible by default return {'success': True} + def user_list(context, data_dict): # Users list is visible by default - return {'success': True} + if not asbool(config.get('ckan.auth.public_user_details', True)): + return restrict_anon(context) + else: + return {'success': True} + def package_relationships_list(context, data_dict): user = context.get('user') @@ -110,6 +122,7 @@ def package_relationships_list(context, data_dict): else: return {'success': True} + def package_show(context, data_dict): user = context.get('user') package = get_package_object(context, data_dict) @@ -157,11 +170,15 @@ def revision_show(context, data_dict): # No authz check in the logic function return {'success': True} + def group_show(context, data_dict): user = context.get('user') group = get_group_object(context, data_dict) if group.state == 'active': - return {'success': True} + if asbool(config.get('ckan.auth.public_user_details', True)) or \ + (not asbool(data_dict.get('include_users', False)) and + (data_dict.get('object_type', None) != 'user')): + return {'success': True} authorized = authz.has_user_permission_for_group_or_org( group.id, user, 'read') if authorized: @@ -178,14 +195,19 @@ def vocabulary_show(context, data_dict): # Allow viewing of vocabs by default return {'success': True} + def tag_show(context, data_dict): # No authz check in the logic function return {'success': True} + def user_show(context, data_dict): # By default, user details can be read by anyone, but some properties like # the API key are stripped at the action level if not not logged in. - return {'success': True} + if not asbool(config.get('ckan.auth.public_user_details', True)): + return restrict_anon(context) + else: + return {'success': True} def package_autocomplete(context, data_dict): @@ -211,26 +233,11 @@ def user_autocomplete(context, data_dict): def format_autocomplete(context, data_dict): return {'success': True} -def task_status_show(context, data_dict): - return {'success': True} -def resource_status_show(context, data_dict): +def task_status_show(context, data_dict): return {'success': True} -## Modifications for rest api -def package_show_rest(context, data_dict): - return authz.is_authorized('package_show', context, data_dict) - - -def group_show_rest(context, data_dict): - return authz.is_authorized('group_show', context, data_dict) - - -def tag_show_rest(context, data_dict): - return authz.is_authorized('tag_show', context, data_dict) - - def get_site_user(context, data_dict): # FIXME this is available to sysadmins currently till # @auth_sysadmins_check decorator is added diff --git a/ckan/logic/auth/update.py b/ckan/logic/auth/update.py index ae75f8cedb8..1518ba11e44 100644 --- a/ckan/logic/auth/update.py +++ b/ckan/logic/auth/update.py @@ -252,28 +252,6 @@ def send_email_notifications(context, data_dict): return {'success': False} -## Modifications for rest api - -def package_update_rest(context, data_dict): - model = context['model'] - user = context['user'] - if not user: - return {'success': False, - 'msg': _('Valid API key needed to edit a package')} - - return authz.is_authorized('package_update', context, data_dict) - - -def group_update_rest(context, data_dict): - model = context['model'] - user = context['user'] - if not user: - return {'success': False, - 'msg': _('Valid API key needed to edit a group')} - - return authz.is_authorized('group_update', context, data_dict) - - def package_owner_org_update(context, data_dict): # sysadmins only return {'success': False} diff --git a/ckan/logic/converters.py b/ckan/logic/converters.py index c747555e910..c87cad49ac8 100644 --- a/ckan/logic/converters.py +++ b/ckan/logic/converters.py @@ -2,6 +2,8 @@ import json +from six import string_types, text_type + import ckan.model as model import ckan.lib.navl.dictization_functions as df import ckan.logic.validators as validators @@ -44,7 +46,7 @@ def remove_from_extras(data, key): def extras_unicode_convert(extras, context): for extra in extras: - extras[extra] = unicode(extras[extra]) + extras[extra] = text_type(extras[extra]) return extras def free_tags_only(key, data, errors, context): @@ -60,7 +62,7 @@ def callable(key, data, errors, context): new_tags = data.get(key) if not new_tags: return - if isinstance(new_tags, basestring): + if isinstance(new_tags, string_types): new_tags = [new_tags] # get current number of tags @@ -173,7 +175,7 @@ def convert_group_name_or_id_to_id(group_name_or_id, context): def convert_to_json_if_string(value, context): - if isinstance(value, basestring): + if isinstance(value, string_types): try: return json.loads(value) except ValueError: @@ -183,13 +185,13 @@ def convert_to_json_if_string(value, context): def convert_to_list_if_string(value, context=None): - if isinstance(value, basestring): + if isinstance(value, string_types): return [value] else: return value def remove_whitespace(value, context): - if isinstance(value, basestring): + if isinstance(value, string_types): return value.strip() return value diff --git a/ckan/logic/schema.py b/ckan/logic/schema.py index 88d2cbda2e3..353fac5fbec 100644 --- a/ckan/logic/schema.py +++ b/ckan/logic/schema.py @@ -3,6 +3,7 @@ from functools import wraps import inspect +from six import text_type import ckan.model import ckan.plugins as plugins from ckan.logic import get_validator @@ -419,9 +420,9 @@ def user_new_form_schema( user_password_validator, user_passwords_match): schema = default_user_schema() - schema['password1'] = [unicode, user_both_passwords_entered, + schema['password1'] = [text_type, user_both_passwords_entered, user_password_validator, user_passwords_match] - schema['password2'] = [unicode] + schema['password2'] = [text_type] return schema @@ -467,7 +468,7 @@ def default_generate_apikey_user_schema( def default_user_invite_schema( not_empty, unicode_safe): return { - 'email': [not_empty, unicode], + 'email': [not_empty, text_type], 'group_id': [not_empty], 'role': [not_empty], } diff --git a/ckan/logic/validators.py b/ckan/logic/validators.py index fc93fae5812..24f6437a042 100644 --- a/ckan/logic/validators.py +++ b/ckan/logic/validators.py @@ -6,6 +6,8 @@ import re import mimetypes +from six import string_types + import ckan.lib.navl.dictization_functions as df import ckan.logic as logic import ckan.lib.helpers as h @@ -46,7 +48,7 @@ def owner_org_validator(key, data, errors, context): if not group: raise Invalid(_('Organization does not exist')) group_id = group.id - if not(user.sysadmin or + if not context.get(u'ignore_auth', False) and not(user.sysadmin or authz.has_user_permission_for_group_or_org( group_id, user.name, 'create_dataset')): raise Invalid(_('You cannot add a dataset to this organization')) @@ -327,7 +329,7 @@ def name_validator(value, context): a valid name ''' - if not isinstance(value, basestring): + if not isinstance(value, string_types): raise Invalid(_('Names must be strings')) # check basic textual rules @@ -355,7 +357,7 @@ def package_name_validator(key, data, errors, context): else: package_id = data.get(key[:-1] + ('id',)) if package_id and package_id is not missing: - query = query.filter(model.Package.id <> package_id) + query = query.filter(model.Package.id != package_id) result = query.first() if result and result.state != State.DELETED: errors[key].append(_('That URL is already in use.')) @@ -404,7 +406,7 @@ def group_name_validator(key, data, errors, context): else: group_id = data.get(key[:-1] + ('id',)) if group_id and group_id is not missing: - query = query.filter(model.Group.id <> group_id) + query = query.filter(model.Group.id != group_id) result = query.first() if result: errors[key].append(_('Group name already exists in database')) @@ -441,7 +443,7 @@ def tag_string_convert(key, data, errors, context): and parses tag names. These are added to the data dict, enumerated. They are also validated.''' - if isinstance(data[key], basestring): + if isinstance(data[key], string_types): tags = [tag.strip() \ for tag in data[key].split(',') \ if tag.strip()] @@ -541,7 +543,7 @@ def user_name_validator(key, data, errors, context): model = context['model'] new_user_name = data[key] - if not isinstance(new_user_name, basestring): + if not isinstance(new_user_name, string_types): raise Invalid(_('User names must be strings')) user = model.User.get(new_user_name) @@ -579,7 +581,7 @@ def user_password_validator(key, data, errors, context): if isinstance(value, Missing): pass - elif not isinstance(value, basestring): + elif not isinstance(value, string_types): errors[('password',)].append(_('Passwords must be strings')) elif value == '': pass @@ -752,7 +754,7 @@ def list_of_strings(key, data, errors, context): if not isinstance(value, list): raise Invalid(_('Not a list')) for x in value: - if not isinstance(x, basestring): + if not isinstance(x, string_types): raise Invalid('%s: %s' % (_('Not a string'), x)) def if_empty_guess_format(key, data, errors, context): diff --git a/ckan/migration/versions/018_adjust_licenses.py b/ckan/migration/versions/018_adjust_licenses.py index b0d3f860ae1..4b7c1d6e245 100644 --- a/ckan/migration/versions/018_adjust_licenses.py +++ b/ckan/migration/versions/018_adjust_licenses.py @@ -88,7 +88,7 @@ def upgrade(migrate_engine): metadata = MetaData() metadata.bind = migrate_engine - #print "Changing package license_ids to strings." + #print("Changing package license_ids to strings.") # Get licenses, package license ids, and package revision license ids. old_license_titles = _get_old_license_titles(migrate_engine) @@ -160,7 +160,7 @@ def _switch_package_license_ids(old_ids, old_license_titles, map): old_license_title = old_license_titles[old_license_id] new_license_id = map[old_license_title] new_ids[package_id] = new_license_id - print "Switched license_id %s to %s" % (old_license_id, new_license_id) + print("Switched license_id %s to %s" % (old_license_id, new_license_id)) return new_ids def _set_new_package_license_ids(migrate_engine, new_ids): diff --git a/ckan/migration/versions/023_add_harvesting.py b/ckan/migration/versions/023_add_harvesting.py index 038d077a199..b110285cfcc 100644 --- a/ckan/migration/versions/023_add_harvesting.py +++ b/ckan/migration/versions/023_add_harvesting.py @@ -32,8 +32,8 @@ def upgrade(migrate_engine): ) metadata.bind = migrate_engine - harvest_source_table.create() - harvesting_job_table.create() + harvest_source_table.create(checkfirst=True) + harvesting_job_table.create(checkfirst=True) def downgrade(migrate_engine): metadata.bind = migrate_engine diff --git a/ckan/migration/versions/083_remove_related_items.py b/ckan/migration/versions/083_remove_related_items.py index e9cc16666ce..0d1da775433 100644 --- a/ckan/migration/versions/083_remove_related_items.py +++ b/ckan/migration/versions/083_remove_related_items.py @@ -17,7 +17,7 @@ def upgrade(migrate_engine): existing = migrate_engine.execute("SELECT COUNT(*) FROM related;")\ .fetchone() if existing[0] > 0: - print WARNING + print(WARNING) return migrate_engine.execute(''' diff --git a/ckan/migration/versions/087_remove_old_authorization_tables.py b/ckan/migration/versions/087_remove_old_authorization_tables.py new file mode 100644 index 00000000000..5dbdb992be4 --- /dev/null +++ b/ckan/migration/versions/087_remove_old_authorization_tables.py @@ -0,0 +1,10 @@ +# encoding: utf-8 + + +def upgrade(migrate_engine): + migrate_engine.execute( + ''' + DROP TABLE IF EXISTS "authorization_group_user"; + DROP TABLE IF EXISTS "authorization_group"; + ''' + ) diff --git a/ckan/model/__init__.py b/ckan/model/__init__.py index 1c6e4d00fae..714d779c868 100644 --- a/ckan/model/__init__.py +++ b/ckan/model/__init__.py @@ -4,7 +4,9 @@ import logging import re from datetime import datetime +from time import sleep +from six import text_type import vdm.sqlalchemy from vdm.sqlalchemy.base import SQLAlchemySession from sqlalchemy import MetaData, __version__ as sqav, Table @@ -137,6 +139,7 @@ log = logging.getLogger(__name__) +DB_CONNECT_RETRIES = 10 # set up in init_model after metadata is bound version_table = None @@ -151,11 +154,18 @@ def init_model(engine): meta.metadata.bind = engine # sqlalchemy migrate version table import sqlalchemy.exc - try: - global version_table - version_table = Table('migrate_version', meta.metadata, autoload=True) - except sqlalchemy.exc.NoSuchTableError: - pass + for i in reversed(range(DB_CONNECT_RETRIES)): + try: + global version_table + version_table = Table('migrate_version', meta.metadata, autoload=True) + break + except sqlalchemy.exc.NoSuchTableError: + break + except sqlalchemy.exc.OperationalError as e: + if 'database system is starting up' in repr(e.orig) and i: + sleep(DB_CONNECT_RETRIES - i) + continue + raise class Repository(vdm.sqlalchemy.Repository): @@ -185,25 +195,6 @@ def init_db(self): else: if not self.tables_created_and_initialised: self.upgrade_db() - ## make sure celery tables are made as celery only makes - ## them after adding a task - try: - import ckan.lib.celery_app as celery_app - import celery.db.session as celery_session - import celery.backends.database - ## This creates the database tables (if using that backend) - ## It is a slight hack to celery - backend = celery_app.celery.backend - if isinstance(backend, - celery.backends.database.DatabaseBackend): - celery_result_session = backend.ResultSession() - engine = celery_result_session.bind - celery_session.ResultModelBase.metadata.\ - create_all(engine) - except ImportError: - # use of celery is optional - pass - self.tables_created_and_initialised = True log.info('Database initialised') @@ -392,7 +383,7 @@ def _get_groups(self): # could set this up directly on the mapper? def _get_revision_user(self): - username = unicode(self.author) + username = text_type(self.author) user = meta.Session.query(User).filter_by(name=username).first() return user diff --git a/ckan/model/group.py b/ckan/model/group.py index 00b77d33323..18fe6a16cdf 100644 --- a/ckan/model/group.py +++ b/ckan/model/group.py @@ -364,9 +364,7 @@ def all_related_revisions(self): results[obj_rev.revision] = [] results[obj_rev.revision].append(obj_rev) result_list = results.items() - ourcmp = lambda rev_tuple1, rev_tuple2: \ - cmp(rev_tuple2[0].timestamp, rev_tuple1[0].timestamp) - return sorted(result_list, cmp=ourcmp) + return sorted(result_list, key=lambda x: x[0].timestamp, reverse=True) def __repr__(self): return '' % self.name @@ -431,4 +429,3 @@ def __repr__(self): INNER JOIN public.group G ON G.id = PT.table_id WHERE G.type = :type AND G.state='active' ORDER BY PT.depth DESC;""".format(max_recurses=MAX_RECURSES) - diff --git a/ckan/model/group_extra.py b/ckan/model/group_extra.py index 9b4aa60d30e..331c4c66d08 100644 --- a/ckan/model/group_extra.py +++ b/ckan/model/group_extra.py @@ -3,6 +3,7 @@ import vdm.sqlalchemy import vdm.sqlalchemy.stateful from sqlalchemy import orm, types, Column, Table, ForeignKey +from six import text_type import group import meta @@ -46,10 +47,10 @@ class GroupExtra(vdm.sqlalchemy.RevisionedObjectMixin, group_extra_revision_table) def _create_extra(key, value): - return GroupExtra(key=unicode(key), value=value) + return GroupExtra(key=text_type(key), value=value) _extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras', - vdm.sqlalchemy.stateful.StatefulDict, base_modifier=lambda x: x.get_as_of()) + vdm.sqlalchemy.stateful.StatefulDict, base_modifier=lambda x: x.get_as_of()) setattr(group.Group, 'extras_active', _extras_active) group.Group.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value', creator=_create_extra) diff --git a/ckan/model/license.py b/ckan/model/license.py index 4b9ecfb14cb..60d2b1d10b8 100644 --- a/ckan/model/license.py +++ b/ckan/model/license.py @@ -6,6 +6,7 @@ from ckan.common import config from paste.deploy.converters import asbool +from six import text_type from ckan.common import _, json import ckan.lib.maintain as maintain @@ -200,7 +201,7 @@ def __getitem__(self, key): if key in self.keys: value = getattr(self, key) if isinstance(value, str): - return unicode(value) + return text_type(value) else: return value else: @@ -210,7 +211,7 @@ def copy(self): ''' create a dict of the license used by the licenses api ''' out = {} for key in self.keys: - out[key] = unicode(getattr(self, key)) + out[key] = text_type(getattr(self, key)) return out class LicenseNotSpecified(DefaultLicense): diff --git a/ckan/model/modification.py b/ckan/model/modification.py index 4c31b190d14..4db8889461d 100644 --- a/ckan/model/modification.py +++ b/ckan/model/modification.py @@ -2,12 +2,17 @@ import logging +from sqlalchemy.orm.exc import UnmappedInstanceError + from ckan.lib.search import SearchIndexError +from ckan.common import g import ckan.plugins as plugins -import domain_object -import package as _package -import resource +import ckan.model as model + +domain_object = model.domain_object +_package = model.package +resource = model.resource log = logging.getLogger(__name__) @@ -77,6 +82,18 @@ def notify(self, entity, operation): observer.notify(entity, operation) except SearchIndexError as search_error: log.exception(search_error) + + # userobj must be available inside rendered error template, + # though it become unbounded after session rollback because + # of this error. Expunge will prevent `UnboundedInstanceError` + # raised from error template. + try: + model.Session.expunge(g.userobj) + # AttributeError - there is no such prop in `g` + # UnmappedInstanceError - g.userobj is None or empty string. + except (AttributeError, UnmappedInstanceError): + pass + # Reraise, since it's pretty crucial to ckan if it can't index # a dataset raise diff --git a/ckan/model/package.py b/ckan/model/package.py index 47ad0143b99..3022119b4ba 100644 --- a/ckan/model/package.py +++ b/ckan/model/package.py @@ -24,7 +24,7 @@ __all__ = ['Package', 'package_table', 'package_revision_table', 'PACKAGE_NAME_MAX_LENGTH', 'PACKAGE_NAME_MIN_LENGTH', - 'PACKAGE_VERSION_MAX_LENGTH', 'PackageTag', 'PackageTagRevision', + 'PACKAGE_VERSION_MAX_LENGTH', 'PackageTagRevision', 'PackageRevision'] @@ -395,9 +395,7 @@ def all_related_revisions(self): results[obj_rev.revision].append(obj_rev) result_list = results.items() - ourcmp = lambda rev_tuple1, rev_tuple2: \ - cmp(rev_tuple2[0].timestamp, rev_tuple1[0].timestamp) - return sorted(result_list, cmp=ourcmp) + return sorted(result_list, key=lambda x: x[0].timestamp, reverse=True) @property def latest_related_revision(self): diff --git a/ckan/model/package_extra.py b/ckan/model/package_extra.py index f32486e4ea7..55c5188ba2b 100644 --- a/ckan/model/package_extra.py +++ b/ckan/model/package_extra.py @@ -1,5 +1,6 @@ # encoding: utf-8 +from six import text_type import vdm.sqlalchemy import vdm.sqlalchemy.stateful from sqlalchemy import orm, types, Column, Table, ForeignKey @@ -75,11 +76,10 @@ def activity_stream_detail(self, activity_id, activity_type): PackageExtraRevision.related_packages = lambda self: [self.continuity.package] def _create_extra(key, value): - return PackageExtra(key=unicode(key), value=value) + return PackageExtra(key=text_type(key), value=value) _extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras', - vdm.sqlalchemy.stateful.StatefulDict, base_modifier=lambda x: x.get_as_of()) + vdm.sqlalchemy.stateful.StatefulDict, base_modifier=lambda x: x.get_as_of()) setattr(_package.Package, 'extras_active', _extras_active) _package.Package.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value', creator=_create_extra) - diff --git a/ckan/model/resource.py b/ckan/model/resource.py index 529a7694401..effcd135b30 100644 --- a/ckan/model/resource.py +++ b/ckan/model/resource.py @@ -2,6 +2,7 @@ import datetime +from six import text_type from sqlalchemy.util import OrderedDict from sqlalchemy.ext.orderinglist import ordering_list from sqlalchemy import orm @@ -212,7 +213,7 @@ def resource_identifier(obj): class DictProxy(object): - def __init__(self, target_key, target_dict, data_type=unicode): + def __init__(self, target_key, target_dict, data_type=text_type): self.target_key = target_key self.target_dict = target_dict self.data_type = data_type diff --git a/ckan/model/system_info.py b/ckan/model/system_info.py index e2b098de1b8..5ccf852dd16 100644 --- a/ckan/model/system_info.py +++ b/ckan/model/system_info.py @@ -8,6 +8,7 @@ ''' from sqlalchemy import types, Column, Table +from six import text_type import vdm.sqlalchemy import meta @@ -37,7 +38,7 @@ def __init__(self, key, value): super(SystemInfo, self).__init__() self.key = key - self.value = unicode(value) + self.value = text_type(value) meta.mapper(SystemInfo, system_info_table, @@ -76,12 +77,12 @@ def set_system_info(key, value): ''' save data in the system_info table ''' obj = None obj = meta.Session.query(SystemInfo).filter_by(key=key).first() - if obj and obj.value == unicode(value): + if obj and obj.value == text_type(value): return if not obj: obj = SystemInfo(key, value) else: - obj.value = unicode(value) + obj.value = text_type(value) from ckan.model import repo rev = repo.new_revision() diff --git a/ckan/model/types.py b/ckan/model/types.py index b05fcf335eb..fcc01d36b0a 100644 --- a/ckan/model/types.py +++ b/ckan/model/types.py @@ -7,6 +7,7 @@ import simplejson as json from sqlalchemy import types +from six import string_types, text_type import meta @@ -14,13 +15,13 @@ 'JsonType', 'JsonDictType'] def make_uuid(): - return unicode(uuid.uuid4()) + return text_type(uuid.uuid4()) class UuidType(types.TypeDecorator): impl = types.Unicode def process_bind_param(self, value, engine): - return unicode(value) + return text_type(value) def process_result_value(self, value, engine): # return uuid.UUID(value) @@ -32,7 +33,7 @@ def copy(self): @classmethod def default(cls): # return uuid.uuid4() - return unicode(uuid.uuid4()) + return text_type(uuid.uuid4()) class JsonType(types.TypeDecorator): @@ -49,7 +50,7 @@ def process_bind_param(self, value, engine): return None else: # ensure_ascii=False => allow unicode but still need to convert - return unicode(json.dumps(value, ensure_ascii=False)) + return text_type(json.dumps(value, ensure_ascii=False)) def process_result_value(self, value, engine): if value is None: @@ -74,10 +75,10 @@ def process_bind_param(self, value, engine): if value is None or value == {}: # ensure we stores nulls in db not json "null" return None else: - if isinstance(value, basestring): - return unicode(value) + if isinstance(value, string_types): + return text_type(value) else: - return unicode(json.dumps(value, ensure_ascii=False)) + return text_type(json.dumps(value, ensure_ascii=False)) def copy(self): return JsonDictType(self.impl.length) @@ -89,7 +90,7 @@ def iso_date_to_datetime_for_sqlite(datetime_or_iso_date_if_sqlite): # to call this to convert it into a datetime type. When running on # postgres then you have a datetime anyway, so this function doesn't # do anything. - if meta.engine_is_sqlite() and isinstance(datetime_or_iso_date_if_sqlite, basestring): + if meta.engine_is_sqlite() and isinstance(datetime_or_iso_date_if_sqlite, string_types): return datetime.datetime.strptime(datetime_or_iso_date_if_sqlite, '%Y-%m-%d %H:%M:%S.%f') else: diff --git a/ckan/model/user.py b/ckan/model/user.py index 257a84d8486..fb1b36e61a4 100644 --- a/ckan/model/user.py +++ b/ckan/model/user.py @@ -10,6 +10,7 @@ from sqlalchemy.sql.expression import or_ from sqlalchemy.orm import synonym from sqlalchemy import types, Column, Table, func +from six import text_type import vdm.sqlalchemy import meta @@ -101,7 +102,7 @@ def _set_password(self, password): ''' hashed_password = pbkdf2_sha512.encrypt(password) - if not isinstance(hashed_password, unicode): + if not isinstance(hashed_password, text_type): hashed_password = hashed_password.decode('utf-8') self._password = hashed_password @@ -109,7 +110,7 @@ def _get_password(self): return self._password def _verify_and_upgrade_from_sha1(self, password): - if isinstance(password, unicode): + if isinstance(password, text_type): password_8bit = password.encode('ascii', 'ignore') else: password_8bit = password diff --git a/ckan/pastertemplates/__init__.py b/ckan/pastertemplates/__init__.py index afcefcd8ccd..07f8c7c1e4e 100644 --- a/ckan/pastertemplates/__init__.py +++ b/ckan/pastertemplates/__init__.py @@ -55,11 +55,14 @@ def check_vars(self, vars, cmd): # workaround for a paster issue https://github.com/ckan/ckan/issues/2636 # this is only used from a short-lived paster command - reload(sys) - sys.setdefaultencoding('utf-8') + try: + reload(sys) # Python 2 + sys.setdefaultencoding('utf-8') + except NameError: + pass # Python 3 if not vars['project'].startswith('ckanext-'): - print "\nError: Project name must start with 'ckanext-'" + print("\nError: Project name must start with 'ckanext-'") sys.exit(1) # The project name without the ckanext-. diff --git a/ckan/plugins/core.py b/ckan/plugins/core.py index 07456fc8803..14098016d0d 100644 --- a/ckan/plugins/core.py +++ b/ckan/plugins/core.py @@ -12,6 +12,7 @@ from pyutilib.component.core import SingletonPlugin as _pca_SingletonPlugin from pyutilib.component.core import Plugin as _pca_Plugin from paste.deploy.converters import asbool +from six import string_types import interfaces @@ -244,7 +245,7 @@ def _get_service(plugin_name): :return: the service object ''' - if isinstance(plugin_name, basestring): + if isinstance(plugin_name, string_types): for group in GROUPS: iterator = iter_entry_points( group=group, diff --git a/ckan/plugins/toolkit.py b/ckan/plugins/toolkit.py index 3f1c8bf48fa..da2fbcd8cca 100644 --- a/ckan/plugins/toolkit.py +++ b/ckan/plugins/toolkit.py @@ -44,6 +44,8 @@ class _Toolkit(object): 'literal', # get logic action function 'get_action', + # get flask/pylons endpoint fragments + 'get_endpoint', # decorator for chained action 'chained_action', # get navl schema converter @@ -283,6 +285,7 @@ def _initialize(self): t['add_ckan_admin_tab'] = self._add_ckan_admin_tabs t['requires_ckan_version'] = self._requires_ckan_version t['check_ckan_version'] = self._check_ckan_version + t['get_endpoint'] = self._get_endpoint t['CkanVersionException'] = CkanVersionException t['HelperError'] = HelperError t['enqueue_job'] = enqueue_job @@ -456,6 +459,26 @@ def _requires_ckan_version(cls, min_version, max_version=None): ) raise CkanVersionException(error) + @classmethod + def _get_endpoint(cls): + """Returns tuple in format: (controller|blueprint, action|view). + """ + import ckan.common as common + try: + # CKAN >= 2.8 + endpoint = tuple(common.request.endpoint.split('.')) + except AttributeError: + try: + return common.c.controller, common.c.action + except AttributeError: + return (None, None) + # there are some routes('hello_world') that are not using blueprint + # For such case, let's assume that view function is a controller + # itself and action is None. + if len(endpoint) is 1: + return endpoint + (None,) + return endpoint + def __getattr__(self, name): ''' return the function/object requested ''' if not self._toolkit: diff --git a/ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js b/ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js index 2a7cb3f751c..8dd976ce5b1 100644 --- a/ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js +++ b/ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js @@ -19,18 +19,22 @@ ckan.module('resource-view-filters-form', function (jQuery) { query; query = { - plain: false, resource_id: resourceId, limit: queryLimit, offset: offset, fields: filterName, distinct: true, - sort: filterName + sort: filterName, + include_total: false }; if (term !== '') { var q = {}; - q[filterName] = term + ':*'; + if (term.indexOf(' ') == -1) { + term = term + ':*'; + query.plain = false; + } + q[filterName] = term; query.q = JSON.stringify(q); } @@ -38,7 +42,7 @@ ckan.module('resource-view-filters-form', function (jQuery) { }, results: function (data, page) { var records = data.result.records, - hasMore = (records.length < data.result.total), + hasMore = (records.length == queryLimit), results; results = $.map(records, function (record) { diff --git a/ckan/public-bs2/base/javascript/modules/resource-view-filters.js b/ckan/public-bs2/base/javascript/modules/resource-view-filters.js index ed7f13a6446..99831075604 100644 --- a/ckan/public-bs2/base/javascript/modules/resource-view-filters.js +++ b/ckan/public-bs2/base/javascript/modules/resource-view-filters.js @@ -94,7 +94,7 @@ this.ckan.module('resource-view-filters', function (jQuery) { width: 'resolve', minimumInputLength: 0, ajax: { - url: '/api/3/action/datastore_search', + url: ckan.url('/api/3/action/datastore_search'), datatype: 'json', quietMillis: 200, cache: true, @@ -103,18 +103,23 @@ this.ckan.module('resource-view-filters', function (jQuery) { query; query = { - plain: false, resource_id: resourceId, limit: queryLimit, offset: offset, fields: filterName, distinct: true, - sort: filterName + sort: filterName, + include_total: false }; + if (term !== '') { var q = {}; - q[filterName] = term + ':*'; + if (term.indexOf(' ') == -1) { + term = term + ':*'; + query.plain = false; + } + q[filterName] = term; query.q = JSON.stringify(q); } @@ -122,7 +127,7 @@ this.ckan.module('resource-view-filters', function (jQuery) { }, results: function (data, page) { var records = data.result.records, - hasMore = (records.length < data.result.total), + hasMore = (records.length == queryLimit), results; results = $.map(records, function (record) { diff --git a/ckan/public-bs2/base/javascript/modules/resource-view-reorder.js b/ckan/public-bs2/base/javascript/modules/resource-view-reorder.js index d10e6d45625..34def7682b5 100644 --- a/ckan/public-bs2/base/javascript/modules/resource-view-reorder.js +++ b/ckan/public-bs2/base/javascript/modules/resource-view-reorder.js @@ -33,7 +33,7 @@ this.ckan.module('resource-view-reorder', function($) { initialize: function() { jQuery.proxyAll(this, /_on/); - var labelText = this._(this.labelText); + var labelText = this._(this.options.labelText); this.html_title = $(this.template.title) .text(labelText) .insertBefore(this.el) diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.images-loaded.js b/ckan/public-bs2/base/javascript/plugins/jquery.images-loaded.js new file mode 100644 index 00000000000..f6ac95c2e28 --- /dev/null +++ b/ckan/public-bs2/base/javascript/plugins/jquery.images-loaded.js @@ -0,0 +1,496 @@ +/*! + * imagesLoaded PACKAGED v4.1.4 + * JavaScript is all like "You images are done yet or what?" + * MIT License + */ + +/** + * EvEmitter v1.1.0 + * Lil' event emitter + * MIT License + */ + +/* jshint unused: true, undef: true, strict: true */ + +( function( global, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, window */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'ev-emitter/ev-emitter',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory(); + } else { + // Browser globals + global.EvEmitter = factory(); + } + +}( typeof window != 'undefined' ? window : this, function() { + + + +function EvEmitter() {} + +var proto = EvEmitter.prototype; + +proto.on = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // set events hash + var events = this._events = this._events || {}; + // set listeners array + var listeners = events[ eventName ] = events[ eventName ] || []; + // only add once + if ( listeners.indexOf( listener ) == -1 ) { + listeners.push( listener ); + } + + return this; +}; + +proto.once = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // add event + this.on( eventName, listener ); + // set once flag + // set onceEvents hash + var onceEvents = this._onceEvents = this._onceEvents || {}; + // set onceListeners object + var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; + // set flag + onceListeners[ listener ] = true; + + return this; +}; + +proto.off = function( eventName, listener ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + var index = listeners.indexOf( listener ); + if ( index != -1 ) { + listeners.splice( index, 1 ); + } + + return this; +}; + +proto.emitEvent = function( eventName, args ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + // copy over to avoid interference if .off() in listener + listeners = listeners.slice(0); + args = args || []; + // once stuff + var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; + + for ( var i=0; i < listeners.length; i++ ) { + var listener = listeners[i] + var isOnce = onceListeners && onceListeners[ listener ]; + if ( isOnce ) { + // remove listener + // remove before trigger to prevent recursion + this.off( eventName, listener ); + // unset once flag + delete onceListeners[ listener ]; + } + // trigger listener + listener.apply( this, args ); + } + + return this; +}; + +proto.allOff = function() { + delete this._events; + delete this._onceEvents; +}; + +return EvEmitter; + +})); + +/*! + * imagesLoaded v4.1.4 + * JavaScript is all like "You images are done yet or what?" + * MIT License + */ + +( function( window, factory ) { 'use strict'; + // universal module definition + + /*global define: false, module: false, require: false */ + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( [ + 'ev-emitter/ev-emitter' + ], function( EvEmitter ) { + return factory( window, EvEmitter ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('ev-emitter') + ); + } else { + // browser global + window.imagesLoaded = factory( + window, + window.EvEmitter + ); + } + +})( typeof window !== 'undefined' ? window : this, + +// -------------------------- factory -------------------------- // + +function factory( window, EvEmitter ) { + + + +var $ = window.jQuery; +var console = window.console; + +// -------------------------- helpers -------------------------- // + +// extend objects +function extend( a, b ) { + for ( var prop in b ) { + a[ prop ] = b[ prop ]; + } + return a; +} + +var arraySlice = Array.prototype.slice; + +// turn element or nodeList into an array +function makeArray( obj ) { + if ( Array.isArray( obj ) ) { + // use object if already an array + return obj; + } + + var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number'; + if ( isArrayLike ) { + // convert nodeList to array + return arraySlice.call( obj ); + } + + // array of single index + return [ obj ]; +} + +// -------------------------- imagesLoaded -------------------------- // + +/** + * @param {Array, Element, NodeList, String} elem + * @param {Object or Function} options - if function, use as callback + * @param {Function} onAlways - callback function + */ +function ImagesLoaded( elem, options, onAlways ) { + // coerce ImagesLoaded() without new, to be new ImagesLoaded() + if ( !( this instanceof ImagesLoaded ) ) { + return new ImagesLoaded( elem, options, onAlways ); + } + // use elem as selector string + var queryElem = elem; + if ( typeof elem == 'string' ) { + queryElem = document.querySelectorAll( elem ); + } + // bail if bad element + if ( !queryElem ) { + console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) ); + return; + } + + this.elements = makeArray( queryElem ); + this.options = extend( {}, this.options ); + // shift arguments if no options set + if ( typeof options == 'function' ) { + onAlways = options; + } else { + extend( this.options, options ); + } + + if ( onAlways ) { + this.on( 'always', onAlways ); + } + + this.getImages(); + + if ( $ ) { + // add jQuery Deferred object + this.jqDeferred = new $.Deferred(); + } + + // HACK check async to allow time to bind listeners + setTimeout( this.check.bind( this ) ); +} + +ImagesLoaded.prototype = Object.create( EvEmitter.prototype ); + +ImagesLoaded.prototype.options = {}; + +ImagesLoaded.prototype.getImages = function() { + this.images = []; + + // filter & find items if we have an item selector + this.elements.forEach( this.addElementImages, this ); +}; + +/** + * @param {Node} element + */ +ImagesLoaded.prototype.addElementImages = function( elem ) { + // filter siblings + if ( elem.nodeName == 'IMG' ) { + this.addImage( elem ); + } + // get background image on element + if ( this.options.background === true ) { + this.addElementBackgroundImages( elem ); + } + + // find children + // no non-element nodes, #143 + var nodeType = elem.nodeType; + if ( !nodeType || !elementNodeTypes[ nodeType ] ) { + return; + } + var childImgs = elem.querySelectorAll('img'); + // concat childElems to filterFound array + for ( var i=0; i < childImgs.length; i++ ) { + var img = childImgs[i]; + this.addImage( img ); + } + + // get child background images + if ( typeof this.options.background == 'string' ) { + var children = elem.querySelectorAll( this.options.background ); + for ( i=0; i < children.length; i++ ) { + var child = children[i]; + this.addElementBackgroundImages( child ); + } + } +}; + +var elementNodeTypes = { + 1: true, + 9: true, + 11: true +}; + +ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) { + var style = getComputedStyle( elem ); + if ( !style ) { + // Firefox returns null if in a hidden iframe https://bugzil.la/548397 + return; + } + // get url inside url("...") + var reURL = /url\((['"])?(.*?)\1\)/gi; + var matches = reURL.exec( style.backgroundImage ); + while ( matches !== null ) { + var url = matches && matches[2]; + if ( url ) { + this.addBackground( url, elem ); + } + matches = reURL.exec( style.backgroundImage ); + } +}; + +/** + * @param {Image} img + */ +ImagesLoaded.prototype.addImage = function( img ) { + var loadingImage = new LoadingImage( img ); + this.images.push( loadingImage ); +}; + +ImagesLoaded.prototype.addBackground = function( url, elem ) { + var background = new Background( url, elem ); + this.images.push( background ); +}; + +ImagesLoaded.prototype.check = function() { + var _this = this; + this.progressedCount = 0; + this.hasAnyBroken = false; + // complete if no images + if ( !this.images.length ) { + this.complete(); + return; + } + + function onProgress( image, elem, message ) { + // HACK - Chrome triggers event before object properties have changed. #83 + setTimeout( function() { + _this.progress( image, elem, message ); + }); + } + + this.images.forEach( function( loadingImage ) { + loadingImage.once( 'progress', onProgress ); + loadingImage.check(); + }); +}; + +ImagesLoaded.prototype.progress = function( image, elem, message ) { + this.progressedCount++; + this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded; + // progress event + this.emitEvent( 'progress', [ this, image, elem ] ); + if ( this.jqDeferred && this.jqDeferred.notify ) { + this.jqDeferred.notify( this, image ); + } + // check if completed + if ( this.progressedCount == this.images.length ) { + this.complete(); + } + + if ( this.options.debug && console ) { + console.log( 'progress: ' + message, image, elem ); + } +}; + +ImagesLoaded.prototype.complete = function() { + var eventName = this.hasAnyBroken ? 'fail' : 'done'; + this.isComplete = true; + this.emitEvent( eventName, [ this ] ); + this.emitEvent( 'always', [ this ] ); + if ( this.jqDeferred ) { + var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve'; + this.jqDeferred[ jqMethod ]( this ); + } +}; + +// -------------------------- -------------------------- // + +function LoadingImage( img ) { + this.img = img; +} + +LoadingImage.prototype = Object.create( EvEmitter.prototype ); + +LoadingImage.prototype.check = function() { + // If complete is true and browser supports natural sizes, + // try to check for image status manually. + var isComplete = this.getIsImageComplete(); + if ( isComplete ) { + // report based on naturalWidth + this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); + return; + } + + // If none of the checks above matched, simulate loading on detached element. + this.proxyImage = new Image(); + this.proxyImage.addEventListener( 'load', this ); + this.proxyImage.addEventListener( 'error', this ); + // bind to image as well for Firefox. #191 + this.img.addEventListener( 'load', this ); + this.img.addEventListener( 'error', this ); + this.proxyImage.src = this.img.src; +}; + +LoadingImage.prototype.getIsImageComplete = function() { + // check for non-zero, non-undefined naturalWidth + // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671 + return this.img.complete && this.img.naturalWidth; +}; + +LoadingImage.prototype.confirm = function( isLoaded, message ) { + this.isLoaded = isLoaded; + this.emitEvent( 'progress', [ this, this.img, message ] ); +}; + +// ----- events ----- // + +// trigger specified handler for event type +LoadingImage.prototype.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +LoadingImage.prototype.onload = function() { + this.confirm( true, 'onload' ); + this.unbindEvents(); +}; + +LoadingImage.prototype.onerror = function() { + this.confirm( false, 'onerror' ); + this.unbindEvents(); +}; + +LoadingImage.prototype.unbindEvents = function() { + this.proxyImage.removeEventListener( 'load', this ); + this.proxyImage.removeEventListener( 'error', this ); + this.img.removeEventListener( 'load', this ); + this.img.removeEventListener( 'error', this ); +}; + +// -------------------------- Background -------------------------- // + +function Background( url, element ) { + this.url = url; + this.element = element; + this.img = new Image(); +} + +// inherit LoadingImage prototype +Background.prototype = Object.create( LoadingImage.prototype ); + +Background.prototype.check = function() { + this.img.addEventListener( 'load', this ); + this.img.addEventListener( 'error', this ); + this.img.src = this.url; + // check if image is already complete + var isComplete = this.getIsImageComplete(); + if ( isComplete ) { + this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); + this.unbindEvents(); + } +}; + +Background.prototype.unbindEvents = function() { + this.img.removeEventListener( 'load', this ); + this.img.removeEventListener( 'error', this ); +}; + +Background.prototype.confirm = function( isLoaded, message ) { + this.isLoaded = isLoaded; + this.emitEvent( 'progress', [ this, this.element, message ] ); +}; + +// -------------------------- jQuery -------------------------- // + +ImagesLoaded.makeJQueryPlugin = function( jQuery ) { + jQuery = jQuery || window.jQuery; + if ( !jQuery ) { + return; + } + // set local variable + $ = jQuery; + // $().imagesLoaded() + $.fn.imagesLoaded = function( options, callback ) { + var instance = new ImagesLoaded( this, options, callback ); + return instance.jqDeferred.promise( $(this) ); + }; +}; +// try making plugin +ImagesLoaded.makeJQueryPlugin(); + +// -------------------------- -------------------------- // + +return ImagesLoaded; + +}); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.masonry.js b/ckan/public-bs2/base/javascript/plugins/jquery.masonry.js index 12a39eb2b76..440b0e00265 100644 --- a/ckan/public-bs2/base/javascript/plugins/jquery.masonry.js +++ b/ckan/public-bs2/base/javascript/plugins/jquery.masonry.js @@ -1,502 +1,2501 @@ +/*! + * Masonry PACKAGED v4.2.1 + * Cascading grid layout library + * https://masonry.desandro.com + * MIT License + * by David DeSandro + */ + /** - * jQuery Masonry v2.1.08 - * A dynamic layout plugin for jQuery - * The flip-side of CSS Floats - * http://masonry.desandro.com - * - * Licensed under the MIT license. - * Copyright 2012 David DeSandro + * Bridget makes jQuery widgets + * v2.0.1 + * MIT license */ -/*jshint browser: true, curly: true, eqeqeq: true, forin: false, immed: false, newcap: true, noempty: true, strict: true, undef: true */ -/*global jQuery: false */ +/* jshint browser: true, strict: true, undef: true, unused: true */ -(function( window, $, undefined ){ +( function( window, factory ) { + // universal module definition + /*jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) { + return factory( window, jQuery ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('jquery') + ); + } else { + // browser global + window.jQueryBridget = factory( + window, + window.jQuery + ); + } + +}( window, function factory( window, jQuery ) { +'use strict'; + +// ----- utils ----- // + +var arraySlice = Array.prototype.slice; + +// helper function for logging errors +// $.error breaks jQuery chaining +var console = window.console; +var logError = typeof console == 'undefined' ? function() {} : + function( message ) { + console.error( message ); + }; - 'use strict'; +// ----- jQueryBridget ----- // + +function jQueryBridget( namespace, PluginClass, $ ) { + $ = $ || jQuery || window.jQuery; + if ( !$ ) { + return; + } + + // add option method -> $().plugin('option', {...}) + if ( !PluginClass.prototype.option ) { + // option setter + PluginClass.prototype.option = function( opts ) { + // bail out if not an object + if ( !$.isPlainObject( opts ) ){ + return; + } + this.options = $.extend( true, this.options, opts ); + }; + } + + // make jQuery plugin + $.fn[ namespace ] = function( arg0 /*, arg1 */ ) { + if ( typeof arg0 == 'string' ) { + // method call $().plugin( 'methodName', { options } ) + // shift arguments by 1 + var args = arraySlice.call( arguments, 1 ); + return methodCall( this, arg0, args ); + } + // just $().plugin({ options }) + plainCall( this, arg0 ); + return this; + }; - /* - * smartresize: debounced resize event for jQuery - * - * latest version and complete README available on Github: - * https://github.com/louisremi/jquery.smartresize.js - * - * Copyright 2011 @louis_remi - * Licensed under the MIT license. - */ + // $().plugin('methodName') + function methodCall( $elems, methodName, args ) { + var returnValue; + var pluginMethodStr = '$().' + namespace + '("' + methodName + '")'; + + $elems.each( function( i, elem ) { + // get instance + var instance = $.data( elem, namespace ); + if ( !instance ) { + logError( namespace + ' not initialized. Cannot call methods, i.e. ' + + pluginMethodStr ); + return; + } - var $event = $.event, - resizeTimeout; + var method = instance[ methodName ]; + if ( !method || methodName.charAt(0) == '_' ) { + logError( pluginMethodStr + ' is not a valid method' ); + return; + } - $event.special.smartresize = { - setup: function() { - $(this).bind( "resize", $event.special.smartresize.handler ); - }, - teardown: function() { - $(this).unbind( "resize", $event.special.smartresize.handler ); - }, - handler: function( event, execAsap ) { - // Save the context - var context = this, - args = arguments; + // apply method, get return value + var value = method.apply( instance, args ); + // set return value if value is returned, use only first value + returnValue = returnValue === undefined ? value : returnValue; + }); + + return returnValue !== undefined ? returnValue : $elems; + } + + function plainCall( $elems, options ) { + $elems.each( function( i, elem ) { + var instance = $.data( elem, namespace ); + if ( instance ) { + // set options & init + instance.option( options ); + instance._init(); + } else { + // initialize new instance + instance = new PluginClass( elem, options ); + $.data( elem, namespace, instance ); + } + }); + } + + updateJQuery( $ ); - // set correct event type - event.type = "smartresize"; +} - if ( resizeTimeout ) { clearTimeout( resizeTimeout ); } - resizeTimeout = setTimeout(function() { - $event.dispatch.apply( context, args ); +// ----- updateJQuery ----- // - }, execAsap === "execAsap"? 0 : 100 ); +// set $.bridget for v1 backwards compatibility +function updateJQuery( $ ) { + if ( !$ || ( $ && $.bridget ) ) { + return; + } + $.bridget = jQueryBridget; +} + +updateJQuery( jQuery || window.jQuery ); + +// ----- ----- // + +return jQueryBridget; + +})); + +/** + * EvEmitter v1.1.0 + * Lil' event emitter + * MIT License + */ + +/* jshint unused: true, undef: true, strict: true */ + +( function( global, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, window */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'ev-emitter/ev-emitter',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory(); + } else { + // Browser globals + global.EvEmitter = factory(); + } + +}( typeof window != 'undefined' ? window : this, function() { + + + +function EvEmitter() {} + +var proto = EvEmitter.prototype; + +proto.on = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // set events hash + var events = this._events = this._events || {}; + // set listeners array + var listeners = events[ eventName ] = events[ eventName ] || []; + // only add once + if ( listeners.indexOf( listener ) == -1 ) { + listeners.push( listener ); + } + + return this; +}; + +proto.once = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // add event + this.on( eventName, listener ); + // set once flag + // set onceEvents hash + var onceEvents = this._onceEvents = this._onceEvents || {}; + // set onceListeners object + var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; + // set flag + onceListeners[ listener ] = true; + + return this; +}; + +proto.off = function( eventName, listener ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + var index = listeners.indexOf( listener ); + if ( index != -1 ) { + listeners.splice( index, 1 ); + } + + return this; +}; + +proto.emitEvent = function( eventName, args ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + // copy over to avoid interference if .off() in listener + listeners = listeners.slice(0); + args = args || []; + // once stuff + var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; + + for ( var i=0; i < listeners.length; i++ ) { + var listener = listeners[i] + var isOnce = onceListeners && onceListeners[ listener ]; + if ( isOnce ) { + // remove listener + // remove before trigger to prevent recursion + this.off( eventName, listener ); + // unset once flag + delete onceListeners[ listener ]; } + // trigger listener + listener.apply( this, args ); + } + + return this; +}; + +proto.allOff = function() { + delete this._events; + delete this._onceEvents; +}; + +return EvEmitter; + +})); + +/*! + * getSize v2.0.2 + * measure size of elements + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ +/*global define: false, module: false, console: false */ + +( function( window, factory ) { + 'use strict'; + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'get-size/get-size',[],function() { + return factory(); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory(); + } else { + // browser global + window.getSize = factory(); + } + +})( window, function factory() { +'use strict'; + +// -------------------------- helpers -------------------------- // + +// get a number from a string, not a percentage +function getStyleSize( value ) { + var num = parseFloat( value ); + // not a percent like '100%', and a number + var isValid = value.indexOf('%') == -1 && !isNaN( num ); + return isValid && num; +} + +function noop() {} + +var logError = typeof console == 'undefined' ? noop : + function( message ) { + console.error( message ); }; - $.fn.smartresize = function( fn ) { - return fn ? this.bind( "smartresize", fn ) : this.trigger( "smartresize", ["execAsap"] ); +// -------------------------- measurements -------------------------- // + +var measurements = [ + 'paddingLeft', + 'paddingRight', + 'paddingTop', + 'paddingBottom', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginBottom', + 'borderLeftWidth', + 'borderRightWidth', + 'borderTopWidth', + 'borderBottomWidth' +]; + +var measurementsLength = measurements.length; + +function getZeroSize() { + var size = { + width: 0, + height: 0, + innerWidth: 0, + innerHeight: 0, + outerWidth: 0, + outerHeight: 0 }; + for ( var i=0; i < measurementsLength; i++ ) { + var measurement = measurements[i]; + size[ measurement ] = 0; + } + return size; +} + +// -------------------------- getStyle -------------------------- // + +/** + * getStyle, get style of element, check for Firefox bug + * https://bugzilla.mozilla.org/show_bug.cgi?id=548397 + */ +function getStyle( elem ) { + var style = getComputedStyle( elem ); + if ( !style ) { + logError( 'Style returned ' + style + + '. Are you running this code in a hidden iframe on Firefox? ' + + 'See http://bit.ly/getsizebug1' ); + } + return style; +} +// -------------------------- setup -------------------------- // +var isSetup = false; -// ========================= Masonry =============================== +var isBoxSizeOuter; +/** + * setup + * check isBoxSizerOuter + * do on first getSize() rather than on page load for Firefox bug + */ +function setup() { + // setup once + if ( isSetup ) { + return; + } + isSetup = true; + + // -------------------------- box sizing -------------------------- // + + /** + * WebKit measures the outer-width on style.width on border-box elems + * IE & Firefox<29 measures the inner-width + */ + var div = document.createElement('div'); + div.style.width = '200px'; + div.style.padding = '1px 2px 3px 4px'; + div.style.borderStyle = 'solid'; + div.style.borderWidth = '1px 2px 3px 4px'; + div.style.boxSizing = 'border-box'; - // our "Widget" object constructor - $.Mason = function( options, element ){ - this.element = $( element ); + var body = document.body || document.documentElement; + body.appendChild( div ); + var style = getStyle( div ); - this._create( options ); - this._init(); - }; + getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200; + body.removeChild( div ); - $.Mason.settings = { - isResizable: true, - isAnimated: false, - animationOptions: { - queue: false, - duration: 500 - }, - gutterWidth: 0, - isRTL: false, - isFitWidth: false, - containerStyle: { - position: 'relative' +} + +// -------------------------- getSize -------------------------- // + +function getSize( elem ) { + setup(); + + // use querySeletor if elem is string + if ( typeof elem == 'string' ) { + elem = document.querySelector( elem ); + } + + // do not proceed on non-objects + if ( !elem || typeof elem != 'object' || !elem.nodeType ) { + return; + } + + var style = getStyle( elem ); + + // if hidden, everything is 0 + if ( style.display == 'none' ) { + return getZeroSize(); + } + + var size = {}; + size.width = elem.offsetWidth; + size.height = elem.offsetHeight; + + var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; + + // get all measurements + for ( var i=0; i < measurementsLength; i++ ) { + var measurement = measurements[i]; + var value = style[ measurement ]; + var num = parseFloat( value ); + // any 'auto', 'medium' value will be 0 + size[ measurement ] = !isNaN( num ) ? num : 0; + } + + var paddingWidth = size.paddingLeft + size.paddingRight; + var paddingHeight = size.paddingTop + size.paddingBottom; + var marginWidth = size.marginLeft + size.marginRight; + var marginHeight = size.marginTop + size.marginBottom; + var borderWidth = size.borderLeftWidth + size.borderRightWidth; + var borderHeight = size.borderTopWidth + size.borderBottomWidth; + + var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; + + // overwrite width and height if we can get it from style + var styleWidth = getStyleSize( style.width ); + if ( styleWidth !== false ) { + size.width = styleWidth + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth ); + } + + var styleHeight = getStyleSize( style.height ); + if ( styleHeight !== false ) { + size.height = styleHeight + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight ); + } + + size.innerWidth = size.width - ( paddingWidth + borderWidth ); + size.innerHeight = size.height - ( paddingHeight + borderHeight ); + + size.outerWidth = size.width + marginWidth; + size.outerHeight = size.height + marginHeight; + + return size; +} + +return getSize; + +}); + +/** + * matchesSelector v2.0.2 + * matchesSelector( element, '.selector' ) + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ + +( function( window, factory ) { + /*global define: false, module: false */ + 'use strict'; + // universal module definition + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'desandro-matches-selector/matches-selector',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory(); + } else { + // browser global + window.matchesSelector = factory(); + } + +}( window, function factory() { + 'use strict'; + + var matchesMethod = ( function() { + var ElemProto = window.Element.prototype; + // check for the standard method name first + if ( ElemProto.matches ) { + return 'matches'; } + // check un-prefixed + if ( ElemProto.matchesSelector ) { + return 'matchesSelector'; + } + // check vendor prefixes + var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; + + for ( var i=0; i < prefixes.length; i++ ) { + var prefix = prefixes[i]; + var method = prefix + 'MatchesSelector'; + if ( ElemProto[ method ] ) { + return method; + } + } + })(); + + return function matchesSelector( elem, selector ) { + return elem[ matchesMethod ]( selector ); }; - $.Mason.prototype = { +})); - _filterFindBricks: function( $elems ) { - var selector = this.options.itemSelector; - // if there is a selector - // filter/find appropriate item elements - return !selector ? $elems : $elems.filter( selector ).add( $elems.find( selector ) ); - }, +/** + * Fizzy UI utils v2.0.5 + * MIT license + */ - _getBricks: function( $elems ) { - var $bricks = this._filterFindBricks( $elems ) - .css({ position: 'absolute' }) - .addClass('masonry-brick'); - return $bricks; - }, - - // sets up widget - _create : function( options ) { - - this.options = $.extend( true, {}, $.Mason.settings, options ); - this.styleQueue = []; - - // get original styles in case we re-apply them in .destroy() - var elemStyle = this.element[0].style; - this.originalStyle = { - // get height - height: elemStyle.height || '' - }; - // get other styles that will be overwritten - var containerStyle = this.options.containerStyle; - for ( var prop in containerStyle ) { - this.originalStyle[ prop ] = elemStyle[ prop ] || ''; - } +/*jshint browser: true, undef: true, unused: true, strict: true */ - this.element.css( containerStyle ); - - this.horizontalDirection = this.options.isRTL ? 'right' : 'left'; - - var x = this.element.css( 'padding-' + this.horizontalDirection ); - var y = this.element.css( 'padding-top' ); - this.offset = { - x: x ? parseInt( x, 10 ) : 0, - y: y ? parseInt( y, 10 ) : 0 - }; - - this.isFluid = this.options.columnWidth && typeof this.options.columnWidth === 'function'; - - // add masonry class first time around - var instance = this; - setTimeout( function() { - instance.element.addClass('masonry'); - }, 0 ); - - // bind resize method - if ( this.options.isResizable ) { - $(window).bind( 'smartresize.masonry', function() { - instance.resize(); - }); - } +( function( window, factory ) { + // universal module definition + /*jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'fizzy-ui-utils/utils',[ + 'desandro-matches-selector/matches-selector' + ], function( matchesSelector ) { + return factory( window, matchesSelector ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('desandro-matches-selector') + ); + } else { + // browser global + window.fizzyUIUtils = factory( + window, + window.matchesSelector + ); + } + +}( window, function factory( window, matchesSelector ) { + + + +var utils = {}; + +// ----- extend ----- // + +// extends objects +utils.extend = function( a, b ) { + for ( var prop in b ) { + a[ prop ] = b[ prop ]; + } + return a; +}; + +// ----- modulo ----- // + +utils.modulo = function( num, div ) { + return ( ( num % div ) + div ) % div; +}; + +// ----- makeArray ----- // + +// turn element or nodeList into an array +utils.makeArray = function( obj ) { + var ary = []; + if ( Array.isArray( obj ) ) { + // use object if already an array + ary = obj; + } else if ( obj && typeof obj == 'object' && + typeof obj.length == 'number' ) { + // convert nodeList to array + for ( var i=0; i < obj.length; i++ ) { + ary.push( obj[i] ); + } + } else { + // array of single index + ary.push( obj ); + } + return ary; +}; + +// ----- removeFrom ----- // + +utils.removeFrom = function( ary, obj ) { + var index = ary.indexOf( obj ); + if ( index != -1 ) { + ary.splice( index, 1 ); + } +}; + +// ----- getParent ----- // + +utils.getParent = function( elem, selector ) { + while ( elem.parentNode && elem != document.body ) { + elem = elem.parentNode; + if ( matchesSelector( elem, selector ) ) { + return elem; + } + } +}; + +// ----- getQueryElement ----- // + +// use element as selector string +utils.getQueryElement = function( elem ) { + if ( typeof elem == 'string' ) { + return document.querySelector( elem ); + } + return elem; +}; + +// ----- handleEvent ----- // + +// enable .ontype to trigger from .addEventListener( elem, 'type' ) +utils.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +// ----- filterFindElements ----- // + +utils.filterFindElements = function( elems, selector ) { + // make array of elems + elems = utils.makeArray( elems ); + var ffElems = []; + + elems.forEach( function( elem ) { + // check that elem is an actual element + if ( !( elem instanceof HTMLElement ) ) { + return; + } + // add elem if no selector + if ( !selector ) { + ffElems.push( elem ); + return; + } + // filter & find items if we have a selector + // filter + if ( matchesSelector( elem, selector ) ) { + ffElems.push( elem ); + } + // find children + var childElems = elem.querySelectorAll( selector ); + // concat childElems to filterFound array + for ( var i=0; i < childElems.length; i++ ) { + ffElems.push( childElems[i] ); + } + }); - // need to get bricks - this.reloadItems(); + return ffElems; +}; - }, - - // _init fires when instance is first created - // and when instance is triggered again -> $el.masonry(); - _init : function( callback ) { - this._getColumns(); - this._reLayout( callback ); - }, +// ----- debounceMethod ----- // - option: function( key, value ){ - // set options AFTER initialization: - // signature: $('#foo').bar({ cool:false }); - if ( $.isPlainObject( key ) ){ - this.options = $.extend(true, this.options, key); - } - }, - - // ====================== General Layout ====================== +utils.debounceMethod = function( _class, methodName, threshold ) { + // original method + var method = _class.prototype[ methodName ]; + var timeoutName = methodName + 'Timeout'; - // used on collection of atoms (should be filtered, and sorted before ) - // accepts atoms-to-be-laid-out to start with - layout : function( $bricks, callback ) { + _class.prototype[ methodName ] = function() { + var timeout = this[ timeoutName ]; + if ( timeout ) { + clearTimeout( timeout ); + } + var args = arguments; - // place each brick - for (var i=0, len = $bricks.length; i < len; i++) { - this._placeBrick( $bricks[i] ); - } - - // set the size of the container - var containerSize = {}; - containerSize.height = Math.max.apply( Math, this.colYs ); - if ( this.options.isFitWidth ) { - var unusedCols = 0; - i = this.cols; - // count unused columns - while ( --i ) { - if ( this.colYs[i] !== 0 ) { - break; - } - unusedCols++; + var _this = this; + this[ timeoutName ] = setTimeout( function() { + method.apply( _this, args ); + delete _this[ timeoutName ]; + }, threshold || 100 ); + }; +}; + +// ----- docReady ----- // + +utils.docReady = function( callback ) { + var readyState = document.readyState; + if ( readyState == 'complete' || readyState == 'interactive' ) { + // do async to allow for other scripts to run. metafizzy/flickity#441 + setTimeout( callback ); + } else { + document.addEventListener( 'DOMContentLoaded', callback ); + } +}; + +// ----- htmlInit ----- // + +// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ +utils.toDashed = function( str ) { + return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { + return $1 + '-' + $2; + }).toLowerCase(); +}; + +var console = window.console; +/** + * allow user to initialize classes via [data-namespace] or .js-namespace class + * htmlInit( Widget, 'widgetName' ) + * options are parsed from data-namespace-options + */ +utils.htmlInit = function( WidgetClass, namespace ) { + utils.docReady( function() { + var dashedNamespace = utils.toDashed( namespace ); + var dataAttr = 'data-' + dashedNamespace; + var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' ); + var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace ); + var elems = utils.makeArray( dataAttrElems ) + .concat( utils.makeArray( jsDashElems ) ); + var dataOptionsAttr = dataAttr + '-options'; + var jQuery = window.jQuery; + + elems.forEach( function( elem ) { + var attr = elem.getAttribute( dataAttr ) || + elem.getAttribute( dataOptionsAttr ); + var options; + try { + options = attr && JSON.parse( attr ); + } catch ( error ) { + // log error, do not initialize + if ( console ) { + console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className + + ': ' + error ); } - // fit container to columns that have been used; - containerSize.width = (this.cols - unusedCols) * this.columnWidth - this.options.gutterWidth; + return; } - this.styleQueue.push({ $el: this.element, style: containerSize }); - - // are we animating the layout arrangement? - // use plugin-ish syntax for css or animate - var styleFn = !this.isLaidOut ? 'css' : ( - this.options.isAnimated ? 'animate' : 'css' - ), - animOpts = this.options.animationOptions; - - // process styleQueue - var obj; - for (i=0, len = this.styleQueue.length; i < len; i++) { - obj = this.styleQueue[i]; - obj.$el[ styleFn ]( obj.style, animOpts ); + // initialize + var instance = new WidgetClass( elem, options ); + // make available via $().data('namespace') + if ( jQuery ) { + jQuery.data( elem, namespace, instance ); } + }); - // clear out queue for next time - this.styleQueue = []; + }); +}; - // provide $elems as context for the callback - if ( callback ) { - callback.call( $bricks ); - } - - this.isLaidOut = true; - }, - - // calculates number of columns - // i.e. this.columnWidth = 200 - _getColumns : function() { - var container = this.options.isFitWidth ? this.element.parent() : this.element, - containerWidth = container.width(); - - // use fluid columnWidth function if there - this.columnWidth = this.isFluid ? this.options.columnWidth( containerWidth ) : - // if not, how about the explicitly set option? - this.options.columnWidth || - // or use the size of the first item - this.$bricks.outerWidth(true) || - // if there's no items, use size of container - containerWidth; - - this.columnWidth += this.options.gutterWidth; - - this.cols = Math.floor( ( containerWidth + this.options.gutterWidth ) / this.columnWidth ); - this.cols = Math.max( this.cols, 1 ); +// ----- ----- // - }, +return utils; - // layout logic - _placeBrick: function( brick ) { - var $brick = $(brick), - colSpan, groupCount, groupY, groupColY, j; +})); - //how many columns does this brick span - colSpan = Math.ceil( $brick.outerWidth(true) / this.columnWidth ); - colSpan = Math.min( colSpan, this.cols ); +/** + * Outlayer Item + */ - if ( colSpan === 1 ) { - // if brick spans only one column, just like singleMode - groupY = this.colYs; - } else { - // brick spans more than one column - // how many different places could this brick fit horizontally - groupCount = this.cols + 1 - colSpan; - groupY = []; - - // for each group potential horizontal position - for ( j=0; j < groupCount; j++ ) { - // make an array of colY values for that one group - groupColY = this.colYs.slice( j, j+colSpan ); - // and get the max value of the array - groupY[j] = Math.max.apply( Math, groupColY ); - } +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'outlayer/item',[ + 'ev-emitter/ev-emitter', + 'get-size/get-size' + ], + factory + ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory( + require('ev-emitter'), + require('get-size') + ); + } else { + // browser global + window.Outlayer = {}; + window.Outlayer.Item = factory( + window.EvEmitter, + window.getSize + ); + } + +}( window, function factory( EvEmitter, getSize ) { +'use strict'; + +// ----- helpers ----- // + +function isEmptyObj( obj ) { + for ( var prop in obj ) { + return false; + } + prop = null; + return true; +} + +// -------------------------- CSS3 support -------------------------- // + + +var docElemStyle = document.documentElement.style; + +var transitionProperty = typeof docElemStyle.transition == 'string' ? + 'transition' : 'WebkitTransition'; +var transformProperty = typeof docElemStyle.transform == 'string' ? + 'transform' : 'WebkitTransform'; + +var transitionEndEvent = { + WebkitTransition: 'webkitTransitionEnd', + transition: 'transitionend' +}[ transitionProperty ]; + +// cache all vendor properties that could have vendor prefix +var vendorProperties = { + transform: transformProperty, + transition: transitionProperty, + transitionDuration: transitionProperty + 'Duration', + transitionProperty: transitionProperty + 'Property', + transitionDelay: transitionProperty + 'Delay' +}; + +// -------------------------- Item -------------------------- // + +function Item( element, layout ) { + if ( !element ) { + return; + } + + this.element = element; + // parent layout class, i.e. Masonry, Isotope, or Packery + this.layout = layout; + this.position = { + x: 0, + y: 0 + }; - } + this._create(); +} - // get the minimum Y value from the columns - var minimumY = Math.min.apply( Math, groupY ), - shortCol = 0; - - // Find index of short column, the first from the left - for (var i=0, len = groupY.length; i < len; i++) { - if ( groupY[i] === minimumY ) { - shortCol = i; - break; - } - } +// inherit EvEmitter +var proto = Item.prototype = Object.create( EvEmitter.prototype ); +proto.constructor = Item; - // position the brick - var position = { - top: minimumY + this.offset.y - }; - // position.left or position.right - position[ this.horizontalDirection ] = this.columnWidth * shortCol + this.offset.x; - this.styleQueue.push({ $el: $brick, style: position }); - - // apply setHeight to necessary columns - var setHeight = minimumY + $brick.outerHeight(true), - setSpan = this.cols + 1 - len; - for ( i=0; i < setSpan; i++ ) { - this.colYs[ shortCol + i ] = setHeight; - } +proto._create = function() { + // transition objects + this._transn = { + ingProperties: {}, + clean: {}, + onEnd: {} + }; + this.css({ + position: 'absolute' + }); +}; + +// trigger specified handler for event type +proto.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +proto.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * apply CSS styles to element + * @param {Object} style + */ +proto.css = function( style ) { + var elemStyle = this.element.style; + + for ( var prop in style ) { + // use vendor property if available + var supportedProp = vendorProperties[ prop ] || prop; + elemStyle[ supportedProp ] = style[ prop ]; + } +}; + + // measure position, and sets it +proto.getPosition = function() { + var style = getComputedStyle( this.element ); + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + var xValue = style[ isOriginLeft ? 'left' : 'right' ]; + var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; + // convert percent to pixels + var layoutSize = this.layout.size; + var x = xValue.indexOf('%') != -1 ? + ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 ); + var y = yValue.indexOf('%') != -1 ? + ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 ); + + // clean up 'auto' or other non-integer values + x = isNaN( x ) ? 0 : x; + y = isNaN( y ) ? 0 : y; + // remove padding from measurement + x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; + y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; + + this.position.x = x; + this.position.y = y; +}; + +// set settled position, apply padding +proto.layoutPosition = function() { + var layoutSize = this.layout.size; + var style = {}; + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + + // x + var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight'; + var xProperty = isOriginLeft ? 'left' : 'right'; + var xResetProperty = isOriginLeft ? 'right' : 'left'; + + var x = this.position.x + layoutSize[ xPadding ]; + // set in percentage or pixels + style[ xProperty ] = this.getXValue( x ); + // reset other property + style[ xResetProperty ] = ''; + + // y + var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom'; + var yProperty = isOriginTop ? 'top' : 'bottom'; + var yResetProperty = isOriginTop ? 'bottom' : 'top'; + + var y = this.position.y + layoutSize[ yPadding ]; + // set in percentage or pixels + style[ yProperty ] = this.getYValue( y ); + // reset other property + style[ yResetProperty ] = ''; + + this.css( style ); + this.emitEvent( 'layout', [ this ] ); +}; + +proto.getXValue = function( x ) { + var isHorizontal = this.layout._getOption('horizontal'); + return this.layout.options.percentPosition && !isHorizontal ? + ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; +}; + +proto.getYValue = function( y ) { + var isHorizontal = this.layout._getOption('horizontal'); + return this.layout.options.percentPosition && isHorizontal ? + ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; +}; + +proto._transitionTo = function( x, y ) { + this.getPosition(); + // get current x & y from top/left + var curX = this.position.x; + var curY = this.position.y; + + var compareX = parseInt( x, 10 ); + var compareY = parseInt( y, 10 ); + var didNotMove = compareX === this.position.x && compareY === this.position.y; + + // save end position + this.setPosition( x, y ); + + // if did not move and not transitioning, just go to layout + if ( didNotMove && !this.isTransitioning ) { + this.layoutPosition(); + return; + } + + var transX = x - curX; + var transY = y - curY; + var transitionStyle = {}; + transitionStyle.transform = this.getTranslate( transX, transY ); + + this.transition({ + to: transitionStyle, + onTransitionEnd: { + transform: this.layoutPosition }, - - - resize: function() { - var prevColCount = this.cols; - // get updated colCount - this._getColumns(); - if ( this.isFluid || this.cols !== prevColCount ) { - // if column count has changed, trigger new layout - this._reLayout(); - } - }, - - - _reLayout : function( callback ) { - // reset columns - var i = this.cols; - this.colYs = []; - while (i--) { - this.colYs.push( 0 ); - } - // apply layout logic to all bricks - this.layout( this.$bricks, callback ); - }, - - // ====================== Convenience methods ====================== - - // goes through all children again and gets bricks in proper order - reloadItems : function() { - this.$bricks = this._getBricks( this.element.children() ); - }, - - - reload : function( callback ) { - this.reloadItems(); - this._init( callback ); - }, - - - // convienence method for working with Infinite Scroll - appended : function( $content, isAnimatedFromBottom, callback ) { - if ( isAnimatedFromBottom ) { - // set new stuff to the bottom - this._filterFindBricks( $content ).css({ top: this.element.height() }); - var instance = this; - setTimeout( function(){ - instance._appended( $content, callback ); - }, 1 ); - } else { - this._appended( $content, callback ); - } - }, - - _appended : function( $content, callback ) { - var $newBricks = this._getBricks( $content ); - // add new bricks to brick pool - this.$bricks = this.$bricks.add( $newBricks ); - this.layout( $newBricks, callback ); - }, - - // removes elements from Masonry widget - remove : function( $content ) { - this.$bricks = this.$bricks.not( $content ); - $content.remove(); - }, - - // destroys widget, returns elements and container back (close) to original style - destroy : function() { - - this.$bricks - .removeClass('masonry-brick') - .each(function(){ - this.style.position = ''; - this.style.top = ''; - this.style.left = ''; - }); - - // re-apply saved container styles - var elemStyle = this.element[0].style; - for ( var prop in this.originalStyle ) { - elemStyle[ prop ] = this.originalStyle[ prop ]; + isCleaning: true + }); +}; + +proto.getTranslate = function( x, y ) { + // flip cooridinates if origin on right or bottom + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + x = isOriginLeft ? x : -x; + y = isOriginTop ? y : -y; + return 'translate3d(' + x + 'px, ' + y + 'px, 0)'; +}; + +// non transition + transform support +proto.goTo = function( x, y ) { + this.setPosition( x, y ); + this.layoutPosition(); +}; + +proto.moveTo = proto._transitionTo; + +proto.setPosition = function( x, y ) { + this.position.x = parseInt( x, 10 ); + this.position.y = parseInt( y, 10 ); +}; + +// ----- transition ----- // + +/** + * @param {Object} style - CSS + * @param {Function} onTransitionEnd + */ + +// non transition, just trigger callback +proto._nonTransition = function( args ) { + this.css( args.to ); + if ( args.isCleaning ) { + this._removeStyles( args.to ); + } + for ( var prop in args.onTransitionEnd ) { + args.onTransitionEnd[ prop ].call( this ); + } +}; + +/** + * proper transition + * @param {Object} args - arguments + * @param {Object} to - style to transition to + * @param {Object} from - style to start transition from + * @param {Boolean} isCleaning - removes transition styles after transition + * @param {Function} onTransitionEnd - callback + */ +proto.transition = function( args ) { + // redirect to nonTransition if no transition duration + if ( !parseFloat( this.layout.options.transitionDuration ) ) { + this._nonTransition( args ); + return; + } + + var _transition = this._transn; + // keep track of onTransitionEnd callback by css property + for ( var prop in args.onTransitionEnd ) { + _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; + } + // keep track of properties that are transitioning + for ( prop in args.to ) { + _transition.ingProperties[ prop ] = true; + // keep track of properties to clean up when transition is done + if ( args.isCleaning ) { + _transition.clean[ prop ] = true; + } + } + + // set from styles + if ( args.from ) { + this.css( args.from ); + // force redraw. http://blog.alexmaccaw.com/css-transitions + var h = this.element.offsetHeight; + // hack for JSHint to hush about unused var + h = null; + } + // enable transition + this.enableTransition( args.to ); + // set styles that are transitioning + this.css( args.to ); + + this.isTransitioning = true; + +}; + +// dash before all cap letters, including first for +// WebkitTransform => -webkit-transform +function toDashedAll( str ) { + return str.replace( /([A-Z])/g, function( $1 ) { + return '-' + $1.toLowerCase(); + }); +} + +var transitionProps = 'opacity,' + toDashedAll( transformProperty ); + +proto.enableTransition = function(/* style */) { + // HACK changing transitionProperty during a transition + // will cause transition to jump + if ( this.isTransitioning ) { + return; + } + + // make `transition: foo, bar, baz` from style object + // HACK un-comment this when enableTransition can work + // while a transition is happening + // var transitionValues = []; + // for ( var prop in style ) { + // // dash-ify camelCased properties like WebkitTransition + // prop = vendorProperties[ prop ] || prop; + // transitionValues.push( toDashedAll( prop ) ); + // } + // munge number to millisecond, to match stagger + var duration = this.layout.options.transitionDuration; + duration = typeof duration == 'number' ? duration + 'ms' : duration; + // enable transition styles + this.css({ + transitionProperty: transitionProps, + transitionDuration: duration, + transitionDelay: this.staggerDelay || 0 + }); + // listen for transition end event + this.element.addEventListener( transitionEndEvent, this, false ); +}; + +// ----- events ----- // + +proto.onwebkitTransitionEnd = function( event ) { + this.ontransitionend( event ); +}; + +proto.onotransitionend = function( event ) { + this.ontransitionend( event ); +}; + +// properties that I munge to make my life easier +var dashedVendorProperties = { + '-webkit-transform': 'transform' +}; + +proto.ontransitionend = function( event ) { + // disregard bubbled events from children + if ( event.target !== this.element ) { + return; + } + var _transition = this._transn; + // get property name of transitioned property, convert to prefix-free + var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; + + // remove property that has completed transitioning + delete _transition.ingProperties[ propertyName ]; + // check if any properties are still transitioning + if ( isEmptyObj( _transition.ingProperties ) ) { + // all properties have completed transitioning + this.disableTransition(); + } + // clean style + if ( propertyName in _transition.clean ) { + // clean up style + this.element.style[ event.propertyName ] = ''; + delete _transition.clean[ propertyName ]; + } + // trigger onTransitionEnd callback + if ( propertyName in _transition.onEnd ) { + var onTransitionEnd = _transition.onEnd[ propertyName ]; + onTransitionEnd.call( this ); + delete _transition.onEnd[ propertyName ]; + } + + this.emitEvent( 'transitionEnd', [ this ] ); +}; + +proto.disableTransition = function() { + this.removeTransitionStyles(); + this.element.removeEventListener( transitionEndEvent, this, false ); + this.isTransitioning = false; +}; + +/** + * removes style property from element + * @param {Object} style +**/ +proto._removeStyles = function( style ) { + // clean up transition styles + var cleanStyle = {}; + for ( var prop in style ) { + cleanStyle[ prop ] = ''; + } + this.css( cleanStyle ); +}; + +var cleanTransitionStyle = { + transitionProperty: '', + transitionDuration: '', + transitionDelay: '' +}; + +proto.removeTransitionStyles = function() { + // remove transition + this.css( cleanTransitionStyle ); +}; + +// ----- stagger ----- // + +proto.stagger = function( delay ) { + delay = isNaN( delay ) ? 0 : delay; + this.staggerDelay = delay + 'ms'; +}; + +// ----- show/hide/remove ----- // + +// remove element from DOM +proto.removeElem = function() { + this.element.parentNode.removeChild( this.element ); + // remove display: none + this.css({ display: '' }); + this.emitEvent( 'remove', [ this ] ); +}; + +proto.remove = function() { + // just remove element if no transition support or no transition + if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { + this.removeElem(); + return; + } + + // start transition + this.once( 'transitionEnd', function() { + this.removeElem(); + }); + this.hide(); +}; + +proto.reveal = function() { + delete this.isHidden; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; + + this.transition({ + from: options.hiddenStyle, + to: options.visibleStyle, + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +proto.onRevealTransitionEnd = function() { + // check if still visible + // during transition, item may have been hidden + if ( !this.isHidden ) { + this.emitEvent('reveal'); + } +}; + +/** + * get style property use for hide/reveal transition end + * @param {String} styleProperty - hiddenStyle/visibleStyle + * @returns {String} + */ +proto.getHideRevealTransitionEndProperty = function( styleProperty ) { + var optionStyle = this.layout.options[ styleProperty ]; + // use opacity + if ( optionStyle.opacity ) { + return 'opacity'; + } + // get first property + for ( var prop in optionStyle ) { + return prop; + } +}; + +proto.hide = function() { + // set flag + this.isHidden = true; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; + + this.transition({ + from: options.visibleStyle, + to: options.hiddenStyle, + // keep hidden stuff hidden + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +proto.onHideTransitionEnd = function() { + // check if still hidden + // during transition, item may have been un-hidden + if ( this.isHidden ) { + this.css({ display: 'none' }); + this.emitEvent('hide'); + } +}; + +proto.destroy = function() { + this.css({ + position: '', + left: '', + right: '', + top: '', + bottom: '', + transition: '', + transform: '' + }); +}; + +return Item; + +})); + +/*! + * Outlayer v2.1.0 + * the brains and guts of a layout library + * MIT license + */ + +( function( window, factory ) { + 'use strict'; + // universal module definition + /* jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'outlayer/outlayer',[ + 'ev-emitter/ev-emitter', + 'get-size/get-size', + 'fizzy-ui-utils/utils', + './item' + ], + function( EvEmitter, getSize, utils, Item ) { + return factory( window, EvEmitter, getSize, utils, Item); } + ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory( + window, + require('ev-emitter'), + require('get-size'), + require('fizzy-ui-utils'), + require('./item') + ); + } else { + // browser global + window.Outlayer = factory( + window, + window.EvEmitter, + window.getSize, + window.fizzyUIUtils, + window.Outlayer.Item + ); + } + +}( window, function factory( window, EvEmitter, getSize, utils, Item ) { +'use strict'; + +// ----- vars ----- // + +var console = window.console; +var jQuery = window.jQuery; +var noop = function() {}; + +// -------------------------- Outlayer -------------------------- // + +// globally unique identifiers +var GUID = 0; +// internal store of all Outlayer intances +var instances = {}; + + +/** + * @param {Element, String} element + * @param {Object} options + * @constructor + */ +function Outlayer( element, options ) { + var queryElement = utils.getQueryElement( element ); + if ( !queryElement ) { + if ( console ) { + console.error( 'Bad element for ' + this.constructor.namespace + + ': ' + ( queryElement || element ) ); + } + return; + } + this.element = queryElement; + // add jQuery + if ( jQuery ) { + this.$element = jQuery( this.element ); + } + + // options + this.options = utils.extend( {}, this.constructor.defaults ); + this.option( options ); + + // add id for Outlayer.getFromElement + var id = ++GUID; + this.element.outlayerGUID = id; // expando + instances[ id ] = this; // associate via id + + // kick it off + this._create(); + + var isInitLayout = this._getOption('initLayout'); + if ( isInitLayout ) { + this.layout(); + } +} + +// settings are for internal use only +Outlayer.namespace = 'outlayer'; +Outlayer.Item = Item; + +// default options +Outlayer.defaults = { + containerStyle: { + position: 'relative' + }, + initLayout: true, + originLeft: true, + originTop: true, + resize: true, + resizeContainer: true, + // item options + transitionDuration: '0.4s', + hiddenStyle: { + opacity: 0, + transform: 'scale(0.001)' + }, + visibleStyle: { + opacity: 1, + transform: 'scale(1)' + } +}; + +var proto = Outlayer.prototype; +// inherit EvEmitter +utils.extend( proto, EvEmitter.prototype ); + +/** + * set options + * @param {Object} opts + */ +proto.option = function( opts ) { + utils.extend( this.options, opts ); +}; + +/** + * get backwards compatible option value, check old name + */ +proto._getOption = function( option ) { + var oldOption = this.constructor.compatOptions[ option ]; + return oldOption && this.options[ oldOption ] !== undefined ? + this.options[ oldOption ] : this.options[ option ]; +}; + +Outlayer.compatOptions = { + // currentName: oldName + initLayout: 'isInitLayout', + horizontal: 'isHorizontal', + layoutInstant: 'isLayoutInstant', + originLeft: 'isOriginLeft', + originTop: 'isOriginTop', + resize: 'isResizeBound', + resizeContainer: 'isResizingContainer' +}; + +proto._create = function() { + // get items from children + this.reloadItems(); + // elements that affect layout, but are not laid out + this.stamps = []; + this.stamp( this.options.stamp ); + // set container style + utils.extend( this.element.style, this.options.containerStyle ); + + // bind resize method + var canBindResize = this._getOption('resize'); + if ( canBindResize ) { + this.bindResize(); + } +}; + +// goes through all children again and gets bricks in proper order +proto.reloadItems = function() { + // collection of item elements + this.items = this._itemize( this.element.children ); +}; + + +/** + * turn elements into Outlayer.Items to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - collection of new Outlayer Items + */ +proto._itemize = function( elems ) { + + var itemElems = this._filterFindItemElements( elems ); + var Item = this.constructor.Item; + + // create new Outlayer Items for collection + var items = []; + for ( var i=0; i < itemElems.length; i++ ) { + var elem = itemElems[i]; + var item = new Item( elem, this ); + items.push( item ); + } + + return items; +}; + +/** + * get item elements to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - item elements + */ +proto._filterFindItemElements = function( elems ) { + return utils.filterFindElements( elems, this.options.itemSelector ); +}; + +/** + * getter method for getting item elements + * @returns {Array} elems - collection of item elements + */ +proto.getItemElements = function() { + return this.items.map( function( item ) { + return item.element; + }); +}; - this.element - .unbind('.masonry') - .removeClass('masonry') - .removeData('masonry'); - - $(window).unbind('.masonry'); +// ----- init & layout ----- // +/** + * lays out all items + */ +proto.layout = function() { + this._resetLayout(); + this._manageStamps(); + + // don't animate first layout + var layoutInstant = this._getOption('layoutInstant'); + var isInstant = layoutInstant !== undefined ? + layoutInstant : !this._isLayoutInited; + this.layoutItems( this.items, isInstant ); + + // flag for initalized + this._isLayoutInited = true; +}; + +// _init is alias for layout +proto._init = proto.layout; + +/** + * logic before any new layout + */ +proto._resetLayout = function() { + this.getSize(); +}; + + +proto.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * get measurement from option, for columnWidth, rowHeight, gutter + * if option is String -> get element from selector string, & get size of element + * if option is Element -> get size of element + * else use option as a number + * + * @param {String} measurement + * @param {String} size - width or height + * @private + */ +proto._getMeasurement = function( measurement, size ) { + var option = this.options[ measurement ]; + var elem; + if ( !option ) { + // default to 0 + this[ measurement ] = 0; + } else { + // use option as an element + if ( typeof option == 'string' ) { + elem = this.element.querySelector( option ); + } else if ( option instanceof HTMLElement ) { + elem = option; } - + // use size of element, if element + this[ measurement ] = elem ? getSize( elem )[ size ] : option; + } +}; + +/** + * layout a collection of item elements + * @api public + */ +proto.layoutItems = function( items, isInstant ) { + items = this._getItemsForLayout( items ); + + this._layoutItems( items, isInstant ); + + this._postLayout(); +}; + +/** + * get the items to be laid out + * you may want to skip over some items + * @param {Array} items + * @returns {Array} items + */ +proto._getItemsForLayout = function( items ) { + return items.filter( function( item ) { + return !item.isIgnored; + }); +}; + +/** + * layout items + * @param {Array} items + * @param {Boolean} isInstant + */ +proto._layoutItems = function( items, isInstant ) { + this._emitCompleteOnItems( 'layout', items ); + + if ( !items || !items.length ) { + // no items, emit event with empty array + return; + } + + var queue = []; + + items.forEach( function( item ) { + // get x/y object from method + var position = this._getItemLayoutPosition( item ); + // enqueue + position.item = item; + position.isInstant = isInstant || item.isLayoutInstant; + queue.push( position ); + }, this ); + + this._processLayoutQueue( queue ); +}; + +/** + * get item layout position + * @param {Outlayer.Item} item + * @returns {Object} x and y position + */ +proto._getItemLayoutPosition = function( /* item */ ) { + return { + x: 0, + y: 0 }; - - - // ======================= imagesLoaded Plugin =============================== - /*! - * jQuery imagesLoaded plugin v1.1.0 - * http://github.com/desandro/imagesloaded - * - * MIT License. by Paul Irish et al. - */ +}; +/** + * iterate over array and position each item + * Reason being - separating this logic prevents 'layout invalidation' + * thx @paul_irish + * @param {Array} queue + */ +proto._processLayoutQueue = function( queue ) { + this.updateStagger(); + queue.forEach( function( obj, i ) { + this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i ); + }, this ); +}; + +// set stagger from option in milliseconds number +proto.updateStagger = function() { + var stagger = this.options.stagger; + if ( stagger === null || stagger === undefined ) { + this.stagger = 0; + return; + } + this.stagger = getMilliseconds( stagger ); + return this.stagger; +}; - // $('#my-container').imagesLoaded(myFunction) - // or - // $('img').imagesLoaded(myFunction) +/** + * Sets position of item in DOM + * @param {Outlayer.Item} item + * @param {Number} x - horizontal position + * @param {Number} y - vertical position + * @param {Boolean} isInstant - disables transitions + */ +proto._positionItem = function( item, x, y, isInstant, i ) { + if ( isInstant ) { + // if not transition, just set CSS + item.goTo( x, y ); + } else { + item.stagger( i * this.stagger ); + item.moveTo( x, y ); + } +}; - // execute a callback when all images have loaded. - // needed because .load() doesn't work on cached images +/** + * Any logic you want to do after each layout, + * i.e. size the container + */ +proto._postLayout = function() { + this.resizeContainer(); +}; + +proto.resizeContainer = function() { + var isResizingContainer = this._getOption('resizeContainer'); + if ( !isResizingContainer ) { + return; + } + var size = this._getContainerSize(); + if ( size ) { + this._setContainerMeasure( size.width, true ); + this._setContainerMeasure( size.height, false ); + } +}; - // callback function gets image collection as argument - // `this` is the container +/** + * Sets width or height of container if returned + * @returns {Object} size + * @param {Number} width + * @param {Number} height + */ +proto._getContainerSize = noop; - $.fn.imagesLoaded = function( callback ) { - var $this = this, - $images = $this.find('img').add( $this.filter('img') ), - len = $images.length, - blank = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==', - loaded = []; +/** + * @param {Number} measure - size of width or height + * @param {Boolean} isWidth + */ +proto._setContainerMeasure = function( measure, isWidth ) { + if ( measure === undefined ) { + return; + } + + var elemSize = this.size; + // add padding and border width if border box + if ( elemSize.isBorderBox ) { + measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + + elemSize.borderLeftWidth + elemSize.borderRightWidth : + elemSize.paddingBottom + elemSize.paddingTop + + elemSize.borderTopWidth + elemSize.borderBottomWidth; + } + + measure = Math.max( measure, 0 ); + this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; +}; - function triggerCallback() { - callback.call( $this, $images ); +/** + * emit eventComplete on a collection of items events + * @param {String} eventName + * @param {Array} items - Outlayer.Items + */ +proto._emitCompleteOnItems = function( eventName, items ) { + var _this = this; + function onComplete() { + _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); + } + + var count = items.length; + if ( !items || !count ) { + onComplete(); + return; + } + + var doneCount = 0; + function tick() { + doneCount++; + if ( doneCount == count ) { + onComplete(); } + } - function imgLoaded( event ) { - var img = event.target; - if ( img.src !== blank && $.inArray( img, loaded ) === -1 ){ - loaded.push( img ); - if ( --len <= 0 ){ - setTimeout( triggerCallback ); - $images.unbind( '.imagesLoaded', imgLoaded ); - } - } + // bind callback + items.forEach( function( item ) { + item.once( eventName, tick ); + }); +}; + +/** + * emits events via EvEmitter and jQuery events + * @param {String} type - name of event + * @param {Event} event - original event + * @param {Array} args - extra arguments + */ +proto.dispatchEvent = function( type, event, args ) { + // add original event to arguments + var emitArgs = event ? [ event ].concat( args ) : args; + this.emitEvent( type, emitArgs ); + + if ( jQuery ) { + // set this.$element + this.$element = this.$element || jQuery( this.element ); + if ( event ) { + // create jQuery event + var $event = jQuery.Event( event ); + $event.type = type; + this.$element.trigger( $event, args ); + } else { + // just trigger with type if no event available + this.$element.trigger( type, args ); } + } +}; + +// -------------------------- ignore & stamps -------------------------- // + + +/** + * keep item in collection, but do not lay it out + * ignored items do not get skipped in layout + * @param {Element} elem + */ +proto.ignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + item.isIgnored = true; + } +}; + +/** + * return item to layout collection + * @param {Element} elem + */ +proto.unignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + delete item.isIgnored; + } +}; + +/** + * adds elements to stamps + * @param {NodeList, Array, Element, or String} elems + */ +proto.stamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ) { + return; + } + + this.stamps = this.stamps.concat( elems ); + // ignore + elems.forEach( this.ignore, this ); +}; + +/** + * removes elements to stamps + * @param {NodeList, Array, or Element} elems + */ +proto.unstamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ){ + return; + } + + elems.forEach( function( elem ) { + // filter out removed stamp elements + utils.removeFrom( this.stamps, elem ); + this.unignore( elem ); + }, this ); +}; + +/** + * finds child elements + * @param {NodeList, Array, Element, or String} elems + * @returns {Array} elems + */ +proto._find = function( elems ) { + if ( !elems ) { + return; + } + // if string, use argument as selector string + if ( typeof elems == 'string' ) { + elems = this.element.querySelectorAll( elems ); + } + elems = utils.makeArray( elems ); + return elems; +}; + +proto._manageStamps = function() { + if ( !this.stamps || !this.stamps.length ) { + return; + } + + this._getBoundingRect(); + + this.stamps.forEach( this._manageStamp, this ); +}; + +// update boundingLeft / Top +proto._getBoundingRect = function() { + // get bounding rect for container element + var boundingRect = this.element.getBoundingClientRect(); + var size = this.size; + this._boundingRect = { + left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, + top: boundingRect.top + size.paddingTop + size.borderTopWidth, + right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), + bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) + }; +}; + +/** + * @param {Element} stamp +**/ +proto._manageStamp = noop; + +/** + * get x/y position of element relative to container element + * @param {Element} elem + * @returns {Object} offset - has left, top, right, bottom + */ +proto._getElementOffset = function( elem ) { + var boundingRect = elem.getBoundingClientRect(); + var thisRect = this._boundingRect; + var size = getSize( elem ); + var offset = { + left: boundingRect.left - thisRect.left - size.marginLeft, + top: boundingRect.top - thisRect.top - size.marginTop, + right: thisRect.right - boundingRect.right - size.marginRight, + bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom + }; + return offset; +}; + +// -------------------------- resize -------------------------- // + +// enable event handlers for listeners +// i.e. resize -> onresize +proto.handleEvent = utils.handleEvent; + +/** + * Bind layout to window resizing + */ +proto.bindResize = function() { + window.addEventListener( 'resize', this ); + this.isResizeBound = true; +}; + +/** + * Unbind layout to window resizing + */ +proto.unbindResize = function() { + window.removeEventListener( 'resize', this ); + this.isResizeBound = false; +}; + +proto.onresize = function() { + this.resize(); +}; + +utils.debounceMethod( Outlayer, 'onresize', 100 ); - // if no images, trigger immediately - if ( !len ) { - triggerCallback(); +proto.resize = function() { + // don't trigger if size did not change + // or if resize was unbound. See #9 + if ( !this.isResizeBound || !this.needsResizeLayout() ) { + return; + } + + this.layout(); +}; + +/** + * check if layout is needed post layout + * @returns Boolean + */ +proto.needsResizeLayout = function() { + var size = getSize( this.element ); + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var hasSizes = this.size && size; + return hasSizes && size.innerWidth !== this.size.innerWidth; +}; + +// -------------------------- methods -------------------------- // + +/** + * add items to Outlayer instance + * @param {Array or NodeList or Element} elems + * @returns {Array} items - Outlayer.Items +**/ +proto.addItems = function( elems ) { + var items = this._itemize( elems ); + // add items to collection + if ( items.length ) { + this.items = this.items.concat( items ); + } + return items; +}; + +/** + * Layout newly-appended item elements + * @param {Array or NodeList or Element} elems + */ +proto.appended = function( elems ) { + var items = this.addItems( elems ); + if ( !items.length ) { + return; + } + // layout and reveal just the new items + this.layoutItems( items, true ); + this.reveal( items ); +}; + +/** + * Layout prepended elements + * @param {Array or NodeList or Element} elems + */ +proto.prepended = function( elems ) { + var items = this._itemize( elems ); + if ( !items.length ) { + return; + } + // add items to beginning of collection + var previousItems = this.items.slice(0); + this.items = items.concat( previousItems ); + // start new layout + this._resetLayout(); + this._manageStamps(); + // layout new stuff without transition + this.layoutItems( items, true ); + this.reveal( items ); + // layout previous items + this.layoutItems( previousItems ); +}; + +/** + * reveal a collection of items + * @param {Array of Outlayer.Items} items + */ +proto.reveal = function( items ) { + this._emitCompleteOnItems( 'reveal', items ); + if ( !items || !items.length ) { + return; + } + var stagger = this.updateStagger(); + items.forEach( function( item, i ) { + item.stagger( i * stagger ); + item.reveal(); + }); +}; + +/** + * hide a collection of items + * @param {Array of Outlayer.Items} items + */ +proto.hide = function( items ) { + this._emitCompleteOnItems( 'hide', items ); + if ( !items || !items.length ) { + return; + } + var stagger = this.updateStagger(); + items.forEach( function( item, i ) { + item.stagger( i * stagger ); + item.hide(); + }); +}; + +/** + * reveal item elements + * @param {Array}, {Element}, {NodeList} items + */ +proto.revealItemElements = function( elems ) { + var items = this.getItems( elems ); + this.reveal( items ); +}; + +/** + * hide item elements + * @param {Array}, {Element}, {NodeList} items + */ +proto.hideItemElements = function( elems ) { + var items = this.getItems( elems ); + this.hide( items ); +}; + +/** + * get Outlayer.Item, given an Element + * @param {Element} elem + * @param {Function} callback + * @returns {Outlayer.Item} item + */ +proto.getItem = function( elem ) { + // loop through items to get the one that matches + for ( var i=0; i < this.items.length; i++ ) { + var item = this.items[i]; + if ( item.element == elem ) { + // return item + return item; } + } +}; - $images.bind( 'load.imagesLoaded error.imagesLoaded', imgLoaded ).each( function() { - // cached images don't fire load sometimes, so we reset src. - var src = this.src; - // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f - // data uri bypasses webkit log warning (thx doug jones) - this.src = blank; - this.src = src; - }); +/** + * get collection of Outlayer.Items, given Elements + * @param {Array} elems + * @returns {Array} items - Outlayer.Items + */ +proto.getItems = function( elems ) { + elems = utils.makeArray( elems ); + var items = []; + elems.forEach( function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + items.push( item ); + } + }, this ); + + return items; +}; - return $this; +/** + * remove element(s) from instance and DOM + * @param {Array or NodeList or Element} elems + */ +proto.remove = function( elems ) { + var removeItems = this.getItems( elems ); + + this._emitCompleteOnItems( 'remove', removeItems ); + + // bail if no items to remove + if ( !removeItems || !removeItems.length ) { + return; + } + + removeItems.forEach( function( item ) { + item.remove(); + // remove item from collection + utils.removeFrom( this.items, item ); + }, this ); +}; + +// ----- destroy ----- // + +// remove and disable Outlayer instance +proto.destroy = function() { + // clean up dynamic styles + var style = this.element.style; + style.height = ''; + style.position = ''; + style.width = ''; + // destroy items + this.items.forEach( function( item ) { + item.destroy(); + }); + + this.unbindResize(); + + var id = this.element.outlayerGUID; + delete instances[ id ]; // remove reference to instance by id + delete this.element.outlayerGUID; + // remove data for jQuery + if ( jQuery ) { + jQuery.removeData( this.element, this.constructor.namespace ); + } + +}; + +// -------------------------- data -------------------------- // + +/** + * get Outlayer instance from element + * @param {Element} elem + * @returns {Outlayer} + */ +Outlayer.data = function( elem ) { + elem = utils.getQueryElement( elem ); + var id = elem && elem.outlayerGUID; + return id && instances[ id ]; +}; + + +// -------------------------- create Outlayer class -------------------------- // + +/** + * create a layout class + * @param {String} namespace + */ +Outlayer.create = function( namespace, options ) { + // sub-class Outlayer + var Layout = subclass( Outlayer ); + // apply new options and compatOptions + Layout.defaults = utils.extend( {}, Outlayer.defaults ); + utils.extend( Layout.defaults, options ); + Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions ); + + Layout.namespace = namespace; + + Layout.data = Outlayer.data; + + // sub-class Item + Layout.Item = subclass( Item ); + + // -------------------------- declarative -------------------------- // + + utils.htmlInit( Layout, namespace ); + + // -------------------------- jQuery bridge -------------------------- // + + // make into jQuery plugin + if ( jQuery && jQuery.bridget ) { + jQuery.bridget( namespace, Layout ); + } + + return Layout; +}; + +function subclass( Parent ) { + function SubClass() { + Parent.apply( this, arguments ); + } + + SubClass.prototype = Object.create( Parent.prototype ); + SubClass.prototype.constructor = SubClass; + + return SubClass; +} + +// ----- helpers ----- // + +// how many milliseconds are in each unit +var msUnits = { + ms: 1, + s: 1000 +}; + +// munge time-like parameter into millisecond number +// '0.4s' -> 40 +function getMilliseconds( time ) { + if ( typeof time == 'number' ) { + return time; + } + var matches = time.match( /(^\d*\.?\d*)(\w*)/ ); + var num = matches && matches[1]; + var unit = matches && matches[2]; + if ( !num.length ) { + return 0; + } + num = parseFloat( num ); + var mult = msUnits[ unit ] || 1; + return num * mult; +} + +// ----- fin ----- // + +// back in global +Outlayer.Item = Item; + +return Outlayer; + +})); + +/*! + * Masonry v4.2.1 + * Cascading grid layout library + * https://masonry.desandro.com + * MIT License + * by David DeSandro + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( [ + 'outlayer/outlayer', + 'get-size/get-size' + ], + factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + require('outlayer'), + require('get-size') + ); + } else { + // browser global + window.Masonry = factory( + window.Outlayer, + window.getSize + ); + } + +}( window, function factory( Outlayer, getSize ) { + + + +// -------------------------- masonryDefinition -------------------------- // + + // create an Outlayer layout class + var Masonry = Outlayer.create('masonry'); + // isFitWidth -> fitWidth + Masonry.compatOptions.fitWidth = 'isFitWidth'; + + var proto = Masonry.prototype; + + proto._resetLayout = function() { + this.getSize(); + this._getMeasurement( 'columnWidth', 'outerWidth' ); + this._getMeasurement( 'gutter', 'outerWidth' ); + this.measureColumns(); + + // reset column Y + this.colYs = []; + for ( var i=0; i < this.cols; i++ ) { + this.colYs.push( 0 ); + } + + this.maxY = 0; + this.horizontalColIndex = 0; }; + proto.measureColumns = function() { + this.getContainerWidth(); + // if columnWidth is 0, default to outerWidth of first item + if ( !this.columnWidth ) { + var firstItem = this.items[0]; + var firstItemElem = firstItem && firstItem.element; + // columnWidth fall back to item of first element + this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || + // if first elem has no width, default to size of container + this.containerWidth; + } - // helper function for logging errors - // $.error breaks jQuery chaining - var logError = function( message ) { - if ( window.console ) { - window.console.error( message ); + var columnWidth = this.columnWidth += this.gutter; + + // calculate columns + var containerWidth = this.containerWidth + this.gutter; + var cols = containerWidth / columnWidth; + // fix rounding errors, typically with gutters + var excess = columnWidth - containerWidth % columnWidth; + // if overshoot is less than a pixel, round up, otherwise floor it + var mathMethod = excess && excess < 1 ? 'round' : 'floor'; + cols = Math[ mathMethod ]( cols ); + this.cols = Math.max( cols, 1 ); + }; + + proto.getContainerWidth = function() { + // container is parent if fit width + var isFitWidth = this._getOption('fitWidth'); + var container = isFitWidth ? this.element.parentNode : this.element; + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var size = getSize( container ); + this.containerWidth = size && size.innerWidth; + }; + + proto._getItemLayoutPosition = function( item ) { + item.getSize(); + // how many columns does this brick span + var remainder = item.size.outerWidth % this.columnWidth; + var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; + // round if off by 1 pixel, otherwise use ceil + var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); + colSpan = Math.min( colSpan, this.cols ); + // use horizontal or top column position + var colPosMethod = this.options.horizontalOrder ? + '_getHorizontalColPosition' : '_getTopColPosition'; + var colPosition = this[ colPosMethod ]( colSpan, item ); + // position the brick + var position = { + x: this.columnWidth * colPosition.col, + y: colPosition.y + }; + // apply setHeight to necessary columns + var setHeight = colPosition.y + item.size.outerHeight; + var setMax = colSpan + colPosition.col; + for ( var i = colPosition.col; i < setMax; i++ ) { + this.colYs[i] = setHeight; } + + return position; }; - - // ======================= Plugin bridge =============================== - // leverages data method to either create or return $.Mason constructor - // A bit from jQuery UI - // https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js - // A bit from jcarousel - // https://github.com/jsor/jcarousel/blob/master/lib/jquery.jcarousel.js - - $.fn.masonry = function( options ) { - if ( typeof options === 'string' ) { - // call method - var args = Array.prototype.slice.call( arguments, 1 ); - - this.each(function(){ - var instance = $.data( this, 'masonry' ); - if ( !instance ) { - logError( "cannot call methods on masonry prior to initialization; " + - "attempted to call method '" + options + "'" ); - return; - } - if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) { - logError( "no such method '" + options + "' for masonry instance" ); - return; - } - // apply method - instance[ options ].apply( instance, args ); - }); - } else { - this.each(function() { - var instance = $.data( this, 'masonry' ); - if ( instance ) { - // apply options & init - instance.option( options || {} ); - instance._init(); - } else { - // initialize new instance - $.data( this, 'masonry', new $.Mason( options, this ) ); - } - }); + + proto._getTopColPosition = function( colSpan ) { + var colGroup = this._getTopColGroup( colSpan ); + // get the minimum Y value from the columns + var minimumY = Math.min.apply( Math, colGroup ); + + return { + col: colGroup.indexOf( minimumY ), + y: minimumY, + }; + }; + + /** + * @param {Number} colSpan - number of columns the element spans + * @returns {Array} colGroup + */ + proto._getTopColGroup = function( colSpan ) { + if ( colSpan < 2 ) { + // if brick spans only one column, use all the column Ys + return this.colYs; } - return this; + + var colGroup = []; + // how many different places could this brick fit horizontally + var groupCount = this.cols + 1 - colSpan; + // for each group potential horizontal position + for ( var i = 0; i < groupCount; i++ ) { + colGroup[i] = this._getColGroupY( i, colSpan ); + } + return colGroup; + }; + + proto._getColGroupY = function( col, colSpan ) { + if ( colSpan < 2 ) { + return this.colYs[ col ]; + } + // make an array of colY values for that one group + var groupColYs = this.colYs.slice( col, col + colSpan ); + // and get the max value of the array + return Math.max.apply( Math, groupColYs ); + }; + + // get column position based on horizontal index. #873 + proto._getHorizontalColPosition = function( colSpan, item ) { + var col = this.horizontalColIndex % this.cols; + var isOver = colSpan > 1 && col + colSpan > this.cols; + // shift to next row if item can't fit on current row + col = isOver ? 0 : col; + // don't let zero-size items take up space + var hasSize = item.size.outerWidth && item.size.outerHeight; + this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex; + + return { + col: col, + y: this._getColGroupY( col, colSpan ), + }; }; -})( window, jQuery ); \ No newline at end of file + proto._manageStamp = function( stamp ) { + var stampSize = getSize( stamp ); + var offset = this._getElementOffset( stamp ); + // get the columns that this stamp affects + var isOriginLeft = this._getOption('originLeft'); + var firstX = isOriginLeft ? offset.left : offset.right; + var lastX = firstX + stampSize.outerWidth; + var firstCol = Math.floor( firstX / this.columnWidth ); + firstCol = Math.max( 0, firstCol ); + var lastCol = Math.floor( lastX / this.columnWidth ); + // lastCol should not go over if multiple of columnWidth #425 + lastCol -= lastX % this.columnWidth ? 0 : 1; + lastCol = Math.min( this.cols - 1, lastCol ); + // set colYs to bottom of the stamp + + var isOriginTop = this._getOption('originTop'); + var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) + + stampSize.outerHeight; + for ( var i = firstCol; i <= lastCol; i++ ) { + this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); + } + }; + + proto._getContainerSize = function() { + this.maxY = Math.max.apply( Math, this.colYs ); + var size = { + height: this.maxY + }; + + if ( this._getOption('fitWidth') ) { + size.width = this._getContainerFitWidth(); + } + + return size; + }; + + proto._getContainerFitWidth = function() { + var unusedCols = 0; + // count unused columns + var i = this.cols; + while ( --i ) { + if ( this.colYs[i] !== 0 ) { + break; + } + unusedCols++; + } + // fit container to columns that have been used + return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; + }; + + proto.needsResizeLayout = function() { + var previousWidth = this.containerWidth; + this.getContainerWidth(); + return previousWidth != this.containerWidth; + }; + + return Masonry; + +})); diff --git a/ckan/public-bs2/base/javascript/resource.config b/ckan/public-bs2/base/javascript/resource.config index 215dcc54a17..8037ce0bded 100644 --- a/ckan/public-bs2/base/javascript/resource.config +++ b/ckan/public-bs2/base/javascript/resource.config @@ -57,6 +57,7 @@ main = plugins/jquery.truncator.js plugins/jquery.masonry.js plugins/jquery.form-warning.js + plugins/jquery.images-loaded.js sandbox.js module.js diff --git a/ckan/public-bs2/base/less/masthead.less b/ckan/public-bs2/base/less/masthead.less index 8c1ccf1bc0b..ebb13672783 100644 --- a/ckan/public-bs2/base/less/masthead.less +++ b/ckan/public-bs2/base/less/masthead.less @@ -24,13 +24,13 @@ span.text { margin: 0 2px 0 4px; } - + span.text { position: absolute; top: -9999px; left: -9999px; } - + &:hover { color: mix(@mastheadBackgroundColor, @mastheadLinkColor, 15%); background-color: darken(@mastheadBackgroundColor, 15%); @@ -118,7 +118,12 @@ white-space: nowrap; } } - + .logo{ + display: inline-block; + img{ + max-height: @logoMaxHeight; + } + } .nav-collapse { padding-top:10px; } diff --git a/ckan/public-bs2/base/less/variables.less b/ckan/public-bs2/base/less/variables.less index 19420bb644c..8ac44efb25c 100644 --- a/ckan/public-bs2/base/less/variables.less +++ b/ckan/public-bs2/base/less/variables.less @@ -12,6 +12,7 @@ @layoutBackgroundColor: #eee; @layoutTrimBackgroundColor: #fff; @layoutTrimBorderColor: #ccc; +@logoMaxHeight: 55px; @navLinkColor: #333; @navActiveBackgroundColor: #f6f6f6; diff --git a/ckan/public-bs2/base/vendor/select2/CONTRIBUTING.md b/ckan/public-bs2/base/vendor/select2/CONTRIBUTING.md new file mode 100644 index 00000000000..bca4baf61a3 --- /dev/null +++ b/ckan/public-bs2/base/vendor/select2/CONTRIBUTING.md @@ -0,0 +1,107 @@ +Contributing to Select2 +======================= +Looking to contribute something to Select2? **Here's how you can help.** + +Please take a moment to review this document in order to make the contribution +process easy and effective for everyone involved. + +Following these guidelines helps to communicate that you respect the time of +the developers managing and developing this open source project. In return, +they should reciprocate that respect in addressing your issue or assessing +patches and features. + +Using the issue tracker +----------------------- +When [reporting bugs][reporting-bugs] or +[requesting features][requesting-features], the +[issue tracker on GitHub][issue-tracker] is the recommended channel to use. + +The issue tracker **is not** a place for support requests. The +[mailing list][mailing-list] or [IRC channel][irc-channel] are better places to +get help. + +Reporting bugs with Select2 +--------------------------- +We really appreciate clear bug reports that _consistently_ show an issue +_within Select2_. + +The ideal bug report follows these guidelines: + +1. **Use the [GitHub issue search][issue-search]** — Check if the issue + has already been reported. +2. **Check if the issue has been fixed** — Try to reproduce the problem + using the code in the `master` branch. +3. **Isolate the problem** — Try to create an + [isolated test case][isolated-case] that consistently reproduces the problem. + +Please try to be as detailed as possible in your bug report, especially if an +isolated test case cannot be made. Some useful questions to include the answer +to are: + +- What steps can be used to reproduce the issue? +- What is the bug and what is the expected outcome? +- What browser(s) and Operating System have you tested with? +- Does the bug happen consistently across all tested browsers? +- What version of jQuery are you using? And what version of Select2? +- Are you using Select2 with other plugins? + +All of these questions will help people fix and identify any potential bugs. + +Requesting features in Select2 +------------------------------ +Select2 is a large library that carries with it a lot of functionality. Because +of this, many feature requests will not be implemented in the core library. + +Before starting work on a major feature for Select2, **contact the +[community][community] first** or you may risk spending a considerable amount of +time on something which the project developers are not interested in bringing +into the project. + +### Select2 4.0 + +Many feature requests will be closed off until 4.0, where Select2 plans to adopt +a more flexible API. If you are interested in helping with the development of +the next major Select2 release, please send a message to the +[mailing list][mailing-list] or [irc channel][irc-channel] for more information. + +Triaging issues and pull requests +--------------------------------- +Anyone can help the project maintainers triage issues and review pull requests. + +### Handling new issues + +Select2 regularly receives new issues which need to be tested and organized. + +When a new issue that comes in that is similar to another existing issue, it +should be checked to make sure it is not a duplicate. Duplicates issues should +be marked by replying to the issue with "Duplicate of #[issue number]" where +`[issue number]` is the url or issue number for the existing issue. This will +allow the project maintainers to quickly close off additional issues and keep +the discussion focused within a single issue. + +If you can test issues that are reported to Select2 that contain test cases and +confirm under what conditions bugs happen, that will allow others to identify +what causes a bug quicker. + +### Reviewing pull requests + +It is very common for pull requests to be opened for issues that contain a clear +solution to the problem. These pull requests should be rigorously reviewed by +the community before being accepted. If you are not sure about a piece of +submitted code, or know of a better way to do something, do not hesitate to make +a comment on the pull request. + +It should also be made clear that **all code contributed to Select** must be +licensable under the [Apache 2 or GPL 2 licenses][licensing]. Code that cannot +be released under either of these licenses **cannot be accepted** into the +project. + +[community]: https://github.com/ivaynberg/select2#community +[reporting-bugs]: #reporting-bugs-with-select2 +[requesting-features]: #requesting-features-in-select2 +[issue-tracker]: https://github.com/ivaynberg/select2/issues +[mailing-list]: https://github.com/ivaynberg/select2#mailing-list +[irc-channel]: https://github.com/ivaynberg/select2#irc-channel +[issue-search]: https://github.com/ivaynberg/select2/search?q=&type=Issues +[isolated-case]: http://css-tricks.com/6263-reduced-test-cases/ +[licensing]: https://github.com/ivaynberg/select2#copyright-and-license diff --git a/ckan/public-bs2/base/vendor/select2/LICENSE b/ckan/public-bs2/base/vendor/select2/LICENSE index 0247cc76273..49f61fcf343 100644 --- a/ckan/public-bs2/base/vendor/select2/LICENSE +++ b/ckan/public-bs2/base/vendor/select2/LICENSE @@ -13,6 +13,6 @@ http://www.apache.org/licenses/LICENSE-2.0 http://www.gnu.org/licenses/gpl-2.0.html Unless required by applicable law or agreed to in writing, software distributed under the Apache License -or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for the specific language governing permissions and limitations under the Apache License and the GPL License. diff --git a/ckan/public-bs2/base/vendor/select2/README.md b/ckan/public-bs2/base/vendor/select2/README.md index 406fe79dc95..cb64dee9d02 100644 --- a/ckan/public-bs2/base/vendor/select2/README.md +++ b/ckan/public-bs2/base/vendor/select2/README.md @@ -3,7 +3,7 @@ Select2 Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. -To get started, checkout examples and documentation at http://ivaynberg.github.com/select2 +To get started, checkout examples and documentation at http://select2.github.io/select2/ Use cases --------- @@ -24,43 +24,59 @@ Browser compatibility * Firefox 10+ * Safari 3+ * Opera 10.6+ - + Usage ----- -You can source Select2 directly from a [CDN like JSDliver](http://www.jsdelivr.com/#!select2), [download it from this GitHub repo](https://github.com/ivaynberg/select2/tags), or use one of the integrations below. +You can source Select2 directly from a CDN like [jsDelivr](http://www.jsdelivr.com/#!select2) or [CDNJS](http://www.cdnjs.com/libraries/select2), [download it from this GitHub repo](https://github.com/select2/select2/tags), or use one of the integrations below. Integrations ------------ * [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org)) * [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails) -* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org)) +* [AngularUI](http://angular-ui.github.io/#ui-select) ([AngularJS](https://angularjs.org/)) * [Django](https://github.com/applegrew/django-select2) * [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin) * [Symfony2](https://github.com/avocode/FormExtensions) * [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins) * [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/)) +* [Meteor](https://jquery-select2.meteor.com) * [Yii 2.x](http://demos.krajee.com/widgets#select2) * [Yii 1.x](https://github.com/tonybolzan/yii-select2) +* [AtmosphereJS](https://atmospherejs.com/package/jquery-select2) +* [EmberJS](https://github.com/iStefo/ember-select-2) + +### Example Integrations + +* [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration) +* [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration) +* [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example) +* [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example) Internationalization (i18n) --------------------------- -Select2 supports multiple languages by simply including the right -language JS file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.). +Select2 supports multiple languages by simply including the right language JS +file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`. Missing a language? Just copy `select2_locale_en.js.template`, translate it, and make a pull request back to Select2 here on GitHub. -Bug tracker ------------ +Documentation +------------- + +The documentation for Select2 is available [through GitHub Pages](http://select2.github.io/select2/) and is located within this repository in the [`gh-pages` branch](https://github.com/ivaynberg/select2/tree/gh-pages). + +Community +--------- + +### Bug tracker Have a bug? Please create an issue here on GitHub! https://github.com/ivaynberg/select2/issues -Mailing list ------------- +### Mailing list Have a question? Ask on our mailing list! @@ -68,11 +84,20 @@ select2@googlegroups.com https://groups.google.com/d/forum/select2 +### IRC channel + +Need help implementing Select2 in your project? Ask in our IRC channel! + +**Network:** [Freenode](https://freenode.net/) (`chat.freenode.net`) + +**Channel:** `#select2` + +**Web access:** https://webchat.freenode.net/?channels=select2 Copyright and license --------------------- -Copyright 2012 Igor Vaynberg +Copyright 2015 Igor Vaynberg This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU General Public License version 2 (the "GPL License"). You may choose either license to govern your diff --git a/ckan/public-bs2/base/vendor/select2/bower.json b/ckan/public-bs2/base/vendor/select2/bower.json index 80e8596e806..c727c1e45a3 100644 --- a/ckan/public-bs2/base/vendor/select2/bower.json +++ b/ckan/public-bs2/base/vendor/select2/bower.json @@ -1,6 +1,6 @@ { "name": "select2", - "version": "3.4.8", + "version": "3.5.4", "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"], "dependencies": { "jquery": ">= 1.7.1" diff --git a/ckan/public-bs2/base/vendor/select2/component.json b/ckan/public-bs2/base/vendor/select2/component.json index ad7abf9d9fa..1d942e65922 100644 --- a/ckan/public-bs2/base/vendor/select2/component.json +++ b/ckan/public-bs2/base/vendor/select2/component.json @@ -2,7 +2,7 @@ "name": "select2", "repo": "ivaynberg/select2", "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.", - "version": "3.4.8", + "version": "3.5.4", "demo": "http://ivaynberg.github.io/select2/", "keywords": [ "jquery" diff --git a/ckan/public-bs2/base/vendor/select2/composer.json b/ckan/public-bs2/base/vendor/select2/composer.json index c50fadba855..cb8ddb5f36f 100644 --- a/ckan/public-bs2/base/vendor/select2/composer.json +++ b/ckan/public-bs2/base/vendor/select2/composer.json @@ -2,7 +2,7 @@ "name": "ivaynberg/select2", "description": "Select2 is a jQuery based replacement for select boxes.", - "version": "3.4.8", + "version": "3.5.4", "type": "component", "homepage": "http://ivaynberg.github.io/select2/", "license": "Apache-2.0", diff --git a/ckan/public-bs2/base/vendor/select2/package.json b/ckan/public-bs2/base/vendor/select2/package.json index 75ad84acaf8..d61868bd097 100644 --- a/ckan/public-bs2/base/vendor/select2/package.json +++ b/ckan/public-bs2/base/vendor/select2/package.json @@ -5,7 +5,7 @@ "author": "Igor Vaynberg", "repository": {"type": "git", "url": "git://github.com/ivaynberg/select2.git"}, "main": "select2.js", - "version": "3.4.8", + "version": "3.5.4", "jspm": { "main": "select2", "files": ["select2.js", "select2.png", "select2.css", "select2-spinner.gif"], diff --git a/ckan/public-bs2/base/vendor/select2/release.sh b/ckan/public-bs2/base/vendor/select2/release.sh index 0d2e279ead4..3b63f96621e 100755 --- a/ckan/public-bs2/base/vendor/select2/release.sh +++ b/ckan/public-bs2/base/vendor/select2/release.sh @@ -20,7 +20,7 @@ branch="build-$ver" curbranch=`git branch | grep "*" | sed "s/* //"` timestamp=$(date) tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g" -remote="github" +remote="origin" echo "Pulling from origin" diff --git a/ckan/public-bs2/base/vendor/select2/select2.css b/ckan/public-bs2/base/vendor/select2/select2.css index 1eb4d229f6d..915347037e0 100644 --- a/ckan/public-bs2/base/vendor/select2/select2.css +++ b/ckan/public-bs2/base/vendor/select2/select2.css @@ -1,13 +1,10 @@ /* -Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 +Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015 */ .select2-container { margin: 0; position: relative; display: inline-block; - /* inline-block for ie7 */ - zoom: 1; - *display: inline; vertical-align: middle; } @@ -56,6 +53,10 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background-image: linear-gradient(to top, #eee 0%, #fff 50%); } +html[dir="rtl"] .select2-container .select2-choice { + padding: 0 8px 0 0; +} + .select2-container.select2-drop-above .select2-choice { border-bottom-color: #aaa; @@ -84,6 +85,11 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 width: auto; } +html[dir="rtl"] .select2-container .select2-choice > .select2-chosen { + margin-left: 26px; + margin-right: 0; +} + .select2-container .select2-choice abbr { display: none; width: 12px; @@ -171,10 +177,6 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 width: auto; } -.select2-drop-auto-width .select2-search { - padding-top: 4px; -} - .select2-container .select2-choice .select2-arrow { display: inline-block; width: 18px; @@ -196,6 +198,15 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background-image: linear-gradient(to top, #ccc 0%, #eee 60%); } +html[dir="rtl"] .select2-container .select2-choice .select2-arrow { + left: 0; + right: auto; + + border-left: none; + border-right: 1px solid #aaa; + border-radius: 4px 0 0 4px; +} + .select2-container .select2-choice .select2-arrow b { display: block; width: 100%; @@ -203,13 +214,16 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background: url('select2.png') no-repeat 0 1px; } +html[dir="rtl"] .select2-container .select2-choice .select2-arrow b { + background-position: 2px 1px; +} + .select2-search { display: inline-block; width: 100%; min-height: 26px; margin: 0; - padding-left: 4px; - padding-right: 4px; + padding: 4px 4px 0 4px; position: relative; z-index: 10000; @@ -241,8 +255,14 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } -.select2-drop.select2-drop-above .select2-search input { - margin-top: 4px; +html[dir="rtl"] .select2-search input { + padding: 4px 5px 4px 20px; + + background: #fff url('select2.png') no-repeat -37px -22px; + background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } .select2-search input.select2-active { @@ -295,10 +315,18 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 border-left: none; filter: none; } +html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow { + border-right: none; +} + .select2-dropdown-open .select2-choice .select2-arrow b { background-position: -18px 1px; } +html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b { + background-position: -16px 1px; +} + .select2-hidden-accessible { border: 0; clip: rect(0 0 0 0); @@ -321,6 +349,11 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } +html[dir="rtl"] .select2-results { + padding: 0 4px 0 0; + margin: 4px 0 4px 4px; +} + .select2-results ul.select2-result-sub { margin: 0; padding-left: 0; @@ -377,9 +410,9 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 color: #000; } - .select2-results .select2-no-results, .select2-results .select2-searching, +.select2-results .select2-ajax-error, .select2-results .select2-selection-limit { background: #f4f4f4; display: list-item; @@ -409,6 +442,10 @@ disabled look for disabled choices in the results dropdown background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%; } +.select2-results .select2-ajax-error { + background: rgba(255, 50, 50, .2); +} + .select2-more-results { background: #f4f4f4; display: list-item; @@ -440,7 +477,7 @@ disabled look for disabled choices in the results dropdown height: auto !important; height: 1%; margin: 0; - padding: 0; + padding: 0 5px 0 0; position: relative; border: 1px solid #aaa; @@ -454,6 +491,10 @@ disabled look for disabled choices in the results dropdown background-image: linear-gradient(to bottom, #eee 1%, #fff 15%); } +html[dir="rtl"] .select2-container-multi .select2-choices { + padding: 0 0 0 5px; +} + .select2-locked { padding: 3px 5px 3px 5px !important; } @@ -533,12 +574,12 @@ html[dir="rtl"] .select2-container-multi .select2-choices li background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); } html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice { - margin-left: 0; - margin-right: 5px; + margin: 3px 5px 3px 0; + padding: 3px 18px 3px 5px; } .select2-container-multi .select2-choices .select2-search-choice .select2-chosen { cursor: default; @@ -568,6 +609,11 @@ html[dir="rtl"] .select2-search-choice-close { left: 3px; } +html[dir="rtl"] .select2-container-multi .select2-search-choice-close { + left: auto; + right: 2px; +} + .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { background-position: right -11px; } diff --git a/ckan/public-bs2/base/vendor/select2/select2.jquery.json b/ckan/public-bs2/base/vendor/select2/select2.jquery.json index e9119279f11..ee7443cffbc 100644 --- a/ckan/public-bs2/base/vendor/select2/select2.jquery.json +++ b/ckan/public-bs2/base/vendor/select2/select2.jquery.json @@ -11,7 +11,7 @@ "tag", "tagging" ], - "version": "3.4.8", + "version": "3.5.4", "author": { "name": "Igor Vaynberg", "url": "https://github.com/ivaynberg" diff --git a/ckan/public-bs2/base/vendor/select2/select2.js b/ckan/public-bs2/base/vendor/select2/select2.js index 2969da5d1f7..195ccee5bb0 100644 --- a/ckan/public-bs2/base/vendor/select2/select2.js +++ b/ckan/public-bs2/base/vendor/select2/select2.js @@ -1,7 +1,7 @@ /* Copyright 2012 Igor Vaynberg -Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 +Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015 This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU General Public License version 2 (the "GPL License"). You may choose either license to govern your @@ -46,7 +46,7 @@ the specific language governing permissions and limitations under the Apache Lic return; } - var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer, + var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer, lastMousePosition={x:0,y:0}, $document, scrollBarDimensions, KEY = { @@ -98,7 +98,7 @@ the specific language governing permissions and limitations under the Apache Lic }, MEASURE_SCROLLBAR_TEMPLATE = "
", - DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z"}; + DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"}; $document = $(document); @@ -132,7 +132,7 @@ the specific language governing permissions and limitations under the Apache Lic function measureScrollbar () { var $template = $( MEASURE_SCROLLBAR_TEMPLATE ); - $template.appendTo('body'); + $template.appendTo(document.body); var dim = { width: $template.width() - $template[0].clientWidth, @@ -160,16 +160,16 @@ the specific language governing permissions and limitations under the Apache Lic } /** - * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty + * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty * strings * @param string * @param separator */ - function splitVal(string, separator) { + function splitVal(string, separator, transform) { var val, i, l; if (string === null || string.length < 1) return []; val = string.split(separator); - for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]); + for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]); return val; } @@ -193,10 +193,6 @@ the specific language governing permissions and limitations under the Apache Lic }); } - $document.on("mousemove", function (e) { - lastMousePosition.x = e.pageX; - lastMousePosition.y = e.pageY; - }); /** * filters mouse events so an event is fired only if the mouse moved. @@ -315,7 +311,7 @@ the specific language governing permissions and limitations under the Apache Lic whiteSpace: "nowrap" }); sizer.attr("class","select2-sizer"); - $("body").append(sizer); + $(document.body).append(sizer); } sizer.text(e.val()); return sizer.width(); @@ -324,27 +320,34 @@ the specific language governing permissions and limitations under the Apache Lic function syncCssClasses(dest, src, adapter) { var classes, replacements = [], adapted; - classes = dest.attr("class"); + classes = $.trim(dest.attr("class")); + if (classes) { classes = '' + classes; // for IE which returns object - $(classes.split(" ")).each2(function() { + + $(classes.split(/\s+/)).each2(function() { if (this.indexOf("select2-") === 0) { replacements.push(this); } }); } - classes = src.attr("class"); + + classes = $.trim(src.attr("class")); + if (classes) { classes = '' + classes; // for IE which returns object - $(classes.split(" ")).each2(function() { + + $(classes.split(/\s+/)).each2(function() { if (this.indexOf("select2-") !== 0) { adapted = adapter(this); + if (adapted) { replacements.push(adapted); } } }); } + dest.attr("class", replacements.join(" ")); } @@ -391,7 +394,7 @@ the specific language governing permissions and limitations under the Apache Lic * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url. * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often - * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2. + * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2. * The expected format is an object containing the following keys: * results array of objects that will be used as choices * more (optional) boolean indicating whether there are more results available @@ -438,7 +441,18 @@ the specific language governing permissions and limitations under the Apache Lic data: data, success: function (data) { // TODO - replace query.page with query so users have access to term, page, etc. - var results = options.results(data, query.page); + // added query as third paramter to keep backwards compatibility + var results = options.results(data, query.page, query); + query.callback(results); + }, + error: function(jqXHR, textStatus, errorThrown){ + var results = { + hasError: true, + jqXHR: jqXHR, + textStatus: textStatus, + errorThrown: errorThrown + }; + query.callback(results); } }); @@ -553,10 +567,18 @@ the specific language governing permissions and limitations under the Apache Lic throw new Error(formatterName +" must be a string, function, or falsy value"); } - function evaluate(val) { + /** + * Returns a given value + * If given a function, returns its output + * + * @param val string|function + * @param context value of "this" to be passed to function + * @returns {*} + */ + function evaluate(val, context) { if ($.isFunction(val)) { - var args = Array.prototype.slice.call(arguments, 1); - return val.apply(null, args); + var args = Array.prototype.slice.call(arguments, 2); + return val.apply(context, args); } return val; } @@ -629,7 +651,7 @@ the specific language governing permissions and limitations under the Apache Lic function cleanupJQueryElements() { var self = this; - Array.prototype.forEach.call(arguments, function (element) { + $.each(arguments, function (i, element) { self[element].remove(); self[element] = null; }); @@ -677,12 +699,15 @@ the specific language governing permissions and limitations under the Apache Lic this.container = this.createContainer(); - this.liveRegion = $("", { - role: "status", - "aria-live": "polite" - }) - .addClass("select2-hidden-accessible") - .appendTo(document.body); + this.liveRegion = $('.select2-hidden-accessible'); + if (this.liveRegion.length == 0) { + this.liveRegion = $("", { + role: "status", + "aria-live": "polite" + }) + .addClass("select2-hidden-accessible") + .appendTo(document.body); + } this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid()); this.containerEventName= this.containerId @@ -692,13 +717,13 @@ the specific language governing permissions and limitations under the Apache Lic this.container.attr("title", opts.element.attr("title")); - this.body = $("body"); + this.body = $(document.body); syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); this.container.attr("style", opts.element.attr("style")); - this.container.css(evaluate(opts.containerCss)); - this.container.addClass(evaluate(opts.containerCssClass)); + this.container.css(evaluate(opts.containerCss, this.opts.element)); + this.container.addClass(evaluate(opts.containerCssClass, this.opts.element)); this.elementTabIndex = this.opts.element.attr("tabindex"); @@ -715,7 +740,7 @@ the specific language governing permissions and limitations under the Apache Lic syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); - this.dropdown.addClass(evaluate(opts.dropdownCssClass)); + this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element)); this.dropdown.data("select2", this); this.dropdown.on("click", killEvent); @@ -789,7 +814,7 @@ the specific language governing permissions and limitations under the Apache Lic // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal. this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); }); - this.nextSearchTerm = undefined; + this.lastSearchTerm = undefined; if ($.isFunction(this.opts.initSelection)) { // initialize selection based on the current value of the source element @@ -824,30 +849,42 @@ the specific language governing permissions and limitations under the Apache Lic // abstract destroy: function () { - var element=this.opts.element, select2 = element.data("select2"); + var element=this.opts.element, select2 = element.data("select2"), self = this; this.close(); + if (element.length && element[0].detachEvent && self._sync) { + element.each(function () { + if (self._sync) { + this.detachEvent("onpropertychange", self._sync); + } + }); + } if (this.propertyObserver) { this.propertyObserver.disconnect(); this.propertyObserver = null; } + this._sync = null; if (select2 !== undefined) { select2.container.remove(); select2.liveRegion.remove(); select2.dropdown.remove(); - element - .removeClass("select2-offscreen") - .removeData("select2") - .off(".select2") - .prop("autofocus", this.autofocus || false); - if (this.elementTabIndex) { - element.attr({tabindex: this.elementTabIndex}); + element.removeData("select2") + .off(".select2"); + if (!element.is("input[type='hidden']")) { + element + .show() + .prop("autofocus", this.autofocus || false); + if (this.elementTabIndex) { + element.attr({tabindex: this.elementTabIndex}); + } else { + element.removeAttr("tabindex"); + } + element.show(); } else { - element.removeAttr("tabindex"); + element.css("display", ""); } - element.show(); } cleanupJQueryElements.call(this, @@ -899,6 +936,155 @@ the specific language governing permissions and limitations under the Apache Lic }); } + opts.debug = opts.debug || $.fn.select2.defaults.debug; + + // Warnings for options renamed/removed in Select2 4.0.0 + // Only when it's enabled through debug mode + if (opts.debug && console && console.warn) { + // id was removed + if (opts.id != null) { + console.warn( + 'Select2: The `id` option has been removed in Select2 4.0.0, ' + + 'consider renaming your `id` property or mapping the property before your data makes it to Select2. ' + + 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id' + ); + } + + // text was removed + if (opts.text != null) { + console.warn( + 'Select2: The `text` option has been removed in Select2 4.0.0, ' + + 'consider renaming your `text` property or mapping the property before your data makes it to Select2. ' + + 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id' + ); + } + + // sortResults was renamed to results + if (opts.sortResults != null) { + console.warn( + 'Select2: the `sortResults` option has been renamed to `sorter` in Select2 4.0.0. ' + ); + } + + // selectOnBlur was renamed to selectOnClose + if (opts.selectOnBlur != null) { + console.warn( + 'Select2: The `selectOnBlur` option has been renamed to `selectOnClose` in Select2 4.0.0.' + ); + } + + // ajax.results was renamed to ajax.processResults + if (opts.ajax != null && opts.ajax.results != null) { + console.warn( + 'Select2: The `ajax.results` option has been renamed to `ajax.processResults` in Select2 4.0.0.' + ); + } + + // format* options were renamed to language.* + if (opts.formatNoResults != null) { + console.warn( + 'Select2: The `formatNoResults` option has been renamed to `language.noResults` in Select2 4.0.0.' + ); + } + if (opts.formatSearching != null) { + console.warn( + 'Select2: The `formatSearching` option has been renamed to `language.searching` in Select2 4.0.0.' + ); + } + if (opts.formatInputTooShort != null) { + console.warn( + 'Select2: The `formatInputTooShort` option has been renamed to `language.inputTooShort` in Select2 4.0.0.' + ); + } + if (opts.formatInputTooLong != null) { + console.warn( + 'Select2: The `formatInputTooLong` option has been renamed to `language.inputTooLong` in Select2 4.0.0.' + ); + } + if (opts.formatLoading != null) { + console.warn( + 'Select2: The `formatLoading` option has been renamed to `language.loadingMore` in Select2 4.0.0.' + ); + } + if (opts.formatSelectionTooBig != null) { + console.warn( + 'Select2: The `formatSelectionTooBig` option has been renamed to `language.maximumSelected` in Select2 4.0.0.' + ); + } + + if (opts.element.data('select2Tags')) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been renamed to `data-tags` in Select2 4.0.0.' + ); + } + } + + // Aliasing options renamed in Select2 4.0.0 + + // data-select2-tags -> data-tags + if (opts.element.data('tags') != null) { + var elemTags = opts.element.data('tags'); + + // data-tags should actually be a boolean + if (!$.isArray(elemTags)) { + elemTags = []; + } + + opts.element.data('select2Tags', elemTags); + } + + // sortResults -> sorter + if (opts.sorter != null) { + opts.sortResults = opts.sorter; + } + + // selectOnBlur -> selectOnClose + if (opts.selectOnClose != null) { + opts.selectOnBlur = opts.selectOnClose; + } + + // ajax.results -> ajax.processResults + if (opts.ajax != null) { + if ($.isFunction(opts.ajax.processResults)) { + opts.ajax.results = opts.ajax.processResults; + } + } + + // Formatters/language options + if (opts.language != null) { + var lang = opts.language; + + // formatNoMatches -> language.noMatches + if ($.isFunction(lang.noMatches)) { + opts.formatNoMatches = lang.noMatches; + } + + // formatSearching -> language.searching + if ($.isFunction(lang.searching)) { + opts.formatSearching = lang.searching; + } + + // formatInputTooShort -> language.inputTooShort + if ($.isFunction(lang.inputTooShort)) { + opts.formatInputTooShort = lang.inputTooShort; + } + + // formatInputTooLong -> language.inputTooLong + if ($.isFunction(lang.inputTooLong)) { + opts.formatInputTooLong = lang.inputTooLong; + } + + // formatLoading -> language.loadingMore + if ($.isFunction(lang.loadingMore)) { + opts.formatLoading = lang.loadingMore; + } + + // formatSelectionTooBig -> language.maximumSelected + if ($.isFunction(lang.maximumSelected)) { + opts.formatSelectionTooBig = lang.maximumSelected; + } + } + opts = $.extend({}, { populateResults: function(container, results, query) { var populate, id=this.opts.id, liveRegion=this.liveRegion; @@ -909,6 +1095,8 @@ the specific language governing permissions and limitations under the Apache Lic results = opts.sortResults(results, container, query); + // collect the created nodes for bulk append + var nodes = []; for (i = 0, l = results.length; i < l; i = i + 1) { result=results[i]; @@ -940,7 +1128,6 @@ the specific language governing permissions and limitations under the Apache Lic if (compound) { - innerContainer=$("
    "); innerContainer.addClass("select2-result-sub"); populate(result.children, innerContainer, depth+1); @@ -948,9 +1135,11 @@ the specific language governing permissions and limitations under the Apache Lic } node.data("select2-data", result); - container.append(node); + nodes.push(node[0]); } + // bulk append the created nodes + container.append(nodes); liveRegion.text(opts.formatMatches(results.length)); }; @@ -1005,11 +1194,10 @@ the specific language governing permissions and limitations under the Apache Lic query.callback(data); }); - // this is needed because inside val() we construct choices from options and there id is hardcoded + // this is needed because inside val() we construct choices from options and their id is hardcoded opts.id=function(e) { return e.id; }; } else { if (!("query" in opts)) { - if ("ajax" in opts) { ajaxUrl = opts.element.data("ajax-url"); if (ajaxUrl && ajaxUrl.length > 0) { @@ -1026,7 +1214,7 @@ the specific language governing permissions and limitations under the Apache Lic if (opts.initSelection === undefined) { opts.initSelection = function (element, callback) { var data = []; - $(splitVal(element.val(), opts.separator)).each(function () { + $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () { var obj = { id: this, text: this }, tags = opts.tags; if ($.isFunction(tags)) tags=tags(); @@ -1062,7 +1250,7 @@ the specific language governing permissions and limitations under the Apache Lic */ // abstract monitorSource: function () { - var el = this.opts.element, sync, observer; + var el = this.opts.element, observer, self = this; el.on("change.select2", this.bind(function (e) { if (this.opts.element.data("select2-change-triggered") !== true) { @@ -1070,7 +1258,7 @@ the specific language governing permissions and limitations under the Apache Lic } })); - sync = this.bind(function () { + this._sync = this.bind(function () { // sync enabled state var disabled = el.prop("disabled"); @@ -1081,27 +1269,31 @@ the specific language governing permissions and limitations under the Apache Lic if (readonly === undefined) readonly = false; this.readonly(readonly); - syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); - this.container.addClass(evaluate(this.opts.containerCssClass)); + if (this.container) { + syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); + this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element)); + } - syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); - this.dropdown.addClass(evaluate(this.opts.dropdownCssClass)); + if (this.dropdown) { + syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); + this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element)); + } }); // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener) if (el.length && el[0].attachEvent) { el.each(function() { - this.attachEvent("onpropertychange", sync); + this.attachEvent("onpropertychange", self._sync); }); } - + // safari, chrome, firefox, IE11 observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver; if (observer !== undefined) { if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; } this.propertyObserver = new observer(function (mutations) { - mutations.forEach(sync); + $.each(mutations, self._sync); }); this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false }); } @@ -1109,7 +1301,7 @@ the specific language governing permissions and limitations under the Apache Lic // abstract triggerSelect: function(data) { - var evt = $.Event("select2-selecting", { val: this.id(data), object: data }); + var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data }); this.opts.element.trigger(evt); return !evt.isDefaultPrevented(); }, @@ -1184,15 +1376,16 @@ the specific language governing permissions and limitations under the Apache Lic // abstract opened: function () { - return this.container.hasClass("select2-dropdown-open"); + return (this.container) ? this.container.hasClass("select2-dropdown-open") : false; }, // abstract positionDropdown: function() { var $dropdown = this.dropdown, - offset = this.container.offset(), - height = this.container.outerHeight(false), - width = this.container.outerWidth(false), + container = this.container, + offset = container.offset(), + height = container.outerHeight(false), + width = container.outerWidth(false), dropHeight = $dropdown.outerHeight(false), $window = $(window), windowWidth = $window.width(), @@ -1204,7 +1397,12 @@ the specific language governing permissions and limitations under the Apache Lic enoughRoomBelow = dropTop + dropHeight <= viewportBottom, enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(), dropWidth = $dropdown.outerWidth(false), - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight, + enoughRoomOnRight = function() { + return dropLeft + dropWidth <= viewPortRight; + }, + enoughRoomOnLeft = function() { + return offset.left + viewPortRight + container.outerWidth(false) > dropWidth; + }, aboveNow = $dropdown.hasClass("select2-drop-above"), bodyOffset, above, @@ -1239,7 +1437,6 @@ the specific language governing permissions and limitations under the Apache Lic dropTop = offset.top + height; dropLeft = offset.left; dropWidth = $dropdown.outerWidth(false); - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight; $dropdown.show(); // fix so the cursor does not move to the left within the search-textbox in IE @@ -1254,7 +1451,6 @@ the specific language governing permissions and limitations under the Apache Lic dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width); dropWidth > width ? width = dropWidth : dropWidth = width; dropHeight = $dropdown.outerHeight(false); - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight; } else { this.container.removeClass('select2-drop-auto-width'); @@ -1270,7 +1466,7 @@ the specific language governing permissions and limitations under the Apache Lic dropLeft -= bodyOffset.left; } - if (!enoughRoomOnRight) { + if (!enoughRoomOnRight() && enoughRoomOnLeft()) { dropLeft = offset.left + this.container.outerWidth(false) - dropWidth; } @@ -1280,10 +1476,11 @@ the specific language governing permissions and limitations under the Apache Lic }; if (above) { - css.top = offset.top - dropHeight; - css.bottom = 'auto'; this.container.addClass("select2-drop-above"); $dropdown.addClass("select2-drop-above"); + dropHeight = $dropdown.outerHeight(false); + css.top = offset.top - dropHeight; + css.bottom = 'auto'; } else { css.top = dropTop; @@ -1291,7 +1488,7 @@ the specific language governing permissions and limitations under the Apache Lic this.container.removeClass("select2-drop-above"); $dropdown.removeClass("select2-drop-above"); } - css = $.extend(css, evaluate(this.opts.dropdownCss)); + css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element)); $dropdown.css(css); }, @@ -1329,6 +1526,12 @@ the specific language governing permissions and limitations under the Apache Lic this.opening(); + // Only bind the document mousemove when the dropdown is visible + $document.on("mousemove.select2Event", function (e) { + lastMousePosition.x = e.pageX; + lastMousePosition.y = e.pageY; + }); + return true; }, @@ -1353,7 +1556,7 @@ the specific language governing permissions and limitations under the Apache Lic // create the dropdown mask if doesn't already exist mask = $("#select2-drop-mask"); - if (mask.length == 0) { + if (mask.length === 0) { mask = $(document.createElement("div")); mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask"); mask.hide(); @@ -1425,9 +1628,14 @@ the specific language governing permissions and limitations under the Apache Lic this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"); this.results.empty(); + // Now that the dropdown is closed, unbind the global document mousemove event + $document.off("mousemove.select2Event"); this.clearSearch(); this.search.removeClass("select2-active"); + + // Remove the aria active descendant for highlighted element + this.search.removeAttr("aria-activedescendant"); this.opts.element.trigger($.Event("select2-close")); }, @@ -1446,14 +1654,35 @@ the specific language governing permissions and limitations under the Apache Lic }, + /** + * @return {Boolean} Whether or not search value was changed. + * @private + */ + prefillNextSearchTerm: function () { + // initializes search's value with nextSearchTerm (if defined by user) + // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter + if(this.search.val() !== "") { + return false; + } + + var nextSearchTerm = this.opts.nextSearchTerm(this.data(), this.lastSearchTerm); + if(nextSearchTerm !== undefined){ + this.search.val(nextSearchTerm); + this.search.select(); + return true; + } + + return false; + }, + //abstract getMaximumSelectionSize: function() { - return evaluate(this.opts.maximumSelectionSize); + return evaluate(this.opts.maximumSelectionSize, this.opts.element); }, // abstract ensureHighlightVisible: function () { - var results = this.results, children, index, child, hb, rb, y, more; + var results = this.results, children, index, child, hb, rb, y, more, topOffset; index = this.highlight(); @@ -1473,7 +1702,9 @@ the specific language governing permissions and limitations under the Apache Lic child = $(children[index]); - hb = child.offset().top + child.outerHeight(true); + topOffset = (child.offset() || {}).top || 0; + + hb = topOffset + child.outerHeight(true); // if this is the last child lets also make sure select2-more-results is visible if (index === children.length - 1) { @@ -1483,11 +1714,11 @@ the specific language governing permissions and limitations under the Apache Lic } } - rb = results.offset().top + results.outerHeight(true); + rb = results.offset().top + results.outerHeight(false); if (hb > rb) { results.scrollTop(results.scrollTop() + (hb - rb)); } - y = child.offset().top - results.offset().top; + y = topOffset - results.offset().top; // make sure the top of the element is visible if (y < 0 && child.css('display') != 'none' ) { @@ -1606,7 +1837,7 @@ the specific language governing permissions and limitations under the Apache Lic self.postprocessResults(data, false, false); if (data.more===true) { - more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, page+1)); + more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1))); window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10); } else { more.remove(); @@ -1659,7 +1890,7 @@ the specific language governing permissions and limitations under the Apache Lic self.liveRegion.text(results.text()); } else { - self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length)); + self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length)); } } @@ -1674,14 +1905,14 @@ the specific language governing permissions and limitations under the Apache Lic if (maxSelSize >=1) { data = this.data(); if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) { - render("
  • " + evaluate(opts.formatSelectionTooBig, maxSelSize) + "
  • "); + render("
  • " + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "
  • "); return; } } if (search.val().length < opts.minimumInputLength) { if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) { - render("
  • " + evaluate(opts.formatInputTooShort, search.val(), opts.minimumInputLength) + "
  • "); + render("
  • " + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "
  • "); } else { render(""); } @@ -1691,7 +1922,7 @@ the specific language governing permissions and limitations under the Apache Lic if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) { if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) { - render("
  • " + evaluate(opts.formatInputTooLong, search.val(), opts.maximumInputLength) + "
  • "); + render("
  • " + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "
  • "); } else { render(""); } @@ -1699,7 +1930,7 @@ the specific language governing permissions and limitations under the Apache Lic } if (opts.formatSearching && this.findHighlightableChoices().length === 0) { - render("
  • " + evaluate(opts.formatSearching) + "
  • "); + render("
  • " + evaluate(opts.formatSearching, opts.element) + "
  • "); } search.addClass("select2-active"); @@ -1734,6 +1965,12 @@ the specific language governing permissions and limitations under the Apache Lic return; } + // handle ajax error + if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) { + render("
  • " + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "
  • "); + return; + } + // save context, if any this.context = (data.context===undefined) ? null : data.context; // create a default choice and prepend it to the list @@ -1750,7 +1987,10 @@ the specific language governing permissions and limitations under the Apache Lic } if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) { - render("
  • " + evaluate(opts.formatNoMatches, search.val()) + "
  • "); + render("
  • " + evaluate(opts.formatNoMatches, opts.element, search.val()) + "
  • "); + if(this.showSearch){ + this.showSearch(search.val()); + } return; } @@ -1758,7 +1998,7 @@ the specific language governing permissions and limitations under the Apache Lic self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null}); if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) { - results.append("
  • " + self.opts.escapeMarkup(evaluate(opts.formatLoadMore, this.resultsPage)) + "
  • "); + results.append("
  • " + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "
  • "); window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10); } @@ -1855,7 +2095,7 @@ the specific language governing permissions and limitations under the Apache Lic } else if (this.opts.width === "copy" || this.opts.width === "resolve") { // check if there is inline style on the element that contains width style = this.opts.element.attr('style'); - if (style !== undefined) { + if (typeof(style) === "string") { attrs = style.split(';'); for (i = 0, l = attrs.length; i < l; i = i + 1) { attr = attrs[i].replace(/\s/g, ''); @@ -1954,14 +2194,7 @@ the specific language governing permissions and limitations under the Apache Lic } } - // initializes search's value with nextSearchTerm (if defined by user) - // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter - if(this.search.val() === "") { - if(this.nextSearchTerm != undefined){ - this.search.val(this.nextSearchTerm); - this.search.select(); - } - } + this.prefillNextSearchTerm(); this.focusser.prop("disabled", true).val(""); this.updateResults(true); @@ -2048,6 +2281,7 @@ the specific language governing permissions and limitations under the Apache Lic this.focusser.attr("id", "s2id_autogen"+idSuffix); elementLabel = $("label[for='" + this.opts.element.attr("id") + "']"); + this.opts.element.on('focus.select2', this.bind(function () { this.focus(); })); this.focusser.prev() .text(elementLabel.text()) @@ -2069,6 +2303,9 @@ the specific language governing permissions and limitations under the Apache Lic this.search.on("keydown", this.bind(function (e) { if (!this.isInterfaceEnabled()) return; + // filter 229 keyCodes (input method editor is processing key input) + if (229 == e.keyCode) return; + if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) { // prevent the page from scrolling killEvent(e); @@ -2100,7 +2337,7 @@ the specific language governing permissions and limitations under the Apache Lic // without this the search field loses focus which is annoying if (document.activeElement === this.body.get(0)) { window.setTimeout(this.bind(function() { - if (this.opened()) { + if (this.opened() && this.results && this.results.length > 1) { this.search.focus(); } }), 0); @@ -2149,11 +2386,17 @@ the specific language governing permissions and limitations under the Apache Lic })); selection.on("mousedown touchstart", "abbr", this.bind(function (e) { - if (!this.isInterfaceEnabled()) return; + if (!this.isInterfaceEnabled()) { + return; + } + this.clear(); killEventImmediately(e); this.close(); - this.selection.focus(); + + if (this.selection) { + this.selection.focus(); + } })); selection.on("mousedown touchstart", this.bind(function (e) { @@ -2202,7 +2445,7 @@ the specific language governing permissions and limitations under the Apache Lic })); this.initContainerWidth(); - this.opts.element.addClass("select2-offscreen"); + this.opts.element.hide(); this.setPlaceholder(); }, @@ -2246,7 +2489,7 @@ the specific language governing permissions and limitations under the Apache Lic self.updateSelection(selected); self.close(); self.setPlaceholder(); - self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val()); + self.lastSearchTerm = self.search.val(); } }); } @@ -2383,7 +2626,7 @@ the specific language governing permissions and limitations under the Apache Lic this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data }); - this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val()); + this.lastSearchTerm = this.search.val(); this.close(); if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) { @@ -2437,9 +2680,23 @@ the specific language governing permissions and limitations under the Apache Lic if (arguments.length > 1) { triggerChange = arguments[1]; + + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. ' + + 'The `change` event will always be triggered in 4.0.0.' + ); + } } if (this.select) { + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: Setting the value on a element.")}),c=a.extend({},{populateResults:function(d,e,f){var h,j=this.opts.id,k=this.liveRegion;h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;for(d=c.sortResults(d,e,f),m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a("
  • "),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+g()),t.attr("role","option"),v=c.formatResult(o,t,f,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a("
      "),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),e.append(s);k.text(c.formatMatches(d.length))},h(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(f=c.id,c.id=function(a){return a[f]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var c,d,a=this.opts.element;a.on("change.select2",this.bind(function(){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),c=this.bind(function(){var c=a.prop("disabled");c===b&&(c=!1),this.enable(!c);var d=a.prop("readonly");d===b&&(d=!1),this.readonly(d),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass)),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass))}),a.length&&a[0].attachEvent&&a.each(function(){this.attachEvent("onpropertychange",c)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(a){a.forEach(c)}),this.propertyObserver.observe(a.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container.hasClass("select2-dropdown-open")},positionDropdown:function(){var t,u,v,w,x,b=this.dropdown,c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),g=a(window),h=g.width(),i=g.height(),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,o=l>=m+f,p=c.top-f>=g.scrollTop(),q=b.outerWidth(!1),r=j>=n+q,s=b.hasClass("select2-drop-above");s?(u=!0,!p&&o&&(v=!0,u=!1)):(u=!1,!o&&p&&(v=!0,u=!0)),v&&(b.hide(),c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,q=b.outerWidth(!1),r=j>=n+q,b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(x=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),q=b.outerWidth(!1)+(x.scrollHeight===x.clientHeight?0:k.width),q>e?e=q:q=e,f=b.outerHeight(!1),r=j>=n+q):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(t=this.body.offset(),m-=t.top,n-=t.left),r||(n=c.left+this.container.outerWidth(!1)-q),w={left:n,width:e},u?(w.top=c.top-f,w.bottom="auto",this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above")):(w.top=m,w.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),w=a.extend(w,K(this.opts.dropdownCss)),b.css(w)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0==f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),this.clearSearch(),this.search.removeClass("select2-active"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return b.scrollTop(0),void 0;c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),f=e.offset().top+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!0),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=e.offset().top-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e}),void 0)},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length -},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).text(K(e.opts.formatLoadMore,d+1)),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find(".select2-result-selectable").length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return n("
    • "+K(f.formatSelectionTooBig,o)+"
    • "),void 0;if(d.val().length"+K(f.formatInputTooShort,d.val(),f.minimumInputLength)+""):n(""),c&&this.showSearch&&this.showSearch(!0),void 0;if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return J(f.formatInputTooLong,"formatInputTooLong")?n("
    • "+K(f.formatInputTooLong,d.val(),f.maximumInputLength)+"
    • "):n(""),void 0;f.formatSearching&&0===this.findHighlightableChoices().length&&n("
    • "+K(f.formatSearching)+"
    • "),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return this.search.removeClass("select2-active"),void 0;if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n("
    • "+K(f.formatNoMatches,d.val())+"
    • "),void 0;e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append("
    • "+h.opts.escapeMarkup(K(f.formatLoadMore,this.resultsPage))+"
    • "),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return this.clearTouchMoved(),void 0;var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function c(){var c,d,e,f,g,h;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(c=this.opts.element.attr("style"),c!==b)for(d=c.split(";"),f=0,g=d.length;g>f;f+=1)if(h=d[f].replace(/\s/g,""),e=h.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==e&&e.length>=1)return e[1];return"resolve"===this.opts.width?(c=this.opts.element.css("width"),c.indexOf("%")>0?c:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var d=c.call(this);null!==d&&this.container.css("width",d)}}),e=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html(["","  "," ","","","","
      "," ","
        ","
      ","
      "].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e))),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,h,d=this.container,e=this.dropdown,f=g();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=d.find(".select2-choice"),this.focusser=d.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+f),this.focusser.attr("aria-labelledby","select2-chosen-"+f),this.results.attr("id","select2-results-"+f),this.search.attr("aria-owns","select2-results-"+f),this.focusser.attr("id","s2id_autogen"+f),h=a("label[for='"+this.opts.element.attr("id")+"']"),this.focusser.prev().text(h.text()).attr("for",this.focusser.attr("id"));var i=this.opts.element.attr("title");this.opts.element.attr("title",i||h.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){if(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)return A(a),void 0;switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case c.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.ESC){if(this.opts.openOnEnter===!1&&a.which===c.ENTER)return A(a),void 0;if(a.which==c.DOWN||a.which==c.UP||a.which==c.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==c.DELETE||a.which==c.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),e.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.nextSearchTerm=c.opts.nextSearchTerm(a,c.search.val()))})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),f=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["
        ","
      • "," "," ","
      • ","
      ","
      ","
        ","
      ","
      "].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){p(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,c){this.triggerSelect(a)&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.updateResults(),this.search.select()),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),c&&c.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("
    • "),f=a("
    • "),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith("
      "+j+"
      "),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("
    • "+K(g.opts.formatNoMatches,g.search.val())+"
    • ")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){p(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c0&&c--,a.splice(d,1),d--);return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),d&&this.triggerChange({added:this.data(),removed:e}),void 0;if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(a.text,c.term,e,d),e.join("")},formatSelection:function(a,c,d){return a?d(a.text):b},sortResults:function(a){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(){return b},formatMatches:function(a){return a+" results are available, use up and down arrow keys to navigate."},formatNoMatches:function(){return"No matches found"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b?a.opts.minimumResultsForSearch<0?!1:!0:!0}},a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":d,single:e,multi:f}}}}(jQuery); \ No newline at end of file +!function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++dc;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo(document.body);var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(a,b,c){var d,e,f;if(null===a||a.length<1)return[];for(d=a.split(b),e=0,f=d.length;f>e;e+=1)d[e]=c(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=h;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!g){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);g=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),g.attr("class","select2-sizer"),a(document.body).append(g)}return g.text(b.val()),g.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?void c.push(d(a)):(c.push(d(a.substring(0,e))),c.push(""),c.push(d(a.substring(e,e+f))),c.push(""),void c.push(d(a.substring(e+f,a.length))))}function F(a){var b={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?void b.callback(c()):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),void b.callback(e))}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,i,j,h={x:0,y:0},k={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case k.LEFT:case k.RIGHT:case k.UP:case k.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case k.SHIFT:case k.CTRL:case k.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="
      ",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038a":"\u0399","\u03aa":"\u0399","\u038c":"\u039f","\u038e":"\u03a5","\u03ab":"\u03a5","\u038f":"\u03a9","\u03ac":"\u03b1","\u03ad":"\u03b5","\u03ae":"\u03b7","\u03af":"\u03b9","\u03ca":"\u03b9","\u0390":"\u03b9","\u03cc":"\u03bf","\u03cd":"\u03c5","\u03cb":"\u03c5","\u03b0":"\u03c5","\u03c9":"\u03c9","\u03c2":"\u03c3"};i=a(document),f=function(){var a=1;return function(){return a++}}(),c=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,g=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a(".select2-hidden-accessible"),0==this.liveRegion.length&&(this.liveRegion=a("",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body)),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+f()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a(document.body),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(g),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",g,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",g,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",g,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",g,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(a){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",g,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",g,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.lastSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),j=j||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&d._sync&&a.each(function(){d._sync&&this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.removeData("select2").off(".select2"),a.is("input[type='hidden']")?a.css("display",""):(a.show().prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show())),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,g,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a ","
      "," ","
        ","
      ","
      "].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var b,c,d;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),b=this.search.get(0),b.createTextRange?(c=b.createTextRange(),c.collapse(!1),c.select()):b.setSelectionRange&&(d=this.search.val().length,b.setSelectionRange(d,d))),this.prefillNextSearchTerm(),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,g,c=this.container,d=this.dropdown,e=f();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=c.find(".select2-choice"),this.focusser=c.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+e),this.focusser.attr("aria-labelledby","select2-chosen-"+e),this.results.attr("id","select2-results-"+e),this.search.attr("aria-owns","select2-results-"+e),this.focusser.attr("id","s2id_autogen"+e),g=a("label[for='"+this.opts.element.attr("id")+"']"),this.opts.element.on("focus.select2",this.bind(function(){this.focus()})),this.focusser.prev().text(g.text()).attr("for",this.focusser.attr("id"));var h=this.opts.element.attr("title");this.opts.element.attr("title",h||g.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)return void A(a);switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),void A(a);case k.ENTER:return this.selectHighlighted(),void A(a);case k.TAB:return void this.selectHighlighted({noFocus:!0});case k.ESC:return this.cancel(a),void A(a)}}})),this.search.on("blur",this.bind(function(a){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.results&&this.results.length>1&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.ESC){if(this.opts.openOnEnter===!1&&a.which===k.ENTER)return void A(a);if(a.which==k.DOWN||a.which==k.UP||a.which==k.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),void A(a)}return a.which==k.DELETE||a.which==k.BACKSPACE?(this.opts.allowClear&&this.clear(),void A(a)):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection&&this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),d.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.hide(),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.lastSearchTerm=c.search.val())})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.lastSearchTerm=this.search.val(),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1],this.opts.debug&&console&&console.warn&&console.warn('Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. The `change` event will always be triggered in 4.0.0.')),this.select)this.opts.debug&&console&&console.warn&&console.warn('Select2: Setting the value on a "," ","","
      ","
        ","
      ","
      "].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator,b.transformVal),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.hide(),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),this.prefillNextSearchTerm(),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c={},d=[],e=this;a(b).each(function(){e.id(this)in c||(c[e.id(this)]=0,d.push(this))}),this.selection.find(".select2-search-choice").remove(),this.addSelectedChoice(d),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,b){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.lastSearchTerm=this.search.val(),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.prefillNextSearchTerm()&&this.updateResults(),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),b&&b.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(b){var c=this.getVal(),d=this;a(b).each(function(){c.push(d.createChoice(this))}),this.setVal(c)},createChoice:function(c){var i,j,d=!c.locked,e=a("
    • "),f=a("
    • "),g=d?e:f,h=this.id(c);return i=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),i!=b&&g.find("div").replaceWith(a("
      ").html(i)),j=this.opts.formatSelectionCssClass(c,g.find("div")),j!=b&&g.addClass(j),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),h},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&this.opts.closeOnSelect===!0&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("
    • "+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+"
    • ")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator,this.opts.transformVal))},setVal:function(b){if(this.select)this.select.val(b);else{var c=[],d={};a(b).each(function(){this in d||(c.push(this),d[this]=0)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator))}},buildChangeDetails:function(a,b){ +for(var b=b.slice(0),a=a.slice(0),c=0;c. Attach to instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={debug:!1,width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(this.text(a),c.term,e,d),e.join("")},transformVal:function(b){return a.trim(b)},formatSelection:function(a,c,d){return a?d(this.text(a)):b},sortResults:function(a,b,c){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(a,c){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},text:function(b){return b&&this.data&&this.data.text?a.isFunction(this.data.text)?this.data.text(b):b[this.data.text]:b.text},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(a){return null},nextSearchTerm:function(a,c){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b&&a.opts.minimumResultsForSearch<0?!1:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."},formatNoMatches:function(){return"No matches found"},formatAjaxError:function(a,b,c){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(a){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":c,single:d,multi:e}}}}(jQuery); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/select2/select2.png b/ckan/public-bs2/base/vendor/select2/select2.png index 44e10d63d8d..1d804ffb996 100644 Binary files a/ckan/public-bs2/base/vendor/select2/select2.png and b/ckan/public-bs2/base/vendor/select2/select2.png differ diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ar.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ar.js index acb33a2f6ad..e991b726cff 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ar.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ar.js @@ -1,4 +1,4 @@ -/** +/** * Select2 Arabic translation. * * Author: Adel KEDJOUR @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ar'] = { formatNoMatches: function () { return "لم يتم العثور على مطابقات"; }, formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; }, formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; }, - formatSelectionTooBig: function (limit) { if (n == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return n == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + n + " إختيارات فقط"; }, + formatSelectionTooBig: function (limit) { if (limit == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return limit == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + limit + " إختيارات فقط"; }, formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; }, formatSearching: function () { return "البحث…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_az.js b/ckan/public-bs2/base/vendor/select2/select2_locale_az.js new file mode 100644 index 00000000000..19fd95b7a5f --- /dev/null +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_az.js @@ -0,0 +1,20 @@ +/** + * Select2 Azerbaijani translation. + * + * Author: Farhad Safarov + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['az'] = { + formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; }, + formatNoMatches: function () { return "Nəticə tapılmadı"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; }, + formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; }, + formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; }, + formatSearching: function () { return "Axtarılır…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['az']); +})(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_bg.js b/ckan/public-bs2/base/vendor/select2/select2_locale_bg.js index 585d28a2b0b..3283d0ae5d2 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_bg.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_bg.js @@ -7,12 +7,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['bg'] = { formatNoMatches: function () { return "Няма намерени съвпадения"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); }, formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); }, formatLoadMore: function (pageNumber) { return "Зареждат се още…"; }, formatSearching: function () { return "Търсене…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['bg']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ca.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ca.js index 7e19d3ce966..dbea39e930b 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ca.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ca.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ca'] = { formatNoMatches: function () { return "No s'ha trobat cap coincidència"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; }, formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; }, formatSearching: function () { return "S'està cercant…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ca']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_cs.js b/ckan/public-bs2/base/vendor/select2/select2_locale_cs.js index 376b54a1352..ef121856485 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_cs.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_cs.js @@ -12,7 +12,7 @@ 3: function() { return "tři"; }, 4: function() { return "čtyři"; } } - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['cs'] = { formatNoMatches: function () { return "Nenalezeny žádné položky"; }, formatInputTooShort: function (input, min) { var n = min - input.length; @@ -45,5 +45,7 @@ }, formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; }, formatSearching: function () { return "Vyhledávání…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['cs']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_da.js b/ckan/public-bs2/base/vendor/select2/select2_locale_da.js index dbce3e1748d..702238b9a09 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_da.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_da.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['da'] = { formatNoMatches: function () { return "Ingen resultater fundet"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; }, formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); }, formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; }, formatSearching: function () { return "Søger…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['da']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_de.js b/ckan/public-bs2/base/vendor/select2/select2_locale_de.js index 93b18e81f85..e27541720c2 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_de.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_de.js @@ -4,12 +4,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['de'] = { formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; }, formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; }, formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse…"; }, - formatSearching: function () { return "Suche…"; } - }); + formatSearching: function () { return "Suche…"; }, + formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['de']); })(jQuery); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_el.js b/ckan/public-bs2/base/vendor/select2/select2_locale_el.js index e94b02cbc5f..d17459e1df3 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_el.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_el.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['el'] = { formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); }, formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; }, formatSearching: function () { return "Αναζήτηση…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['el']); })(jQuery); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_en.js.template b/ckan/public-bs2/base/vendor/select2/select2_locale_en.js.template index f66bcc844db..f758b110079 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_en.js.template +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_en.js.template @@ -1,18 +1,20 @@ /** * Select2 translation. - * + * * Author: Your Name */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { - formatMatches: function (matches) { return matches + " results are available, use up and down arrow keys to navigate."; }, + $.fn.select2.locales['en'] = { + formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; }, formatNoMatches: function () { return "No matches found"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " more character" + (n == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); }, formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Loading more results…"; }, formatSearching: function () { return "Searching…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['en']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_es.js b/ckan/public-bs2/base/vendor/select2/select2_locale_es.js index f2b581791eb..92a19861e40 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_es.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_es.js @@ -4,12 +4,16 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['es'] = { + formatMatches: function (matches) { if (matches === 1) { return "Un resultado disponible, presione enter para seleccionarlo."; } return matches + " resultados disponibles, use las teclas de dirección para navegar."; }, formatNoMatches: function () { return "No se encontraron resultados"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); }, formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; }, - formatSearching: function () { return "Buscando…"; } - }); + formatSearching: function () { return "Buscando…"; }, + formatAjaxError: function() { return "La carga falló"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['es']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_et.js b/ckan/public-bs2/base/vendor/select2/select2_locale_et.js index a4045d22df7..4d69f55e3fb 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_et.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_et.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['et'] = { formatNoMatches: function () { return "Tulemused puuduvad"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; }, formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; }, formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; }, formatSearching: function () { return "Otsin.."; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['et']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_eu.js b/ckan/public-bs2/base/vendor/select2/select2_locale_eu.js index 1da1a709481..67ae8d05ae5 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_eu.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_eu.js @@ -6,7 +6,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['eu'] = { formatNoMatches: function () { return "Ez da bat datorrenik aurkitu"; }, @@ -39,5 +39,7 @@ formatSearching: function () { return "Bilatzen…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['eu']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_fa.js b/ckan/public-bs2/base/vendor/select2/select2_locale_fa.js index a9e95af4dba..b3ffd8b7da6 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_fa.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_fa.js @@ -7,7 +7,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['fa'] = { formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; }, formatNoMatches: function () { return "نتیجه‌ای یافت نشد."; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; }, @@ -15,5 +15,7 @@ formatSelectionTooBig: function (limit) { return "شما فقط می‌توانید " + limit + " مورد را انتخاب کنید"; }, formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; }, formatSearching: function () { return "در حال جستجو…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fa']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_fi.js b/ckan/public-bs2/base/vendor/select2/select2_locale_fi.js index 9bed310f717..6487fbdad35 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_fi.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_fi.js @@ -3,7 +3,7 @@ */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['fi'] = { formatNoMatches: function () { return "Ei tuloksia"; }, @@ -24,5 +24,7 @@ formatSearching: function () { return "Etsitään…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fi']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_fr.js b/ckan/public-bs2/base/vendor/select2/select2_locale_fr.js index 9afda2abdcd..d5485d6be76 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_fr.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_fr.js @@ -4,13 +4,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['fr'] = { formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; }, formatNoMatches: function () { return "Aucun résultat trouvé"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Merci de saisir " + n + " caractère" + (n == 1 ? "" : "s") + " de plus"; }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Merci de supprimer " + n + " caractère" + (n == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); }, formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; }, formatSearching: function () { return "Recherche en cours…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_gl.js b/ckan/public-bs2/base/vendor/select2/select2_locale_gl.js index 80326320bf0..9335167da96 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_gl.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_gl.js @@ -6,7 +6,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['gl'] = { formatNoMatches: function () { return "Non se atoparon resultados"; }, @@ -39,5 +39,7 @@ formatSearching: function () { return "Buscando…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['gl']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_he.js b/ckan/public-bs2/base/vendor/select2/select2_locale_he.js index 00385410804..789dcdcaaf2 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_he.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_he.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['he'] = { formatNoMatches: function () { return "לא נמצאו התאמות"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; }, formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; }, formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; }, formatSearching: function () { return "מחפש…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['he']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_hr.js b/ckan/public-bs2/base/vendor/select2/select2_locale_hr.js index c29372524b6..ce8051c788e 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_hr.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_hr.js @@ -7,14 +7,16 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['hr'] = { formatNoMatches: function () { return "Nema rezultata"; }, formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); }, formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; }, formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; }, formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; }, formatSearching: function () { return "Pretraga…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['hr']); function character (n) { return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova"); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_hu.js b/ckan/public-bs2/base/vendor/select2/select2_locale_hu.js index a8c30881928..f431f246360 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_hu.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_hu.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['hu'] = { formatNoMatches: function () { return "Nincs találat."; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " karakterrel több, mint kellene."; }, formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; }, formatLoadMore: function (pageNumber) { return "Töltés…"; }, formatSearching: function () { return "Keresés…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['hu']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_id.js b/ckan/public-bs2/base/vendor/select2/select2_locale_id.js index 547454079ba..e7ea0ac6277 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_id.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_id.js @@ -2,16 +2,20 @@ * Select2 Indonesian translation. * * Author: Ibrahim Yusuf + * Author: Salahuddin Hairai */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['id'] = { + formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, formatNoMatches: function () { return "Tidak ada data yang sesuai"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi" + (n == 1 ? "" : "s"); }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapus " + n + " huruf" + (n == 1 ? "" : "s"); }, - formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan" + (limit == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapuskan " + n + " huruf" ; }, + formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan"; }, formatLoadMore: function (pageNumber) { return "Mengambil data…"; }, formatSearching: function () { return "Mencari…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['id']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_is.js b/ckan/public-bs2/base/vendor/select2/select2_locale_is.js index aecc6cd7194..273f33de8c0 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_is.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_is.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['is'] = { formatNoMatches: function () { return "Ekkert fannst"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); }, formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; }, formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; }, formatSearching: function () { return "Leita…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['is']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_it.js b/ckan/public-bs2/base/vendor/select2/select2_locale_it.js index d4e24de7000..6e2b8e23709 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_it.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_it.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['it'] = { formatNoMatches: function () { return "Nessuna corrispondenza trovata"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; }, formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); }, formatLoadMore: function (pageNumber) { return "Caricamento in corso…"; }, formatSearching: function () { return "Ricerca…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['it']); })(jQuery); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ja.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ja.js index 81106e78a80..7dbd8d7ee86 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ja.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ja.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ja'] = { formatNoMatches: function () { return "該当なし"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; }, formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; }, formatLoadMore: function (pageNumber) { return "読込中・・・"; }, formatSearching: function () { return "検索中・・・"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ja']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ka.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ka.js index 366cc2d9c4d..6cbe1d8f31e 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ka.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ka.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ka'] = { formatNoMatches: function () { return "ვერ მოიძებნა"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; }, formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; }, formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; }, formatSearching: function () { return "ძებნა…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ka']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ko.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ko.js index 1a84d21eae6..bf036e09e6e 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ko.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ko.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ko'] = { formatNoMatches: function () { return "결과 없음"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; }, formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; }, formatLoadMore: function (pageNumber) { return "불러오는 중…"; }, formatSearching: function () { return "검색 중…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ko']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_lt.js b/ckan/public-bs2/base/vendor/select2/select2_locale_lt.js index 2e2f950b00d..7d7040f72f1 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_lt.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_lt.js @@ -7,7 +7,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['lt'] = { formatNoMatches: function () { return "Atitikmenų nerasta"; }, formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); }, formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); }, @@ -16,7 +16,9 @@ }, formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; }, formatSearching: function () { return "Ieškoma…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['lt']); function character (n) { return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į"); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_lv.js b/ckan/public-bs2/base/vendor/select2/select2_locale_lv.js index b300ec770f4..4afc5b41c80 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_lv.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_lv.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['lv'] = { formatNoMatches: function () { return "Sakritību nav"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; }, formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); }, formatLoadMore: function (pageNumber) { return "Datu ielāde…"; }, formatSearching: function () { return "Meklēšana…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['lv']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_mk.js b/ckan/public-bs2/base/vendor/select2/select2_locale_mk.js index 513562c51bf..8a51a9e0b3c 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_mk.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_mk.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['mk'] = { formatNoMatches: function () { return "Нема пронајдено совпаѓања"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); }, formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); }, formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; }, formatSearching: function () { return "Пребарување…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['mk']); })(jQuery); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ms.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ms.js index 262042aab15..6447c089932 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ms.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ms.js @@ -2,16 +2,20 @@ * Select2 Malay translation. * * Author: Kepoweran + * Author: Salahuddin Hairai */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ms'] = { + formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, formatNoMatches: function () { return "Tiada padanan yang ditemui"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; }, formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; }, formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; }, formatSearching: function () { return "Mencari…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_no.js b/ckan/public-bs2/base/vendor/select2/select2_locale_nb.js similarity index 54% rename from ckan/public/base/vendor/select2/select2_locale_no.js rename to ckan/public-bs2/base/vendor/select2/select2_locale_nb.js index ab61c082a02..cb5dfaeef22 100644 --- a/ckan/public/base/vendor/select2/select2_locale_no.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_nb.js @@ -1,18 +1,22 @@ /** - * Select2 Norwegian translation. + * Select2 Norwegian Bokmål translation. * * Author: Torgeir Veimo + * Author: Bjørn Johansen */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['nb'] = { + formatMatches: function (matches) { if (matches === 1) { return "Ett resultat er tilgjengelig, trykk enter for å velge det."; } return matches + " resultater er tilgjengelig. Bruk piltastene opp og ned for å navigere."; }, formatNoMatches: function () { return "Ingen treff"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; }, formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; }, - formatLoadMore: function (pageNumber) { return "Laster flere resultater…"; }, - formatSearching: function () { return "Søker…"; } - }); + formatLoadMore: function (pageNumber) { return "Laster flere resultater …"; }, + formatSearching: function () { return "Søker …"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['no']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_nl.js b/ckan/public-bs2/base/vendor/select2/select2_locale_nl.js index 5b5c4156ce1..985741ec20f 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_nl.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_nl.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['nl'] = { formatNoMatches: function () { return "Geen resultaten gevonden"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " meer in"; }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " minder in"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; }, formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; }, formatLoadMore: function (pageNumber) { return "Meer resultaten laden…"; }, formatSearching: function () { return "Zoeken…"; } - }); -})(jQuery); \ No newline at end of file + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['nl']); +})(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_pl.js b/ckan/public-bs2/base/vendor/select2/select2_locale_pl.js index 75054e76578..87c26194131 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_pl.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_pl.js @@ -1,22 +1,54 @@ /** * Select2 Polish translation. - * + * * @author Jan Kondratowicz * @author Uriy Efremochkin + * @author Michał Połtyn + * @author Damian Zajkowski */ -(function ($) { +(function($) { "use strict"; - $.extend($.fn.select2.defaults, { - formatNoMatches: function () { return "Brak wyników"; }, - formatInputTooShort: function (input, min) { return "Wpisz jeszcze" + character(min - input.length, "znak", "i"); }, - formatInputTooLong: function (input, max) { return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); }, - formatSelectionTooBig: function (limit) { return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); }, - formatLoadMore: function (pageNumber) { return "Ładowanie wyników…"; }, - formatSearching: function () { return "Szukanie…"; } - }); + $.fn.select2.locales['pl'] = { + formatNoMatches: function() { + return "Brak wyników"; + }, + formatInputTooShort: function(input, min) { + return "Wpisz co najmniej" + character(min - input.length, "znak", "i"); + }, + formatInputTooLong: function(input, max) { + return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); + }, + formatSelectionTooBig: function(limit) { + return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); + }, + formatLoadMore: function(pageNumber) { + return "Ładowanie wyników…"; + }, + formatSearching: function() { + return "Szukanie…"; + } + }; - function character (n, word, pluralSuffix) { - return " " + n + " " + word + (n == 1 ? "" : n%10 < 5 && n%10 > 1 && (n%100 < 5 || n%100 > 20) ? pluralSuffix : "ów"); + $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']); + + function character(n, word, pluralSuffix) { + //Liczba pojedyncza - brak suffiksu + //jeden znak + //jeden element + var suffix = ''; + if (n > 1 && n < 5) { + //Liczaba mnoga ilość od 2 do 4 - własny suffiks + //Dwa znaki, trzy znaki, cztery znaki. + //Dwa elementy, trzy elementy, cztery elementy + suffix = pluralSuffix; + } else if (n == 0 || n >= 5) { + //Ilość 0 suffiks ów + //Liczaba mnoga w ilości 5 i więcej - suffiks ów (nie poprawny dla wszystkich wyrazów, np. 100 wiadomości) + //Zero znaków, Pięć znaków, sześć znaków, siedem znaków, osiem znaków. + //Zero elementów Pięć elementów, sześć elementów, siedem elementów, osiem elementów. + suffix = 'ów'; + } + return " " + n + " " + word + suffix; } })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_pt-BR.js b/ckan/public-bs2/base/vendor/select2/select2_locale_pt-BR.js index ac4969acfbb..51b037de580 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_pt-BR.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_pt-BR.js @@ -4,12 +4,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['pt-BR'] = { formatNoMatches: function () { return "Nenhum resultado encontrado"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite mais " + n + " caracter" + (n == 1? "" : "es"); }, + formatAjaxError: function () { return "Erro na busca"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite " + (min == 1 ? "" : "mais") + " " + n + " caracter" + (n == 1? "" : "es"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); }, formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; }, formatSearching: function () { return "Buscando…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_pt-PT.js b/ckan/public-bs2/base/vendor/select2/select2_locale_pt-PT.js index cced7cf3ec1..ae55a4fc4ef 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_pt-PT.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_pt-PT.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['pt-PT'] = { formatNoMatches: function () { return "Nenhum resultado encontrado"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "A carregar mais resultados…"; }, formatSearching: function () { return "A pesquisar…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ro.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ro.js index 87eca4cf740..21b0cf18186 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ro.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ro.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ro'] = { formatNoMatches: function () { return "Nu a fost găsit nimic"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); }, formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); }, formatLoadMore: function (pageNumber) { return "Se încarcă…"; }, formatSearching: function () { return "Căutare…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ro']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_rs.js b/ckan/public-bs2/base/vendor/select2/select2_locale_rs.js index 300c01bc5e5..72c16389c9e 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_rs.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_rs.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['rs'] = { formatNoMatches: function () { return "Ništa nije pronađeno"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); }, formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; }, formatSearching: function () { return "Pretraga…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['rs']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ru.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ru.js index 0f45ce0dddf..2a6c7702c42 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_ru.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ru.js @@ -6,14 +6,16 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ru'] = { formatNoMatches: function () { return "Совпадений не найдено"; }, - formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще" + character(min - input.length); }, + formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); }, formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; }, formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); }, formatLoadMore: function (pageNumber) { return "Загрузка данных…"; }, formatSearching: function () { return "Поиск…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ru']); function character (n) { return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов"); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_sk.js b/ckan/public-bs2/base/vendor/select2/select2_locale_sk.js index 772f304aca9..027530c9388 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_sk.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_sk.js @@ -10,33 +10,33 @@ 2: function(masc) { return (masc ? "dva" : "dve"); }, 3: function() { return "tri"; }, 4: function() { return "štyri"; } - } - $.extend($.fn.select2.defaults, { + }; + $.fn.select2.locales['sk'] = { formatNoMatches: function () { return "Nenašli sa žiadne položky"; }, formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1) { - return "Prosím zadajte ešte jeden znak"; + return "Prosím, zadajte ešte jeden znak"; } else if (n <= 4) { - return "Prosím zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky"; + return "Prosím, zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky"; } else { - return "Prosím zadajte ešte ďalších "+n+" znakov"; + return "Prosím, zadajte ešte ďalších "+n+" znakov"; } }, formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1) { - return "Prosím zadajte o jeden znak menej"; - } else if (n <= 4) { - return "Prosím zadajte o "+smallNumbers[n](true)+" znaky menej"; + return "Prosím, zadajte o jeden znak menej"; + } else if (n >= 2 && n <= 4) { + return "Prosím, zadajte o "+smallNumbers[n](true)+" znaky menej"; } else { - return "Prosím zadajte o "+n+" znakov menej"; + return "Prosím, zadajte o "+n+" znakov menej"; } }, formatSelectionTooBig: function (limit) { if (limit == 1) { return "Môžete zvoliť len jednu položku"; - } else if (limit <= 4) { + } else if (limit >= 2 && limit <= 4) { return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky"; } else { return "Môžete zvoliť najviac "+limit+" položiek"; @@ -44,5 +44,7 @@ }, formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; }, formatSearching: function () { return "Vyhľadávanie…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['sk']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_sv.js b/ckan/public-bs2/base/vendor/select2/select2_locale_sv.js index d611189a593..96f8c0a881d 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_sv.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_sv.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['sv'] = { formatNoMatches: function () { return "Inga träffar"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; }, formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; }, formatLoadMore: function (pageNumber) { return "Laddar fler resultat…"; }, formatSearching: function () { return "Söker…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['sv']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_th.js b/ckan/public-bs2/base/vendor/select2/select2_locale_th.js index df59bdac36d..7f3e6ef8c39 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_th.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_th.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['th'] = { formatNoMatches: function () { return "ไม่พบข้อมูล"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "โปรดพิมพ์เพิ่มอีก " + n + " ตัวอักษร"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "โปรดลบออก " + n + " ตัวอักษร"; }, formatSelectionTooBig: function (limit) { return "คุณสามารถเลือกได้ไม่เกิน " + limit + " รายการ"; }, formatLoadMore: function (pageNumber) { return "กำลังค้นข้อมูลเพิ่ม…"; }, formatSearching: function () { return "กำลังค้นข้อมูล…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['th']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_tr.js b/ckan/public-bs2/base/vendor/select2/select2_locale_tr.js index f834dad2b89..2330bc205ba 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_tr.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_tr.js @@ -6,12 +6,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['tr'] = { + formatMatches: function (matches) { if (matches === 1) { return "Sadece bir sonuç bulundu, seçmek için enter tuşuna basabilirsiniz."; } return matches + " sonuç bulundu, yukarı ve aşağı tuşları ile seçebilirsiniz."; }, formatNoMatches: function () { return "Sonuç bulunamadı"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; }, formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; }, formatLoadMore: function (pageNumber) { return "Daha fazla…"; }, formatSearching: function () { return "Aranıyor…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_ug-CN.js b/ckan/public-bs2/base/vendor/select2/select2_locale_ug-CN.js new file mode 100644 index 00000000000..579588a7ac0 --- /dev/null +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_ug-CN.js @@ -0,0 +1,16 @@ +/** + * Select2 Uyghur translation + */ +(function ($) { + "use strict"; + $.fn.select2.locales['ug-CN'] = { + formatNoMatches: function () { return "ماس كېلىدىغان ئۇچۇر تېپىلمىدى"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "يەنە " + n + " ھەرپ كىرگۈزۈڭ";}, + formatInputTooLong: function (input, max) { var n = input.length - max; return "" + n + "ھەرپ ئۆچۈرۈڭ";}, + formatSelectionTooBig: function (limit) { return "ئەڭ كۆپ بولغاندا" + limit + " تال ئۇچۇر تاللىيالايسىز"; }, + formatLoadMore: function (pageNumber) { return "ئۇچۇرلار ئوقۇلىۋاتىدۇ…"; }, + formatSearching: function () { return "ئىزدەۋاتىدۇ…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ug-CN']); +})(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_uk.js b/ckan/public-bs2/base/vendor/select2/select2_locale_uk.js index 8d31a056080..b5bd0e02d2c 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_uk.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_uk.js @@ -7,7 +7,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['uk'] = { formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; }, formatNoMatches: function () { return "Нічого не знайдено"; }, formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); }, @@ -15,7 +15,9 @@ formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); }, formatLoadMore: function (pageNumber) { return "Завантаження даних…"; }, formatSearching: function () { return "Пошук…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['uk']); function character (n, word) { return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів"); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_vi.js b/ckan/public-bs2/base/vendor/select2/select2_locale_vi.js index 5dbc275361f..9517cb6bd8e 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_vi.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_vi.js @@ -1,18 +1,20 @@ /** * Select2 Vietnamese translation. * - * Author: Long Nguyen + * Author: Long Nguyen , Nguyen Chien Cong */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['vi'] = { formatNoMatches: function () { return "Không tìm thấy kết quả"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự" + (n == 1 ? "" : "s"); }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự" + (n == 1? "" : "s"); }, - formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " tùy chọn" + (limit == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự"; }, + formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " lựa chọn"; }, formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; }, formatSearching: function () { return "Đang tìm…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['vi']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_zh-CN.js b/ckan/public-bs2/base/vendor/select2/select2_locale_zh-CN.js index 6add3c52518..e988dac1a4c 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_zh-CN.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_zh-CN.js @@ -3,12 +3,14 @@ */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['zh-CN'] = { formatNoMatches: function () { return "没有找到匹配项"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";}, formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";}, formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; }, formatLoadMore: function (pageNumber) { return "加载结果中…"; }, formatSearching: function () { return "搜索中…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-CN']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_zh-TW.js b/ckan/public-bs2/base/vendor/select2/select2_locale_zh-TW.js old mode 100755 new mode 100644 index f072381faae..85dbd5afc23 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_zh-TW.js +++ b/ckan/public-bs2/base/vendor/select2/select2_locale_zh-TW.js @@ -3,12 +3,14 @@ */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['zh-TW'] = { formatNoMatches: function () { return "沒有找到相符的項目"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "請再輸入" + n + "個字元";}, formatInputTooLong: function (input, max) { var n = input.length - max; return "請刪掉" + n + "個字元";}, formatSelectionTooBig: function (limit) { return "你只能選擇最多" + limit + "項"; }, formatLoadMore: function (pageNumber) { return "載入中…"; }, formatSearching: function () { return "搜尋中…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-TW']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2x2.png b/ckan/public-bs2/base/vendor/select2/select2x2.png index c4bf72ca859..4bdd5c961d4 100644 Binary files a/ckan/public-bs2/base/vendor/select2/select2x2.png and b/ckan/public-bs2/base/vendor/select2/select2x2.png differ diff --git a/ckan/public/base/css/fuchsia.css b/ckan/public/base/css/fuchsia.css index 274b5e6135d..933db385508 100644 --- a/ckan/public/base/css/fuchsia.css +++ b/ckan/public/base/css/fuchsia.css @@ -1075,7 +1075,7 @@ body { font-size: 14px; line-height: 1.42857143; color: #333333; - background-color: #fff; + background-color: #ffffff; } input, button, @@ -1117,8 +1117,8 @@ img { .img-thumbnail { padding: 4px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; @@ -1171,7 +1171,7 @@ h6, .h5, .h6 { font-family: inherit; - font-weight: 500; + font-weight: 700; line-height: 1.1; color: inherit; } @@ -1531,8 +1531,8 @@ code { kbd { padding: 2px 4px; font-size: 90%; - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } @@ -1552,7 +1552,7 @@ pre { word-wrap: break-word; color: #333333; background-color: #f5f5f5; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } pre code { @@ -2260,11 +2260,11 @@ th { padding: 8px; line-height: 1.42857143; vertical-align: top; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid #ddd; + border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, @@ -2275,10 +2275,10 @@ th { border-top: 0; } .table > tbody + tbody { - border-top: 2px solid #ddd; + border-top: 2px solid #dddddd; } .table .table { - background-color: #fff; + background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, @@ -2289,7 +2289,7 @@ th { padding: 5px; } .table-bordered { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, @@ -2297,7 +2297,7 @@ th { .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { @@ -2435,7 +2435,7 @@ table th[class*="col-"] { margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; @@ -2540,9 +2540,9 @@ output { font-size: 14px; line-height: 1.42857143; color: #555555; - background-color: #fff; + background-color: #ffffff; background-image: none; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); @@ -2557,14 +2557,14 @@ output { box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { - color: #999; + color: #999999; opacity: 1; } .form-control:-ms-input-placeholder { - color: #999; + color: #999999; } .form-control::-webkit-input-placeholder { - color: #999; + color: #999999; } .form-control::-ms-expand { border: 0; @@ -3018,7 +3018,7 @@ select[multiple].input-lg { .btn:hover, .btn:focus, .btn.focus { - color: #333; + color: #333333; text-decoration: none; } .btn:active, @@ -3042,25 +3042,25 @@ fieldset[disabled] a.btn { pointer-events: none; } .btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; + color: #333333; + background-color: #ffffff; + border-color: #cccccc; } .btn-default:focus, .btn-default.focus { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } @@ -3073,7 +3073,7 @@ fieldset[disabled] a.btn { .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { - color: #333; + color: #333333; background-color: #d4d4d4; border-color: #8c8c8c; } @@ -3091,33 +3091,33 @@ fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: #ccc; + background-color: #ffffff; + border-color: #cccccc; } .btn-default .badge { - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; } .btn-primary { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } @@ -3130,7 +3130,7 @@ fieldset[disabled] .btn-default.focus { .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #204d74; border-color: #122b40; } @@ -3153,28 +3153,28 @@ fieldset[disabled] .btn-primary.focus { } .btn-primary .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .btn-success { - color: #fff; + color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #255625; } .btn-success:hover { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } @@ -3187,7 +3187,7 @@ fieldset[disabled] .btn-primary.focus { .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { - color: #fff; + color: #ffffff; background-color: #398439; border-color: #255625; } @@ -3210,28 +3210,28 @@ fieldset[disabled] .btn-success.focus { } .btn-success .badge { color: #5cb85c; - background-color: #fff; + background-color: #ffffff; } .btn-info { - color: #fff; + color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } @@ -3244,7 +3244,7 @@ fieldset[disabled] .btn-success.focus { .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { - color: #fff; + color: #ffffff; background-color: #269abc; border-color: #1b6d85; } @@ -3267,28 +3267,28 @@ fieldset[disabled] .btn-info.focus { } .btn-info .badge { color: #5bc0de; - background-color: #fff; + background-color: #ffffff; } .btn-warning { - color: #fff; + color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } @@ -3301,7 +3301,7 @@ fieldset[disabled] .btn-info.focus { .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #d58512; border-color: #985f0d; } @@ -3324,28 +3324,28 @@ fieldset[disabled] .btn-warning.focus { } .btn-warning .badge { color: #f0ad4e; - background-color: #fff; + background-color: #ffffff; } .btn-danger { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -3358,7 +3358,7 @@ fieldset[disabled] .btn-warning.focus { .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -3381,7 +3381,7 @@ fieldset[disabled] .btn-danger.focus { } .btn-danger .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .btn-link { color: #337ab7; @@ -3512,8 +3512,8 @@ tbody.collapse.in { list-style: none; font-size: 14px; text-align: left; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); @@ -3548,7 +3548,7 @@ tbody.collapse.in { .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; text-decoration: none; outline: 0; background-color: #337ab7; @@ -3884,7 +3884,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { color: #555555; text-align: center; background-color: #eeeeee; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { @@ -3997,7 +3997,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { max-width: none; } .nav-tabs { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; @@ -4010,14 +4010,14 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #ddd; + border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-bottom-color: transparent; cursor: default; } @@ -4052,17 +4052,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .nav-pills > li { @@ -4077,7 +4077,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; + color: #ffffff; background-color: #337ab7; } .nav-stacked > li { @@ -4120,17 +4120,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .tab-content > .tab-pane { @@ -4475,7 +4475,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-color: #e7e7e7; } .navbar-default .navbar-brand { - color: #777; + color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { @@ -4483,37 +4483,37 @@ select[multiple].input-group-sm > .input-group-btn > .btn { background-color: transparent; } .navbar-default .navbar-text { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { - border-color: #ddd; + border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #ddd; + background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { - background-color: #888; + background-color: #888888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { @@ -4523,51 +4523,51 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; - color: #555; + color: #555555; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { - color: #777; + color: #777777; } .navbar-default .navbar-link:hover { - color: #333; + color: #333333; } .navbar-default .btn-link { - color: #777; + color: #777777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333; + color: #333333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; + color: #cccccc; } .navbar-inverse { - background-color: #222; + background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { @@ -4575,7 +4575,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { @@ -4586,30 +4586,30 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { - border-color: #333; + border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333; + background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; + background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { @@ -4619,7 +4619,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; - color: #fff; + color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { @@ -4633,19 +4633,19 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } } @@ -4653,20 +4653,20 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; + color: #444444; } .breadcrumb { padding: 8px 15px; @@ -4681,7 +4681,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; - color: #ccc; + color: #cccccc; } .breadcrumb > .active { color: #777777; @@ -4703,8 +4703,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { line-height: 1.42857143; text-decoration: none; color: #337ab7; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; margin-left: -1px; } .pagination > li:first-child > a, @@ -4725,7 +4725,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { z-index: 2; color: #23527c; background-color: #eeeeee; - border-color: #ddd; + border-color: #dddddd; } .pagination > .active > a, .pagination > .active > span, @@ -4734,7 +4734,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; cursor: default; @@ -4746,8 +4746,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; - background-color: #fff; - border-color: #ddd; + background-color: #ffffff; + border-color: #dddddd; cursor: not-allowed; } .pagination-lg > li > a, @@ -4795,8 +4795,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager li > span { display: inline-block; padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, @@ -4817,7 +4817,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager .disabled > a:focus, .pager .disabled > span { color: #777777; - background-color: #fff; + background-color: #ffffff; cursor: not-allowed; } .label { @@ -4826,7 +4826,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { font-size: 75%; font-weight: bold; line-height: 1; - color: #fff; + color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; @@ -4834,7 +4834,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { } a.label:hover, a.label:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } @@ -4893,7 +4893,7 @@ a.label:focus { padding: 3px 7px; font-size: 12px; font-weight: bold; - color: #fff; + color: #ffffff; line-height: 1; vertical-align: middle; white-space: nowrap; @@ -4915,14 +4915,14 @@ a.label:focus { } a.badge:hover, a.badge:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .list-group-item > .badge { float: right; @@ -4981,8 +4981,8 @@ a.badge:focus { padding: 4px; margin-bottom: 20px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; @@ -5108,7 +5108,7 @@ a.thumbnail.active { height: 100%; font-size: 12px; line-height: 20px; - color: #fff; + color: #ffffff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); @@ -5219,8 +5219,8 @@ a.thumbnail.active { display: block; padding: 10px 15px; margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; @@ -5233,18 +5233,18 @@ a.thumbnail.active { } a.list-group-item, button.list-group-item { - color: #555; + color: #555555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { - color: #333; + color: #333333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; - color: #555; + color: #555555; background-color: #f5f5f5; } button.list-group-item { @@ -5272,7 +5272,7 @@ button.list-group-item { .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5418,7 +5418,7 @@ button.list-group-item-danger.active:focus { } .panel { margin-bottom: 20px; - background-color: #fff; + background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); @@ -5452,7 +5452,7 @@ button.list-group-item-danger.active:focus { .panel-footer { padding: 10px 15px; background-color: #f5f5f5; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } @@ -5566,7 +5566,7 @@ button.list-group-item-danger.active:focus { .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { @@ -5643,37 +5643,37 @@ button.list-group-item-danger.active:focus { } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .panel-default { - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; + border-top-color: #dddddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; + border-bottom-color: #dddddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5682,7 +5682,7 @@ button.list-group-item-danger.active:focus { } .panel-primary > .panel-heading .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; @@ -5812,14 +5812,14 @@ button.list-group-item-danger.active:focus { font-size: 21px; font-weight: bold; line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; + color: #000000; + text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { - color: #000; + color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; @@ -5874,8 +5874,8 @@ button.close { } .modal-content { position: relative; - background-color: #fff; - border: 1px solid #999; + background-color: #ffffff; + border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); @@ -5890,7 +5890,7 @@ button.close { bottom: 0; left: 0; z-index: 1040; - background-color: #000; + background-color: #000000; } .modal-backdrop.fade { opacity: 0; @@ -6001,9 +6001,9 @@ button.close { .tooltip-inner { max-width: 200px; padding: 3px 8px; - color: #fff; + color: #ffffff; text-align: center; - background-color: #000; + background-color: #000000; border-radius: 4px; } .tooltip-arrow { @@ -6018,56 +6018,56 @@ button.close { left: 50%; margin-left: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; - border-right-color: #000; + border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; - border-left-color: #000; + border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .popover { position: absolute; @@ -6093,9 +6093,9 @@ button.close { word-spacing: normal; word-wrap: normal; font-size: 14px; - background-color: #fff; + background-color: #ffffff; background-clip: padding-box; - border: 1px solid #ccc; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); @@ -6153,7 +6153,7 @@ button.close { bottom: 1px; margin-left: -10px; border-bottom-width: 0; - border-top-color: #fff; + border-top-color: #ffffff; } .popover.right > .arrow { top: 50%; @@ -6168,7 +6168,7 @@ button.close { left: 1px; bottom: -10px; border-left-width: 0; - border-right-color: #fff; + border-right-color: #ffffff; } .popover.bottom > .arrow { left: 50%; @@ -6183,7 +6183,7 @@ button.close { top: 1px; margin-left: -10px; border-top-width: 0; - border-bottom-color: #fff; + border-bottom-color: #ffffff; } .popover.left > .arrow { top: 50%; @@ -6197,7 +6197,7 @@ button.close { content: " "; right: 1px; border-right-width: 0; - border-left-color: #fff; + border-left-color: #ffffff; bottom: -10px; } .clearfix:before, @@ -6509,7 +6509,7 @@ button.close { .tag { display: inline-block; margin-bottom: 4px; - color: #111; + color: #111111; background-color: #f6f6f6; padding: 1px 10px; border: 1px solid #dddddd; @@ -6528,14 +6528,14 @@ a.tag:hover { .pill { display: inline-block; background-color: #6f8890; - color: #FFF; + color: #ffffff; padding: 2px 10px 1px 10px; margin-right: 5px; font-weight: normal; border-radius: 100px; } .pill a { - color: #FFF; + color: #ffffff; } .pill a.remove { font-size: 11px; @@ -6548,7 +6548,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-item:last-of-type { border-bottom: 0; @@ -6578,7 +6578,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-list > li:last-of-type { border-bottom: 0; @@ -6607,8 +6607,8 @@ a.tag:hover { display: block; } .box { - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -6625,8 +6625,8 @@ a.tag:hover { font-size: 14px; line-height: 1.3; background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; } .module-heading:before, .module-heading:after { @@ -6654,11 +6654,11 @@ a.tag:hover { .module-footer { padding: 7px 25px 7px; margin: 0; - border-top: 1px dotted #ddd; + border-top: 1px dotted #dddddd; } .module .read-more { font-weight: bold; - color: #000; + color: #000000; } .pagination-wrapper { text-align: center; @@ -6694,7 +6694,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .module-grid:before, @@ -6790,8 +6790,8 @@ a.tag:hover { .module-resource { z-index: 5; position: relative; - background-color: #fff; - border-bottom: 1px solid #ddd; + background-color: #ffffff; + border-bottom: 1px solid #dddddd; margin-top: 0; margin-bottom: 0; border-radius: 3px 3px 0 0; @@ -6836,8 +6836,8 @@ a.tag:hover { top: 15px; right: -35px; width: 80px; - color: #fff; - background-color: #E73892; + color: #ffffff; + background-color: #e73892; padding: 1px 20px; font-size: 11px; text-align: center; @@ -6849,7 +6849,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .media-grid:before, @@ -6904,7 +6904,7 @@ a.tag:hover { left: 0; right: 0; bottom: 0; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; -webkit-transition: all 0.2s ease-in; -o-transition: all 0.2s ease-in; @@ -6913,13 +6913,13 @@ a.tag:hover { } .media-view:hover, .media-view.hovered { - border-color: #E73892; + border-color: #e73892; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); } .media-view:hover .banner, .media-view.hovered .banner { - background-color: #E73892; + background-color: #e73892; } .media-view span { display: none; @@ -7026,7 +7026,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .nav-simple > li:last-of-type, .nav-aside > li:last-of-type { @@ -7044,7 +7044,7 @@ a.tag:hover { } .nav-item > a, .nav-aside li a { - color: #333; + color: #333333; font-size: 14px; line-height: 1.42857143; margin: -7px -25px; @@ -7057,24 +7057,28 @@ a.tag:hover { .nav-item.active > a, .nav-aside li.active a { position: relative; - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } .nav-item.active > a:hover, .nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } @media (min-width: 768px) { .nav-item.active > a:before, .nav-aside li.active a:before { content: ' '; position: absolute; - top: 3px; + border: 20px solid transparent; + border-right: none; + border-left-color: #8ca0a6; + border-left-width: 6px; + top: 0; + bottom: 0; right: -6px; width: 6px; height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); } } .nav-pills > li { @@ -7089,7 +7093,6 @@ a.tag:hover { .nav-aside li.active a span { white-space: nowrap; overflow: hidden; - display: block; } .module-narrow .nav-item > a, .module-narrow .nav-aside li a { @@ -7356,7 +7359,7 @@ select[multiple].control-large input { position: relative; display: block; font-size: 11px; - color: #aaa; + color: #aaaaaa; line-height: 1.3; margin-top: 6px; } @@ -7397,7 +7400,7 @@ form .control-medium .info-block.info-inline { margin-right: 15px; } .form-group .info-block a { - color: #aaa; + color: #aaaaaa; text-decoration: underline; } .form-inline input { @@ -7434,7 +7437,7 @@ input[data-module="autocomplete"] { position: relative; } .simple-input .field-bordered { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-input .field input { width: 100%; @@ -7470,13 +7473,13 @@ input[data-module="autocomplete"] { padding: 4px 10px; background: #ebebeb; width: auto; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-top: none; font-size: 11px; color: #282828; } .editor .editor-info-block a { - color: #E73892; + color: #e73892; text-decoration: none; } .control-custom { @@ -7494,7 +7497,7 @@ input[data-module="autocomplete"] { } .control-custom.disabled label, .control-custom.disabled input { - color: #aaa; + color: #aaaaaa; text-decoration: line-through; text-shadow: none; } @@ -7504,7 +7507,7 @@ input[data-module="autocomplete"] { background-color: #f3f3f3; } .control-custom.disabled .checkbox { - color: #444; + color: #444444; text-decoration: none; } .control-custom .checkbox.btn { @@ -7531,25 +7534,25 @@ input[data-module="autocomplete"] { display: none; } .control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .control-custom.disabled .checkbox.btn:focus, .control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .control-custom.disabled .checkbox.btn:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .control-custom.disabled .checkbox.btn:active, .control-custom.disabled .checkbox.btn.active, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -7562,7 +7565,7 @@ input[data-module="autocomplete"] { .control-custom.disabled .checkbox.btn:active.focus, .control-custom.disabled .checkbox.btn.active.focus, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -7585,7 +7588,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .control-custom.disabled .checkbox.btn .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .alert-danger a { color: #b55457; @@ -7614,7 +7617,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; padding: 6px 8px 3px; background: #c6898b; - color: #fff; + color: #ffffff; width: auto; } .control-medium .error-block { @@ -7666,7 +7669,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 27px; counter-increment: stage; width: 50%; - background-color: #EDEDED; + background-color: #ededed; float: left; padding: 10px 20px; position: relative; @@ -7681,7 +7684,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-right: 5px; font-weight: bold; text-align: center; - color: #fff; + color: #ffffff; background-color: #aeaeae; z-index: 1; } @@ -7693,8 +7696,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { width: 0; position: absolute; pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; + border-top-color: #ededed; + border-bottom-color: #ededed; border-width: 29px; top: 50%; margin-top: -29px; @@ -7731,7 +7734,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .stages li.active:before { color: #8cc68a; - background: #fff; + background: #ffffff; } .stages li.complete:before { color: #c5e2c4; @@ -7758,7 +7761,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .stages li.active .highlight { - color: #fff; + color: #ffffff; background: #8cc68a; } .stages li.complete .highlight { @@ -7842,8 +7845,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; -o-transition: border linear 0.2s, box-shadow linear 0.2s; transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; } .select2-container-active .select2-choices, .select2-container-multi.select2-container-active .select2-choices { @@ -7933,7 +7936,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1; } .dataset-item { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; padding-bottom: 20px; margin-bottom: 20px; } @@ -7954,7 +7957,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1.3; } .dataset-heading a { - color: #333; + color: #333333; } .dataset-heading .label { position: relative; @@ -7980,7 +7983,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: inline; } .dataset-resources li a { - background-color: #aaa; + background-color: #aaaaaa; } .dataset-heading .popular { top: 0; @@ -7998,10 +8001,10 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { border-radius: 3px; } .resource-item:hover { - background-color: #eee; + background-color: #eeeeee; } .resource-item .heading { - color: #000; + color: #000000; font-size: 14px; font-weight: bold; } @@ -8026,14 +8029,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .resource-list.reordering .resource-item { - border: 1px solid #ddd; + border: 1px solid #dddddd; margin-bottom: 10px; cursor: move; } .resource-list.reordering .resource-item .handle { display: block; position: absolute; - color: #888; + color: #888888; left: -31px; top: 50%; margin-top: -15px; @@ -8041,25 +8044,25 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 30px; line-height: 30px; text-align: center; - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0 1px 1px; - background-color: #fff; + background-color: #ffffff; border-radius: 20px 0 0 20px; } .resource-list.reordering .resource-item .handle:hover { text-decoration: none; } .resource-list.reordering .resource-item:hover .handle { - background-color: #eee; + background-color: #eeeeee; } .resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #E73892; + background-color: #eeeeee; + border: 1px solid #e73892; } .resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #E73892; - color: #333; + background-color: #eeeeee; + border-color: #e73892; + color: #333333; } .resource-item .handle { display: none; @@ -8137,7 +8140,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; min-height: 50px; padding: 10px; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; border-radius: 3px; } @@ -8147,8 +8150,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 50px; overflow: hidden; margin-right: 10px; - color: #444; - background-color: #eee; + color: #444444; + background-color: #eeeeee; border-radius: 3px; } .view-list li a .icon i { @@ -8158,7 +8161,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 50px; } .view-list li a h3 { - color: #000; + color: #000000; font-weight: bold; font-size: 16px; margin: 0 0 3px 0; @@ -8168,33 +8171,33 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - color: #444; + color: #444444; } .view-list li a.active, .view-list li a:hover { text-decoration: none; - border-color: #E73892; + border-color: #e73892; } .view-list li a.active .icon, .view-list li a:hover .icon { - background-color: #E73892; + background-color: #e73892; color: #f6f6f6; } .view-list li .arrow { position: absolute; display: none; border: 8px solid transparent; - border-top-color: #E73892; + border-top-color: #e73892; left: 50%; bottom: -15px; margin-left: -4px; } .view-list li.active a { text-decoration: none; - border-color: #E73892; + border-color: #e73892; } .view-list li.active a .icon { - background-color: #E73892; + background-color: #e73892; color: #f6f6f6; } .view-list li.active .arrow { @@ -8227,7 +8230,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { background-color: #c3c3c3; } .view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #E73892; + background-color: #e73892; } .resource-view { margin-top: 20px; @@ -8235,7 +8238,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { .search-form { margin-bottom: 20px; padding-bottom: 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .search-form .search-input { position: relative; @@ -8265,22 +8268,21 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: none; } .search-form .search-input button i { - color: #ccc; + color: #cccccc; -webkit-transition: color 0.2s ease-in; -o-transition: color 0.2s ease-in; transition: color 0.2s ease-in; } .search-form .search-input button:hover i { - color: #000; + color: #000000; } .search-form .search-input.search-giant input { font-size: 16px; padding: 15px; } .search-form .search-input.search-giant button { - margin-top: -4px; + margin-top: -15px; right: 15px; - height: 30px; } .search-form .search-input.search-giant button i { font-size: 28px; @@ -8295,7 +8297,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin: 0; } .search-form .filter-list { - color: #444; + color: #444444; line-height: 32px; margin: 10px 0 0 0; } @@ -8306,17 +8308,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-top: 10px; font-size: 18px; font-weight: normal; - color: #000; + color: #000000; } .search-form.no-bottom-border { border-bottom-width: 0; margin-bottom: 0; } .search-form .search-input-group { - margin-bottom: 12px; -} -.search-form .search-input-group .input-group-btn .btn { - margin-top: 25px; + margin-bottom: 30px; } .tertiary .control-order-by { float: none; @@ -8363,7 +8362,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-bottom: 2px; } .group-list .module-heading h3 a { - color: #333; + color: #333333; } .group-list .module-heading .media-image { overflow: hidden; @@ -8467,7 +8466,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header { margin-top: 30px; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; background-color: #f6f6f6; border-radius: 0 3px 0 0; } @@ -8497,7 +8496,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header .nav-tabs li.active a, .page-header .nav-tabs a:hover { - background-color: #fff; + background-color: #ffffff; } .page-header .content_action { float: right; @@ -8511,7 +8510,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .nav-tabs-plain > .active > a, .nav-tabs-plain > .active > a:hover { - background-color: #fff; + background-color: #ffffff; } @media (max-width: 991px) { .page-header .nav-tabs { @@ -8572,8 +8571,8 @@ h4 small { } .table-chunky thead th, .table-chunky thead td { - color: #fff; - background-color: #aaa; + color: #ffffff; + background-color: #aaaaaa; padding-top: 10px; padding-bottom: 10px; } @@ -8927,7 +8926,8 @@ h4 small { margin-right: 3px; } .wrapper { - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -8960,7 +8960,7 @@ h4 small { bottom: 0; left: 0; width: 25%; - border-right: 1px solid #ddd; + border-right: 1px solid #dddddd; z-index: 1; } .wrapper.no-nav:before { @@ -8979,7 +8979,7 @@ h4 small { [role=main], .main { padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); + background: #eeeeee url("../../../base/images/bg.png"); } } [role=main] { @@ -9171,7 +9171,7 @@ h4 small { float: left; width: 50%; margin: 5px 0 0 0; - color: #444; + color: #444444; } .context-info .nums dl dt { display: block; @@ -9201,8 +9201,8 @@ h4 small { margin-top: 0; } .flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; + -webkit-box-shadow: 0 0 0 1px #ffffff; + box-shadow: 0 0 0 1px #ffffff; } .view-preview-container { margin-top: 20px; @@ -9212,8 +9212,8 @@ h4 small { } .homepage .module-search { padding: 5px; - color: #fff; - background: #fff; + color: #ffffff; + background: #ffffff; } .homepage .module-search .search-giant { margin-bottom: 10px; @@ -9223,7 +9223,7 @@ h4 small { } .homepage .module-search .module-content { border-radius: 3px 3px 0 0; - background-color: #E73892; + background-color: #e73892; border-bottom: none; } .homepage .module-search .module-content .heading { @@ -9330,7 +9330,7 @@ h4 small { } .account-masthead { min-height: 30px; - color: #fff; + color: #ffffff; background: #d31979 url("../../../base/images/bg.png"); } .account-masthead:before, @@ -9412,12 +9412,12 @@ h4 small { color: #f9cde4; } .account-masthead .account .notifications a:hover span { - color: #fff; + color: #ffffff; background-color: #a5145f; } .account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; + color: #ffffff; + background-color: #c9403a; } .account-masthead .account.authed .image { padding: 0 6px; @@ -9429,8 +9429,8 @@ h4 small { .masthead { margin-bottom: initial; padding: 10px 0; - color: #fff; - background: #E73892 url("../../../base/images/bg.png"); + color: #ffffff; + background: #e73892 url("../../../base/images/bg.png"); } .masthead:before, .masthead:after { @@ -9452,7 +9452,7 @@ h4 small { position: relative; } .masthead a { - color: #fff; + color: #ffffff; } .masthead hgroup h1, .masthead hgroup h2 { @@ -9577,8 +9577,8 @@ h4 small { .site-footer { margin-bottom: initial; padding: 10px 0; - color: #fff; - background: #E73892 url("../../../base/images/bg.png"); + color: #ffffff; + background: #e73892 url("../../../base/images/bg.png"); padding: 20px 0; } .site-footer:before, @@ -9601,7 +9601,7 @@ h4 small { position: relative; } .site-footer a { - color: #fff; + color: #ffffff; } .site-footer hgroup h1, .site-footer hgroup h2 { @@ -9743,13 +9743,13 @@ h4 small { margin-top: 0; } .lang-dropdown { - color: #000; + color: #000000; } .lang-dropdown li { width: auto; } .table-selected td { - background-color: #fff; + background-color: #ffffff; } .table-selected td .edit { display: block; @@ -9843,7 +9843,7 @@ h4 small { height: 30px; line-height: 30px; text-align: center; - color: #FFFFFF; + color: #ffffff; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); font-weight: normal; margin-right: 10px; @@ -9907,7 +9907,7 @@ h4 small { .popover .popover-content { font-size: 14px; line-height: 1.42857143; - color: #444; + color: #444444; word-break: break-all; } .popover .popover-content dl { @@ -9921,16 +9921,16 @@ h4 small { background-color: #999999; } .activity .item.failure .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.success .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.added-tag .icon { background-color: #6995a6; } .activity .item.changed-group .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.changed-package .icon { background-color: #8c76ce; @@ -9948,7 +9948,7 @@ h4 small { background-color: #699fa6; } .activity .item.deleted-group .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.deleted-package .icon { background-color: #b97452; @@ -9963,7 +9963,7 @@ h4 small { background-color: #b95297; } .activity .item.new-group .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.new-package .icon { background-color: #69a68e; @@ -9987,7 +9987,7 @@ h4 small { background-color: #b9b952; } .activity .item.follow-dataset .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.follow-user .icon { background-color: #8c76ce; @@ -10071,7 +10071,7 @@ h4 small { .popover-followee .popover-header { background-color: whiteSmoke; padding: 5px; - border-bottom: 1px solid #ccc; + border-bottom: 1px solid #cccccc; border-radius: 3px 3px 0 0; } .popover-followee .popover-header:before, @@ -10128,8 +10128,8 @@ h4 small { border-radius: 0; } .popover-followee .nav li a i { - background-color: #E73892; - color: #fff; + background-color: #e73892; + color: #ffffff; margin-right: 11px; padding: 3px 5px; line-height: 1; @@ -10141,8 +10141,8 @@ h4 small { background-color: #000; } .popover-followee .nav li.active a i { - color: #E73892; - background-color: #fff; + color: #e73892; + background-color: #ffffff; } .dashboard-me { padding: 15px 15px 0 15px; @@ -10227,7 +10227,7 @@ h4 small { z-index: 0; } body { - background: #E73892 url("../../../base/images/bg.png"); + background: #e73892 url("../../../base/images/bg.png"); } [hidden] { display: none; @@ -10246,7 +10246,7 @@ table .metric { width: 140px; } code { - color: #000; + color: #000000; border: none; background: none; white-space: normal; @@ -10279,7 +10279,7 @@ iframe { text-indent: -999em; } .empty { - color: #aaa; + color: #aaaaaa; font-style: italic; } .page-heading { diff --git a/ckan/public/base/css/green.css b/ckan/public/base/css/green.css index 50e8ea9c25b..7843dfce4bf 100644 --- a/ckan/public/base/css/green.css +++ b/ckan/public/base/css/green.css @@ -1075,7 +1075,7 @@ body { font-size: 14px; line-height: 1.42857143; color: #333333; - background-color: #fff; + background-color: #ffffff; } input, button, @@ -1117,8 +1117,8 @@ img { .img-thumbnail { padding: 4px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; @@ -1171,7 +1171,7 @@ h6, .h5, .h6 { font-family: inherit; - font-weight: 500; + font-weight: 700; line-height: 1.1; color: inherit; } @@ -1531,8 +1531,8 @@ code { kbd { padding: 2px 4px; font-size: 90%; - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } @@ -1552,7 +1552,7 @@ pre { word-wrap: break-word; color: #333333; background-color: #f5f5f5; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } pre code { @@ -2260,11 +2260,11 @@ th { padding: 8px; line-height: 1.42857143; vertical-align: top; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid #ddd; + border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, @@ -2275,10 +2275,10 @@ th { border-top: 0; } .table > tbody + tbody { - border-top: 2px solid #ddd; + border-top: 2px solid #dddddd; } .table .table { - background-color: #fff; + background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, @@ -2289,7 +2289,7 @@ th { padding: 5px; } .table-bordered { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, @@ -2297,7 +2297,7 @@ th { .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { @@ -2435,7 +2435,7 @@ table th[class*="col-"] { margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; @@ -2540,9 +2540,9 @@ output { font-size: 14px; line-height: 1.42857143; color: #555555; - background-color: #fff; + background-color: #ffffff; background-image: none; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); @@ -2557,14 +2557,14 @@ output { box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { - color: #999; + color: #999999; opacity: 1; } .form-control:-ms-input-placeholder { - color: #999; + color: #999999; } .form-control::-webkit-input-placeholder { - color: #999; + color: #999999; } .form-control::-ms-expand { border: 0; @@ -3018,7 +3018,7 @@ select[multiple].input-lg { .btn:hover, .btn:focus, .btn.focus { - color: #333; + color: #333333; text-decoration: none; } .btn:active, @@ -3042,25 +3042,25 @@ fieldset[disabled] a.btn { pointer-events: none; } .btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; + color: #333333; + background-color: #ffffff; + border-color: #cccccc; } .btn-default:focus, .btn-default.focus { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } @@ -3073,7 +3073,7 @@ fieldset[disabled] a.btn { .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { - color: #333; + color: #333333; background-color: #d4d4d4; border-color: #8c8c8c; } @@ -3091,33 +3091,33 @@ fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: #ccc; + background-color: #ffffff; + border-color: #cccccc; } .btn-default .badge { - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; } .btn-primary { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } @@ -3130,7 +3130,7 @@ fieldset[disabled] .btn-default.focus { .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #204d74; border-color: #122b40; } @@ -3153,28 +3153,28 @@ fieldset[disabled] .btn-primary.focus { } .btn-primary .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .btn-success { - color: #fff; + color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #255625; } .btn-success:hover { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } @@ -3187,7 +3187,7 @@ fieldset[disabled] .btn-primary.focus { .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { - color: #fff; + color: #ffffff; background-color: #398439; border-color: #255625; } @@ -3210,28 +3210,28 @@ fieldset[disabled] .btn-success.focus { } .btn-success .badge { color: #5cb85c; - background-color: #fff; + background-color: #ffffff; } .btn-info { - color: #fff; + color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } @@ -3244,7 +3244,7 @@ fieldset[disabled] .btn-success.focus { .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { - color: #fff; + color: #ffffff; background-color: #269abc; border-color: #1b6d85; } @@ -3267,28 +3267,28 @@ fieldset[disabled] .btn-info.focus { } .btn-info .badge { color: #5bc0de; - background-color: #fff; + background-color: #ffffff; } .btn-warning { - color: #fff; + color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } @@ -3301,7 +3301,7 @@ fieldset[disabled] .btn-info.focus { .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #d58512; border-color: #985f0d; } @@ -3324,28 +3324,28 @@ fieldset[disabled] .btn-warning.focus { } .btn-warning .badge { color: #f0ad4e; - background-color: #fff; + background-color: #ffffff; } .btn-danger { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -3358,7 +3358,7 @@ fieldset[disabled] .btn-warning.focus { .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -3381,7 +3381,7 @@ fieldset[disabled] .btn-danger.focus { } .btn-danger .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .btn-link { color: #337ab7; @@ -3512,8 +3512,8 @@ tbody.collapse.in { list-style: none; font-size: 14px; text-align: left; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); @@ -3548,7 +3548,7 @@ tbody.collapse.in { .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; text-decoration: none; outline: 0; background-color: #337ab7; @@ -3884,7 +3884,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { color: #555555; text-align: center; background-color: #eeeeee; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { @@ -3997,7 +3997,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { max-width: none; } .nav-tabs { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; @@ -4010,14 +4010,14 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #ddd; + border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-bottom-color: transparent; cursor: default; } @@ -4052,17 +4052,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .nav-pills > li { @@ -4077,7 +4077,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; + color: #ffffff; background-color: #337ab7; } .nav-stacked > li { @@ -4120,17 +4120,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .tab-content > .tab-pane { @@ -4475,7 +4475,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-color: #e7e7e7; } .navbar-default .navbar-brand { - color: #777; + color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { @@ -4483,37 +4483,37 @@ select[multiple].input-group-sm > .input-group-btn > .btn { background-color: transparent; } .navbar-default .navbar-text { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { - border-color: #ddd; + border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #ddd; + background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { - background-color: #888; + background-color: #888888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { @@ -4523,51 +4523,51 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; - color: #555; + color: #555555; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { - color: #777; + color: #777777; } .navbar-default .navbar-link:hover { - color: #333; + color: #333333; } .navbar-default .btn-link { - color: #777; + color: #777777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333; + color: #333333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; + color: #cccccc; } .navbar-inverse { - background-color: #222; + background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { @@ -4575,7 +4575,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { @@ -4586,30 +4586,30 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { - border-color: #333; + border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333; + background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; + background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { @@ -4619,7 +4619,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; - color: #fff; + color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { @@ -4633,19 +4633,19 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } } @@ -4653,20 +4653,20 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; + color: #444444; } .breadcrumb { padding: 8px 15px; @@ -4681,7 +4681,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; - color: #ccc; + color: #cccccc; } .breadcrumb > .active { color: #777777; @@ -4703,8 +4703,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { line-height: 1.42857143; text-decoration: none; color: #337ab7; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; margin-left: -1px; } .pagination > li:first-child > a, @@ -4725,7 +4725,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { z-index: 2; color: #23527c; background-color: #eeeeee; - border-color: #ddd; + border-color: #dddddd; } .pagination > .active > a, .pagination > .active > span, @@ -4734,7 +4734,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; cursor: default; @@ -4746,8 +4746,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; - background-color: #fff; - border-color: #ddd; + background-color: #ffffff; + border-color: #dddddd; cursor: not-allowed; } .pagination-lg > li > a, @@ -4795,8 +4795,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager li > span { display: inline-block; padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, @@ -4817,7 +4817,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager .disabled > a:focus, .pager .disabled > span { color: #777777; - background-color: #fff; + background-color: #ffffff; cursor: not-allowed; } .label { @@ -4826,7 +4826,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { font-size: 75%; font-weight: bold; line-height: 1; - color: #fff; + color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; @@ -4834,7 +4834,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { } a.label:hover, a.label:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } @@ -4893,7 +4893,7 @@ a.label:focus { padding: 3px 7px; font-size: 12px; font-weight: bold; - color: #fff; + color: #ffffff; line-height: 1; vertical-align: middle; white-space: nowrap; @@ -4915,14 +4915,14 @@ a.label:focus { } a.badge:hover, a.badge:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .list-group-item > .badge { float: right; @@ -4981,8 +4981,8 @@ a.badge:focus { padding: 4px; margin-bottom: 20px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; @@ -5108,7 +5108,7 @@ a.thumbnail.active { height: 100%; font-size: 12px; line-height: 20px; - color: #fff; + color: #ffffff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); @@ -5219,8 +5219,8 @@ a.thumbnail.active { display: block; padding: 10px 15px; margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; @@ -5233,18 +5233,18 @@ a.thumbnail.active { } a.list-group-item, button.list-group-item { - color: #555; + color: #555555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { - color: #333; + color: #333333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; - color: #555; + color: #555555; background-color: #f5f5f5; } button.list-group-item { @@ -5272,7 +5272,7 @@ button.list-group-item { .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5418,7 +5418,7 @@ button.list-group-item-danger.active:focus { } .panel { margin-bottom: 20px; - background-color: #fff; + background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); @@ -5452,7 +5452,7 @@ button.list-group-item-danger.active:focus { .panel-footer { padding: 10px 15px; background-color: #f5f5f5; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } @@ -5566,7 +5566,7 @@ button.list-group-item-danger.active:focus { .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { @@ -5643,37 +5643,37 @@ button.list-group-item-danger.active:focus { } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .panel-default { - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; + border-top-color: #dddddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; + border-bottom-color: #dddddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5682,7 +5682,7 @@ button.list-group-item-danger.active:focus { } .panel-primary > .panel-heading .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; @@ -5812,14 +5812,14 @@ button.list-group-item-danger.active:focus { font-size: 21px; font-weight: bold; line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; + color: #000000; + text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { - color: #000; + color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; @@ -5874,8 +5874,8 @@ button.close { } .modal-content { position: relative; - background-color: #fff; - border: 1px solid #999; + background-color: #ffffff; + border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); @@ -5890,7 +5890,7 @@ button.close { bottom: 0; left: 0; z-index: 1040; - background-color: #000; + background-color: #000000; } .modal-backdrop.fade { opacity: 0; @@ -6001,9 +6001,9 @@ button.close { .tooltip-inner { max-width: 200px; padding: 3px 8px; - color: #fff; + color: #ffffff; text-align: center; - background-color: #000; + background-color: #000000; border-radius: 4px; } .tooltip-arrow { @@ -6018,56 +6018,56 @@ button.close { left: 50%; margin-left: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; - border-right-color: #000; + border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; - border-left-color: #000; + border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .popover { position: absolute; @@ -6093,9 +6093,9 @@ button.close { word-spacing: normal; word-wrap: normal; font-size: 14px; - background-color: #fff; + background-color: #ffffff; background-clip: padding-box; - border: 1px solid #ccc; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); @@ -6153,7 +6153,7 @@ button.close { bottom: 1px; margin-left: -10px; border-bottom-width: 0; - border-top-color: #fff; + border-top-color: #ffffff; } .popover.right > .arrow { top: 50%; @@ -6168,7 +6168,7 @@ button.close { left: 1px; bottom: -10px; border-left-width: 0; - border-right-color: #fff; + border-right-color: #ffffff; } .popover.bottom > .arrow { left: 50%; @@ -6183,7 +6183,7 @@ button.close { top: 1px; margin-left: -10px; border-top-width: 0; - border-bottom-color: #fff; + border-bottom-color: #ffffff; } .popover.left > .arrow { top: 50%; @@ -6197,7 +6197,7 @@ button.close { content: " "; right: 1px; border-right-width: 0; - border-left-color: #fff; + border-left-color: #ffffff; bottom: -10px; } .clearfix:before, @@ -6509,7 +6509,7 @@ button.close { .tag { display: inline-block; margin-bottom: 4px; - color: #111; + color: #111111; background-color: #f6f6f6; padding: 1px 10px; border: 1px solid #dddddd; @@ -6528,14 +6528,14 @@ a.tag:hover { .pill { display: inline-block; background-color: #6f8890; - color: #FFF; + color: #ffffff; padding: 2px 10px 1px 10px; margin-right: 5px; font-weight: normal; border-radius: 100px; } .pill a { - color: #FFF; + color: #ffffff; } .pill a.remove { font-size: 11px; @@ -6548,7 +6548,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-item:last-of-type { border-bottom: 0; @@ -6578,7 +6578,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-list > li:last-of-type { border-bottom: 0; @@ -6607,8 +6607,8 @@ a.tag:hover { display: block; } .box { - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -6625,8 +6625,8 @@ a.tag:hover { font-size: 14px; line-height: 1.3; background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; } .module-heading:before, .module-heading:after { @@ -6654,11 +6654,11 @@ a.tag:hover { .module-footer { padding: 7px 25px 7px; margin: 0; - border-top: 1px dotted #ddd; + border-top: 1px dotted #dddddd; } .module .read-more { font-weight: bold; - color: #000; + color: #000000; } .pagination-wrapper { text-align: center; @@ -6694,7 +6694,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .module-grid:before, @@ -6790,8 +6790,8 @@ a.tag:hover { .module-resource { z-index: 5; position: relative; - background-color: #fff; - border-bottom: 1px solid #ddd; + background-color: #ffffff; + border-bottom: 1px solid #dddddd; margin-top: 0; margin-bottom: 0; border-radius: 3px 3px 0 0; @@ -6836,8 +6836,8 @@ a.tag:hover { top: 15px; right: -35px; width: 80px; - color: #fff; - background-color: #2F9B45; + color: #ffffff; + background-color: #2f9b45; padding: 1px 20px; font-size: 11px; text-align: center; @@ -6849,7 +6849,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .media-grid:before, @@ -6904,7 +6904,7 @@ a.tag:hover { left: 0; right: 0; bottom: 0; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; -webkit-transition: all 0.2s ease-in; -o-transition: all 0.2s ease-in; @@ -6913,13 +6913,13 @@ a.tag:hover { } .media-view:hover, .media-view.hovered { - border-color: #2F9B45; + border-color: #2f9b45; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); } .media-view:hover .banner, .media-view.hovered .banner { - background-color: #2F9B45; + background-color: #2f9b45; } .media-view span { display: none; @@ -7026,7 +7026,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .nav-simple > li:last-of-type, .nav-aside > li:last-of-type { @@ -7044,7 +7044,7 @@ a.tag:hover { } .nav-item > a, .nav-aside li a { - color: #333; + color: #333333; font-size: 14px; line-height: 1.42857143; margin: -7px -25px; @@ -7057,24 +7057,28 @@ a.tag:hover { .nav-item.active > a, .nav-aside li.active a { position: relative; - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } .nav-item.active > a:hover, .nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } @media (min-width: 768px) { .nav-item.active > a:before, .nav-aside li.active a:before { content: ' '; position: absolute; - top: 3px; + border: 20px solid transparent; + border-right: none; + border-left-color: #8ca0a6; + border-left-width: 6px; + top: 0; + bottom: 0; right: -6px; width: 6px; height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); } } .nav-pills > li { @@ -7089,7 +7093,6 @@ a.tag:hover { .nav-aside li.active a span { white-space: nowrap; overflow: hidden; - display: block; } .module-narrow .nav-item > a, .module-narrow .nav-aside li a { @@ -7356,7 +7359,7 @@ select[multiple].control-large input { position: relative; display: block; font-size: 11px; - color: #aaa; + color: #aaaaaa; line-height: 1.3; margin-top: 6px; } @@ -7397,7 +7400,7 @@ form .control-medium .info-block.info-inline { margin-right: 15px; } .form-group .info-block a { - color: #aaa; + color: #aaaaaa; text-decoration: underline; } .form-inline input { @@ -7434,7 +7437,7 @@ input[data-module="autocomplete"] { position: relative; } .simple-input .field-bordered { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-input .field input { width: 100%; @@ -7470,13 +7473,13 @@ input[data-module="autocomplete"] { padding: 4px 10px; background: #ebebeb; width: auto; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-top: none; font-size: 11px; color: #282828; } .editor .editor-info-block a { - color: #2F9B45; + color: #2f9b45; text-decoration: none; } .control-custom { @@ -7494,7 +7497,7 @@ input[data-module="autocomplete"] { } .control-custom.disabled label, .control-custom.disabled input { - color: #aaa; + color: #aaaaaa; text-decoration: line-through; text-shadow: none; } @@ -7504,7 +7507,7 @@ input[data-module="autocomplete"] { background-color: #f3f3f3; } .control-custom.disabled .checkbox { - color: #444; + color: #444444; text-decoration: none; } .control-custom .checkbox.btn { @@ -7531,25 +7534,25 @@ input[data-module="autocomplete"] { display: none; } .control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .control-custom.disabled .checkbox.btn:focus, .control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .control-custom.disabled .checkbox.btn:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .control-custom.disabled .checkbox.btn:active, .control-custom.disabled .checkbox.btn.active, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -7562,7 +7565,7 @@ input[data-module="autocomplete"] { .control-custom.disabled .checkbox.btn:active.focus, .control-custom.disabled .checkbox.btn.active.focus, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -7585,7 +7588,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .control-custom.disabled .checkbox.btn .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .alert-danger a { color: #b55457; @@ -7614,7 +7617,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; padding: 6px 8px 3px; background: #c6898b; - color: #fff; + color: #ffffff; width: auto; } .control-medium .error-block { @@ -7666,7 +7669,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 27px; counter-increment: stage; width: 50%; - background-color: #EDEDED; + background-color: #ededed; float: left; padding: 10px 20px; position: relative; @@ -7681,7 +7684,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-right: 5px; font-weight: bold; text-align: center; - color: #fff; + color: #ffffff; background-color: #aeaeae; z-index: 1; } @@ -7693,8 +7696,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { width: 0; position: absolute; pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; + border-top-color: #ededed; + border-bottom-color: #ededed; border-width: 29px; top: 50%; margin-top: -29px; @@ -7731,7 +7734,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .stages li.active:before { color: #8cc68a; - background: #fff; + background: #ffffff; } .stages li.complete:before { color: #c5e2c4; @@ -7758,7 +7761,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .stages li.active .highlight { - color: #fff; + color: #ffffff; background: #8cc68a; } .stages li.complete .highlight { @@ -7842,8 +7845,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; -o-transition: border linear 0.2s, box-shadow linear 0.2s; transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; } .select2-container-active .select2-choices, .select2-container-multi.select2-container-active .select2-choices { @@ -7933,7 +7936,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1; } .dataset-item { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; padding-bottom: 20px; margin-bottom: 20px; } @@ -7954,7 +7957,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1.3; } .dataset-heading a { - color: #333; + color: #333333; } .dataset-heading .label { position: relative; @@ -7980,7 +7983,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: inline; } .dataset-resources li a { - background-color: #aaa; + background-color: #aaaaaa; } .dataset-heading .popular { top: 0; @@ -7998,10 +8001,10 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { border-radius: 3px; } .resource-item:hover { - background-color: #eee; + background-color: #eeeeee; } .resource-item .heading { - color: #000; + color: #000000; font-size: 14px; font-weight: bold; } @@ -8026,14 +8029,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .resource-list.reordering .resource-item { - border: 1px solid #ddd; + border: 1px solid #dddddd; margin-bottom: 10px; cursor: move; } .resource-list.reordering .resource-item .handle { display: block; position: absolute; - color: #888; + color: #888888; left: -31px; top: 50%; margin-top: -15px; @@ -8041,25 +8044,25 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 30px; line-height: 30px; text-align: center; - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0 1px 1px; - background-color: #fff; + background-color: #ffffff; border-radius: 20px 0 0 20px; } .resource-list.reordering .resource-item .handle:hover { text-decoration: none; } .resource-list.reordering .resource-item:hover .handle { - background-color: #eee; + background-color: #eeeeee; } .resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #2F9B45; + background-color: #eeeeee; + border: 1px solid #2f9b45; } .resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #2F9B45; - color: #333; + background-color: #eeeeee; + border-color: #2f9b45; + color: #333333; } .resource-item .handle { display: none; @@ -8137,7 +8140,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; min-height: 50px; padding: 10px; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; border-radius: 3px; } @@ -8147,8 +8150,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 50px; overflow: hidden; margin-right: 10px; - color: #444; - background-color: #eee; + color: #444444; + background-color: #eeeeee; border-radius: 3px; } .view-list li a .icon i { @@ -8158,7 +8161,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 50px; } .view-list li a h3 { - color: #000; + color: #000000; font-weight: bold; font-size: 16px; margin: 0 0 3px 0; @@ -8168,33 +8171,33 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - color: #444; + color: #444444; } .view-list li a.active, .view-list li a:hover { text-decoration: none; - border-color: #2F9B45; + border-color: #2f9b45; } .view-list li a.active .icon, .view-list li a:hover .icon { - background-color: #2F9B45; + background-color: #2f9b45; color: #f6f6f6; } .view-list li .arrow { position: absolute; display: none; border: 8px solid transparent; - border-top-color: #2F9B45; + border-top-color: #2f9b45; left: 50%; bottom: -15px; margin-left: -4px; } .view-list li.active a { text-decoration: none; - border-color: #2F9B45; + border-color: #2f9b45; } .view-list li.active a .icon { - background-color: #2F9B45; + background-color: #2f9b45; color: #f6f6f6; } .view-list li.active .arrow { @@ -8227,7 +8230,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { background-color: #c3c3c3; } .view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #2F9B45; + background-color: #2f9b45; } .resource-view { margin-top: 20px; @@ -8235,7 +8238,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { .search-form { margin-bottom: 20px; padding-bottom: 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .search-form .search-input { position: relative; @@ -8265,22 +8268,21 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: none; } .search-form .search-input button i { - color: #ccc; + color: #cccccc; -webkit-transition: color 0.2s ease-in; -o-transition: color 0.2s ease-in; transition: color 0.2s ease-in; } .search-form .search-input button:hover i { - color: #000; + color: #000000; } .search-form .search-input.search-giant input { font-size: 16px; padding: 15px; } .search-form .search-input.search-giant button { - margin-top: -4px; + margin-top: -15px; right: 15px; - height: 30px; } .search-form .search-input.search-giant button i { font-size: 28px; @@ -8295,7 +8297,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin: 0; } .search-form .filter-list { - color: #444; + color: #444444; line-height: 32px; margin: 10px 0 0 0; } @@ -8306,17 +8308,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-top: 10px; font-size: 18px; font-weight: normal; - color: #000; + color: #000000; } .search-form.no-bottom-border { border-bottom-width: 0; margin-bottom: 0; } .search-form .search-input-group { - margin-bottom: 12px; -} -.search-form .search-input-group .input-group-btn .btn { - margin-top: 25px; + margin-bottom: 30px; } .tertiary .control-order-by { float: none; @@ -8363,7 +8362,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-bottom: 2px; } .group-list .module-heading h3 a { - color: #333; + color: #333333; } .group-list .module-heading .media-image { overflow: hidden; @@ -8467,7 +8466,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header { margin-top: 30px; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; background-color: #f6f6f6; border-radius: 0 3px 0 0; } @@ -8497,7 +8496,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header .nav-tabs li.active a, .page-header .nav-tabs a:hover { - background-color: #fff; + background-color: #ffffff; } .page-header .content_action { float: right; @@ -8511,7 +8510,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .nav-tabs-plain > .active > a, .nav-tabs-plain > .active > a:hover { - background-color: #fff; + background-color: #ffffff; } @media (max-width: 991px) { .page-header .nav-tabs { @@ -8572,8 +8571,8 @@ h4 small { } .table-chunky thead th, .table-chunky thead td { - color: #fff; - background-color: #aaa; + color: #ffffff; + background-color: #aaaaaa; padding-top: 10px; padding-bottom: 10px; } @@ -8927,7 +8926,8 @@ h4 small { margin-right: 3px; } .wrapper { - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -8960,7 +8960,7 @@ h4 small { bottom: 0; left: 0; width: 25%; - border-right: 1px solid #ddd; + border-right: 1px solid #dddddd; z-index: 1; } .wrapper.no-nav:before { @@ -8979,7 +8979,7 @@ h4 small { [role=main], .main { padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); + background: #eeeeee url("../../../base/images/bg.png"); } } [role=main] { @@ -9171,7 +9171,7 @@ h4 small { float: left; width: 50%; margin: 5px 0 0 0; - color: #444; + color: #444444; } .context-info .nums dl dt { display: block; @@ -9201,8 +9201,8 @@ h4 small { margin-top: 0; } .flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; + -webkit-box-shadow: 0 0 0 1px #ffffff; + box-shadow: 0 0 0 1px #ffffff; } .view-preview-container { margin-top: 20px; @@ -9212,8 +9212,8 @@ h4 small { } .homepage .module-search { padding: 5px; - color: #fff; - background: #fff; + color: #ffffff; + background: #ffffff; } .homepage .module-search .search-giant { margin-bottom: 10px; @@ -9223,7 +9223,7 @@ h4 small { } .homepage .module-search .module-content { border-radius: 3px 3px 0 0; - background-color: #2F9B45; + background-color: #2f9b45; border-bottom: none; } .homepage .module-search .module-content .heading { @@ -9330,7 +9330,7 @@ h4 small { } .account-masthead { min-height: 30px; - color: #fff; + color: #ffffff; background: #237434 url("../../../base/images/bg.png"); } .account-masthead:before, @@ -9412,12 +9412,12 @@ h4 small { color: #cbe6d1; } .account-masthead .account .notifications a:hover span { - color: #fff; + color: #ffffff; background-color: #174d22; } .account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; + color: #ffffff; + background-color: #c9403a; } .account-masthead .account.authed .image { padding: 0 6px; @@ -9429,8 +9429,8 @@ h4 small { .masthead { margin-bottom: initial; padding: 10px 0; - color: #fff; - background: #2F9B45 url("../../../base/images/bg.png"); + color: #ffffff; + background: #2f9b45 url("../../../base/images/bg.png"); } .masthead:before, .masthead:after { @@ -9452,7 +9452,7 @@ h4 small { position: relative; } .masthead a { - color: #fff; + color: #ffffff; } .masthead hgroup h1, .masthead hgroup h2 { @@ -9577,8 +9577,8 @@ h4 small { .site-footer { margin-bottom: initial; padding: 10px 0; - color: #fff; - background: #2F9B45 url("../../../base/images/bg.png"); + color: #ffffff; + background: #2f9b45 url("../../../base/images/bg.png"); padding: 20px 0; } .site-footer:before, @@ -9601,7 +9601,7 @@ h4 small { position: relative; } .site-footer a { - color: #fff; + color: #ffffff; } .site-footer hgroup h1, .site-footer hgroup h2 { @@ -9743,13 +9743,13 @@ h4 small { margin-top: 0; } .lang-dropdown { - color: #000; + color: #000000; } .lang-dropdown li { width: auto; } .table-selected td { - background-color: #fff; + background-color: #ffffff; } .table-selected td .edit { display: block; @@ -9843,7 +9843,7 @@ h4 small { height: 30px; line-height: 30px; text-align: center; - color: #FFFFFF; + color: #ffffff; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); font-weight: normal; margin-right: 10px; @@ -9907,7 +9907,7 @@ h4 small { .popover .popover-content { font-size: 14px; line-height: 1.42857143; - color: #444; + color: #444444; word-break: break-all; } .popover .popover-content dl { @@ -9921,16 +9921,16 @@ h4 small { background-color: #999999; } .activity .item.failure .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.success .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.added-tag .icon { background-color: #6995a6; } .activity .item.changed-group .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.changed-package .icon { background-color: #8c76ce; @@ -9948,7 +9948,7 @@ h4 small { background-color: #699fa6; } .activity .item.deleted-group .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.deleted-package .icon { background-color: #b97452; @@ -9963,7 +9963,7 @@ h4 small { background-color: #b95297; } .activity .item.new-group .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.new-package .icon { background-color: #69a68e; @@ -9987,7 +9987,7 @@ h4 small { background-color: #b9b952; } .activity .item.follow-dataset .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.follow-user .icon { background-color: #8c76ce; @@ -10071,7 +10071,7 @@ h4 small { .popover-followee .popover-header { background-color: whiteSmoke; padding: 5px; - border-bottom: 1px solid #ccc; + border-bottom: 1px solid #cccccc; border-radius: 3px 3px 0 0; } .popover-followee .popover-header:before, @@ -10128,8 +10128,8 @@ h4 small { border-radius: 0; } .popover-followee .nav li a i { - background-color: #2F9B45; - color: #fff; + background-color: #2f9b45; + color: #ffffff; margin-right: 11px; padding: 3px 5px; line-height: 1; @@ -10141,8 +10141,8 @@ h4 small { background-color: #000; } .popover-followee .nav li.active a i { - color: #2F9B45; - background-color: #fff; + color: #2f9b45; + background-color: #ffffff; } .dashboard-me { padding: 15px 15px 0 15px; @@ -10227,7 +10227,7 @@ h4 small { z-index: 0; } body { - background: #2F9B45 url("../../../base/images/bg.png"); + background: #2f9b45 url("../../../base/images/bg.png"); } [hidden] { display: none; @@ -10246,7 +10246,7 @@ table .metric { width: 140px; } code { - color: #000; + color: #000000; border: none; background: none; white-space: normal; @@ -10279,7 +10279,7 @@ iframe { text-indent: -999em; } .empty { - color: #aaa; + color: #aaaaaa; font-style: italic; } .page-heading { diff --git a/ckan/public/base/css/main.css b/ckan/public/base/css/main.css index 45a75e4b1b9..fd966a245e9 100644 --- a/ckan/public/base/css/main.css +++ b/ckan/public/base/css/main.css @@ -1086,12 +1086,12 @@ textarea { line-height: inherit; } a { - color: #337ab7; + color: #206b82; text-decoration: none; } a:hover, a:focus { - color: #23527c; + color: #113845; text-decoration: underline; } a:focus { @@ -1106,7 +1106,9 @@ img { } .img-responsive, .thumbnail > img, -.thumbnail a > img { +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; @@ -1171,7 +1173,7 @@ h6, .h5, .h6 { font-family: inherit; - font-weight: 500; + font-weight: 700; line-height: 1.1; color: inherit; } @@ -1294,7 +1296,7 @@ small, mark, .mark { background-color: #fcf8e3; - padding: .2em; + padding: 0.2em; } .text-left { text-align: left; @@ -1324,11 +1326,11 @@ mark, color: #777777; } .text-primary { - color: #337ab7; + color: #206b82; } a.text-primary:hover, a.text-primary:focus { - color: #286090; + color: #164959; } .text-success { color: #3c763d; @@ -1360,11 +1362,11 @@ a.text-danger:focus { } .bg-primary { color: #fff; - background-color: #337ab7; + background-color: #206b82; } a.bg-primary:hover, a.bg-primary:focus { - background-color: #286090; + background-color: #164959; } .bg-success { background-color: #dff0d8; @@ -1598,13 +1600,71 @@ pre code { margin-left: -15px; margin-right: -15px; } -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px; } -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { float: left; } .col-xs-12 { @@ -1761,7 +1821,18 @@ pre code { margin-left: 0%; } @media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11, + .col-sm-12 { float: left; } .col-sm-12 { @@ -1919,7 +1990,18 @@ pre code { } } @media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11, + .col-md-12 { float: left; } .col-md-12 { @@ -2077,7 +2159,18 @@ pre code { } } @media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11, + .col-lg-12 { float: left; } .col-lg-12 { @@ -3100,26 +3193,26 @@ fieldset[disabled] .btn-default.focus { } .btn-primary { color: #fff; - background-color: #337ab7; - border-color: #2e6da4; + background-color: #206b82; + border-color: #1b5a6e; } .btn-primary:focus, .btn-primary.focus { color: #fff; - background-color: #286090; - border-color: #122b40; + background-color: #164959; + border-color: #020607; } .btn-primary:hover { color: #fff; - background-color: #286090; - border-color: #204d74; + background-color: #164959; + border-color: #0f323c; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; - background-color: #286090; - border-color: #204d74; + background-color: #164959; + border-color: #0f323c; } .btn-primary:active:hover, .btn-primary.active:hover, @@ -3131,8 +3224,8 @@ fieldset[disabled] .btn-default.focus { .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; - background-color: #204d74; - border-color: #122b40; + background-color: #0f323c; + border-color: #020607; } .btn-primary:active, .btn-primary.active, @@ -3148,11 +3241,11 @@ fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { - background-color: #337ab7; - border-color: #2e6da4; + background-color: #206b82; + border-color: #1b5a6e; } .btn-primary .badge { - color: #337ab7; + color: #206b82; background-color: #fff; } .btn-success { @@ -3384,7 +3477,7 @@ fieldset[disabled] .btn-danger.focus { background-color: #fff; } .btn-link { - color: #337ab7; + color: #206b82; font-weight: normal; border-radius: 0; } @@ -3405,7 +3498,7 @@ fieldset[disabled] .btn-link { } .btn-link:hover, .btn-link:focus { - color: #23527c; + color: #113845; text-decoration: underline; background-color: transparent; } @@ -3551,7 +3644,7 @@ tbody.collapse.in { color: #fff; text-decoration: none; outline: 0; - background-color: #337ab7; + background-color: #206b82; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, @@ -3985,7 +4078,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; - border-color: #337ab7; + border-color: #206b82; } .nav .nav-divider { height: 1px; @@ -4078,7 +4171,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; - background-color: #337ab7; + background-color: #206b82; } .nav-stacked > li { float: none; @@ -4702,7 +4795,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { padding: 6px 12px; line-height: 1.42857143; text-decoration: none; - color: #337ab7; + color: #206b82; background-color: #fff; border: 1px solid #ddd; margin-left: -1px; @@ -4723,7 +4816,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; - color: #23527c; + color: #113845; background-color: #eeeeee; border-color: #ddd; } @@ -4735,8 +4828,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .active > span:focus { z-index: 3; color: #fff; - background-color: #337ab7; - border-color: #337ab7; + background-color: #206b82; + border-color: #206b82; cursor: default; } .pagination > .disabled > span, @@ -4822,7 +4915,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { } .label { display: inline; - padding: .2em .6em .3em; + padding: 0.2em 0.6em 0.3em; font-size: 75%; font-weight: bold; line-height: 1; @@ -4830,7 +4923,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { text-align: center; white-space: nowrap; vertical-align: baseline; - border-radius: .25em; + border-radius: 0.25em; } a.label:hover, a.label:focus { @@ -4853,11 +4946,11 @@ a.label:focus { background-color: #5e5e5e; } .label-primary { - background-color: #337ab7; + background-color: #206b82; } .label-primary[href]:hover, .label-primary[href]:focus { - background-color: #286090; + background-color: #164959; } .label-success { background-color: #5cb85c; @@ -4921,7 +5014,7 @@ a.badge:focus { } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { - color: #337ab7; + color: #206b82; background-color: #fff; } .list-group-item > .badge { @@ -4996,7 +5089,7 @@ a.badge:focus { a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { - border-color: #337ab7; + border-color: #206b82; } .thumbnail .caption { padding: 9px; @@ -5110,7 +5203,7 @@ a.thumbnail.active { line-height: 20px; color: #fff; text-align: center; - background-color: #337ab7; + background-color: #206b82; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; @@ -5273,8 +5366,8 @@ button.list-group-item { .list-group-item.active:focus { z-index: 2; color: #fff; - background-color: #337ab7; - border-color: #337ab7; + background-color: #206b82; + border-color: #206b82; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, @@ -5290,7 +5383,7 @@ button.list-group-item { .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { - color: #c7ddef; + color: #8bcee3; } .list-group-item-success { color: #3c763d; @@ -5670,22 +5763,22 @@ button.list-group-item-danger.active:focus { border-bottom-color: #ddd; } .panel-primary { - border-color: #337ab7; + border-color: #206b82; } .panel-primary > .panel-heading { color: #fff; - background-color: #337ab7; - border-color: #337ab7; + background-color: #206b82; + border-color: #206b82; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; + border-top-color: #206b82; } .panel-primary > .panel-heading .badge { - color: #337ab7; + color: #206b82; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; + border-bottom-color: #206b82; } .panel-success { border-color: #d6e9c6; @@ -6200,6 +6293,230 @@ button.close { border-left-color: #fff; bottom: -10px; } +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: 0; + color: #fff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.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; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #fff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #fff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} .clearfix:before, .clearfix:after, .dl-horizontal dd:before, @@ -6647,6 +6964,9 @@ a.tag:hover { .module-content { padding: 30px; } +.module-content .add-to-group .btn-primary { + margin-bottom: 30px; +} .module:first-child .module-heading { border-radius: 3px 0 0 0; border-top-width: 0; @@ -6666,6 +6986,7 @@ a.tag:hover { padding-top: 10px; } .module h1 { + margin-top: 0; margin-bottom: 20px; } .module-shallow .module-content { @@ -6693,6 +7014,7 @@ a.tag:hover { margin: 0; list-style: none; min-height: 205px; + padding-top: 15px; background: #fbfbfb url("../../../base/images/bg.png"); border: 1px solid #ddd; border-width: 1px 0; @@ -6717,7 +7039,7 @@ a.tag:hover { float: left; width: 178px; padding: 15px; - margin: 15px 0 0 15px; + margin: 0 0 15px 15px; background-color: white; border-radius: 3px; min-height: 1px; @@ -6848,6 +7170,7 @@ a.tag:hover { margin: 0; list-style: none; min-height: 205px; + padding-top: 15px; background: #fbfbfb url("../../../base/images/bg.png"); border: 1px solid #ddd; border-width: 1px 0; @@ -6873,7 +7196,7 @@ a.tag:hover { float: left; width: 178px; padding: 15px; - margin: 15px 0 0 15px; + margin: 0 0 15px 15px; background-color: white; border-radius: 3px; } @@ -7070,11 +7393,15 @@ a.tag:hover { .nav-aside li.active a:before { content: ' '; position: absolute; - top: 3px; + border: 20px solid transparent; + border-right: none; + border-left-color: #8CA0A6; + border-left-width: 6px; + top: 0; + bottom: 0; right: -6px; width: 6px; height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); } } .nav-pills > li { @@ -7089,7 +7416,6 @@ a.tag:hover { .nav-aside li.active a span { white-space: nowrap; overflow: hidden; - display: block; } .module-narrow .nav-item > a, .module-narrow .nav-aside li a { @@ -7215,6 +7541,12 @@ a.tag:hover { .nav-simple > .nav-btn .btn { display: inline-block; } +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} .js .js-hide { display: none; } @@ -7291,11 +7623,6 @@ textarea { height: auto; width: 100%; } -@media (min-width: 992px) { - .control-medium { - width: calc(50% - 15px); - } -} .control-large input { height: 46px; padding: 10px 16px; @@ -7326,6 +7653,9 @@ select[multiple].control-large input { .form-actions .control-required-message:first-child { margin-left: 0; } +.form-actions { + overflow: auto; +} @media (min-width: 768px) { .form-actions { text-align: right; @@ -7341,6 +7671,7 @@ select[multiple].control-large input { .form-actions .action-info { float: left; width: 50%; + margin-right: 15px; } } .form-actions .action-info.small { @@ -7420,7 +7751,8 @@ form .control-medium .info-block.info-inline { margin-right: -15px; padding: 10px 15px 0; } -input[data-module="autocomplete"] { +input[data-module="autocomplete"], +select[data-module="autocomplete"] { width: 100%; } .form-select label { @@ -7819,6 +8151,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .select2-container { margin-top: 1px; + margin-bottom: 7.5px; } .select2-container-multi { margin-top: 0; @@ -7900,7 +8233,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { .js .image-upload .btn-remove-url { position: absolute; margin-right: 0; - top: 4px; + top: 6px; right: 5px; padding: 0 12px; border-radius: 100px; @@ -7909,25 +8242,29 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-right: 0; } .add-member-form .control-label { - width: 100%; - text-align: left; + display: block; } -.add-member-form .controls { - margin-left: auto; +.add-member-or-wrap { + display: flex; + align-items: flex-end; + justify-content: center; +} +@media (max-width: 991px) { + .add-member-or-wrap { + margin-bottom: 30px; + } +} +@media (min-width: 992px) { + .add-member-or-wrap { + min-height: 100px; + } } .add-member-or { + text-align: center; text-transform: uppercase; color: #777777; font-weight: bold; } -.add-member-form .row .control-group { - float: left; - width: 45%; -} -.add-member-form .row .select2-container, -.add-member-form .row input { - width: 100% !important; -} #recaptcha_table { table-layout: inherit; line-height: 1; @@ -8017,7 +8354,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .resource-item .btn-group { position: absolute; - top: 14px; + top: 9px; right: 10px; } @media (max-width: 991px) { @@ -8278,9 +8615,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { padding: 15px; } .search-form .search-input.search-giant button { - margin-top: -4px; + margin-top: -15px; right: 15px; - height: 30px; } .search-form .search-input.search-giant button i { font-size: 28px; @@ -8290,9 +8626,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { .search-form .control-order-by select { display: inline; } -.search-form .control-order-by select { - width: 160px; - margin: 0; +.search-form .control-order-by .form-control { + width: auto; } .search-form .filter-list { color: #444; @@ -8313,10 +8648,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-bottom: 0; } .search-form .search-input-group { - margin-bottom: 12px; -} -.search-form .search-input-group .input-group-btn .btn { - margin-top: 25px; + margin-bottom: 30px; } .tertiary .control-order-by { float: none; @@ -9013,7 +9345,6 @@ h4 small { } @media (max-width: 767px) { .wrapper { - margin: 0 -20px; border-width: 0; -webkit-box-shadow: 0; box-shadow: 0; @@ -9475,15 +9806,18 @@ h4 small { line-height: 1.2; white-space: nowrap; } +.masthead .logo { + display: inline-block; +} +.masthead .logo img { + max-height: 60px; +} .masthead .navbar-collapse { padding: 10px 0; } .masthead .section { float: left; } -.masthead input[type="text"] { - border-color: #004a61; -} @media (min-width: 768px) and (max-width: 991px) { .masthead .navigation.section { float: right; @@ -9554,11 +9888,8 @@ h4 small { } } @media (max-width: 991px) { - .account-masthead { - margin-left: -15px; - margin-right: -15px; - padding-left: 15px; - padding-right: 15px; + .navbar-toggle { + margin-right: 0; } .masthead .section { float: none; @@ -9574,6 +9905,13 @@ h4 small { display: none; } } +@media (max-width: 767px) { + .masthead .navbar-collapse { + clear: both; + margin-left: 0; + margin-right: 0; + } +} .site-footer { margin-bottom: initial; padding: 10px 0; @@ -9624,15 +9962,18 @@ h4 small { line-height: 1.2; white-space: nowrap; } +.site-footer .logo { + display: inline-block; +} +.site-footer .logo img { + max-height: 60px; +} .site-footer .navbar-collapse { padding: 10px 0; } .site-footer .section { float: left; } -.site-footer input[type="text"] { - border-color: #004a61; -} @media (min-width: 768px) and (max-width: 991px) { .site-footer .navigation.section { float: right; @@ -10173,11 +10514,14 @@ h4 small { font-size: 16px; margin: 3px 0; } +.resource-view .actions { + right: 0; +} .resource-view-filters { margin-bottom: 1em; } .resource-view-filters .resource-view-filter { - margin-bottom: 1.0em; + margin-bottom: 1em; } .resource-view-filters .resource-view-remove-filter { cursor: pointer; @@ -10191,6 +10535,73 @@ h4 small { .resource-view-filters .resource-view-filter-values .select2-container .select2-search-choice-close { left: auto; } +.resource-view-list.reordering { + margin: -10px -10px 0; +} +.resource-view-list.reordering li { + margin-bottom: 10px; + border-radius: 3px; + cursor: move; +} +.resource-view-list.reordering li a { + cursor: inherit; +} +.resource-view-list.reordering li .handle { + padding: 0; + display: block; + position: absolute; + color: #888; + left: -31px; + top: 50%; + margin-top: -15px; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + border: 1px solid #ddd; + border-width: 1px 0 1px 1px; + background-color: #fff; + border-radius: 20px 0 0 20px; +} +.resource-view-list.reordering li .handle:hover { + text-decoration: none; +} +.resource-view-list.reordering li:hover .handle { + background-color: #eee; +} +.resource-view-list.reordering li.ui-sortable-helper { + background-color: #eee; + border: 1px solid #187794; +} +.resource-view-list.reordering li.ui-sortable-helper .handle { + background-color: #eee; + border-color: #187794; + color: #333; +} +.resource-view-list > li > a { + border-radius: 0; +} +.resource-view-list li { + margin-bottom: -3px; + border: 1px solid #ddd; +} +.resource-view-list li:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.resource-view-list li:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} +.resource-view-list li .handle { + display: none; +} +.view-preview-container .module-content { + position: relative; +} +.view-preview-container .actions { + right: 15px; +} .datapusher-status-link:hover { text-decoration: none; } diff --git a/ckan/public/base/css/maroon.css b/ckan/public/base/css/maroon.css index 39d602737e1..675930f38fc 100644 --- a/ckan/public/base/css/maroon.css +++ b/ckan/public/base/css/maroon.css @@ -1075,7 +1075,7 @@ body { font-size: 14px; line-height: 1.42857143; color: #333333; - background-color: #fff; + background-color: #ffffff; } input, button, @@ -1117,8 +1117,8 @@ img { .img-thumbnail { padding: 4px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; @@ -1171,7 +1171,7 @@ h6, .h5, .h6 { font-family: inherit; - font-weight: 500; + font-weight: 700; line-height: 1.1; color: inherit; } @@ -1531,8 +1531,8 @@ code { kbd { padding: 2px 4px; font-size: 90%; - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } @@ -1552,7 +1552,7 @@ pre { word-wrap: break-word; color: #333333; background-color: #f5f5f5; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } pre code { @@ -2260,11 +2260,11 @@ th { padding: 8px; line-height: 1.42857143; vertical-align: top; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid #ddd; + border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, @@ -2275,10 +2275,10 @@ th { border-top: 0; } .table > tbody + tbody { - border-top: 2px solid #ddd; + border-top: 2px solid #dddddd; } .table .table { - background-color: #fff; + background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, @@ -2289,7 +2289,7 @@ th { padding: 5px; } .table-bordered { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, @@ -2297,7 +2297,7 @@ th { .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { @@ -2435,7 +2435,7 @@ table th[class*="col-"] { margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; @@ -2540,9 +2540,9 @@ output { font-size: 14px; line-height: 1.42857143; color: #555555; - background-color: #fff; + background-color: #ffffff; background-image: none; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); @@ -2557,14 +2557,14 @@ output { box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { - color: #999; + color: #999999; opacity: 1; } .form-control:-ms-input-placeholder { - color: #999; + color: #999999; } .form-control::-webkit-input-placeholder { - color: #999; + color: #999999; } .form-control::-ms-expand { border: 0; @@ -3018,7 +3018,7 @@ select[multiple].input-lg { .btn:hover, .btn:focus, .btn.focus { - color: #333; + color: #333333; text-decoration: none; } .btn:active, @@ -3042,25 +3042,25 @@ fieldset[disabled] a.btn { pointer-events: none; } .btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; + color: #333333; + background-color: #ffffff; + border-color: #cccccc; } .btn-default:focus, .btn-default.focus { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } @@ -3073,7 +3073,7 @@ fieldset[disabled] a.btn { .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { - color: #333; + color: #333333; background-color: #d4d4d4; border-color: #8c8c8c; } @@ -3091,33 +3091,33 @@ fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: #ccc; + background-color: #ffffff; + border-color: #cccccc; } .btn-default .badge { - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; } .btn-primary { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } @@ -3130,7 +3130,7 @@ fieldset[disabled] .btn-default.focus { .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #204d74; border-color: #122b40; } @@ -3153,28 +3153,28 @@ fieldset[disabled] .btn-primary.focus { } .btn-primary .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .btn-success { - color: #fff; + color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #255625; } .btn-success:hover { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } @@ -3187,7 +3187,7 @@ fieldset[disabled] .btn-primary.focus { .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { - color: #fff; + color: #ffffff; background-color: #398439; border-color: #255625; } @@ -3210,28 +3210,28 @@ fieldset[disabled] .btn-success.focus { } .btn-success .badge { color: #5cb85c; - background-color: #fff; + background-color: #ffffff; } .btn-info { - color: #fff; + color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } @@ -3244,7 +3244,7 @@ fieldset[disabled] .btn-success.focus { .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { - color: #fff; + color: #ffffff; background-color: #269abc; border-color: #1b6d85; } @@ -3267,28 +3267,28 @@ fieldset[disabled] .btn-info.focus { } .btn-info .badge { color: #5bc0de; - background-color: #fff; + background-color: #ffffff; } .btn-warning { - color: #fff; + color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } @@ -3301,7 +3301,7 @@ fieldset[disabled] .btn-info.focus { .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #d58512; border-color: #985f0d; } @@ -3324,28 +3324,28 @@ fieldset[disabled] .btn-warning.focus { } .btn-warning .badge { color: #f0ad4e; - background-color: #fff; + background-color: #ffffff; } .btn-danger { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -3358,7 +3358,7 @@ fieldset[disabled] .btn-warning.focus { .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -3381,7 +3381,7 @@ fieldset[disabled] .btn-danger.focus { } .btn-danger .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .btn-link { color: #337ab7; @@ -3512,8 +3512,8 @@ tbody.collapse.in { list-style: none; font-size: 14px; text-align: left; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); @@ -3548,7 +3548,7 @@ tbody.collapse.in { .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; text-decoration: none; outline: 0; background-color: #337ab7; @@ -3884,7 +3884,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { color: #555555; text-align: center; background-color: #eeeeee; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { @@ -3997,7 +3997,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { max-width: none; } .nav-tabs { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; @@ -4010,14 +4010,14 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #ddd; + border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-bottom-color: transparent; cursor: default; } @@ -4052,17 +4052,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .nav-pills > li { @@ -4077,7 +4077,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; + color: #ffffff; background-color: #337ab7; } .nav-stacked > li { @@ -4120,17 +4120,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .tab-content > .tab-pane { @@ -4475,7 +4475,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-color: #e7e7e7; } .navbar-default .navbar-brand { - color: #777; + color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { @@ -4483,37 +4483,37 @@ select[multiple].input-group-sm > .input-group-btn > .btn { background-color: transparent; } .navbar-default .navbar-text { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { - border-color: #ddd; + border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #ddd; + background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { - background-color: #888; + background-color: #888888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { @@ -4523,51 +4523,51 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; - color: #555; + color: #555555; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { - color: #777; + color: #777777; } .navbar-default .navbar-link:hover { - color: #333; + color: #333333; } .navbar-default .btn-link { - color: #777; + color: #777777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333; + color: #333333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; + color: #cccccc; } .navbar-inverse { - background-color: #222; + background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { @@ -4575,7 +4575,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { @@ -4586,30 +4586,30 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { - border-color: #333; + border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333; + background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; + background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { @@ -4619,7 +4619,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; - color: #fff; + color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { @@ -4633,19 +4633,19 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } } @@ -4653,20 +4653,20 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; + color: #444444; } .breadcrumb { padding: 8px 15px; @@ -4681,7 +4681,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; - color: #ccc; + color: #cccccc; } .breadcrumb > .active { color: #777777; @@ -4703,8 +4703,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { line-height: 1.42857143; text-decoration: none; color: #337ab7; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; margin-left: -1px; } .pagination > li:first-child > a, @@ -4725,7 +4725,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { z-index: 2; color: #23527c; background-color: #eeeeee; - border-color: #ddd; + border-color: #dddddd; } .pagination > .active > a, .pagination > .active > span, @@ -4734,7 +4734,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; cursor: default; @@ -4746,8 +4746,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; - background-color: #fff; - border-color: #ddd; + background-color: #ffffff; + border-color: #dddddd; cursor: not-allowed; } .pagination-lg > li > a, @@ -4795,8 +4795,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager li > span { display: inline-block; padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, @@ -4817,7 +4817,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager .disabled > a:focus, .pager .disabled > span { color: #777777; - background-color: #fff; + background-color: #ffffff; cursor: not-allowed; } .label { @@ -4826,7 +4826,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { font-size: 75%; font-weight: bold; line-height: 1; - color: #fff; + color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; @@ -4834,7 +4834,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { } a.label:hover, a.label:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } @@ -4893,7 +4893,7 @@ a.label:focus { padding: 3px 7px; font-size: 12px; font-weight: bold; - color: #fff; + color: #ffffff; line-height: 1; vertical-align: middle; white-space: nowrap; @@ -4915,14 +4915,14 @@ a.label:focus { } a.badge:hover, a.badge:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .list-group-item > .badge { float: right; @@ -4981,8 +4981,8 @@ a.badge:focus { padding: 4px; margin-bottom: 20px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; @@ -5108,7 +5108,7 @@ a.thumbnail.active { height: 100%; font-size: 12px; line-height: 20px; - color: #fff; + color: #ffffff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); @@ -5219,8 +5219,8 @@ a.thumbnail.active { display: block; padding: 10px 15px; margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; @@ -5233,18 +5233,18 @@ a.thumbnail.active { } a.list-group-item, button.list-group-item { - color: #555; + color: #555555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { - color: #333; + color: #333333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; - color: #555; + color: #555555; background-color: #f5f5f5; } button.list-group-item { @@ -5272,7 +5272,7 @@ button.list-group-item { .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5418,7 +5418,7 @@ button.list-group-item-danger.active:focus { } .panel { margin-bottom: 20px; - background-color: #fff; + background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); @@ -5452,7 +5452,7 @@ button.list-group-item-danger.active:focus { .panel-footer { padding: 10px 15px; background-color: #f5f5f5; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } @@ -5566,7 +5566,7 @@ button.list-group-item-danger.active:focus { .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { @@ -5643,37 +5643,37 @@ button.list-group-item-danger.active:focus { } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .panel-default { - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; + border-top-color: #dddddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; + border-bottom-color: #dddddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5682,7 +5682,7 @@ button.list-group-item-danger.active:focus { } .panel-primary > .panel-heading .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; @@ -5812,14 +5812,14 @@ button.list-group-item-danger.active:focus { font-size: 21px; font-weight: bold; line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; + color: #000000; + text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { - color: #000; + color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; @@ -5874,8 +5874,8 @@ button.close { } .modal-content { position: relative; - background-color: #fff; - border: 1px solid #999; + background-color: #ffffff; + border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); @@ -5890,7 +5890,7 @@ button.close { bottom: 0; left: 0; z-index: 1040; - background-color: #000; + background-color: #000000; } .modal-backdrop.fade { opacity: 0; @@ -6001,9 +6001,9 @@ button.close { .tooltip-inner { max-width: 200px; padding: 3px 8px; - color: #fff; + color: #ffffff; text-align: center; - background-color: #000; + background-color: #000000; border-radius: 4px; } .tooltip-arrow { @@ -6018,56 +6018,56 @@ button.close { left: 50%; margin-left: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; - border-right-color: #000; + border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; - border-left-color: #000; + border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .popover { position: absolute; @@ -6093,9 +6093,9 @@ button.close { word-spacing: normal; word-wrap: normal; font-size: 14px; - background-color: #fff; + background-color: #ffffff; background-clip: padding-box; - border: 1px solid #ccc; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); @@ -6153,7 +6153,7 @@ button.close { bottom: 1px; margin-left: -10px; border-bottom-width: 0; - border-top-color: #fff; + border-top-color: #ffffff; } .popover.right > .arrow { top: 50%; @@ -6168,7 +6168,7 @@ button.close { left: 1px; bottom: -10px; border-left-width: 0; - border-right-color: #fff; + border-right-color: #ffffff; } .popover.bottom > .arrow { left: 50%; @@ -6183,7 +6183,7 @@ button.close { top: 1px; margin-left: -10px; border-top-width: 0; - border-bottom-color: #fff; + border-bottom-color: #ffffff; } .popover.left > .arrow { top: 50%; @@ -6197,7 +6197,7 @@ button.close { content: " "; right: 1px; border-right-width: 0; - border-left-color: #fff; + border-left-color: #ffffff; bottom: -10px; } .clearfix:before, @@ -6509,7 +6509,7 @@ button.close { .tag { display: inline-block; margin-bottom: 4px; - color: #111; + color: #111111; background-color: #f6f6f6; padding: 1px 10px; border: 1px solid #dddddd; @@ -6528,14 +6528,14 @@ a.tag:hover { .pill { display: inline-block; background-color: #6f8890; - color: #FFF; + color: #ffffff; padding: 2px 10px 1px 10px; margin-right: 5px; font-weight: normal; border-radius: 100px; } .pill a { - color: #FFF; + color: #ffffff; } .pill a.remove { font-size: 11px; @@ -6548,7 +6548,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-item:last-of-type { border-bottom: 0; @@ -6578,7 +6578,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-list > li:last-of-type { border-bottom: 0; @@ -6607,8 +6607,8 @@ a.tag:hover { display: block; } .box { - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -6625,8 +6625,8 @@ a.tag:hover { font-size: 14px; line-height: 1.3; background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; } .module-heading:before, .module-heading:after { @@ -6654,11 +6654,11 @@ a.tag:hover { .module-footer { padding: 7px 25px 7px; margin: 0; - border-top: 1px dotted #ddd; + border-top: 1px dotted #dddddd; } .module .read-more { font-weight: bold; - color: #000; + color: #000000; } .pagination-wrapper { text-align: center; @@ -6694,7 +6694,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .module-grid:before, @@ -6790,8 +6790,8 @@ a.tag:hover { .module-resource { z-index: 5; position: relative; - background-color: #fff; - border-bottom: 1px solid #ddd; + background-color: #ffffff; + border-bottom: 1px solid #dddddd; margin-top: 0; margin-bottom: 0; border-radius: 3px 3px 0 0; @@ -6836,7 +6836,7 @@ a.tag:hover { top: 15px; right: -35px; width: 80px; - color: #fff; + color: #ffffff; background-color: #810606; padding: 1px 20px; font-size: 11px; @@ -6849,7 +6849,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .media-grid:before, @@ -6904,7 +6904,7 @@ a.tag:hover { left: 0; right: 0; bottom: 0; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; -webkit-transition: all 0.2s ease-in; -o-transition: all 0.2s ease-in; @@ -7026,7 +7026,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .nav-simple > li:last-of-type, .nav-aside > li:last-of-type { @@ -7044,7 +7044,7 @@ a.tag:hover { } .nav-item > a, .nav-aside li a { - color: #333; + color: #333333; font-size: 14px; line-height: 1.42857143; margin: -7px -25px; @@ -7057,24 +7057,28 @@ a.tag:hover { .nav-item.active > a, .nav-aside li.active a { position: relative; - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } .nav-item.active > a:hover, .nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } @media (min-width: 768px) { .nav-item.active > a:before, .nav-aside li.active a:before { content: ' '; position: absolute; - top: 3px; + border: 20px solid transparent; + border-right: none; + border-left-color: #8ca0a6; + border-left-width: 6px; + top: 0; + bottom: 0; right: -6px; width: 6px; height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); } } .nav-pills > li { @@ -7089,7 +7093,6 @@ a.tag:hover { .nav-aside li.active a span { white-space: nowrap; overflow: hidden; - display: block; } .module-narrow .nav-item > a, .module-narrow .nav-aside li a { @@ -7356,7 +7359,7 @@ select[multiple].control-large input { position: relative; display: block; font-size: 11px; - color: #aaa; + color: #aaaaaa; line-height: 1.3; margin-top: 6px; } @@ -7397,7 +7400,7 @@ form .control-medium .info-block.info-inline { margin-right: 15px; } .form-group .info-block a { - color: #aaa; + color: #aaaaaa; text-decoration: underline; } .form-inline input { @@ -7434,7 +7437,7 @@ input[data-module="autocomplete"] { position: relative; } .simple-input .field-bordered { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-input .field input { width: 100%; @@ -7470,7 +7473,7 @@ input[data-module="autocomplete"] { padding: 4px 10px; background: #ebebeb; width: auto; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-top: none; font-size: 11px; color: #282828; @@ -7494,7 +7497,7 @@ input[data-module="autocomplete"] { } .control-custom.disabled label, .control-custom.disabled input { - color: #aaa; + color: #aaaaaa; text-decoration: line-through; text-shadow: none; } @@ -7504,7 +7507,7 @@ input[data-module="autocomplete"] { background-color: #f3f3f3; } .control-custom.disabled .checkbox { - color: #444; + color: #444444; text-decoration: none; } .control-custom .checkbox.btn { @@ -7531,25 +7534,25 @@ input[data-module="autocomplete"] { display: none; } .control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .control-custom.disabled .checkbox.btn:focus, .control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .control-custom.disabled .checkbox.btn:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .control-custom.disabled .checkbox.btn:active, .control-custom.disabled .checkbox.btn.active, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -7562,7 +7565,7 @@ input[data-module="autocomplete"] { .control-custom.disabled .checkbox.btn:active.focus, .control-custom.disabled .checkbox.btn.active.focus, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -7585,7 +7588,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .control-custom.disabled .checkbox.btn .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .alert-danger a { color: #b55457; @@ -7614,7 +7617,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; padding: 6px 8px 3px; background: #c6898b; - color: #fff; + color: #ffffff; width: auto; } .control-medium .error-block { @@ -7666,7 +7669,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 27px; counter-increment: stage; width: 50%; - background-color: #EDEDED; + background-color: #ededed; float: left; padding: 10px 20px; position: relative; @@ -7681,7 +7684,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-right: 5px; font-weight: bold; text-align: center; - color: #fff; + color: #ffffff; background-color: #aeaeae; z-index: 1; } @@ -7693,8 +7696,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { width: 0; position: absolute; pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; + border-top-color: #ededed; + border-bottom-color: #ededed; border-width: 29px; top: 50%; margin-top: -29px; @@ -7731,7 +7734,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .stages li.active:before { color: #8cc68a; - background: #fff; + background: #ffffff; } .stages li.complete:before { color: #c5e2c4; @@ -7758,7 +7761,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .stages li.active .highlight { - color: #fff; + color: #ffffff; background: #8cc68a; } .stages li.complete .highlight { @@ -7842,8 +7845,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; -o-transition: border linear 0.2s, box-shadow linear 0.2s; transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; } .select2-container-active .select2-choices, .select2-container-multi.select2-container-active .select2-choices { @@ -7933,7 +7936,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1; } .dataset-item { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; padding-bottom: 20px; margin-bottom: 20px; } @@ -7954,7 +7957,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1.3; } .dataset-heading a { - color: #333; + color: #333333; } .dataset-heading .label { position: relative; @@ -7980,7 +7983,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: inline; } .dataset-resources li a { - background-color: #aaa; + background-color: #aaaaaa; } .dataset-heading .popular { top: 0; @@ -7998,10 +8001,10 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { border-radius: 3px; } .resource-item:hover { - background-color: #eee; + background-color: #eeeeee; } .resource-item .heading { - color: #000; + color: #000000; font-size: 14px; font-weight: bold; } @@ -8026,14 +8029,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .resource-list.reordering .resource-item { - border: 1px solid #ddd; + border: 1px solid #dddddd; margin-bottom: 10px; cursor: move; } .resource-list.reordering .resource-item .handle { display: block; position: absolute; - color: #888; + color: #888888; left: -31px; top: 50%; margin-top: -15px; @@ -8041,25 +8044,25 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 30px; line-height: 30px; text-align: center; - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0 1px 1px; - background-color: #fff; + background-color: #ffffff; border-radius: 20px 0 0 20px; } .resource-list.reordering .resource-item .handle:hover { text-decoration: none; } .resource-list.reordering .resource-item:hover .handle { - background-color: #eee; + background-color: #eeeeee; } .resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; + background-color: #eeeeee; border: 1px solid #810606; } .resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; + background-color: #eeeeee; border-color: #810606; - color: #333; + color: #333333; } .resource-item .handle { display: none; @@ -8137,7 +8140,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; min-height: 50px; padding: 10px; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; border-radius: 3px; } @@ -8147,8 +8150,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 50px; overflow: hidden; margin-right: 10px; - color: #444; - background-color: #eee; + color: #444444; + background-color: #eeeeee; border-radius: 3px; } .view-list li a .icon i { @@ -8158,7 +8161,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 50px; } .view-list li a h3 { - color: #000; + color: #000000; font-weight: bold; font-size: 16px; margin: 0 0 3px 0; @@ -8168,7 +8171,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - color: #444; + color: #444444; } .view-list li a.active, .view-list li a:hover { @@ -8235,7 +8238,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { .search-form { margin-bottom: 20px; padding-bottom: 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .search-form .search-input { position: relative; @@ -8265,22 +8268,21 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: none; } .search-form .search-input button i { - color: #ccc; + color: #cccccc; -webkit-transition: color 0.2s ease-in; -o-transition: color 0.2s ease-in; transition: color 0.2s ease-in; } .search-form .search-input button:hover i { - color: #000; + color: #000000; } .search-form .search-input.search-giant input { font-size: 16px; padding: 15px; } .search-form .search-input.search-giant button { - margin-top: -4px; + margin-top: -15px; right: 15px; - height: 30px; } .search-form .search-input.search-giant button i { font-size: 28px; @@ -8295,7 +8297,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin: 0; } .search-form .filter-list { - color: #444; + color: #444444; line-height: 32px; margin: 10px 0 0 0; } @@ -8306,17 +8308,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-top: 10px; font-size: 18px; font-weight: normal; - color: #000; + color: #000000; } .search-form.no-bottom-border { border-bottom-width: 0; margin-bottom: 0; } .search-form .search-input-group { - margin-bottom: 12px; -} -.search-form .search-input-group .input-group-btn .btn { - margin-top: 25px; + margin-bottom: 30px; } .tertiary .control-order-by { float: none; @@ -8363,7 +8362,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-bottom: 2px; } .group-list .module-heading h3 a { - color: #333; + color: #333333; } .group-list .module-heading .media-image { overflow: hidden; @@ -8467,7 +8466,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header { margin-top: 30px; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; background-color: #f6f6f6; border-radius: 0 3px 0 0; } @@ -8497,7 +8496,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header .nav-tabs li.active a, .page-header .nav-tabs a:hover { - background-color: #fff; + background-color: #ffffff; } .page-header .content_action { float: right; @@ -8511,7 +8510,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .nav-tabs-plain > .active > a, .nav-tabs-plain > .active > a:hover { - background-color: #fff; + background-color: #ffffff; } @media (max-width: 991px) { .page-header .nav-tabs { @@ -8572,8 +8571,8 @@ h4 small { } .table-chunky thead th, .table-chunky thead td { - color: #fff; - background-color: #aaa; + color: #ffffff; + background-color: #aaaaaa; padding-top: 10px; padding-bottom: 10px; } @@ -8927,7 +8926,8 @@ h4 small { margin-right: 3px; } .wrapper { - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -8960,7 +8960,7 @@ h4 small { bottom: 0; left: 0; width: 25%; - border-right: 1px solid #ddd; + border-right: 1px solid #dddddd; z-index: 1; } .wrapper.no-nav:before { @@ -8979,7 +8979,7 @@ h4 small { [role=main], .main { padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); + background: #eeeeee url("../../../base/images/bg.png"); } } [role=main] { @@ -9171,7 +9171,7 @@ h4 small { float: left; width: 50%; margin: 5px 0 0 0; - color: #444; + color: #444444; } .context-info .nums dl dt { display: block; @@ -9201,8 +9201,8 @@ h4 small { margin-top: 0; } .flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; + -webkit-box-shadow: 0 0 0 1px #ffffff; + box-shadow: 0 0 0 1px #ffffff; } .view-preview-container { margin-top: 20px; @@ -9212,8 +9212,8 @@ h4 small { } .homepage .module-search { padding: 5px; - color: #fff; - background: #fff; + color: #ffffff; + background: #ffffff; } .homepage .module-search .search-giant { margin-bottom: 10px; @@ -9330,7 +9330,7 @@ h4 small { } .account-masthead { min-height: 30px; - color: #fff; + color: #ffffff; background: #500404 url("../../../base/images/bg.png"); } .account-masthead:before, @@ -9412,12 +9412,12 @@ h4 small { color: #e0c1c1; } .account-masthead .account .notifications a:hover span { - color: #fff; + color: #ffffff; background-color: #200101; } .account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; + color: #ffffff; + background-color: #c9403a; } .account-masthead .account.authed .image { padding: 0 6px; @@ -9429,7 +9429,7 @@ h4 small { .masthead { margin-bottom: initial; padding: 10px 0; - color: #fff; + color: #ffffff; background: #810606 url("../../../base/images/bg.png"); } .masthead:before, @@ -9452,7 +9452,7 @@ h4 small { position: relative; } .masthead a { - color: #fff; + color: #ffffff; } .masthead hgroup h1, .masthead hgroup h2 { @@ -9577,7 +9577,7 @@ h4 small { .site-footer { margin-bottom: initial; padding: 10px 0; - color: #fff; + color: #ffffff; background: #810606 url("../../../base/images/bg.png"); padding: 20px 0; } @@ -9601,7 +9601,7 @@ h4 small { position: relative; } .site-footer a { - color: #fff; + color: #ffffff; } .site-footer hgroup h1, .site-footer hgroup h2 { @@ -9743,13 +9743,13 @@ h4 small { margin-top: 0; } .lang-dropdown { - color: #000; + color: #000000; } .lang-dropdown li { width: auto; } .table-selected td { - background-color: #fff; + background-color: #ffffff; } .table-selected td .edit { display: block; @@ -9843,7 +9843,7 @@ h4 small { height: 30px; line-height: 30px; text-align: center; - color: #FFFFFF; + color: #ffffff; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); font-weight: normal; margin-right: 10px; @@ -9907,7 +9907,7 @@ h4 small { .popover .popover-content { font-size: 14px; line-height: 1.42857143; - color: #444; + color: #444444; word-break: break-all; } .popover .popover-content dl { @@ -9921,16 +9921,16 @@ h4 small { background-color: #999999; } .activity .item.failure .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.success .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.added-tag .icon { background-color: #6995a6; } .activity .item.changed-group .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.changed-package .icon { background-color: #8c76ce; @@ -9948,7 +9948,7 @@ h4 small { background-color: #699fa6; } .activity .item.deleted-group .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.deleted-package .icon { background-color: #b97452; @@ -9963,7 +9963,7 @@ h4 small { background-color: #b95297; } .activity .item.new-group .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.new-package .icon { background-color: #69a68e; @@ -9987,7 +9987,7 @@ h4 small { background-color: #b9b952; } .activity .item.follow-dataset .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.follow-user .icon { background-color: #8c76ce; @@ -10071,7 +10071,7 @@ h4 small { .popover-followee .popover-header { background-color: whiteSmoke; padding: 5px; - border-bottom: 1px solid #ccc; + border-bottom: 1px solid #cccccc; border-radius: 3px 3px 0 0; } .popover-followee .popover-header:before, @@ -10129,7 +10129,7 @@ h4 small { } .popover-followee .nav li a i { background-color: #810606; - color: #fff; + color: #ffffff; margin-right: 11px; padding: 3px 5px; line-height: 1; @@ -10142,7 +10142,7 @@ h4 small { } .popover-followee .nav li.active a i { color: #810606; - background-color: #fff; + background-color: #ffffff; } .dashboard-me { padding: 15px 15px 0 15px; @@ -10246,7 +10246,7 @@ table .metric { width: 140px; } code { - color: #000; + color: #000000; border: none; background: none; white-space: normal; @@ -10279,7 +10279,7 @@ iframe { text-indent: -999em; } .empty { - color: #aaa; + color: #aaaaaa; font-style: italic; } .page-heading { diff --git a/ckan/public/base/css/red.css b/ckan/public/base/css/red.css index 86b9b5e151e..612ba939d7e 100644 --- a/ckan/public/base/css/red.css +++ b/ckan/public/base/css/red.css @@ -1075,7 +1075,7 @@ body { font-size: 14px; line-height: 1.42857143; color: #333333; - background-color: #fff; + background-color: #ffffff; } input, button, @@ -1117,8 +1117,8 @@ img { .img-thumbnail { padding: 4px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; @@ -1171,7 +1171,7 @@ h6, .h5, .h6 { font-family: inherit; - font-weight: 500; + font-weight: 700; line-height: 1.1; color: inherit; } @@ -1531,8 +1531,8 @@ code { kbd { padding: 2px 4px; font-size: 90%; - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } @@ -1552,7 +1552,7 @@ pre { word-wrap: break-word; color: #333333; background-color: #f5f5f5; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } pre code { @@ -2260,11 +2260,11 @@ th { padding: 8px; line-height: 1.42857143; vertical-align: top; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid #ddd; + border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, @@ -2275,10 +2275,10 @@ th { border-top: 0; } .table > tbody + tbody { - border-top: 2px solid #ddd; + border-top: 2px solid #dddddd; } .table .table { - background-color: #fff; + background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, @@ -2289,7 +2289,7 @@ th { padding: 5px; } .table-bordered { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, @@ -2297,7 +2297,7 @@ th { .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { @@ -2435,7 +2435,7 @@ table th[class*="col-"] { margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; + border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; @@ -2540,9 +2540,9 @@ output { font-size: 14px; line-height: 1.42857143; color: #555555; - background-color: #fff; + background-color: #ffffff; background-image: none; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); @@ -2557,14 +2557,14 @@ output { box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { - color: #999; + color: #999999; opacity: 1; } .form-control:-ms-input-placeholder { - color: #999; + color: #999999; } .form-control::-webkit-input-placeholder { - color: #999; + color: #999999; } .form-control::-ms-expand { border: 0; @@ -3018,7 +3018,7 @@ select[multiple].input-lg { .btn:hover, .btn:focus, .btn.focus { - color: #333; + color: #333333; text-decoration: none; } .btn:active, @@ -3042,25 +3042,25 @@ fieldset[disabled] a.btn { pointer-events: none; } .btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; + color: #333333; + background-color: #ffffff; + border-color: #cccccc; } .btn-default:focus, .btn-default.focus { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { - color: #333; + color: #333333; background-color: #e6e6e6; border-color: #adadad; } @@ -3073,7 +3073,7 @@ fieldset[disabled] a.btn { .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { - color: #333; + color: #333333; background-color: #d4d4d4; border-color: #8c8c8c; } @@ -3091,33 +3091,33 @@ fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: #ccc; + background-color: #ffffff; + border-color: #cccccc; } .btn-default .badge { - color: #fff; - background-color: #333; + color: #ffffff; + background-color: #333333; } .btn-primary { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { - color: #fff; + color: #ffffff; background-color: #286090; border-color: #204d74; } @@ -3130,7 +3130,7 @@ fieldset[disabled] .btn-default.focus { .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { - color: #fff; + color: #ffffff; background-color: #204d74; border-color: #122b40; } @@ -3153,28 +3153,28 @@ fieldset[disabled] .btn-primary.focus { } .btn-primary .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .btn-success { - color: #fff; + color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #255625; } .btn-success:hover { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { - color: #fff; + color: #ffffff; background-color: #449d44; border-color: #398439; } @@ -3187,7 +3187,7 @@ fieldset[disabled] .btn-primary.focus { .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { - color: #fff; + color: #ffffff; background-color: #398439; border-color: #255625; } @@ -3210,28 +3210,28 @@ fieldset[disabled] .btn-success.focus { } .btn-success .badge { color: #5cb85c; - background-color: #fff; + background-color: #ffffff; } .btn-info { - color: #fff; + color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { - color: #fff; + color: #ffffff; background-color: #31b0d5; border-color: #269abc; } @@ -3244,7 +3244,7 @@ fieldset[disabled] .btn-success.focus { .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { - color: #fff; + color: #ffffff; background-color: #269abc; border-color: #1b6d85; } @@ -3267,28 +3267,28 @@ fieldset[disabled] .btn-info.focus { } .btn-info .badge { color: #5bc0de; - background-color: #fff; + background-color: #ffffff; } .btn-warning { - color: #fff; + color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { - color: #fff; + color: #ffffff; background-color: #ec971f; border-color: #d58512; } @@ -3301,7 +3301,7 @@ fieldset[disabled] .btn-info.focus { .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { - color: #fff; + color: #ffffff; background-color: #d58512; border-color: #985f0d; } @@ -3324,28 +3324,28 @@ fieldset[disabled] .btn-warning.focus { } .btn-warning .badge { color: #f0ad4e; - background-color: #fff; + background-color: #ffffff; } .btn-danger { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -3358,7 +3358,7 @@ fieldset[disabled] .btn-warning.focus { .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -3381,7 +3381,7 @@ fieldset[disabled] .btn-danger.focus { } .btn-danger .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .btn-link { color: #337ab7; @@ -3512,8 +3512,8 @@ tbody.collapse.in { list-style: none; font-size: 14px; text-align: left; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); @@ -3548,7 +3548,7 @@ tbody.collapse.in { .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; text-decoration: none; outline: 0; background-color: #337ab7; @@ -3884,7 +3884,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { color: #555555; text-align: center; background-color: #eeeeee; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { @@ -3997,7 +3997,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { max-width: none; } .nav-tabs { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; @@ -4010,14 +4010,14 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #ddd; + border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-bottom-color: transparent; cursor: default; } @@ -4052,17 +4052,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .nav-pills > li { @@ -4077,7 +4077,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; + color: #ffffff; background-color: #337ab7; } .nav-stacked > li { @@ -4120,17 +4120,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; + border-bottom-color: #ffffff; } } .tab-content > .tab-pane { @@ -4475,7 +4475,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-color: #e7e7e7; } .navbar-default .navbar-brand { - color: #777; + color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { @@ -4483,37 +4483,37 @@ select[multiple].input-group-sm > .input-group-btn > .btn { background-color: transparent; } .navbar-default .navbar-text { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { - border-color: #ddd; + border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #ddd; + background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { - background-color: #888; + background-color: #888888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { @@ -4523,51 +4523,51 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; - color: #555; + color: #555555; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; + color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; + color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; + color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; + color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { - color: #777; + color: #777777; } .navbar-default .navbar-link:hover { - color: #333; + color: #333333; } .navbar-default .btn-link { - color: #777; + color: #777777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333; + color: #333333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; + color: #cccccc; } .navbar-inverse { - background-color: #222; + background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { @@ -4575,7 +4575,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { @@ -4586,30 +4586,30 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { - border-color: #333; + border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333; + background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; + background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { @@ -4619,7 +4619,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; - color: #fff; + color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { @@ -4633,19 +4633,19 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; + color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; + color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; + color: #444444; background-color: transparent; } } @@ -4653,20 +4653,20 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #fff; + color: #ffffff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; + color: #444444; } .breadcrumb { padding: 8px 15px; @@ -4681,7 +4681,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; - color: #ccc; + color: #cccccc; } .breadcrumb > .active { color: #777777; @@ -4703,8 +4703,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { line-height: 1.42857143; text-decoration: none; color: #337ab7; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; margin-left: -1px; } .pagination > li:first-child > a, @@ -4725,7 +4725,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { z-index: 2; color: #23527c; background-color: #eeeeee; - border-color: #ddd; + border-color: #dddddd; } .pagination > .active > a, .pagination > .active > span, @@ -4734,7 +4734,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; cursor: default; @@ -4746,8 +4746,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; - background-color: #fff; - border-color: #ddd; + background-color: #ffffff; + border-color: #dddddd; cursor: not-allowed; } .pagination-lg > li > a, @@ -4795,8 +4795,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager li > span { display: inline-block; padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, @@ -4817,7 +4817,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager .disabled > a:focus, .pager .disabled > span { color: #777777; - background-color: #fff; + background-color: #ffffff; cursor: not-allowed; } .label { @@ -4826,7 +4826,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { font-size: 75%; font-weight: bold; line-height: 1; - color: #fff; + color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; @@ -4834,7 +4834,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { } a.label:hover, a.label:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } @@ -4893,7 +4893,7 @@ a.label:focus { padding: 3px 7px; font-size: 12px; font-weight: bold; - color: #fff; + color: #ffffff; line-height: 1; vertical-align: middle; white-space: nowrap; @@ -4915,14 +4915,14 @@ a.label:focus { } a.badge:hover, a.badge:focus { - color: #fff; + color: #ffffff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .list-group-item > .badge { float: right; @@ -4981,8 +4981,8 @@ a.badge:focus { padding: 4px; margin-bottom: 20px; line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; @@ -5108,7 +5108,7 @@ a.thumbnail.active { height: 100%; font-size: 12px; line-height: 20px; - color: #fff; + color: #ffffff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); @@ -5219,8 +5219,8 @@ a.thumbnail.active { display: block; padding: 10px 15px; margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; + background-color: #ffffff; + border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; @@ -5233,18 +5233,18 @@ a.thumbnail.active { } a.list-group-item, button.list-group-item { - color: #555; + color: #555555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { - color: #333; + color: #333333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; - color: #555; + color: #555555; background-color: #f5f5f5; } button.list-group-item { @@ -5272,7 +5272,7 @@ button.list-group-item { .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5418,7 +5418,7 @@ button.list-group-item-danger.active:focus { } .panel { margin-bottom: 20px; - background-color: #fff; + background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); @@ -5452,7 +5452,7 @@ button.list-group-item-danger.active:focus { .panel-footer { padding: 10px 15px; background-color: #f5f5f5; - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } @@ -5566,7 +5566,7 @@ button.list-group-item-danger.active:focus { .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { @@ -5643,37 +5643,37 @@ button.list-group-item-danger.active:focus { } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; + border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; } .panel-default { - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; - border-color: #ddd; + border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; + border-top-color: #dddddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; + border-bottom-color: #dddddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { - color: #fff; + color: #ffffff; background-color: #337ab7; border-color: #337ab7; } @@ -5682,7 +5682,7 @@ button.list-group-item-danger.active:focus { } .panel-primary > .panel-heading .badge { color: #337ab7; - background-color: #fff; + background-color: #ffffff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; @@ -5812,14 +5812,14 @@ button.list-group-item-danger.active:focus { font-size: 21px; font-weight: bold; line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; + color: #000000; + text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { - color: #000; + color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; @@ -5874,8 +5874,8 @@ button.close { } .modal-content { position: relative; - background-color: #fff; - border: 1px solid #999; + background-color: #ffffff; + border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); @@ -5890,7 +5890,7 @@ button.close { bottom: 0; left: 0; z-index: 1040; - background-color: #000; + background-color: #000000; } .modal-backdrop.fade { opacity: 0; @@ -6001,9 +6001,9 @@ button.close { .tooltip-inner { max-width: 200px; padding: 3px 8px; - color: #fff; + color: #ffffff; text-align: center; - background-color: #000; + background-color: #000000; border-radius: 4px; } .tooltip-arrow { @@ -6018,56 +6018,56 @@ button.close { left: 50%; margin-left: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000; + border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; - border-right-color: #000; + border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; - border-left-color: #000; + border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000; + border-bottom-color: #000000; } .popover { position: absolute; @@ -6093,9 +6093,9 @@ button.close { word-spacing: normal; word-wrap: normal; font-size: 14px; - background-color: #fff; + background-color: #ffffff; background-clip: padding-box; - border: 1px solid #ccc; + border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); @@ -6153,7 +6153,7 @@ button.close { bottom: 1px; margin-left: -10px; border-bottom-width: 0; - border-top-color: #fff; + border-top-color: #ffffff; } .popover.right > .arrow { top: 50%; @@ -6168,7 +6168,7 @@ button.close { left: 1px; bottom: -10px; border-left-width: 0; - border-right-color: #fff; + border-right-color: #ffffff; } .popover.bottom > .arrow { left: 50%; @@ -6183,7 +6183,7 @@ button.close { top: 1px; margin-left: -10px; border-top-width: 0; - border-bottom-color: #fff; + border-bottom-color: #ffffff; } .popover.left > .arrow { top: 50%; @@ -6197,7 +6197,7 @@ button.close { content: " "; right: 1px; border-right-width: 0; - border-left-color: #fff; + border-left-color: #ffffff; bottom: -10px; } .clearfix:before, @@ -6509,7 +6509,7 @@ button.close { .tag { display: inline-block; margin-bottom: 4px; - color: #111; + color: #111111; background-color: #f6f6f6; padding: 1px 10px; border: 1px solid #dddddd; @@ -6528,14 +6528,14 @@ a.tag:hover { .pill { display: inline-block; background-color: #6f8890; - color: #FFF; + color: #ffffff; padding: 2px 10px 1px 10px; margin-right: 5px; font-weight: normal; border-radius: 100px; } .pill a { - color: #FFF; + color: #ffffff; } .pill a.remove { font-size: 11px; @@ -6548,7 +6548,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-item:last-of-type { border-bottom: 0; @@ -6578,7 +6578,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-list > li:last-of-type { border-bottom: 0; @@ -6607,8 +6607,8 @@ a.tag:hover { display: block; } .box { - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -6625,8 +6625,8 @@ a.tag:hover { font-size: 14px; line-height: 1.3; background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; } .module-heading:before, .module-heading:after { @@ -6654,11 +6654,11 @@ a.tag:hover { .module-footer { padding: 7px 25px 7px; margin: 0; - border-top: 1px dotted #ddd; + border-top: 1px dotted #dddddd; } .module .read-more { font-weight: bold; - color: #000; + color: #000000; } .pagination-wrapper { text-align: center; @@ -6694,7 +6694,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .module-grid:before, @@ -6790,8 +6790,8 @@ a.tag:hover { .module-resource { z-index: 5; position: relative; - background-color: #fff; - border-bottom: 1px solid #ddd; + background-color: #ffffff; + border-bottom: 1px solid #dddddd; margin-top: 0; margin-bottom: 0; border-radius: 3px 3px 0 0; @@ -6836,8 +6836,8 @@ a.tag:hover { top: 15px; right: -35px; width: 80px; - color: #fff; - background-color: #C14531; + color: #ffffff; + background-color: #c14531; padding: 1px 20px; font-size: 11px; text-align: center; @@ -6849,7 +6849,7 @@ a.tag:hover { list-style: none; min-height: 205px; background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0; } .media-grid:before, @@ -6904,7 +6904,7 @@ a.tag:hover { left: 0; right: 0; bottom: 0; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; -webkit-transition: all 0.2s ease-in; -o-transition: all 0.2s ease-in; @@ -6913,13 +6913,13 @@ a.tag:hover { } .media-view:hover, .media-view.hovered { - border-color: #C14531; + border-color: #c14531; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); } .media-view:hover .banner, .media-view.hovered .banner { - background-color: #C14531; + background-color: #c14531; } .media-view span { display: none; @@ -7026,7 +7026,7 @@ a.tag:hover { font-size: 12px; line-height: 1.16666667em; padding: 7px 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .nav-simple > li:last-of-type, .nav-aside > li:last-of-type { @@ -7044,7 +7044,7 @@ a.tag:hover { } .nav-item > a, .nav-aside li a { - color: #333; + color: #333333; font-size: 14px; line-height: 1.42857143; margin: -7px -25px; @@ -7057,24 +7057,28 @@ a.tag:hover { .nav-item.active > a, .nav-aside li.active a { position: relative; - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } .nav-item.active > a:hover, .nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; + color: #ffffff; + background-color: #8ca0a6; } @media (min-width: 768px) { .nav-item.active > a:before, .nav-aside li.active a:before { content: ' '; position: absolute; - top: 3px; + border: 20px solid transparent; + border-right: none; + border-left-color: #8ca0a6; + border-left-width: 6px; + top: 0; + bottom: 0; right: -6px; width: 6px; height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); } } .nav-pills > li { @@ -7089,7 +7093,6 @@ a.tag:hover { .nav-aside li.active a span { white-space: nowrap; overflow: hidden; - display: block; } .module-narrow .nav-item > a, .module-narrow .nav-aside li a { @@ -7356,7 +7359,7 @@ select[multiple].control-large input { position: relative; display: block; font-size: 11px; - color: #aaa; + color: #aaaaaa; line-height: 1.3; margin-top: 6px; } @@ -7397,7 +7400,7 @@ form .control-medium .info-block.info-inline { margin-right: 15px; } .form-group .info-block a { - color: #aaa; + color: #aaaaaa; text-decoration: underline; } .form-inline input { @@ -7434,7 +7437,7 @@ input[data-module="autocomplete"] { position: relative; } .simple-input .field-bordered { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .simple-input .field input { width: 100%; @@ -7470,13 +7473,13 @@ input[data-module="autocomplete"] { padding: 4px 10px; background: #ebebeb; width: auto; - border: 1px solid #ccc; + border: 1px solid #cccccc; border-top: none; font-size: 11px; color: #282828; } .editor .editor-info-block a { - color: #C14531; + color: #c14531; text-decoration: none; } .control-custom { @@ -7494,7 +7497,7 @@ input[data-module="autocomplete"] { } .control-custom.disabled label, .control-custom.disabled input { - color: #aaa; + color: #aaaaaa; text-decoration: line-through; text-shadow: none; } @@ -7504,7 +7507,7 @@ input[data-module="autocomplete"] { background-color: #f3f3f3; } .control-custom.disabled .checkbox { - color: #444; + color: #444444; text-decoration: none; } .control-custom .checkbox.btn { @@ -7531,25 +7534,25 @@ input[data-module="autocomplete"] { display: none; } .control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .control-custom.disabled .checkbox.btn:focus, .control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #761c19; } .control-custom.disabled .checkbox.btn:hover { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .control-custom.disabled .checkbox.btn:active, .control-custom.disabled .checkbox.btn.active, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn { - color: #fff; + color: #ffffff; background-color: #c9302c; border-color: #ac2925; } @@ -7562,7 +7565,7 @@ input[data-module="autocomplete"] { .control-custom.disabled .checkbox.btn:active.focus, .control-custom.disabled .checkbox.btn.active.focus, .open > .dropdown-toggle.control-custom.disabled .checkbox.btn.focus { - color: #fff; + color: #ffffff; background-color: #ac2925; border-color: #761c19; } @@ -7585,7 +7588,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .control-custom.disabled .checkbox.btn .badge { color: #d9534f; - background-color: #fff; + background-color: #ffffff; } .alert-danger a { color: #b55457; @@ -7614,7 +7617,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; padding: 6px 8px 3px; background: #c6898b; - color: #fff; + color: #ffffff; width: auto; } .control-medium .error-block { @@ -7666,7 +7669,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 27px; counter-increment: stage; width: 50%; - background-color: #EDEDED; + background-color: #ededed; float: left; padding: 10px 20px; position: relative; @@ -7681,7 +7684,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-right: 5px; font-weight: bold; text-align: center; - color: #fff; + color: #ffffff; background-color: #aeaeae; z-index: 1; } @@ -7693,8 +7696,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { width: 0; position: absolute; pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; + border-top-color: #ededed; + border-bottom-color: #ededed; border-width: 29px; top: 50%; margin-top: -29px; @@ -7731,7 +7734,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .stages li.active:before { color: #8cc68a; - background: #fff; + background: #ffffff; } .stages li.complete:before { color: #c5e2c4; @@ -7758,7 +7761,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .stages li.active .highlight { - color: #fff; + color: #ffffff; background: #8cc68a; } .stages li.complete .highlight { @@ -7842,8 +7845,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; -o-transition: border linear 0.2s, box-shadow linear 0.2s; transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; } .select2-container-active .select2-choices, .select2-container-multi.select2-container-active .select2-choices { @@ -7933,7 +7936,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1; } .dataset-item { - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; padding-bottom: 20px; margin-bottom: 20px; } @@ -7954,7 +7957,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 1.3; } .dataset-heading a { - color: #333; + color: #333333; } .dataset-heading .label { position: relative; @@ -7980,7 +7983,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: inline; } .dataset-resources li a { - background-color: #aaa; + background-color: #aaaaaa; } .dataset-heading .popular { top: 0; @@ -7998,10 +8001,10 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { border-radius: 3px; } .resource-item:hover { - background-color: #eee; + background-color: #eeeeee; } .resource-item .heading { - color: #000; + color: #000000; font-size: 14px; font-weight: bold; } @@ -8026,14 +8029,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } } .resource-list.reordering .resource-item { - border: 1px solid #ddd; + border: 1px solid #dddddd; margin-bottom: 10px; cursor: move; } .resource-list.reordering .resource-item .handle { display: block; position: absolute; - color: #888; + color: #888888; left: -31px; top: 50%; margin-top: -15px; @@ -8041,25 +8044,25 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 30px; line-height: 30px; text-align: center; - border: 1px solid #ddd; + border: 1px solid #dddddd; border-width: 1px 0 1px 1px; - background-color: #fff; + background-color: #ffffff; border-radius: 20px 0 0 20px; } .resource-list.reordering .resource-item .handle:hover { text-decoration: none; } .resource-list.reordering .resource-item:hover .handle { - background-color: #eee; + background-color: #eeeeee; } .resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #C14531; + background-color: #eeeeee; + border: 1px solid #c14531; } .resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #C14531; - color: #333; + background-color: #eeeeee; + border-color: #c14531; + color: #333333; } .resource-item .handle { display: none; @@ -8137,7 +8140,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: block; min-height: 50px; padding: 10px; - border: 1px solid #ddd; + border: 1px solid #dddddd; overflow: hidden; border-radius: 3px; } @@ -8147,8 +8150,8 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { height: 50px; overflow: hidden; margin-right: 10px; - color: #444; - background-color: #eee; + color: #444444; + background-color: #eeeeee; border-radius: 3px; } .view-list li a .icon i { @@ -8158,7 +8161,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { line-height: 50px; } .view-list li a h3 { - color: #000; + color: #000000; font-weight: bold; font-size: 16px; margin: 0 0 3px 0; @@ -8168,33 +8171,33 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - color: #444; + color: #444444; } .view-list li a.active, .view-list li a:hover { text-decoration: none; - border-color: #C14531; + border-color: #c14531; } .view-list li a.active .icon, .view-list li a:hover .icon { - background-color: #C14531; + background-color: #c14531; color: #f6f6f6; } .view-list li .arrow { position: absolute; display: none; border: 8px solid transparent; - border-top-color: #C14531; + border-top-color: #c14531; left: 50%; bottom: -15px; margin-left: -4px; } .view-list li.active a { text-decoration: none; - border-color: #C14531; + border-color: #c14531; } .view-list li.active a .icon { - background-color: #C14531; + background-color: #c14531; color: #f6f6f6; } .view-list li.active .arrow { @@ -8227,7 +8230,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { background-color: #c3c3c3; } .view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #C14531; + background-color: #c14531; } .resource-view { margin-top: 20px; @@ -8235,7 +8238,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { .search-form { margin-bottom: 20px; padding-bottom: 25px; - border-bottom: 1px dotted #ddd; + border-bottom: 1px dotted #dddddd; } .search-form .search-input { position: relative; @@ -8265,22 +8268,21 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { display: none; } .search-form .search-input button i { - color: #ccc; + color: #cccccc; -webkit-transition: color 0.2s ease-in; -o-transition: color 0.2s ease-in; transition: color 0.2s ease-in; } .search-form .search-input button:hover i { - color: #000; + color: #000000; } .search-form .search-input.search-giant input { font-size: 16px; padding: 15px; } .search-form .search-input.search-giant button { - margin-top: -4px; + margin-top: -15px; right: 15px; - height: 30px; } .search-form .search-input.search-giant button i { font-size: 28px; @@ -8295,7 +8297,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin: 0; } .search-form .filter-list { - color: #444; + color: #444444; line-height: 32px; margin: 10px 0 0 0; } @@ -8306,17 +8308,14 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-top: 10px; font-size: 18px; font-weight: normal; - color: #000; + color: #000000; } .search-form.no-bottom-border { border-bottom-width: 0; margin-bottom: 0; } .search-form .search-input-group { - margin-bottom: 12px; -} -.search-form .search-input-group .input-group-btn .btn { - margin-top: 25px; + margin-bottom: 30px; } .tertiary .control-order-by { float: none; @@ -8363,7 +8362,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { margin-bottom: 2px; } .group-list .module-heading h3 a { - color: #333; + color: #333333; } .group-list .module-heading .media-image { overflow: hidden; @@ -8467,7 +8466,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header { margin-top: 30px; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #dddddd; background-color: #f6f6f6; border-radius: 0 3px 0 0; } @@ -8497,7 +8496,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .page-header .nav-tabs li.active a, .page-header .nav-tabs a:hover { - background-color: #fff; + background-color: #ffffff; } .page-header .content_action { float: right; @@ -8511,7 +8510,7 @@ fieldset[disabled] .control-custom.disabled .checkbox.btn.focus { } .nav-tabs-plain > .active > a, .nav-tabs-plain > .active > a:hover { - background-color: #fff; + background-color: #ffffff; } @media (max-width: 991px) { .page-header .nav-tabs { @@ -8572,8 +8571,8 @@ h4 small { } .table-chunky thead th, .table-chunky thead td { - color: #fff; - background-color: #aaa; + color: #ffffff; + background-color: #aaaaaa; padding-top: 10px; padding-bottom: 10px; } @@ -8927,7 +8926,8 @@ h4 small { margin-right: 3px; } .wrapper { - border: 1px solid #ccc; + background-color: #ffffff; + border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); @@ -8960,7 +8960,7 @@ h4 small { bottom: 0; left: 0; width: 25%; - border-right: 1px solid #ddd; + border-right: 1px solid #dddddd; z-index: 1; } .wrapper.no-nav:before { @@ -8979,7 +8979,7 @@ h4 small { [role=main], .main { padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); + background: #eeeeee url("../../../base/images/bg.png"); } } [role=main] { @@ -9171,7 +9171,7 @@ h4 small { float: left; width: 50%; margin: 5px 0 0 0; - color: #444; + color: #444444; } .context-info .nums dl dt { display: block; @@ -9201,8 +9201,8 @@ h4 small { margin-top: 0; } .flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; + -webkit-box-shadow: 0 0 0 1px #ffffff; + box-shadow: 0 0 0 1px #ffffff; } .view-preview-container { margin-top: 20px; @@ -9212,8 +9212,8 @@ h4 small { } .homepage .module-search { padding: 5px; - color: #fff; - background: #fff; + color: #ffffff; + background: #ffffff; } .homepage .module-search .search-giant { margin-bottom: 10px; @@ -9223,7 +9223,7 @@ h4 small { } .homepage .module-search .module-content { border-radius: 3px 3px 0 0; - background-color: #C14531; + background-color: #c14531; border-bottom: none; } .homepage .module-search .module-content .heading { @@ -9330,7 +9330,7 @@ h4 small { } .account-masthead { min-height: 30px; - color: #fff; + color: #ffffff; background: #983627 url("../../../base/images/bg.png"); } .account-masthead:before, @@ -9412,12 +9412,12 @@ h4 small { color: #f0d1cc; } .account-masthead .account .notifications a:hover span { - color: #fff; + color: #ffffff; background-color: #70281c; } .account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; + color: #ffffff; + background-color: #c9403a; } .account-masthead .account.authed .image { padding: 0 6px; @@ -9429,8 +9429,8 @@ h4 small { .masthead { margin-bottom: initial; padding: 10px 0; - color: #fff; - background: #C14531 url("../../../base/images/bg.png"); + color: #ffffff; + background: #c14531 url("../../../base/images/bg.png"); } .masthead:before, .masthead:after { @@ -9452,7 +9452,7 @@ h4 small { position: relative; } .masthead a { - color: #fff; + color: #ffffff; } .masthead hgroup h1, .masthead hgroup h2 { @@ -9577,8 +9577,8 @@ h4 small { .site-footer { margin-bottom: initial; padding: 10px 0; - color: #fff; - background: #C14531 url("../../../base/images/bg.png"); + color: #ffffff; + background: #c14531 url("../../../base/images/bg.png"); padding: 20px 0; } .site-footer:before, @@ -9601,7 +9601,7 @@ h4 small { position: relative; } .site-footer a { - color: #fff; + color: #ffffff; } .site-footer hgroup h1, .site-footer hgroup h2 { @@ -9743,13 +9743,13 @@ h4 small { margin-top: 0; } .lang-dropdown { - color: #000; + color: #000000; } .lang-dropdown li { width: auto; } .table-selected td { - background-color: #fff; + background-color: #ffffff; } .table-selected td .edit { display: block; @@ -9843,7 +9843,7 @@ h4 small { height: 30px; line-height: 30px; text-align: center; - color: #FFFFFF; + color: #ffffff; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); font-weight: normal; margin-right: 10px; @@ -9907,7 +9907,7 @@ h4 small { .popover .popover-content { font-size: 14px; line-height: 1.42857143; - color: #444; + color: #444444; word-break: break-all; } .popover .popover-content dl { @@ -9921,16 +9921,16 @@ h4 small { background-color: #999999; } .activity .item.failure .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.success .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.added-tag .icon { background-color: #6995a6; } .activity .item.changed-group .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.changed-package .icon { background-color: #8c76ce; @@ -9948,7 +9948,7 @@ h4 small { background-color: #699fa6; } .activity .item.deleted-group .icon { - background-color: #B95252; + background-color: #b95252; } .activity .item.deleted-package .icon { background-color: #b97452; @@ -9963,7 +9963,7 @@ h4 small { background-color: #b95297; } .activity .item.new-group .icon { - background-color: #69A67A; + background-color: #69a67a; } .activity .item.new-package .icon { background-color: #69a68e; @@ -9987,7 +9987,7 @@ h4 small { background-color: #b9b952; } .activity .item.follow-dataset .icon { - background-color: #767DCE; + background-color: #767dce; } .activity .item.follow-user .icon { background-color: #8c76ce; @@ -10071,7 +10071,7 @@ h4 small { .popover-followee .popover-header { background-color: whiteSmoke; padding: 5px; - border-bottom: 1px solid #ccc; + border-bottom: 1px solid #cccccc; border-radius: 3px 3px 0 0; } .popover-followee .popover-header:before, @@ -10128,8 +10128,8 @@ h4 small { border-radius: 0; } .popover-followee .nav li a i { - background-color: #C14531; - color: #fff; + background-color: #c14531; + color: #ffffff; margin-right: 11px; padding: 3px 5px; line-height: 1; @@ -10141,8 +10141,8 @@ h4 small { background-color: #000; } .popover-followee .nav li.active a i { - color: #C14531; - background-color: #fff; + color: #c14531; + background-color: #ffffff; } .dashboard-me { padding: 15px 15px 0 15px; @@ -10227,7 +10227,7 @@ h4 small { z-index: 0; } body { - background: #C14531 url("../../../base/images/bg.png"); + background: #c14531 url("../../../base/images/bg.png"); } [hidden] { display: none; @@ -10246,7 +10246,7 @@ table .metric { width: 140px; } code { - color: #000; + color: #000000; border: none; background: none; white-space: normal; @@ -10279,7 +10279,7 @@ iframe { text-indent: -999em; } .empty { - color: #aaa; + color: #aaaaaa; font-style: italic; } .page-heading { diff --git a/ckan/public/base/javascript/modules/autocomplete.js b/ckan/public/base/javascript/modules/autocomplete.js index 8a8f5e9d69c..562854a7afe 100644 --- a/ckan/public/base/javascript/modules/autocomplete.js +++ b/ckan/public/base/javascript/modules/autocomplete.js @@ -2,14 +2,15 @@ * a list of terms from an API endpoint (provided using data-module-source). * * source - A url pointing to an API autocomplete endpoint. - * interval - The interval between requests in milliseconds (default: 1000). + * interval - The interval between requests in milliseconds (default: 300). * items - The max number of items to display (default: 10) * tags - Boolean attribute if true will create a tag input. * key - A string of the key you want to be the form value to end up on * from the ajax returned results * label - A string of the label you want to appear within the dropdown for * returned results - * + * tokensep - A string that contains characters which will be interpreted + * as separators for tags when typed or pasted (default ","). * Examples * * // @@ -24,6 +25,7 @@ this.ckan.module('autocomplete', function (jQuery) { label: false, items: 10, source: null, + tokensep: ',', interval: 300, dropdownClass: '', containerClass: '' @@ -50,7 +52,8 @@ this.ckan.module('autocomplete', function (jQuery) { formatNoMatches: this.formatNoMatches, formatInputTooShort: this.formatInputTooShort, dropdownCssClass: this.options.dropdownClass, - containerCssClass: this.options.containerClass + containerCssClass: this.options.containerClass, + tokenSeparators: this.options.tokensep.split('') }; // Different keys are required depending on whether the select is diff --git a/ckan/public/base/javascript/modules/confirm-action.js b/ckan/public/base/javascript/modules/confirm-action.js index 25dd9096810..8afd65a8092 100644 --- a/ckan/public/base/javascript/modules/confirm-action.js +++ b/ckan/public/base/javascript/modules/confirm-action.js @@ -28,11 +28,11 @@ this.ckan.module('confirm-action', function (jQuery) { '', @@ -98,7 +98,7 @@ this.ckan.module('confirm-action', function (jQuery) { element.on('click', '.btn-cancel', this._onConfirmCancel); element.modal({show: false}); - element.find('h3').text(this._('Please Confirm Action')); + element.find('.modal-title').text(this._('Please Confirm Action')); var content = this.options.content || this.options.i18n.content || /* Backwards-compatibility */ this._('Are you sure you want to perform this action?'); diff --git a/ckan/public/base/javascript/modules/custom-fields.js b/ckan/public/base/javascript/modules/custom-fields.js index bc4f7c139f1..189b0031392 100644 --- a/ckan/public/base/javascript/modules/custom-fields.js +++ b/ckan/public/base/javascript/modules/custom-fields.js @@ -22,9 +22,6 @@ this.ckan.module('custom-fields', function (jQuery) { var delegated = this.options.fieldSelector + ':last input:first'; this.el.on('change', delegated, this._onChange); this.el.on('change', ':checkbox', this._onRemove); - - // Style the remove checkbox like a button. - this.$('.checkbox').addClass("btn btn-danger fa fa-times"); }, /* Creates a new field and appends it to the list. This currently works by diff --git a/ckan/public/base/javascript/modules/resource-view-filters-form.js b/ckan/public/base/javascript/modules/resource-view-filters-form.js index 2a7cb3f751c..8dd976ce5b1 100644 --- a/ckan/public/base/javascript/modules/resource-view-filters-form.js +++ b/ckan/public/base/javascript/modules/resource-view-filters-form.js @@ -19,18 +19,22 @@ ckan.module('resource-view-filters-form', function (jQuery) { query; query = { - plain: false, resource_id: resourceId, limit: queryLimit, offset: offset, fields: filterName, distinct: true, - sort: filterName + sort: filterName, + include_total: false }; if (term !== '') { var q = {}; - q[filterName] = term + ':*'; + if (term.indexOf(' ') == -1) { + term = term + ':*'; + query.plain = false; + } + q[filterName] = term; query.q = JSON.stringify(q); } @@ -38,7 +42,7 @@ ckan.module('resource-view-filters-form', function (jQuery) { }, results: function (data, page) { var records = data.result.records, - hasMore = (records.length < data.result.total), + hasMore = (records.length == queryLimit), results; results = $.map(records, function (record) { diff --git a/ckan/public/base/javascript/modules/resource-view-filters.js b/ckan/public/base/javascript/modules/resource-view-filters.js index ed7f13a6446..5a9ffaecec2 100644 --- a/ckan/public/base/javascript/modules/resource-view-filters.js +++ b/ckan/public/base/javascript/modules/resource-view-filters.js @@ -94,7 +94,7 @@ this.ckan.module('resource-view-filters', function (jQuery) { width: 'resolve', minimumInputLength: 0, ajax: { - url: '/api/3/action/datastore_search', + url: ckan.url('/api/3/action/datastore_search'), datatype: 'json', quietMillis: 200, cache: true, @@ -103,18 +103,22 @@ this.ckan.module('resource-view-filters', function (jQuery) { query; query = { - plain: false, resource_id: resourceId, limit: queryLimit, offset: offset, fields: filterName, distinct: true, - sort: filterName + sort: filterName, + include_total: false }; if (term !== '') { var q = {}; - q[filterName] = term + ':*'; + if (term.indexOf(' ') == -1) { + term = term + ':*'; + query.plain = false; + } + q[filterName] = term; query.q = JSON.stringify(q); } @@ -122,7 +126,7 @@ this.ckan.module('resource-view-filters', function (jQuery) { }, results: function (data, page) { var records = data.result.records, - hasMore = (records.length < data.result.total), + hasMore = (records.length == queryLimit), results; results = $.map(records, function (record) { diff --git a/ckan/public/base/javascript/modules/resource-view-reorder.js b/ckan/public/base/javascript/modules/resource-view-reorder.js index ce401083874..b4e75cb982c 100644 --- a/ckan/public/base/javascript/modules/resource-view-reorder.js +++ b/ckan/public/base/javascript/modules/resource-view-reorder.js @@ -20,6 +20,11 @@ this.ckan.module('resource-view-reorder', function($) { '', '' ].join('\n'), + handle: [ + '', + '', + '' + ].join('\n'), saving: [ '', '', @@ -53,6 +58,10 @@ this.ckan.module('resource-view-reorder', function($) { .text(this._('Cancel')) .on('click', this._onHandleCancel); + this.html_handles = $(this.template.handle) + .hide() + .appendTo($('li', this.el)); + this.html_saving = $(this.template.saving) .hide() .insertBefore($('.save', this.html_form_actions)); @@ -69,6 +78,7 @@ this.ckan.module('resource-view-reorder', function($) { _onHandleStartReorder: function() { if (!this.is_reordering) { this.html_form_actions + .add(this.html_handles) .add(this.html_title) .show(); this.el @@ -89,6 +99,7 @@ this.ckan.module('resource-view-reorder', function($) { this.el.html(this.cache) .sortable() .sortable('disable'); + this.html_handles = $('.handle', this.el); } }, @@ -116,6 +127,7 @@ this.ckan.module('resource-view-reorder', function($) { reset: function() { this.html_form_actions + .add(this.html_handles) .add(this.html_title) .hide(); this.el diff --git a/ckan/public/base/javascript/plugins/jquery.images-loaded.js b/ckan/public/base/javascript/plugins/jquery.images-loaded.js new file mode 100644 index 00000000000..f6ac95c2e28 --- /dev/null +++ b/ckan/public/base/javascript/plugins/jquery.images-loaded.js @@ -0,0 +1,496 @@ +/*! + * imagesLoaded PACKAGED v4.1.4 + * JavaScript is all like "You images are done yet or what?" + * MIT License + */ + +/** + * EvEmitter v1.1.0 + * Lil' event emitter + * MIT License + */ + +/* jshint unused: true, undef: true, strict: true */ + +( function( global, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, window */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'ev-emitter/ev-emitter',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory(); + } else { + // Browser globals + global.EvEmitter = factory(); + } + +}( typeof window != 'undefined' ? window : this, function() { + + + +function EvEmitter() {} + +var proto = EvEmitter.prototype; + +proto.on = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // set events hash + var events = this._events = this._events || {}; + // set listeners array + var listeners = events[ eventName ] = events[ eventName ] || []; + // only add once + if ( listeners.indexOf( listener ) == -1 ) { + listeners.push( listener ); + } + + return this; +}; + +proto.once = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // add event + this.on( eventName, listener ); + // set once flag + // set onceEvents hash + var onceEvents = this._onceEvents = this._onceEvents || {}; + // set onceListeners object + var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; + // set flag + onceListeners[ listener ] = true; + + return this; +}; + +proto.off = function( eventName, listener ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + var index = listeners.indexOf( listener ); + if ( index != -1 ) { + listeners.splice( index, 1 ); + } + + return this; +}; + +proto.emitEvent = function( eventName, args ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + // copy over to avoid interference if .off() in listener + listeners = listeners.slice(0); + args = args || []; + // once stuff + var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; + + for ( var i=0; i < listeners.length; i++ ) { + var listener = listeners[i] + var isOnce = onceListeners && onceListeners[ listener ]; + if ( isOnce ) { + // remove listener + // remove before trigger to prevent recursion + this.off( eventName, listener ); + // unset once flag + delete onceListeners[ listener ]; + } + // trigger listener + listener.apply( this, args ); + } + + return this; +}; + +proto.allOff = function() { + delete this._events; + delete this._onceEvents; +}; + +return EvEmitter; + +})); + +/*! + * imagesLoaded v4.1.4 + * JavaScript is all like "You images are done yet or what?" + * MIT License + */ + +( function( window, factory ) { 'use strict'; + // universal module definition + + /*global define: false, module: false, require: false */ + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( [ + 'ev-emitter/ev-emitter' + ], function( EvEmitter ) { + return factory( window, EvEmitter ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('ev-emitter') + ); + } else { + // browser global + window.imagesLoaded = factory( + window, + window.EvEmitter + ); + } + +})( typeof window !== 'undefined' ? window : this, + +// -------------------------- factory -------------------------- // + +function factory( window, EvEmitter ) { + + + +var $ = window.jQuery; +var console = window.console; + +// -------------------------- helpers -------------------------- // + +// extend objects +function extend( a, b ) { + for ( var prop in b ) { + a[ prop ] = b[ prop ]; + } + return a; +} + +var arraySlice = Array.prototype.slice; + +// turn element or nodeList into an array +function makeArray( obj ) { + if ( Array.isArray( obj ) ) { + // use object if already an array + return obj; + } + + var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number'; + if ( isArrayLike ) { + // convert nodeList to array + return arraySlice.call( obj ); + } + + // array of single index + return [ obj ]; +} + +// -------------------------- imagesLoaded -------------------------- // + +/** + * @param {Array, Element, NodeList, String} elem + * @param {Object or Function} options - if function, use as callback + * @param {Function} onAlways - callback function + */ +function ImagesLoaded( elem, options, onAlways ) { + // coerce ImagesLoaded() without new, to be new ImagesLoaded() + if ( !( this instanceof ImagesLoaded ) ) { + return new ImagesLoaded( elem, options, onAlways ); + } + // use elem as selector string + var queryElem = elem; + if ( typeof elem == 'string' ) { + queryElem = document.querySelectorAll( elem ); + } + // bail if bad element + if ( !queryElem ) { + console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) ); + return; + } + + this.elements = makeArray( queryElem ); + this.options = extend( {}, this.options ); + // shift arguments if no options set + if ( typeof options == 'function' ) { + onAlways = options; + } else { + extend( this.options, options ); + } + + if ( onAlways ) { + this.on( 'always', onAlways ); + } + + this.getImages(); + + if ( $ ) { + // add jQuery Deferred object + this.jqDeferred = new $.Deferred(); + } + + // HACK check async to allow time to bind listeners + setTimeout( this.check.bind( this ) ); +} + +ImagesLoaded.prototype = Object.create( EvEmitter.prototype ); + +ImagesLoaded.prototype.options = {}; + +ImagesLoaded.prototype.getImages = function() { + this.images = []; + + // filter & find items if we have an item selector + this.elements.forEach( this.addElementImages, this ); +}; + +/** + * @param {Node} element + */ +ImagesLoaded.prototype.addElementImages = function( elem ) { + // filter siblings + if ( elem.nodeName == 'IMG' ) { + this.addImage( elem ); + } + // get background image on element + if ( this.options.background === true ) { + this.addElementBackgroundImages( elem ); + } + + // find children + // no non-element nodes, #143 + var nodeType = elem.nodeType; + if ( !nodeType || !elementNodeTypes[ nodeType ] ) { + return; + } + var childImgs = elem.querySelectorAll('img'); + // concat childElems to filterFound array + for ( var i=0; i < childImgs.length; i++ ) { + var img = childImgs[i]; + this.addImage( img ); + } + + // get child background images + if ( typeof this.options.background == 'string' ) { + var children = elem.querySelectorAll( this.options.background ); + for ( i=0; i < children.length; i++ ) { + var child = children[i]; + this.addElementBackgroundImages( child ); + } + } +}; + +var elementNodeTypes = { + 1: true, + 9: true, + 11: true +}; + +ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) { + var style = getComputedStyle( elem ); + if ( !style ) { + // Firefox returns null if in a hidden iframe https://bugzil.la/548397 + return; + } + // get url inside url("...") + var reURL = /url\((['"])?(.*?)\1\)/gi; + var matches = reURL.exec( style.backgroundImage ); + while ( matches !== null ) { + var url = matches && matches[2]; + if ( url ) { + this.addBackground( url, elem ); + } + matches = reURL.exec( style.backgroundImage ); + } +}; + +/** + * @param {Image} img + */ +ImagesLoaded.prototype.addImage = function( img ) { + var loadingImage = new LoadingImage( img ); + this.images.push( loadingImage ); +}; + +ImagesLoaded.prototype.addBackground = function( url, elem ) { + var background = new Background( url, elem ); + this.images.push( background ); +}; + +ImagesLoaded.prototype.check = function() { + var _this = this; + this.progressedCount = 0; + this.hasAnyBroken = false; + // complete if no images + if ( !this.images.length ) { + this.complete(); + return; + } + + function onProgress( image, elem, message ) { + // HACK - Chrome triggers event before object properties have changed. #83 + setTimeout( function() { + _this.progress( image, elem, message ); + }); + } + + this.images.forEach( function( loadingImage ) { + loadingImage.once( 'progress', onProgress ); + loadingImage.check(); + }); +}; + +ImagesLoaded.prototype.progress = function( image, elem, message ) { + this.progressedCount++; + this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded; + // progress event + this.emitEvent( 'progress', [ this, image, elem ] ); + if ( this.jqDeferred && this.jqDeferred.notify ) { + this.jqDeferred.notify( this, image ); + } + // check if completed + if ( this.progressedCount == this.images.length ) { + this.complete(); + } + + if ( this.options.debug && console ) { + console.log( 'progress: ' + message, image, elem ); + } +}; + +ImagesLoaded.prototype.complete = function() { + var eventName = this.hasAnyBroken ? 'fail' : 'done'; + this.isComplete = true; + this.emitEvent( eventName, [ this ] ); + this.emitEvent( 'always', [ this ] ); + if ( this.jqDeferred ) { + var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve'; + this.jqDeferred[ jqMethod ]( this ); + } +}; + +// -------------------------- -------------------------- // + +function LoadingImage( img ) { + this.img = img; +} + +LoadingImage.prototype = Object.create( EvEmitter.prototype ); + +LoadingImage.prototype.check = function() { + // If complete is true and browser supports natural sizes, + // try to check for image status manually. + var isComplete = this.getIsImageComplete(); + if ( isComplete ) { + // report based on naturalWidth + this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); + return; + } + + // If none of the checks above matched, simulate loading on detached element. + this.proxyImage = new Image(); + this.proxyImage.addEventListener( 'load', this ); + this.proxyImage.addEventListener( 'error', this ); + // bind to image as well for Firefox. #191 + this.img.addEventListener( 'load', this ); + this.img.addEventListener( 'error', this ); + this.proxyImage.src = this.img.src; +}; + +LoadingImage.prototype.getIsImageComplete = function() { + // check for non-zero, non-undefined naturalWidth + // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671 + return this.img.complete && this.img.naturalWidth; +}; + +LoadingImage.prototype.confirm = function( isLoaded, message ) { + this.isLoaded = isLoaded; + this.emitEvent( 'progress', [ this, this.img, message ] ); +}; + +// ----- events ----- // + +// trigger specified handler for event type +LoadingImage.prototype.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +LoadingImage.prototype.onload = function() { + this.confirm( true, 'onload' ); + this.unbindEvents(); +}; + +LoadingImage.prototype.onerror = function() { + this.confirm( false, 'onerror' ); + this.unbindEvents(); +}; + +LoadingImage.prototype.unbindEvents = function() { + this.proxyImage.removeEventListener( 'load', this ); + this.proxyImage.removeEventListener( 'error', this ); + this.img.removeEventListener( 'load', this ); + this.img.removeEventListener( 'error', this ); +}; + +// -------------------------- Background -------------------------- // + +function Background( url, element ) { + this.url = url; + this.element = element; + this.img = new Image(); +} + +// inherit LoadingImage prototype +Background.prototype = Object.create( LoadingImage.prototype ); + +Background.prototype.check = function() { + this.img.addEventListener( 'load', this ); + this.img.addEventListener( 'error', this ); + this.img.src = this.url; + // check if image is already complete + var isComplete = this.getIsImageComplete(); + if ( isComplete ) { + this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); + this.unbindEvents(); + } +}; + +Background.prototype.unbindEvents = function() { + this.img.removeEventListener( 'load', this ); + this.img.removeEventListener( 'error', this ); +}; + +Background.prototype.confirm = function( isLoaded, message ) { + this.isLoaded = isLoaded; + this.emitEvent( 'progress', [ this, this.element, message ] ); +}; + +// -------------------------- jQuery -------------------------- // + +ImagesLoaded.makeJQueryPlugin = function( jQuery ) { + jQuery = jQuery || window.jQuery; + if ( !jQuery ) { + return; + } + // set local variable + $ = jQuery; + // $().imagesLoaded() + $.fn.imagesLoaded = function( options, callback ) { + var instance = new ImagesLoaded( this, options, callback ); + return instance.jqDeferred.promise( $(this) ); + }; +}; +// try making plugin +ImagesLoaded.makeJQueryPlugin(); + +// -------------------------- -------------------------- // + +return ImagesLoaded; + +}); diff --git a/ckan/public/base/javascript/plugins/jquery.masonry.js b/ckan/public/base/javascript/plugins/jquery.masonry.js index 12a39eb2b76..440b0e00265 100644 --- a/ckan/public/base/javascript/plugins/jquery.masonry.js +++ b/ckan/public/base/javascript/plugins/jquery.masonry.js @@ -1,502 +1,2501 @@ +/*! + * Masonry PACKAGED v4.2.1 + * Cascading grid layout library + * https://masonry.desandro.com + * MIT License + * by David DeSandro + */ + /** - * jQuery Masonry v2.1.08 - * A dynamic layout plugin for jQuery - * The flip-side of CSS Floats - * http://masonry.desandro.com - * - * Licensed under the MIT license. - * Copyright 2012 David DeSandro + * Bridget makes jQuery widgets + * v2.0.1 + * MIT license */ -/*jshint browser: true, curly: true, eqeqeq: true, forin: false, immed: false, newcap: true, noempty: true, strict: true, undef: true */ -/*global jQuery: false */ +/* jshint browser: true, strict: true, undef: true, unused: true */ -(function( window, $, undefined ){ +( function( window, factory ) { + // universal module definition + /*jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) { + return factory( window, jQuery ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('jquery') + ); + } else { + // browser global + window.jQueryBridget = factory( + window, + window.jQuery + ); + } + +}( window, function factory( window, jQuery ) { +'use strict'; + +// ----- utils ----- // + +var arraySlice = Array.prototype.slice; + +// helper function for logging errors +// $.error breaks jQuery chaining +var console = window.console; +var logError = typeof console == 'undefined' ? function() {} : + function( message ) { + console.error( message ); + }; - 'use strict'; +// ----- jQueryBridget ----- // + +function jQueryBridget( namespace, PluginClass, $ ) { + $ = $ || jQuery || window.jQuery; + if ( !$ ) { + return; + } + + // add option method -> $().plugin('option', {...}) + if ( !PluginClass.prototype.option ) { + // option setter + PluginClass.prototype.option = function( opts ) { + // bail out if not an object + if ( !$.isPlainObject( opts ) ){ + return; + } + this.options = $.extend( true, this.options, opts ); + }; + } + + // make jQuery plugin + $.fn[ namespace ] = function( arg0 /*, arg1 */ ) { + if ( typeof arg0 == 'string' ) { + // method call $().plugin( 'methodName', { options } ) + // shift arguments by 1 + var args = arraySlice.call( arguments, 1 ); + return methodCall( this, arg0, args ); + } + // just $().plugin({ options }) + plainCall( this, arg0 ); + return this; + }; - /* - * smartresize: debounced resize event for jQuery - * - * latest version and complete README available on Github: - * https://github.com/louisremi/jquery.smartresize.js - * - * Copyright 2011 @louis_remi - * Licensed under the MIT license. - */ + // $().plugin('methodName') + function methodCall( $elems, methodName, args ) { + var returnValue; + var pluginMethodStr = '$().' + namespace + '("' + methodName + '")'; + + $elems.each( function( i, elem ) { + // get instance + var instance = $.data( elem, namespace ); + if ( !instance ) { + logError( namespace + ' not initialized. Cannot call methods, i.e. ' + + pluginMethodStr ); + return; + } - var $event = $.event, - resizeTimeout; + var method = instance[ methodName ]; + if ( !method || methodName.charAt(0) == '_' ) { + logError( pluginMethodStr + ' is not a valid method' ); + return; + } - $event.special.smartresize = { - setup: function() { - $(this).bind( "resize", $event.special.smartresize.handler ); - }, - teardown: function() { - $(this).unbind( "resize", $event.special.smartresize.handler ); - }, - handler: function( event, execAsap ) { - // Save the context - var context = this, - args = arguments; + // apply method, get return value + var value = method.apply( instance, args ); + // set return value if value is returned, use only first value + returnValue = returnValue === undefined ? value : returnValue; + }); + + return returnValue !== undefined ? returnValue : $elems; + } + + function plainCall( $elems, options ) { + $elems.each( function( i, elem ) { + var instance = $.data( elem, namespace ); + if ( instance ) { + // set options & init + instance.option( options ); + instance._init(); + } else { + // initialize new instance + instance = new PluginClass( elem, options ); + $.data( elem, namespace, instance ); + } + }); + } + + updateJQuery( $ ); - // set correct event type - event.type = "smartresize"; +} - if ( resizeTimeout ) { clearTimeout( resizeTimeout ); } - resizeTimeout = setTimeout(function() { - $event.dispatch.apply( context, args ); +// ----- updateJQuery ----- // - }, execAsap === "execAsap"? 0 : 100 ); +// set $.bridget for v1 backwards compatibility +function updateJQuery( $ ) { + if ( !$ || ( $ && $.bridget ) ) { + return; + } + $.bridget = jQueryBridget; +} + +updateJQuery( jQuery || window.jQuery ); + +// ----- ----- // + +return jQueryBridget; + +})); + +/** + * EvEmitter v1.1.0 + * Lil' event emitter + * MIT License + */ + +/* jshint unused: true, undef: true, strict: true */ + +( function( global, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, window */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'ev-emitter/ev-emitter',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory(); + } else { + // Browser globals + global.EvEmitter = factory(); + } + +}( typeof window != 'undefined' ? window : this, function() { + + + +function EvEmitter() {} + +var proto = EvEmitter.prototype; + +proto.on = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // set events hash + var events = this._events = this._events || {}; + // set listeners array + var listeners = events[ eventName ] = events[ eventName ] || []; + // only add once + if ( listeners.indexOf( listener ) == -1 ) { + listeners.push( listener ); + } + + return this; +}; + +proto.once = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // add event + this.on( eventName, listener ); + // set once flag + // set onceEvents hash + var onceEvents = this._onceEvents = this._onceEvents || {}; + // set onceListeners object + var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; + // set flag + onceListeners[ listener ] = true; + + return this; +}; + +proto.off = function( eventName, listener ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + var index = listeners.indexOf( listener ); + if ( index != -1 ) { + listeners.splice( index, 1 ); + } + + return this; +}; + +proto.emitEvent = function( eventName, args ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + // copy over to avoid interference if .off() in listener + listeners = listeners.slice(0); + args = args || []; + // once stuff + var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; + + for ( var i=0; i < listeners.length; i++ ) { + var listener = listeners[i] + var isOnce = onceListeners && onceListeners[ listener ]; + if ( isOnce ) { + // remove listener + // remove before trigger to prevent recursion + this.off( eventName, listener ); + // unset once flag + delete onceListeners[ listener ]; } + // trigger listener + listener.apply( this, args ); + } + + return this; +}; + +proto.allOff = function() { + delete this._events; + delete this._onceEvents; +}; + +return EvEmitter; + +})); + +/*! + * getSize v2.0.2 + * measure size of elements + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ +/*global define: false, module: false, console: false */ + +( function( window, factory ) { + 'use strict'; + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'get-size/get-size',[],function() { + return factory(); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory(); + } else { + // browser global + window.getSize = factory(); + } + +})( window, function factory() { +'use strict'; + +// -------------------------- helpers -------------------------- // + +// get a number from a string, not a percentage +function getStyleSize( value ) { + var num = parseFloat( value ); + // not a percent like '100%', and a number + var isValid = value.indexOf('%') == -1 && !isNaN( num ); + return isValid && num; +} + +function noop() {} + +var logError = typeof console == 'undefined' ? noop : + function( message ) { + console.error( message ); }; - $.fn.smartresize = function( fn ) { - return fn ? this.bind( "smartresize", fn ) : this.trigger( "smartresize", ["execAsap"] ); +// -------------------------- measurements -------------------------- // + +var measurements = [ + 'paddingLeft', + 'paddingRight', + 'paddingTop', + 'paddingBottom', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginBottom', + 'borderLeftWidth', + 'borderRightWidth', + 'borderTopWidth', + 'borderBottomWidth' +]; + +var measurementsLength = measurements.length; + +function getZeroSize() { + var size = { + width: 0, + height: 0, + innerWidth: 0, + innerHeight: 0, + outerWidth: 0, + outerHeight: 0 }; + for ( var i=0; i < measurementsLength; i++ ) { + var measurement = measurements[i]; + size[ measurement ] = 0; + } + return size; +} + +// -------------------------- getStyle -------------------------- // + +/** + * getStyle, get style of element, check for Firefox bug + * https://bugzilla.mozilla.org/show_bug.cgi?id=548397 + */ +function getStyle( elem ) { + var style = getComputedStyle( elem ); + if ( !style ) { + logError( 'Style returned ' + style + + '. Are you running this code in a hidden iframe on Firefox? ' + + 'See http://bit.ly/getsizebug1' ); + } + return style; +} +// -------------------------- setup -------------------------- // +var isSetup = false; -// ========================= Masonry =============================== +var isBoxSizeOuter; +/** + * setup + * check isBoxSizerOuter + * do on first getSize() rather than on page load for Firefox bug + */ +function setup() { + // setup once + if ( isSetup ) { + return; + } + isSetup = true; + + // -------------------------- box sizing -------------------------- // + + /** + * WebKit measures the outer-width on style.width on border-box elems + * IE & Firefox<29 measures the inner-width + */ + var div = document.createElement('div'); + div.style.width = '200px'; + div.style.padding = '1px 2px 3px 4px'; + div.style.borderStyle = 'solid'; + div.style.borderWidth = '1px 2px 3px 4px'; + div.style.boxSizing = 'border-box'; - // our "Widget" object constructor - $.Mason = function( options, element ){ - this.element = $( element ); + var body = document.body || document.documentElement; + body.appendChild( div ); + var style = getStyle( div ); - this._create( options ); - this._init(); - }; + getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200; + body.removeChild( div ); - $.Mason.settings = { - isResizable: true, - isAnimated: false, - animationOptions: { - queue: false, - duration: 500 - }, - gutterWidth: 0, - isRTL: false, - isFitWidth: false, - containerStyle: { - position: 'relative' +} + +// -------------------------- getSize -------------------------- // + +function getSize( elem ) { + setup(); + + // use querySeletor if elem is string + if ( typeof elem == 'string' ) { + elem = document.querySelector( elem ); + } + + // do not proceed on non-objects + if ( !elem || typeof elem != 'object' || !elem.nodeType ) { + return; + } + + var style = getStyle( elem ); + + // if hidden, everything is 0 + if ( style.display == 'none' ) { + return getZeroSize(); + } + + var size = {}; + size.width = elem.offsetWidth; + size.height = elem.offsetHeight; + + var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; + + // get all measurements + for ( var i=0; i < measurementsLength; i++ ) { + var measurement = measurements[i]; + var value = style[ measurement ]; + var num = parseFloat( value ); + // any 'auto', 'medium' value will be 0 + size[ measurement ] = !isNaN( num ) ? num : 0; + } + + var paddingWidth = size.paddingLeft + size.paddingRight; + var paddingHeight = size.paddingTop + size.paddingBottom; + var marginWidth = size.marginLeft + size.marginRight; + var marginHeight = size.marginTop + size.marginBottom; + var borderWidth = size.borderLeftWidth + size.borderRightWidth; + var borderHeight = size.borderTopWidth + size.borderBottomWidth; + + var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; + + // overwrite width and height if we can get it from style + var styleWidth = getStyleSize( style.width ); + if ( styleWidth !== false ) { + size.width = styleWidth + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth ); + } + + var styleHeight = getStyleSize( style.height ); + if ( styleHeight !== false ) { + size.height = styleHeight + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight ); + } + + size.innerWidth = size.width - ( paddingWidth + borderWidth ); + size.innerHeight = size.height - ( paddingHeight + borderHeight ); + + size.outerWidth = size.width + marginWidth; + size.outerHeight = size.height + marginHeight; + + return size; +} + +return getSize; + +}); + +/** + * matchesSelector v2.0.2 + * matchesSelector( element, '.selector' ) + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ + +( function( window, factory ) { + /*global define: false, module: false */ + 'use strict'; + // universal module definition + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'desandro-matches-selector/matches-selector',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory(); + } else { + // browser global + window.matchesSelector = factory(); + } + +}( window, function factory() { + 'use strict'; + + var matchesMethod = ( function() { + var ElemProto = window.Element.prototype; + // check for the standard method name first + if ( ElemProto.matches ) { + return 'matches'; } + // check un-prefixed + if ( ElemProto.matchesSelector ) { + return 'matchesSelector'; + } + // check vendor prefixes + var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; + + for ( var i=0; i < prefixes.length; i++ ) { + var prefix = prefixes[i]; + var method = prefix + 'MatchesSelector'; + if ( ElemProto[ method ] ) { + return method; + } + } + })(); + + return function matchesSelector( elem, selector ) { + return elem[ matchesMethod ]( selector ); }; - $.Mason.prototype = { +})); - _filterFindBricks: function( $elems ) { - var selector = this.options.itemSelector; - // if there is a selector - // filter/find appropriate item elements - return !selector ? $elems : $elems.filter( selector ).add( $elems.find( selector ) ); - }, +/** + * Fizzy UI utils v2.0.5 + * MIT license + */ - _getBricks: function( $elems ) { - var $bricks = this._filterFindBricks( $elems ) - .css({ position: 'absolute' }) - .addClass('masonry-brick'); - return $bricks; - }, - - // sets up widget - _create : function( options ) { - - this.options = $.extend( true, {}, $.Mason.settings, options ); - this.styleQueue = []; - - // get original styles in case we re-apply them in .destroy() - var elemStyle = this.element[0].style; - this.originalStyle = { - // get height - height: elemStyle.height || '' - }; - // get other styles that will be overwritten - var containerStyle = this.options.containerStyle; - for ( var prop in containerStyle ) { - this.originalStyle[ prop ] = elemStyle[ prop ] || ''; - } +/*jshint browser: true, undef: true, unused: true, strict: true */ - this.element.css( containerStyle ); - - this.horizontalDirection = this.options.isRTL ? 'right' : 'left'; - - var x = this.element.css( 'padding-' + this.horizontalDirection ); - var y = this.element.css( 'padding-top' ); - this.offset = { - x: x ? parseInt( x, 10 ) : 0, - y: y ? parseInt( y, 10 ) : 0 - }; - - this.isFluid = this.options.columnWidth && typeof this.options.columnWidth === 'function'; - - // add masonry class first time around - var instance = this; - setTimeout( function() { - instance.element.addClass('masonry'); - }, 0 ); - - // bind resize method - if ( this.options.isResizable ) { - $(window).bind( 'smartresize.masonry', function() { - instance.resize(); - }); - } +( function( window, factory ) { + // universal module definition + /*jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'fizzy-ui-utils/utils',[ + 'desandro-matches-selector/matches-selector' + ], function( matchesSelector ) { + return factory( window, matchesSelector ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('desandro-matches-selector') + ); + } else { + // browser global + window.fizzyUIUtils = factory( + window, + window.matchesSelector + ); + } + +}( window, function factory( window, matchesSelector ) { + + + +var utils = {}; + +// ----- extend ----- // + +// extends objects +utils.extend = function( a, b ) { + for ( var prop in b ) { + a[ prop ] = b[ prop ]; + } + return a; +}; + +// ----- modulo ----- // + +utils.modulo = function( num, div ) { + return ( ( num % div ) + div ) % div; +}; + +// ----- makeArray ----- // + +// turn element or nodeList into an array +utils.makeArray = function( obj ) { + var ary = []; + if ( Array.isArray( obj ) ) { + // use object if already an array + ary = obj; + } else if ( obj && typeof obj == 'object' && + typeof obj.length == 'number' ) { + // convert nodeList to array + for ( var i=0; i < obj.length; i++ ) { + ary.push( obj[i] ); + } + } else { + // array of single index + ary.push( obj ); + } + return ary; +}; + +// ----- removeFrom ----- // + +utils.removeFrom = function( ary, obj ) { + var index = ary.indexOf( obj ); + if ( index != -1 ) { + ary.splice( index, 1 ); + } +}; + +// ----- getParent ----- // + +utils.getParent = function( elem, selector ) { + while ( elem.parentNode && elem != document.body ) { + elem = elem.parentNode; + if ( matchesSelector( elem, selector ) ) { + return elem; + } + } +}; + +// ----- getQueryElement ----- // + +// use element as selector string +utils.getQueryElement = function( elem ) { + if ( typeof elem == 'string' ) { + return document.querySelector( elem ); + } + return elem; +}; + +// ----- handleEvent ----- // + +// enable .ontype to trigger from .addEventListener( elem, 'type' ) +utils.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +// ----- filterFindElements ----- // + +utils.filterFindElements = function( elems, selector ) { + // make array of elems + elems = utils.makeArray( elems ); + var ffElems = []; + + elems.forEach( function( elem ) { + // check that elem is an actual element + if ( !( elem instanceof HTMLElement ) ) { + return; + } + // add elem if no selector + if ( !selector ) { + ffElems.push( elem ); + return; + } + // filter & find items if we have a selector + // filter + if ( matchesSelector( elem, selector ) ) { + ffElems.push( elem ); + } + // find children + var childElems = elem.querySelectorAll( selector ); + // concat childElems to filterFound array + for ( var i=0; i < childElems.length; i++ ) { + ffElems.push( childElems[i] ); + } + }); - // need to get bricks - this.reloadItems(); + return ffElems; +}; - }, - - // _init fires when instance is first created - // and when instance is triggered again -> $el.masonry(); - _init : function( callback ) { - this._getColumns(); - this._reLayout( callback ); - }, +// ----- debounceMethod ----- // - option: function( key, value ){ - // set options AFTER initialization: - // signature: $('#foo').bar({ cool:false }); - if ( $.isPlainObject( key ) ){ - this.options = $.extend(true, this.options, key); - } - }, - - // ====================== General Layout ====================== +utils.debounceMethod = function( _class, methodName, threshold ) { + // original method + var method = _class.prototype[ methodName ]; + var timeoutName = methodName + 'Timeout'; - // used on collection of atoms (should be filtered, and sorted before ) - // accepts atoms-to-be-laid-out to start with - layout : function( $bricks, callback ) { + _class.prototype[ methodName ] = function() { + var timeout = this[ timeoutName ]; + if ( timeout ) { + clearTimeout( timeout ); + } + var args = arguments; - // place each brick - for (var i=0, len = $bricks.length; i < len; i++) { - this._placeBrick( $bricks[i] ); - } - - // set the size of the container - var containerSize = {}; - containerSize.height = Math.max.apply( Math, this.colYs ); - if ( this.options.isFitWidth ) { - var unusedCols = 0; - i = this.cols; - // count unused columns - while ( --i ) { - if ( this.colYs[i] !== 0 ) { - break; - } - unusedCols++; + var _this = this; + this[ timeoutName ] = setTimeout( function() { + method.apply( _this, args ); + delete _this[ timeoutName ]; + }, threshold || 100 ); + }; +}; + +// ----- docReady ----- // + +utils.docReady = function( callback ) { + var readyState = document.readyState; + if ( readyState == 'complete' || readyState == 'interactive' ) { + // do async to allow for other scripts to run. metafizzy/flickity#441 + setTimeout( callback ); + } else { + document.addEventListener( 'DOMContentLoaded', callback ); + } +}; + +// ----- htmlInit ----- // + +// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ +utils.toDashed = function( str ) { + return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { + return $1 + '-' + $2; + }).toLowerCase(); +}; + +var console = window.console; +/** + * allow user to initialize classes via [data-namespace] or .js-namespace class + * htmlInit( Widget, 'widgetName' ) + * options are parsed from data-namespace-options + */ +utils.htmlInit = function( WidgetClass, namespace ) { + utils.docReady( function() { + var dashedNamespace = utils.toDashed( namespace ); + var dataAttr = 'data-' + dashedNamespace; + var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' ); + var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace ); + var elems = utils.makeArray( dataAttrElems ) + .concat( utils.makeArray( jsDashElems ) ); + var dataOptionsAttr = dataAttr + '-options'; + var jQuery = window.jQuery; + + elems.forEach( function( elem ) { + var attr = elem.getAttribute( dataAttr ) || + elem.getAttribute( dataOptionsAttr ); + var options; + try { + options = attr && JSON.parse( attr ); + } catch ( error ) { + // log error, do not initialize + if ( console ) { + console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className + + ': ' + error ); } - // fit container to columns that have been used; - containerSize.width = (this.cols - unusedCols) * this.columnWidth - this.options.gutterWidth; + return; } - this.styleQueue.push({ $el: this.element, style: containerSize }); - - // are we animating the layout arrangement? - // use plugin-ish syntax for css or animate - var styleFn = !this.isLaidOut ? 'css' : ( - this.options.isAnimated ? 'animate' : 'css' - ), - animOpts = this.options.animationOptions; - - // process styleQueue - var obj; - for (i=0, len = this.styleQueue.length; i < len; i++) { - obj = this.styleQueue[i]; - obj.$el[ styleFn ]( obj.style, animOpts ); + // initialize + var instance = new WidgetClass( elem, options ); + // make available via $().data('namespace') + if ( jQuery ) { + jQuery.data( elem, namespace, instance ); } + }); - // clear out queue for next time - this.styleQueue = []; + }); +}; - // provide $elems as context for the callback - if ( callback ) { - callback.call( $bricks ); - } - - this.isLaidOut = true; - }, - - // calculates number of columns - // i.e. this.columnWidth = 200 - _getColumns : function() { - var container = this.options.isFitWidth ? this.element.parent() : this.element, - containerWidth = container.width(); - - // use fluid columnWidth function if there - this.columnWidth = this.isFluid ? this.options.columnWidth( containerWidth ) : - // if not, how about the explicitly set option? - this.options.columnWidth || - // or use the size of the first item - this.$bricks.outerWidth(true) || - // if there's no items, use size of container - containerWidth; - - this.columnWidth += this.options.gutterWidth; - - this.cols = Math.floor( ( containerWidth + this.options.gutterWidth ) / this.columnWidth ); - this.cols = Math.max( this.cols, 1 ); +// ----- ----- // - }, +return utils; - // layout logic - _placeBrick: function( brick ) { - var $brick = $(brick), - colSpan, groupCount, groupY, groupColY, j; +})); - //how many columns does this brick span - colSpan = Math.ceil( $brick.outerWidth(true) / this.columnWidth ); - colSpan = Math.min( colSpan, this.cols ); +/** + * Outlayer Item + */ - if ( colSpan === 1 ) { - // if brick spans only one column, just like singleMode - groupY = this.colYs; - } else { - // brick spans more than one column - // how many different places could this brick fit horizontally - groupCount = this.cols + 1 - colSpan; - groupY = []; - - // for each group potential horizontal position - for ( j=0; j < groupCount; j++ ) { - // make an array of colY values for that one group - groupColY = this.colYs.slice( j, j+colSpan ); - // and get the max value of the array - groupY[j] = Math.max.apply( Math, groupColY ); - } +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'outlayer/item',[ + 'ev-emitter/ev-emitter', + 'get-size/get-size' + ], + factory + ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory( + require('ev-emitter'), + require('get-size') + ); + } else { + // browser global + window.Outlayer = {}; + window.Outlayer.Item = factory( + window.EvEmitter, + window.getSize + ); + } + +}( window, function factory( EvEmitter, getSize ) { +'use strict'; + +// ----- helpers ----- // + +function isEmptyObj( obj ) { + for ( var prop in obj ) { + return false; + } + prop = null; + return true; +} + +// -------------------------- CSS3 support -------------------------- // + + +var docElemStyle = document.documentElement.style; + +var transitionProperty = typeof docElemStyle.transition == 'string' ? + 'transition' : 'WebkitTransition'; +var transformProperty = typeof docElemStyle.transform == 'string' ? + 'transform' : 'WebkitTransform'; + +var transitionEndEvent = { + WebkitTransition: 'webkitTransitionEnd', + transition: 'transitionend' +}[ transitionProperty ]; + +// cache all vendor properties that could have vendor prefix +var vendorProperties = { + transform: transformProperty, + transition: transitionProperty, + transitionDuration: transitionProperty + 'Duration', + transitionProperty: transitionProperty + 'Property', + transitionDelay: transitionProperty + 'Delay' +}; + +// -------------------------- Item -------------------------- // + +function Item( element, layout ) { + if ( !element ) { + return; + } + + this.element = element; + // parent layout class, i.e. Masonry, Isotope, or Packery + this.layout = layout; + this.position = { + x: 0, + y: 0 + }; - } + this._create(); +} - // get the minimum Y value from the columns - var minimumY = Math.min.apply( Math, groupY ), - shortCol = 0; - - // Find index of short column, the first from the left - for (var i=0, len = groupY.length; i < len; i++) { - if ( groupY[i] === minimumY ) { - shortCol = i; - break; - } - } +// inherit EvEmitter +var proto = Item.prototype = Object.create( EvEmitter.prototype ); +proto.constructor = Item; - // position the brick - var position = { - top: minimumY + this.offset.y - }; - // position.left or position.right - position[ this.horizontalDirection ] = this.columnWidth * shortCol + this.offset.x; - this.styleQueue.push({ $el: $brick, style: position }); - - // apply setHeight to necessary columns - var setHeight = minimumY + $brick.outerHeight(true), - setSpan = this.cols + 1 - len; - for ( i=0; i < setSpan; i++ ) { - this.colYs[ shortCol + i ] = setHeight; - } +proto._create = function() { + // transition objects + this._transn = { + ingProperties: {}, + clean: {}, + onEnd: {} + }; + this.css({ + position: 'absolute' + }); +}; + +// trigger specified handler for event type +proto.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +proto.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * apply CSS styles to element + * @param {Object} style + */ +proto.css = function( style ) { + var elemStyle = this.element.style; + + for ( var prop in style ) { + // use vendor property if available + var supportedProp = vendorProperties[ prop ] || prop; + elemStyle[ supportedProp ] = style[ prop ]; + } +}; + + // measure position, and sets it +proto.getPosition = function() { + var style = getComputedStyle( this.element ); + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + var xValue = style[ isOriginLeft ? 'left' : 'right' ]; + var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; + // convert percent to pixels + var layoutSize = this.layout.size; + var x = xValue.indexOf('%') != -1 ? + ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 ); + var y = yValue.indexOf('%') != -1 ? + ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 ); + + // clean up 'auto' or other non-integer values + x = isNaN( x ) ? 0 : x; + y = isNaN( y ) ? 0 : y; + // remove padding from measurement + x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; + y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; + + this.position.x = x; + this.position.y = y; +}; + +// set settled position, apply padding +proto.layoutPosition = function() { + var layoutSize = this.layout.size; + var style = {}; + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + + // x + var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight'; + var xProperty = isOriginLeft ? 'left' : 'right'; + var xResetProperty = isOriginLeft ? 'right' : 'left'; + + var x = this.position.x + layoutSize[ xPadding ]; + // set in percentage or pixels + style[ xProperty ] = this.getXValue( x ); + // reset other property + style[ xResetProperty ] = ''; + + // y + var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom'; + var yProperty = isOriginTop ? 'top' : 'bottom'; + var yResetProperty = isOriginTop ? 'bottom' : 'top'; + + var y = this.position.y + layoutSize[ yPadding ]; + // set in percentage or pixels + style[ yProperty ] = this.getYValue( y ); + // reset other property + style[ yResetProperty ] = ''; + + this.css( style ); + this.emitEvent( 'layout', [ this ] ); +}; + +proto.getXValue = function( x ) { + var isHorizontal = this.layout._getOption('horizontal'); + return this.layout.options.percentPosition && !isHorizontal ? + ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; +}; + +proto.getYValue = function( y ) { + var isHorizontal = this.layout._getOption('horizontal'); + return this.layout.options.percentPosition && isHorizontal ? + ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; +}; + +proto._transitionTo = function( x, y ) { + this.getPosition(); + // get current x & y from top/left + var curX = this.position.x; + var curY = this.position.y; + + var compareX = parseInt( x, 10 ); + var compareY = parseInt( y, 10 ); + var didNotMove = compareX === this.position.x && compareY === this.position.y; + + // save end position + this.setPosition( x, y ); + + // if did not move and not transitioning, just go to layout + if ( didNotMove && !this.isTransitioning ) { + this.layoutPosition(); + return; + } + + var transX = x - curX; + var transY = y - curY; + var transitionStyle = {}; + transitionStyle.transform = this.getTranslate( transX, transY ); + + this.transition({ + to: transitionStyle, + onTransitionEnd: { + transform: this.layoutPosition }, - - - resize: function() { - var prevColCount = this.cols; - // get updated colCount - this._getColumns(); - if ( this.isFluid || this.cols !== prevColCount ) { - // if column count has changed, trigger new layout - this._reLayout(); - } - }, - - - _reLayout : function( callback ) { - // reset columns - var i = this.cols; - this.colYs = []; - while (i--) { - this.colYs.push( 0 ); - } - // apply layout logic to all bricks - this.layout( this.$bricks, callback ); - }, - - // ====================== Convenience methods ====================== - - // goes through all children again and gets bricks in proper order - reloadItems : function() { - this.$bricks = this._getBricks( this.element.children() ); - }, - - - reload : function( callback ) { - this.reloadItems(); - this._init( callback ); - }, - - - // convienence method for working with Infinite Scroll - appended : function( $content, isAnimatedFromBottom, callback ) { - if ( isAnimatedFromBottom ) { - // set new stuff to the bottom - this._filterFindBricks( $content ).css({ top: this.element.height() }); - var instance = this; - setTimeout( function(){ - instance._appended( $content, callback ); - }, 1 ); - } else { - this._appended( $content, callback ); - } - }, - - _appended : function( $content, callback ) { - var $newBricks = this._getBricks( $content ); - // add new bricks to brick pool - this.$bricks = this.$bricks.add( $newBricks ); - this.layout( $newBricks, callback ); - }, - - // removes elements from Masonry widget - remove : function( $content ) { - this.$bricks = this.$bricks.not( $content ); - $content.remove(); - }, - - // destroys widget, returns elements and container back (close) to original style - destroy : function() { - - this.$bricks - .removeClass('masonry-brick') - .each(function(){ - this.style.position = ''; - this.style.top = ''; - this.style.left = ''; - }); - - // re-apply saved container styles - var elemStyle = this.element[0].style; - for ( var prop in this.originalStyle ) { - elemStyle[ prop ] = this.originalStyle[ prop ]; + isCleaning: true + }); +}; + +proto.getTranslate = function( x, y ) { + // flip cooridinates if origin on right or bottom + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + x = isOriginLeft ? x : -x; + y = isOriginTop ? y : -y; + return 'translate3d(' + x + 'px, ' + y + 'px, 0)'; +}; + +// non transition + transform support +proto.goTo = function( x, y ) { + this.setPosition( x, y ); + this.layoutPosition(); +}; + +proto.moveTo = proto._transitionTo; + +proto.setPosition = function( x, y ) { + this.position.x = parseInt( x, 10 ); + this.position.y = parseInt( y, 10 ); +}; + +// ----- transition ----- // + +/** + * @param {Object} style - CSS + * @param {Function} onTransitionEnd + */ + +// non transition, just trigger callback +proto._nonTransition = function( args ) { + this.css( args.to ); + if ( args.isCleaning ) { + this._removeStyles( args.to ); + } + for ( var prop in args.onTransitionEnd ) { + args.onTransitionEnd[ prop ].call( this ); + } +}; + +/** + * proper transition + * @param {Object} args - arguments + * @param {Object} to - style to transition to + * @param {Object} from - style to start transition from + * @param {Boolean} isCleaning - removes transition styles after transition + * @param {Function} onTransitionEnd - callback + */ +proto.transition = function( args ) { + // redirect to nonTransition if no transition duration + if ( !parseFloat( this.layout.options.transitionDuration ) ) { + this._nonTransition( args ); + return; + } + + var _transition = this._transn; + // keep track of onTransitionEnd callback by css property + for ( var prop in args.onTransitionEnd ) { + _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; + } + // keep track of properties that are transitioning + for ( prop in args.to ) { + _transition.ingProperties[ prop ] = true; + // keep track of properties to clean up when transition is done + if ( args.isCleaning ) { + _transition.clean[ prop ] = true; + } + } + + // set from styles + if ( args.from ) { + this.css( args.from ); + // force redraw. http://blog.alexmaccaw.com/css-transitions + var h = this.element.offsetHeight; + // hack for JSHint to hush about unused var + h = null; + } + // enable transition + this.enableTransition( args.to ); + // set styles that are transitioning + this.css( args.to ); + + this.isTransitioning = true; + +}; + +// dash before all cap letters, including first for +// WebkitTransform => -webkit-transform +function toDashedAll( str ) { + return str.replace( /([A-Z])/g, function( $1 ) { + return '-' + $1.toLowerCase(); + }); +} + +var transitionProps = 'opacity,' + toDashedAll( transformProperty ); + +proto.enableTransition = function(/* style */) { + // HACK changing transitionProperty during a transition + // will cause transition to jump + if ( this.isTransitioning ) { + return; + } + + // make `transition: foo, bar, baz` from style object + // HACK un-comment this when enableTransition can work + // while a transition is happening + // var transitionValues = []; + // for ( var prop in style ) { + // // dash-ify camelCased properties like WebkitTransition + // prop = vendorProperties[ prop ] || prop; + // transitionValues.push( toDashedAll( prop ) ); + // } + // munge number to millisecond, to match stagger + var duration = this.layout.options.transitionDuration; + duration = typeof duration == 'number' ? duration + 'ms' : duration; + // enable transition styles + this.css({ + transitionProperty: transitionProps, + transitionDuration: duration, + transitionDelay: this.staggerDelay || 0 + }); + // listen for transition end event + this.element.addEventListener( transitionEndEvent, this, false ); +}; + +// ----- events ----- // + +proto.onwebkitTransitionEnd = function( event ) { + this.ontransitionend( event ); +}; + +proto.onotransitionend = function( event ) { + this.ontransitionend( event ); +}; + +// properties that I munge to make my life easier +var dashedVendorProperties = { + '-webkit-transform': 'transform' +}; + +proto.ontransitionend = function( event ) { + // disregard bubbled events from children + if ( event.target !== this.element ) { + return; + } + var _transition = this._transn; + // get property name of transitioned property, convert to prefix-free + var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; + + // remove property that has completed transitioning + delete _transition.ingProperties[ propertyName ]; + // check if any properties are still transitioning + if ( isEmptyObj( _transition.ingProperties ) ) { + // all properties have completed transitioning + this.disableTransition(); + } + // clean style + if ( propertyName in _transition.clean ) { + // clean up style + this.element.style[ event.propertyName ] = ''; + delete _transition.clean[ propertyName ]; + } + // trigger onTransitionEnd callback + if ( propertyName in _transition.onEnd ) { + var onTransitionEnd = _transition.onEnd[ propertyName ]; + onTransitionEnd.call( this ); + delete _transition.onEnd[ propertyName ]; + } + + this.emitEvent( 'transitionEnd', [ this ] ); +}; + +proto.disableTransition = function() { + this.removeTransitionStyles(); + this.element.removeEventListener( transitionEndEvent, this, false ); + this.isTransitioning = false; +}; + +/** + * removes style property from element + * @param {Object} style +**/ +proto._removeStyles = function( style ) { + // clean up transition styles + var cleanStyle = {}; + for ( var prop in style ) { + cleanStyle[ prop ] = ''; + } + this.css( cleanStyle ); +}; + +var cleanTransitionStyle = { + transitionProperty: '', + transitionDuration: '', + transitionDelay: '' +}; + +proto.removeTransitionStyles = function() { + // remove transition + this.css( cleanTransitionStyle ); +}; + +// ----- stagger ----- // + +proto.stagger = function( delay ) { + delay = isNaN( delay ) ? 0 : delay; + this.staggerDelay = delay + 'ms'; +}; + +// ----- show/hide/remove ----- // + +// remove element from DOM +proto.removeElem = function() { + this.element.parentNode.removeChild( this.element ); + // remove display: none + this.css({ display: '' }); + this.emitEvent( 'remove', [ this ] ); +}; + +proto.remove = function() { + // just remove element if no transition support or no transition + if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { + this.removeElem(); + return; + } + + // start transition + this.once( 'transitionEnd', function() { + this.removeElem(); + }); + this.hide(); +}; + +proto.reveal = function() { + delete this.isHidden; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; + + this.transition({ + from: options.hiddenStyle, + to: options.visibleStyle, + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +proto.onRevealTransitionEnd = function() { + // check if still visible + // during transition, item may have been hidden + if ( !this.isHidden ) { + this.emitEvent('reveal'); + } +}; + +/** + * get style property use for hide/reveal transition end + * @param {String} styleProperty - hiddenStyle/visibleStyle + * @returns {String} + */ +proto.getHideRevealTransitionEndProperty = function( styleProperty ) { + var optionStyle = this.layout.options[ styleProperty ]; + // use opacity + if ( optionStyle.opacity ) { + return 'opacity'; + } + // get first property + for ( var prop in optionStyle ) { + return prop; + } +}; + +proto.hide = function() { + // set flag + this.isHidden = true; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; + + this.transition({ + from: options.visibleStyle, + to: options.hiddenStyle, + // keep hidden stuff hidden + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +proto.onHideTransitionEnd = function() { + // check if still hidden + // during transition, item may have been un-hidden + if ( this.isHidden ) { + this.css({ display: 'none' }); + this.emitEvent('hide'); + } +}; + +proto.destroy = function() { + this.css({ + position: '', + left: '', + right: '', + top: '', + bottom: '', + transition: '', + transform: '' + }); +}; + +return Item; + +})); + +/*! + * Outlayer v2.1.0 + * the brains and guts of a layout library + * MIT license + */ + +( function( window, factory ) { + 'use strict'; + // universal module definition + /* jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'outlayer/outlayer',[ + 'ev-emitter/ev-emitter', + 'get-size/get-size', + 'fizzy-ui-utils/utils', + './item' + ], + function( EvEmitter, getSize, utils, Item ) { + return factory( window, EvEmitter, getSize, utils, Item); } + ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory( + window, + require('ev-emitter'), + require('get-size'), + require('fizzy-ui-utils'), + require('./item') + ); + } else { + // browser global + window.Outlayer = factory( + window, + window.EvEmitter, + window.getSize, + window.fizzyUIUtils, + window.Outlayer.Item + ); + } + +}( window, function factory( window, EvEmitter, getSize, utils, Item ) { +'use strict'; + +// ----- vars ----- // + +var console = window.console; +var jQuery = window.jQuery; +var noop = function() {}; + +// -------------------------- Outlayer -------------------------- // + +// globally unique identifiers +var GUID = 0; +// internal store of all Outlayer intances +var instances = {}; + + +/** + * @param {Element, String} element + * @param {Object} options + * @constructor + */ +function Outlayer( element, options ) { + var queryElement = utils.getQueryElement( element ); + if ( !queryElement ) { + if ( console ) { + console.error( 'Bad element for ' + this.constructor.namespace + + ': ' + ( queryElement || element ) ); + } + return; + } + this.element = queryElement; + // add jQuery + if ( jQuery ) { + this.$element = jQuery( this.element ); + } + + // options + this.options = utils.extend( {}, this.constructor.defaults ); + this.option( options ); + + // add id for Outlayer.getFromElement + var id = ++GUID; + this.element.outlayerGUID = id; // expando + instances[ id ] = this; // associate via id + + // kick it off + this._create(); + + var isInitLayout = this._getOption('initLayout'); + if ( isInitLayout ) { + this.layout(); + } +} + +// settings are for internal use only +Outlayer.namespace = 'outlayer'; +Outlayer.Item = Item; + +// default options +Outlayer.defaults = { + containerStyle: { + position: 'relative' + }, + initLayout: true, + originLeft: true, + originTop: true, + resize: true, + resizeContainer: true, + // item options + transitionDuration: '0.4s', + hiddenStyle: { + opacity: 0, + transform: 'scale(0.001)' + }, + visibleStyle: { + opacity: 1, + transform: 'scale(1)' + } +}; + +var proto = Outlayer.prototype; +// inherit EvEmitter +utils.extend( proto, EvEmitter.prototype ); + +/** + * set options + * @param {Object} opts + */ +proto.option = function( opts ) { + utils.extend( this.options, opts ); +}; + +/** + * get backwards compatible option value, check old name + */ +proto._getOption = function( option ) { + var oldOption = this.constructor.compatOptions[ option ]; + return oldOption && this.options[ oldOption ] !== undefined ? + this.options[ oldOption ] : this.options[ option ]; +}; + +Outlayer.compatOptions = { + // currentName: oldName + initLayout: 'isInitLayout', + horizontal: 'isHorizontal', + layoutInstant: 'isLayoutInstant', + originLeft: 'isOriginLeft', + originTop: 'isOriginTop', + resize: 'isResizeBound', + resizeContainer: 'isResizingContainer' +}; + +proto._create = function() { + // get items from children + this.reloadItems(); + // elements that affect layout, but are not laid out + this.stamps = []; + this.stamp( this.options.stamp ); + // set container style + utils.extend( this.element.style, this.options.containerStyle ); + + // bind resize method + var canBindResize = this._getOption('resize'); + if ( canBindResize ) { + this.bindResize(); + } +}; + +// goes through all children again and gets bricks in proper order +proto.reloadItems = function() { + // collection of item elements + this.items = this._itemize( this.element.children ); +}; + + +/** + * turn elements into Outlayer.Items to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - collection of new Outlayer Items + */ +proto._itemize = function( elems ) { + + var itemElems = this._filterFindItemElements( elems ); + var Item = this.constructor.Item; + + // create new Outlayer Items for collection + var items = []; + for ( var i=0; i < itemElems.length; i++ ) { + var elem = itemElems[i]; + var item = new Item( elem, this ); + items.push( item ); + } + + return items; +}; + +/** + * get item elements to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - item elements + */ +proto._filterFindItemElements = function( elems ) { + return utils.filterFindElements( elems, this.options.itemSelector ); +}; + +/** + * getter method for getting item elements + * @returns {Array} elems - collection of item elements + */ +proto.getItemElements = function() { + return this.items.map( function( item ) { + return item.element; + }); +}; - this.element - .unbind('.masonry') - .removeClass('masonry') - .removeData('masonry'); - - $(window).unbind('.masonry'); +// ----- init & layout ----- // +/** + * lays out all items + */ +proto.layout = function() { + this._resetLayout(); + this._manageStamps(); + + // don't animate first layout + var layoutInstant = this._getOption('layoutInstant'); + var isInstant = layoutInstant !== undefined ? + layoutInstant : !this._isLayoutInited; + this.layoutItems( this.items, isInstant ); + + // flag for initalized + this._isLayoutInited = true; +}; + +// _init is alias for layout +proto._init = proto.layout; + +/** + * logic before any new layout + */ +proto._resetLayout = function() { + this.getSize(); +}; + + +proto.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * get measurement from option, for columnWidth, rowHeight, gutter + * if option is String -> get element from selector string, & get size of element + * if option is Element -> get size of element + * else use option as a number + * + * @param {String} measurement + * @param {String} size - width or height + * @private + */ +proto._getMeasurement = function( measurement, size ) { + var option = this.options[ measurement ]; + var elem; + if ( !option ) { + // default to 0 + this[ measurement ] = 0; + } else { + // use option as an element + if ( typeof option == 'string' ) { + elem = this.element.querySelector( option ); + } else if ( option instanceof HTMLElement ) { + elem = option; } - + // use size of element, if element + this[ measurement ] = elem ? getSize( elem )[ size ] : option; + } +}; + +/** + * layout a collection of item elements + * @api public + */ +proto.layoutItems = function( items, isInstant ) { + items = this._getItemsForLayout( items ); + + this._layoutItems( items, isInstant ); + + this._postLayout(); +}; + +/** + * get the items to be laid out + * you may want to skip over some items + * @param {Array} items + * @returns {Array} items + */ +proto._getItemsForLayout = function( items ) { + return items.filter( function( item ) { + return !item.isIgnored; + }); +}; + +/** + * layout items + * @param {Array} items + * @param {Boolean} isInstant + */ +proto._layoutItems = function( items, isInstant ) { + this._emitCompleteOnItems( 'layout', items ); + + if ( !items || !items.length ) { + // no items, emit event with empty array + return; + } + + var queue = []; + + items.forEach( function( item ) { + // get x/y object from method + var position = this._getItemLayoutPosition( item ); + // enqueue + position.item = item; + position.isInstant = isInstant || item.isLayoutInstant; + queue.push( position ); + }, this ); + + this._processLayoutQueue( queue ); +}; + +/** + * get item layout position + * @param {Outlayer.Item} item + * @returns {Object} x and y position + */ +proto._getItemLayoutPosition = function( /* item */ ) { + return { + x: 0, + y: 0 }; - - - // ======================= imagesLoaded Plugin =============================== - /*! - * jQuery imagesLoaded plugin v1.1.0 - * http://github.com/desandro/imagesloaded - * - * MIT License. by Paul Irish et al. - */ +}; +/** + * iterate over array and position each item + * Reason being - separating this logic prevents 'layout invalidation' + * thx @paul_irish + * @param {Array} queue + */ +proto._processLayoutQueue = function( queue ) { + this.updateStagger(); + queue.forEach( function( obj, i ) { + this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i ); + }, this ); +}; + +// set stagger from option in milliseconds number +proto.updateStagger = function() { + var stagger = this.options.stagger; + if ( stagger === null || stagger === undefined ) { + this.stagger = 0; + return; + } + this.stagger = getMilliseconds( stagger ); + return this.stagger; +}; - // $('#my-container').imagesLoaded(myFunction) - // or - // $('img').imagesLoaded(myFunction) +/** + * Sets position of item in DOM + * @param {Outlayer.Item} item + * @param {Number} x - horizontal position + * @param {Number} y - vertical position + * @param {Boolean} isInstant - disables transitions + */ +proto._positionItem = function( item, x, y, isInstant, i ) { + if ( isInstant ) { + // if not transition, just set CSS + item.goTo( x, y ); + } else { + item.stagger( i * this.stagger ); + item.moveTo( x, y ); + } +}; - // execute a callback when all images have loaded. - // needed because .load() doesn't work on cached images +/** + * Any logic you want to do after each layout, + * i.e. size the container + */ +proto._postLayout = function() { + this.resizeContainer(); +}; + +proto.resizeContainer = function() { + var isResizingContainer = this._getOption('resizeContainer'); + if ( !isResizingContainer ) { + return; + } + var size = this._getContainerSize(); + if ( size ) { + this._setContainerMeasure( size.width, true ); + this._setContainerMeasure( size.height, false ); + } +}; - // callback function gets image collection as argument - // `this` is the container +/** + * Sets width or height of container if returned + * @returns {Object} size + * @param {Number} width + * @param {Number} height + */ +proto._getContainerSize = noop; - $.fn.imagesLoaded = function( callback ) { - var $this = this, - $images = $this.find('img').add( $this.filter('img') ), - len = $images.length, - blank = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==', - loaded = []; +/** + * @param {Number} measure - size of width or height + * @param {Boolean} isWidth + */ +proto._setContainerMeasure = function( measure, isWidth ) { + if ( measure === undefined ) { + return; + } + + var elemSize = this.size; + // add padding and border width if border box + if ( elemSize.isBorderBox ) { + measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + + elemSize.borderLeftWidth + elemSize.borderRightWidth : + elemSize.paddingBottom + elemSize.paddingTop + + elemSize.borderTopWidth + elemSize.borderBottomWidth; + } + + measure = Math.max( measure, 0 ); + this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; +}; - function triggerCallback() { - callback.call( $this, $images ); +/** + * emit eventComplete on a collection of items events + * @param {String} eventName + * @param {Array} items - Outlayer.Items + */ +proto._emitCompleteOnItems = function( eventName, items ) { + var _this = this; + function onComplete() { + _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); + } + + var count = items.length; + if ( !items || !count ) { + onComplete(); + return; + } + + var doneCount = 0; + function tick() { + doneCount++; + if ( doneCount == count ) { + onComplete(); } + } - function imgLoaded( event ) { - var img = event.target; - if ( img.src !== blank && $.inArray( img, loaded ) === -1 ){ - loaded.push( img ); - if ( --len <= 0 ){ - setTimeout( triggerCallback ); - $images.unbind( '.imagesLoaded', imgLoaded ); - } - } + // bind callback + items.forEach( function( item ) { + item.once( eventName, tick ); + }); +}; + +/** + * emits events via EvEmitter and jQuery events + * @param {String} type - name of event + * @param {Event} event - original event + * @param {Array} args - extra arguments + */ +proto.dispatchEvent = function( type, event, args ) { + // add original event to arguments + var emitArgs = event ? [ event ].concat( args ) : args; + this.emitEvent( type, emitArgs ); + + if ( jQuery ) { + // set this.$element + this.$element = this.$element || jQuery( this.element ); + if ( event ) { + // create jQuery event + var $event = jQuery.Event( event ); + $event.type = type; + this.$element.trigger( $event, args ); + } else { + // just trigger with type if no event available + this.$element.trigger( type, args ); } + } +}; + +// -------------------------- ignore & stamps -------------------------- // + + +/** + * keep item in collection, but do not lay it out + * ignored items do not get skipped in layout + * @param {Element} elem + */ +proto.ignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + item.isIgnored = true; + } +}; + +/** + * return item to layout collection + * @param {Element} elem + */ +proto.unignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + delete item.isIgnored; + } +}; + +/** + * adds elements to stamps + * @param {NodeList, Array, Element, or String} elems + */ +proto.stamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ) { + return; + } + + this.stamps = this.stamps.concat( elems ); + // ignore + elems.forEach( this.ignore, this ); +}; + +/** + * removes elements to stamps + * @param {NodeList, Array, or Element} elems + */ +proto.unstamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ){ + return; + } + + elems.forEach( function( elem ) { + // filter out removed stamp elements + utils.removeFrom( this.stamps, elem ); + this.unignore( elem ); + }, this ); +}; + +/** + * finds child elements + * @param {NodeList, Array, Element, or String} elems + * @returns {Array} elems + */ +proto._find = function( elems ) { + if ( !elems ) { + return; + } + // if string, use argument as selector string + if ( typeof elems == 'string' ) { + elems = this.element.querySelectorAll( elems ); + } + elems = utils.makeArray( elems ); + return elems; +}; + +proto._manageStamps = function() { + if ( !this.stamps || !this.stamps.length ) { + return; + } + + this._getBoundingRect(); + + this.stamps.forEach( this._manageStamp, this ); +}; + +// update boundingLeft / Top +proto._getBoundingRect = function() { + // get bounding rect for container element + var boundingRect = this.element.getBoundingClientRect(); + var size = this.size; + this._boundingRect = { + left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, + top: boundingRect.top + size.paddingTop + size.borderTopWidth, + right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), + bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) + }; +}; + +/** + * @param {Element} stamp +**/ +proto._manageStamp = noop; + +/** + * get x/y position of element relative to container element + * @param {Element} elem + * @returns {Object} offset - has left, top, right, bottom + */ +proto._getElementOffset = function( elem ) { + var boundingRect = elem.getBoundingClientRect(); + var thisRect = this._boundingRect; + var size = getSize( elem ); + var offset = { + left: boundingRect.left - thisRect.left - size.marginLeft, + top: boundingRect.top - thisRect.top - size.marginTop, + right: thisRect.right - boundingRect.right - size.marginRight, + bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom + }; + return offset; +}; + +// -------------------------- resize -------------------------- // + +// enable event handlers for listeners +// i.e. resize -> onresize +proto.handleEvent = utils.handleEvent; + +/** + * Bind layout to window resizing + */ +proto.bindResize = function() { + window.addEventListener( 'resize', this ); + this.isResizeBound = true; +}; + +/** + * Unbind layout to window resizing + */ +proto.unbindResize = function() { + window.removeEventListener( 'resize', this ); + this.isResizeBound = false; +}; + +proto.onresize = function() { + this.resize(); +}; + +utils.debounceMethod( Outlayer, 'onresize', 100 ); - // if no images, trigger immediately - if ( !len ) { - triggerCallback(); +proto.resize = function() { + // don't trigger if size did not change + // or if resize was unbound. See #9 + if ( !this.isResizeBound || !this.needsResizeLayout() ) { + return; + } + + this.layout(); +}; + +/** + * check if layout is needed post layout + * @returns Boolean + */ +proto.needsResizeLayout = function() { + var size = getSize( this.element ); + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var hasSizes = this.size && size; + return hasSizes && size.innerWidth !== this.size.innerWidth; +}; + +// -------------------------- methods -------------------------- // + +/** + * add items to Outlayer instance + * @param {Array or NodeList or Element} elems + * @returns {Array} items - Outlayer.Items +**/ +proto.addItems = function( elems ) { + var items = this._itemize( elems ); + // add items to collection + if ( items.length ) { + this.items = this.items.concat( items ); + } + return items; +}; + +/** + * Layout newly-appended item elements + * @param {Array or NodeList or Element} elems + */ +proto.appended = function( elems ) { + var items = this.addItems( elems ); + if ( !items.length ) { + return; + } + // layout and reveal just the new items + this.layoutItems( items, true ); + this.reveal( items ); +}; + +/** + * Layout prepended elements + * @param {Array or NodeList or Element} elems + */ +proto.prepended = function( elems ) { + var items = this._itemize( elems ); + if ( !items.length ) { + return; + } + // add items to beginning of collection + var previousItems = this.items.slice(0); + this.items = items.concat( previousItems ); + // start new layout + this._resetLayout(); + this._manageStamps(); + // layout new stuff without transition + this.layoutItems( items, true ); + this.reveal( items ); + // layout previous items + this.layoutItems( previousItems ); +}; + +/** + * reveal a collection of items + * @param {Array of Outlayer.Items} items + */ +proto.reveal = function( items ) { + this._emitCompleteOnItems( 'reveal', items ); + if ( !items || !items.length ) { + return; + } + var stagger = this.updateStagger(); + items.forEach( function( item, i ) { + item.stagger( i * stagger ); + item.reveal(); + }); +}; + +/** + * hide a collection of items + * @param {Array of Outlayer.Items} items + */ +proto.hide = function( items ) { + this._emitCompleteOnItems( 'hide', items ); + if ( !items || !items.length ) { + return; + } + var stagger = this.updateStagger(); + items.forEach( function( item, i ) { + item.stagger( i * stagger ); + item.hide(); + }); +}; + +/** + * reveal item elements + * @param {Array}, {Element}, {NodeList} items + */ +proto.revealItemElements = function( elems ) { + var items = this.getItems( elems ); + this.reveal( items ); +}; + +/** + * hide item elements + * @param {Array}, {Element}, {NodeList} items + */ +proto.hideItemElements = function( elems ) { + var items = this.getItems( elems ); + this.hide( items ); +}; + +/** + * get Outlayer.Item, given an Element + * @param {Element} elem + * @param {Function} callback + * @returns {Outlayer.Item} item + */ +proto.getItem = function( elem ) { + // loop through items to get the one that matches + for ( var i=0; i < this.items.length; i++ ) { + var item = this.items[i]; + if ( item.element == elem ) { + // return item + return item; } + } +}; - $images.bind( 'load.imagesLoaded error.imagesLoaded', imgLoaded ).each( function() { - // cached images don't fire load sometimes, so we reset src. - var src = this.src; - // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f - // data uri bypasses webkit log warning (thx doug jones) - this.src = blank; - this.src = src; - }); +/** + * get collection of Outlayer.Items, given Elements + * @param {Array} elems + * @returns {Array} items - Outlayer.Items + */ +proto.getItems = function( elems ) { + elems = utils.makeArray( elems ); + var items = []; + elems.forEach( function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + items.push( item ); + } + }, this ); + + return items; +}; - return $this; +/** + * remove element(s) from instance and DOM + * @param {Array or NodeList or Element} elems + */ +proto.remove = function( elems ) { + var removeItems = this.getItems( elems ); + + this._emitCompleteOnItems( 'remove', removeItems ); + + // bail if no items to remove + if ( !removeItems || !removeItems.length ) { + return; + } + + removeItems.forEach( function( item ) { + item.remove(); + // remove item from collection + utils.removeFrom( this.items, item ); + }, this ); +}; + +// ----- destroy ----- // + +// remove and disable Outlayer instance +proto.destroy = function() { + // clean up dynamic styles + var style = this.element.style; + style.height = ''; + style.position = ''; + style.width = ''; + // destroy items + this.items.forEach( function( item ) { + item.destroy(); + }); + + this.unbindResize(); + + var id = this.element.outlayerGUID; + delete instances[ id ]; // remove reference to instance by id + delete this.element.outlayerGUID; + // remove data for jQuery + if ( jQuery ) { + jQuery.removeData( this.element, this.constructor.namespace ); + } + +}; + +// -------------------------- data -------------------------- // + +/** + * get Outlayer instance from element + * @param {Element} elem + * @returns {Outlayer} + */ +Outlayer.data = function( elem ) { + elem = utils.getQueryElement( elem ); + var id = elem && elem.outlayerGUID; + return id && instances[ id ]; +}; + + +// -------------------------- create Outlayer class -------------------------- // + +/** + * create a layout class + * @param {String} namespace + */ +Outlayer.create = function( namespace, options ) { + // sub-class Outlayer + var Layout = subclass( Outlayer ); + // apply new options and compatOptions + Layout.defaults = utils.extend( {}, Outlayer.defaults ); + utils.extend( Layout.defaults, options ); + Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions ); + + Layout.namespace = namespace; + + Layout.data = Outlayer.data; + + // sub-class Item + Layout.Item = subclass( Item ); + + // -------------------------- declarative -------------------------- // + + utils.htmlInit( Layout, namespace ); + + // -------------------------- jQuery bridge -------------------------- // + + // make into jQuery plugin + if ( jQuery && jQuery.bridget ) { + jQuery.bridget( namespace, Layout ); + } + + return Layout; +}; + +function subclass( Parent ) { + function SubClass() { + Parent.apply( this, arguments ); + } + + SubClass.prototype = Object.create( Parent.prototype ); + SubClass.prototype.constructor = SubClass; + + return SubClass; +} + +// ----- helpers ----- // + +// how many milliseconds are in each unit +var msUnits = { + ms: 1, + s: 1000 +}; + +// munge time-like parameter into millisecond number +// '0.4s' -> 40 +function getMilliseconds( time ) { + if ( typeof time == 'number' ) { + return time; + } + var matches = time.match( /(^\d*\.?\d*)(\w*)/ ); + var num = matches && matches[1]; + var unit = matches && matches[2]; + if ( !num.length ) { + return 0; + } + num = parseFloat( num ); + var mult = msUnits[ unit ] || 1; + return num * mult; +} + +// ----- fin ----- // + +// back in global +Outlayer.Item = Item; + +return Outlayer; + +})); + +/*! + * Masonry v4.2.1 + * Cascading grid layout library + * https://masonry.desandro.com + * MIT License + * by David DeSandro + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( [ + 'outlayer/outlayer', + 'get-size/get-size' + ], + factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + require('outlayer'), + require('get-size') + ); + } else { + // browser global + window.Masonry = factory( + window.Outlayer, + window.getSize + ); + } + +}( window, function factory( Outlayer, getSize ) { + + + +// -------------------------- masonryDefinition -------------------------- // + + // create an Outlayer layout class + var Masonry = Outlayer.create('masonry'); + // isFitWidth -> fitWidth + Masonry.compatOptions.fitWidth = 'isFitWidth'; + + var proto = Masonry.prototype; + + proto._resetLayout = function() { + this.getSize(); + this._getMeasurement( 'columnWidth', 'outerWidth' ); + this._getMeasurement( 'gutter', 'outerWidth' ); + this.measureColumns(); + + // reset column Y + this.colYs = []; + for ( var i=0; i < this.cols; i++ ) { + this.colYs.push( 0 ); + } + + this.maxY = 0; + this.horizontalColIndex = 0; }; + proto.measureColumns = function() { + this.getContainerWidth(); + // if columnWidth is 0, default to outerWidth of first item + if ( !this.columnWidth ) { + var firstItem = this.items[0]; + var firstItemElem = firstItem && firstItem.element; + // columnWidth fall back to item of first element + this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || + // if first elem has no width, default to size of container + this.containerWidth; + } - // helper function for logging errors - // $.error breaks jQuery chaining - var logError = function( message ) { - if ( window.console ) { - window.console.error( message ); + var columnWidth = this.columnWidth += this.gutter; + + // calculate columns + var containerWidth = this.containerWidth + this.gutter; + var cols = containerWidth / columnWidth; + // fix rounding errors, typically with gutters + var excess = columnWidth - containerWidth % columnWidth; + // if overshoot is less than a pixel, round up, otherwise floor it + var mathMethod = excess && excess < 1 ? 'round' : 'floor'; + cols = Math[ mathMethod ]( cols ); + this.cols = Math.max( cols, 1 ); + }; + + proto.getContainerWidth = function() { + // container is parent if fit width + var isFitWidth = this._getOption('fitWidth'); + var container = isFitWidth ? this.element.parentNode : this.element; + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var size = getSize( container ); + this.containerWidth = size && size.innerWidth; + }; + + proto._getItemLayoutPosition = function( item ) { + item.getSize(); + // how many columns does this brick span + var remainder = item.size.outerWidth % this.columnWidth; + var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; + // round if off by 1 pixel, otherwise use ceil + var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); + colSpan = Math.min( colSpan, this.cols ); + // use horizontal or top column position + var colPosMethod = this.options.horizontalOrder ? + '_getHorizontalColPosition' : '_getTopColPosition'; + var colPosition = this[ colPosMethod ]( colSpan, item ); + // position the brick + var position = { + x: this.columnWidth * colPosition.col, + y: colPosition.y + }; + // apply setHeight to necessary columns + var setHeight = colPosition.y + item.size.outerHeight; + var setMax = colSpan + colPosition.col; + for ( var i = colPosition.col; i < setMax; i++ ) { + this.colYs[i] = setHeight; } + + return position; }; - - // ======================= Plugin bridge =============================== - // leverages data method to either create or return $.Mason constructor - // A bit from jQuery UI - // https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js - // A bit from jcarousel - // https://github.com/jsor/jcarousel/blob/master/lib/jquery.jcarousel.js - - $.fn.masonry = function( options ) { - if ( typeof options === 'string' ) { - // call method - var args = Array.prototype.slice.call( arguments, 1 ); - - this.each(function(){ - var instance = $.data( this, 'masonry' ); - if ( !instance ) { - logError( "cannot call methods on masonry prior to initialization; " + - "attempted to call method '" + options + "'" ); - return; - } - if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) { - logError( "no such method '" + options + "' for masonry instance" ); - return; - } - // apply method - instance[ options ].apply( instance, args ); - }); - } else { - this.each(function() { - var instance = $.data( this, 'masonry' ); - if ( instance ) { - // apply options & init - instance.option( options || {} ); - instance._init(); - } else { - // initialize new instance - $.data( this, 'masonry', new $.Mason( options, this ) ); - } - }); + + proto._getTopColPosition = function( colSpan ) { + var colGroup = this._getTopColGroup( colSpan ); + // get the minimum Y value from the columns + var minimumY = Math.min.apply( Math, colGroup ); + + return { + col: colGroup.indexOf( minimumY ), + y: minimumY, + }; + }; + + /** + * @param {Number} colSpan - number of columns the element spans + * @returns {Array} colGroup + */ + proto._getTopColGroup = function( colSpan ) { + if ( colSpan < 2 ) { + // if brick spans only one column, use all the column Ys + return this.colYs; } - return this; + + var colGroup = []; + // how many different places could this brick fit horizontally + var groupCount = this.cols + 1 - colSpan; + // for each group potential horizontal position + for ( var i = 0; i < groupCount; i++ ) { + colGroup[i] = this._getColGroupY( i, colSpan ); + } + return colGroup; + }; + + proto._getColGroupY = function( col, colSpan ) { + if ( colSpan < 2 ) { + return this.colYs[ col ]; + } + // make an array of colY values for that one group + var groupColYs = this.colYs.slice( col, col + colSpan ); + // and get the max value of the array + return Math.max.apply( Math, groupColYs ); + }; + + // get column position based on horizontal index. #873 + proto._getHorizontalColPosition = function( colSpan, item ) { + var col = this.horizontalColIndex % this.cols; + var isOver = colSpan > 1 && col + colSpan > this.cols; + // shift to next row if item can't fit on current row + col = isOver ? 0 : col; + // don't let zero-size items take up space + var hasSize = item.size.outerWidth && item.size.outerHeight; + this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex; + + return { + col: col, + y: this._getColGroupY( col, colSpan ), + }; }; -})( window, jQuery ); \ No newline at end of file + proto._manageStamp = function( stamp ) { + var stampSize = getSize( stamp ); + var offset = this._getElementOffset( stamp ); + // get the columns that this stamp affects + var isOriginLeft = this._getOption('originLeft'); + var firstX = isOriginLeft ? offset.left : offset.right; + var lastX = firstX + stampSize.outerWidth; + var firstCol = Math.floor( firstX / this.columnWidth ); + firstCol = Math.max( 0, firstCol ); + var lastCol = Math.floor( lastX / this.columnWidth ); + // lastCol should not go over if multiple of columnWidth #425 + lastCol -= lastX % this.columnWidth ? 0 : 1; + lastCol = Math.min( this.cols - 1, lastCol ); + // set colYs to bottom of the stamp + + var isOriginTop = this._getOption('originTop'); + var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) + + stampSize.outerHeight; + for ( var i = firstCol; i <= lastCol; i++ ) { + this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); + } + }; + + proto._getContainerSize = function() { + this.maxY = Math.max.apply( Math, this.colYs ); + var size = { + height: this.maxY + }; + + if ( this._getOption('fitWidth') ) { + size.width = this._getContainerFitWidth(); + } + + return size; + }; + + proto._getContainerFitWidth = function() { + var unusedCols = 0; + // count unused columns + var i = this.cols; + while ( --i ) { + if ( this.colYs[i] !== 0 ) { + break; + } + unusedCols++; + } + // fit container to columns that have been used + return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; + }; + + proto.needsResizeLayout = function() { + var previousWidth = this.containerWidth; + this.getContainerWidth(); + return previousWidth != this.containerWidth; + }; + + return Masonry; + +})); diff --git a/ckan/public/base/javascript/resource.config b/ckan/public/base/javascript/resource.config index 215dcc54a17..8037ce0bded 100644 --- a/ckan/public/base/javascript/resource.config +++ b/ckan/public/base/javascript/resource.config @@ -57,6 +57,7 @@ main = plugins/jquery.truncator.js plugins/jquery.masonry.js plugins/jquery.form-warning.js + plugins/jquery.images-loaded.js sandbox.js module.js diff --git a/ckan/public/base/less/bootstrap-variables.less b/ckan/public/base/less/bootstrap-variables.less index 32fc8bb3a1f..f03c3e40548 100644 --- a/ckan/public/base/less/bootstrap-variables.less +++ b/ckan/public/base/less/bootstrap-variables.less @@ -14,7 +14,7 @@ @gray-light: lighten(@gray-base, 46.7%); // #777 @gray-lighter: lighten(@gray-base, 93.5%); // #eee -@brand-primary: darken(#428bca, 6.5%); // #337ab7 +@brand-primary: #206b82; @brand-success: #5cb85c; @brand-info: #5bc0de; @brand-warning: #f0ad4e; @@ -66,7 +66,7 @@ //** By default, this inherits from the ``. @headings-font-family: inherit; -@headings-font-weight: 500; +@headings-font-weight: 700; @headings-line-height: 1.1; @headings-color: inherit; diff --git a/ckan/public/base/less/bootstrap.less b/ckan/public/base/less/bootstrap.less index 201e5ccaff8..f86ae4dac6c 100644 --- a/ckan/public/base/less/bootstrap.less +++ b/ckan/public/base/less/bootstrap.less @@ -51,7 +51,7 @@ @import "@{bootstrap-path}modals.less"; @import "@{bootstrap-path}tooltip.less"; @import "@{bootstrap-path}popovers.less"; -// @import "@{bootstrap-path}carousel.less"; +@import "@{bootstrap-path}carousel.less"; // Utility classes @import "@{bootstrap-path}utilities.less"; diff --git a/ckan/public/base/less/dataset.less b/ckan/public/base/less/dataset.less index 8076a0f47b1..a3da83d2d8f 100644 --- a/ckan/public/base/less/dataset.less +++ b/ckan/public/base/less/dataset.less @@ -99,7 +99,7 @@ .resource-item .btn-group { position: absolute; - top: 14px; + top: (@grid-gutter-width/2 - 6); right: 10px; } @@ -337,4 +337,4 @@ .resource-view { margin-top: 20px; -} \ No newline at end of file +} diff --git a/ckan/public/base/less/forms.less b/ckan/public/base/less/forms.less index 85d54848b24..79cc069b63f 100644 --- a/ckan/public/base/less/forms.less +++ b/ckan/public/base/less/forms.less @@ -93,12 +93,6 @@ textarea { width: 100%; } -.control-medium { - @media (min-width: @screen-md-min) { - width: calc(~"50% - " @grid-gutter-width/2); - } -} - .control-large { input { .input-lg; @@ -123,11 +117,7 @@ textarea { } .form-actions { - // background: none; - // overflow: auto; // margin-left: -@gutterX; - // margin-right: -@gutterX; - // margin-bottom: 0; // Prevents reduces the padding when included in a module. - // padding-bottom: 0; + overflow: auto; } @media (min-width: @screen-sm-min) { @@ -147,6 +137,7 @@ textarea { .form-actions .action-info { float: left; width: 50%; + margin-right: @grid-gutter-width/2; } } @@ -260,7 +251,8 @@ form .control-medium .info-block.info-inline { padding: 10px @gutterSmallX 0; } -input[data-module="autocomplete"] { +input[data-module="autocomplete"], +select[data-module="autocomplete"] { width: 100%; } @@ -659,6 +651,7 @@ input[data-module="autocomplete"] { .select2-container { margin-top: 1px; + margin-bottom: @grid-gutter-width/4; } .select2-container-multi { @@ -751,8 +744,8 @@ input[data-module="autocomplete"] { .btn-remove-url { position: absolute; margin-right: 0; - top: 4px; - right: 5px; + top: @grid-gutter-width/5; + right: @grid-gutter-width/6; padding: 0 12px; .border-radius(100px); .icon-remove { @@ -762,36 +755,28 @@ input[data-module="autocomplete"] { } .add-member-form .control-label { - width: 100%; - text-align: left; + display: block; } -.add-member-form .controls { - margin-left: auto; +.add-member-or-wrap{ + display: flex; + align-items: flex-end; + justify-content: center; + @media (max-width: @screen-sm-max){ + margin-bottom: @grid-gutter-width; + } + @media (min-width: @screen-md-min){ + min-height: @grid-gutter-width*3 + 10; + } } .add-member-or { - // float: left; - // margin-top: 75px; - // width: 7%; - // text-align: center; + text-align: center; text-transform: uppercase; color: @gray-light; font-weight: bold; } -.add-member-form .row .control-group { - float: left; - width: 45%; -} - -.add-member-form .row { - .select2-container, - input { - width: 100% !important; - } -} - #recaptcha_table { table-layout: inherit; line-height: 1; diff --git a/ckan/public/base/less/layout.less b/ckan/public/base/less/layout.less index f397776b99f..3b622f33cec 100644 --- a/ckan/public/base/less/layout.less +++ b/ckan/public/base/less/layout.less @@ -91,7 +91,6 @@ @media (max-width: @screen-xs-max) { .wrapper { - margin: 0 -20px; border-width: 0; .box-shadow(0); .border-radius(0); diff --git a/ckan/public/base/less/masthead.less b/ckan/public/base/less/masthead.less index 3ab192921c4..a04e2e70fdc 100644 --- a/ckan/public/base/less/masthead.less +++ b/ckan/public/base/less/masthead.less @@ -113,15 +113,18 @@ white-space: nowrap; } } + .logo{ + display: inline-block; + img{ + max-height: @logoMaxHeight; + } + } .navbar-collapse { padding: @grid-gutter-width/3 0; } .section { float: left; } - input[type="text"] { - border-color: darken(@mastheadBackgroundColor, 5); - } .navigation { &.section { @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { @@ -190,11 +193,8 @@ } @media (max-width: @screen-sm-max) { - .account-masthead { - margin-left: -@grid-gutter-width/2; - margin-right: -@grid-gutter-width/2; - padding-left: @grid-gutter-width/2; - padding-right: @grid-gutter-width/2; + .navbar-toggle{ + margin-right: 0; } .masthead { .section { @@ -212,3 +212,13 @@ } } } + +@media (max-width: @screen-xs-max){ + .masthead { + .navbar-collapse{ + clear: both; + margin-left: 0; + margin-right: 0; + } + } +} diff --git a/ckan/public/base/less/media.less b/ckan/public/base/less/media.less index 193726c0612..22434b35dad 100644 --- a/ckan/public/base/less/media.less +++ b/ckan/public/base/less/media.less @@ -18,25 +18,18 @@ .list-unstyled; .clearfix; min-height: 205px; - // margin: 0 -25px; - // padding-bottom: 15px; + padding-top: @grid-gutter-width/2; background: lighten(@layoutBackgroundColor, 5%) url("@{bgPath}"); border: 1px solid @moduleHeadingBorderColor; border-width: 1px 0; } -// @media (min-width: @screen-sm-min) { -// .media-grid { -// margin-left: -27px; -// } -// } - .media-item { position: relative; float: left; width: 178px; padding: @grid-gutter-width/2; - margin: @grid-gutter-width/2 0 0 @grid-gutter-width/2; + margin: 0 0 @grid-gutter-width/2 @grid-gutter-width/2; background-color: white; .border-radius(3px); span.count { @@ -148,4 +141,4 @@ .wide .media-item { width: 186px; -} \ No newline at end of file +} diff --git a/ckan/public/base/less/module.less b/ckan/public/base/less/module.less index 943acdaca90..7cb71cdd8ac 100644 --- a/ckan/public/base/less/module.less +++ b/ckan/public/base/less/module.less @@ -23,6 +23,12 @@ .module-content { padding: @grid-gutter-width; + + .add-to-group{ + .btn-primary{ + margin-bottom: @grid-gutter-width; + } + } } // @media (min-width: @screen-sm-min) { @@ -63,7 +69,7 @@ .pagination-wrapper{ text-align: center; border-top: 1px solid @hr-border; - padding-top: @grid-gutter-width/3; + padding-top: @grid-gutter-width/3; } // .module-content .pagination { @@ -99,6 +105,7 @@ // } .module h1 { + margin-top: 0; margin-bottom: 20px; } @@ -231,4 +238,4 @@ max-height: 50px; vertical-align: middle; } -} \ No newline at end of file +} diff --git a/ckan/public/base/less/nav.less b/ckan/public/base/less/nav.less index fe24eb41edc..e619d6c9bb3 100644 --- a/ckan/public/base/less/nav.less +++ b/ckan/public/base/less/nav.less @@ -40,11 +40,16 @@ .nav-aside li.active a:before { content: ' '; position: absolute; - top: 3px; - right: -6px; - width: 6px; + border: (@navItemActiveArrowSize*3 + 2) solid transparent; + border-right: none; + border-left-color: @navItemActiveBackgroundColor; + border-left-width: @navItemActiveArrowSize; + top: 0; + bottom: 0; + right: -@navItemActiveArrowSize; + width: @navItemActiveArrowSize; height: 34px; - background-image: url("@{imagePath}/nav-active.png?1"); + // background-image: url("@{imagePath}/nav-active.png?1"); } } @@ -59,7 +64,7 @@ .nav-aside li.active a span { white-space: nowrap; overflow: hidden; - display: block; + // display: block; } .module-narrow .nav-item>a, @@ -172,3 +177,14 @@ display: inline-block; } } + +// STACKED NAV +// ----------- + +// Stacked tabs and pills +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; // no need for the gap between nav items +} diff --git a/ckan/public/base/less/resource-view.less b/ckan/public/base/less/resource-view.less index afacc3c163b..a3818547e5f 100644 --- a/ckan/public/base/less/resource-view.less +++ b/ckan/public/base/less/resource-view.less @@ -1,18 +1,100 @@ +.resource-view { + .actions { + right: 0; + } +} + .resource-view-filters { - margin-bottom: 1em; - .resource-view-filter { - margin-bottom: 1.0em; + margin-bottom: 1em; + .resource-view-filter { + margin-bottom: 1.0em; + } + .resource-view-remove-filter { + cursor: pointer; + color: @errorText; + } + .resource-view-filter-values .select2-container { + margin-right: 0.3em; + margin-bottom: 0.2em; + width: 24% !important; + .select2-search-choice-close { + left: auto; } - .resource-view-remove-filter { - cursor: pointer; - color: @errorText; - } - .resource-view-filter-values .select2-container { - margin-right: 0.3em; - margin-bottom: 0.2em; - width: 24% !important; - .select2-search-choice-close { - left: auto; + } +} + +.resource-view-list { + &.reordering { + margin: -10px -10px 0; + li { + margin-bottom: 10px; + .border-radius(@nav-pills-border-radius - 1); + cursor: move; + a { + cursor: inherit; + } + .handle { + padding: 0; + display: block; + position: absolute; + color: @moduleHeadingActionTextColor; + left: -31px; + top: 50%; + margin-top: -15px; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + border: 1px solid @moduleHeadingBorderColor; + border-width: 1px 0 1px 1px; + background-color: @moduleBackgroundColor; + .border-radius(20px 0 0 20px); + &:hover { + text-decoration: none; + } + } + &:hover .handle { + background-color: @layoutBackgroundColor; + } + &.ui-sortable-helper { + background-color: @layoutBackgroundColor; + border: 1px solid @layoutLinkColor; + .handle { + background-color: @layoutBackgroundColor; + border-color: @layoutLinkColor; + color: @navLinkColor; } + } + } + } +} + +.resource-view-list { + >li>a { + border-radius: 0; + } + li { + margin-bottom: -3px; + border: 1px solid @moduleHeadingBorderColor; + &:first-child { + border-top-left-radius: @nav-pills-border-radius; + border-top-right-radius: @nav-pills-border-radius; + } + &:last-child { + border-bottom-left-radius: @nav-pills-border-radius; + border-bottom-right-radius: @nav-pills-border-radius; + } + .handle { + display: none; } -} \ No newline at end of file + } +} + +.view-preview-container { + .module-content { + position: relative; + } + .actions { + right: @grid-gutter-width/2; + } +} diff --git a/ckan/public/base/less/search.less b/ckan/public/base/less/search.less index 29b81e696b5..cdc2c456735 100644 --- a/ckan/public/base/less/search.less +++ b/ckan/public/base/less/search.less @@ -41,9 +41,9 @@ padding: 15px; } button { - margin-top: -4px; + margin-top: -@grid-gutter-width/2; right: 15px; - height: 30px; + // height: 30px; i { font-size: 28px; width: 28px; @@ -57,9 +57,8 @@ select { display: inline; } - select { - width: 160px; - margin: 0; + .form-control { + width: auto; } } // h2 { @@ -88,12 +87,12 @@ margin-bottom: 0; } .search-input-group { - margin-bottom: 12px; - .input-group-btn { - .btn { - margin-top: 25px; - } - } + margin-bottom: @grid-gutter-width; + // .input-group-btn { + // .btn { + // margin-top: 25px; + // } + // } } } diff --git a/ckan/public/base/less/variables.less b/ckan/public/base/less/variables.less index 5c62374cb0f..9347eb03711 100644 --- a/ckan/public/base/less/variables.less +++ b/ckan/public/base/less/variables.less @@ -12,6 +12,7 @@ @layoutBackgroundColor: #eee; @layoutTrimBackgroundColor: #fff; @layoutTrimBorderColor: #ccc; +@logoMaxHeight: 60px; @navLinkColor: #333; @navActiveBackgroundColor: #f6f6f6; @@ -44,6 +45,7 @@ @navItemActiveTextColor: #FFF; @navItemActiveBackgroundColor: #8CA0A6; +@navItemActiveArrowSize: 6px; @pillTextColor: @navItemActiveTextColor; @pillBackgroundColor: darken(@navItemActiveBackgroundColor, 10%); diff --git a/ckan/public/base/test/spec/modules/autocomplete.spec.js b/ckan/public/base/test/spec/modules/autocomplete.spec.js index 93a8fb57a54..9e8fffa0469 100644 --- a/ckan/public/base/test/spec/modules/autocomplete.spec.js +++ b/ckan/public/base/test/spec/modules/autocomplete.spec.js @@ -65,7 +65,8 @@ describe('ckan.modules.AutocompleteModule()', function () { formatNoMatches: this.module.formatNoMatches, formatInputTooShort: this.module.formatInputTooShort, createSearchChoice: this.module.formatTerm, // Not used by tags. - initSelection: this.module.formatInitialValue + initSelection: this.module.formatInitialValue, + tokenSeparators: [','] }); }); @@ -82,7 +83,8 @@ describe('ckan.modules.AutocompleteModule()', function () { formatResult: this.module.formatResult, formatNoMatches: this.module.formatNoMatches, formatInputTooShort: this.module.formatInputTooShort, - initSelection: this.module.formatInitialValue + initSelection: this.module.formatInitialValue, + tokenSeparators: [','] }); it('should watch the keydown event on the select2 input'); @@ -100,7 +102,8 @@ describe('ckan.modules.AutocompleteModule()', function () { formatResult: this.module.formatResult, formatNoMatches: this.module.formatNoMatches, formatInputTooShort: this.module.formatInputTooShort, - initSelection: this.module.formatInitialValue + initSelection: this.module.formatInitialValue, + tokenSeparators: [','] }); }); @@ -117,7 +120,8 @@ describe('ckan.modules.AutocompleteModule()', function () { formatResult: this.module.formatResult, formatNoMatches: this.module.formatNoMatches, formatInputTooShort: this.module.formatInputTooShort, - initSelection: this.module.formatInitialValue + initSelection: this.module.formatInitialValue, + tokenSeparators: [','] }); }); diff --git a/ckan/public/base/test/spec/modules/custom-fields.spec.js b/ckan/public/base/test/spec/modules/custom-fields.spec.js index ad2d7b71f19..93afad1a3d8 100644 --- a/ckan/public/base/test/spec/modules/custom-fields.spec.js +++ b/ckan/public/base/test/spec/modules/custom-fields.spec.js @@ -50,13 +50,6 @@ describe('ckan.module.CustomFieldsModule()', function () { assert.calledOnce(target); }); - - it('should add "button" classes to the remove input', function () { - this.module.initialize(); - - assert.equal(this.module.$('.checkbox.btn').length, 1, 'each item should have the .btn class'); - assert.equal(this.module.$('.checkbox.fa-times').length, 1, 'each item shoud have the .fa-times class'); - }); }); describe('.newField(element)', function () { diff --git a/ckan/public/base/vendor/select2/CONTRIBUTING.md b/ckan/public/base/vendor/select2/CONTRIBUTING.md new file mode 100644 index 00000000000..bca4baf61a3 --- /dev/null +++ b/ckan/public/base/vendor/select2/CONTRIBUTING.md @@ -0,0 +1,107 @@ +Contributing to Select2 +======================= +Looking to contribute something to Select2? **Here's how you can help.** + +Please take a moment to review this document in order to make the contribution +process easy and effective for everyone involved. + +Following these guidelines helps to communicate that you respect the time of +the developers managing and developing this open source project. In return, +they should reciprocate that respect in addressing your issue or assessing +patches and features. + +Using the issue tracker +----------------------- +When [reporting bugs][reporting-bugs] or +[requesting features][requesting-features], the +[issue tracker on GitHub][issue-tracker] is the recommended channel to use. + +The issue tracker **is not** a place for support requests. The +[mailing list][mailing-list] or [IRC channel][irc-channel] are better places to +get help. + +Reporting bugs with Select2 +--------------------------- +We really appreciate clear bug reports that _consistently_ show an issue +_within Select2_. + +The ideal bug report follows these guidelines: + +1. **Use the [GitHub issue search][issue-search]** — Check if the issue + has already been reported. +2. **Check if the issue has been fixed** — Try to reproduce the problem + using the code in the `master` branch. +3. **Isolate the problem** — Try to create an + [isolated test case][isolated-case] that consistently reproduces the problem. + +Please try to be as detailed as possible in your bug report, especially if an +isolated test case cannot be made. Some useful questions to include the answer +to are: + +- What steps can be used to reproduce the issue? +- What is the bug and what is the expected outcome? +- What browser(s) and Operating System have you tested with? +- Does the bug happen consistently across all tested browsers? +- What version of jQuery are you using? And what version of Select2? +- Are you using Select2 with other plugins? + +All of these questions will help people fix and identify any potential bugs. + +Requesting features in Select2 +------------------------------ +Select2 is a large library that carries with it a lot of functionality. Because +of this, many feature requests will not be implemented in the core library. + +Before starting work on a major feature for Select2, **contact the +[community][community] first** or you may risk spending a considerable amount of +time on something which the project developers are not interested in bringing +into the project. + +### Select2 4.0 + +Many feature requests will be closed off until 4.0, where Select2 plans to adopt +a more flexible API. If you are interested in helping with the development of +the next major Select2 release, please send a message to the +[mailing list][mailing-list] or [irc channel][irc-channel] for more information. + +Triaging issues and pull requests +--------------------------------- +Anyone can help the project maintainers triage issues and review pull requests. + +### Handling new issues + +Select2 regularly receives new issues which need to be tested and organized. + +When a new issue that comes in that is similar to another existing issue, it +should be checked to make sure it is not a duplicate. Duplicates issues should +be marked by replying to the issue with "Duplicate of #[issue number]" where +`[issue number]` is the url or issue number for the existing issue. This will +allow the project maintainers to quickly close off additional issues and keep +the discussion focused within a single issue. + +If you can test issues that are reported to Select2 that contain test cases and +confirm under what conditions bugs happen, that will allow others to identify +what causes a bug quicker. + +### Reviewing pull requests + +It is very common for pull requests to be opened for issues that contain a clear +solution to the problem. These pull requests should be rigorously reviewed by +the community before being accepted. If you are not sure about a piece of +submitted code, or know of a better way to do something, do not hesitate to make +a comment on the pull request. + +It should also be made clear that **all code contributed to Select** must be +licensable under the [Apache 2 or GPL 2 licenses][licensing]. Code that cannot +be released under either of these licenses **cannot be accepted** into the +project. + +[community]: https://github.com/ivaynberg/select2#community +[reporting-bugs]: #reporting-bugs-with-select2 +[requesting-features]: #requesting-features-in-select2 +[issue-tracker]: https://github.com/ivaynberg/select2/issues +[mailing-list]: https://github.com/ivaynberg/select2#mailing-list +[irc-channel]: https://github.com/ivaynberg/select2#irc-channel +[issue-search]: https://github.com/ivaynberg/select2/search?q=&type=Issues +[isolated-case]: http://css-tricks.com/6263-reduced-test-cases/ +[licensing]: https://github.com/ivaynberg/select2#copyright-and-license diff --git a/ckan/public/base/vendor/select2/LICENSE b/ckan/public/base/vendor/select2/LICENSE index 0247cc76273..49f61fcf343 100644 --- a/ckan/public/base/vendor/select2/LICENSE +++ b/ckan/public/base/vendor/select2/LICENSE @@ -13,6 +13,6 @@ http://www.apache.org/licenses/LICENSE-2.0 http://www.gnu.org/licenses/gpl-2.0.html Unless required by applicable law or agreed to in writing, software distributed under the Apache License -or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for the specific language governing permissions and limitations under the Apache License and the GPL License. diff --git a/ckan/public/base/vendor/select2/README.md b/ckan/public/base/vendor/select2/README.md index 406fe79dc95..cb64dee9d02 100644 --- a/ckan/public/base/vendor/select2/README.md +++ b/ckan/public/base/vendor/select2/README.md @@ -3,7 +3,7 @@ Select2 Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. -To get started, checkout examples and documentation at http://ivaynberg.github.com/select2 +To get started, checkout examples and documentation at http://select2.github.io/select2/ Use cases --------- @@ -24,43 +24,59 @@ Browser compatibility * Firefox 10+ * Safari 3+ * Opera 10.6+ - + Usage ----- -You can source Select2 directly from a [CDN like JSDliver](http://www.jsdelivr.com/#!select2), [download it from this GitHub repo](https://github.com/ivaynberg/select2/tags), or use one of the integrations below. +You can source Select2 directly from a CDN like [jsDelivr](http://www.jsdelivr.com/#!select2) or [CDNJS](http://www.cdnjs.com/libraries/select2), [download it from this GitHub repo](https://github.com/select2/select2/tags), or use one of the integrations below. Integrations ------------ * [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org)) * [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails) -* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org)) +* [AngularUI](http://angular-ui.github.io/#ui-select) ([AngularJS](https://angularjs.org/)) * [Django](https://github.com/applegrew/django-select2) * [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin) * [Symfony2](https://github.com/avocode/FormExtensions) * [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins) * [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/)) +* [Meteor](https://jquery-select2.meteor.com) * [Yii 2.x](http://demos.krajee.com/widgets#select2) * [Yii 1.x](https://github.com/tonybolzan/yii-select2) +* [AtmosphereJS](https://atmospherejs.com/package/jquery-select2) +* [EmberJS](https://github.com/iStefo/ember-select-2) + +### Example Integrations + +* [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration) +* [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration) +* [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example) +* [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example) Internationalization (i18n) --------------------------- -Select2 supports multiple languages by simply including the right -language JS file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.). +Select2 supports multiple languages by simply including the right language JS +file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`. Missing a language? Just copy `select2_locale_en.js.template`, translate it, and make a pull request back to Select2 here on GitHub. -Bug tracker ------------ +Documentation +------------- + +The documentation for Select2 is available [through GitHub Pages](http://select2.github.io/select2/) and is located within this repository in the [`gh-pages` branch](https://github.com/ivaynberg/select2/tree/gh-pages). + +Community +--------- + +### Bug tracker Have a bug? Please create an issue here on GitHub! https://github.com/ivaynberg/select2/issues -Mailing list ------------- +### Mailing list Have a question? Ask on our mailing list! @@ -68,11 +84,20 @@ select2@googlegroups.com https://groups.google.com/d/forum/select2 +### IRC channel + +Need help implementing Select2 in your project? Ask in our IRC channel! + +**Network:** [Freenode](https://freenode.net/) (`chat.freenode.net`) + +**Channel:** `#select2` + +**Web access:** https://webchat.freenode.net/?channels=select2 Copyright and license --------------------- -Copyright 2012 Igor Vaynberg +Copyright 2015 Igor Vaynberg This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU General Public License version 2 (the "GPL License"). You may choose either license to govern your diff --git a/ckan/public/base/vendor/select2/bower.json b/ckan/public/base/vendor/select2/bower.json index 80e8596e806..c727c1e45a3 100644 --- a/ckan/public/base/vendor/select2/bower.json +++ b/ckan/public/base/vendor/select2/bower.json @@ -1,6 +1,6 @@ { "name": "select2", - "version": "3.4.8", + "version": "3.5.4", "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"], "dependencies": { "jquery": ">= 1.7.1" diff --git a/ckan/public/base/vendor/select2/component.json b/ckan/public/base/vendor/select2/component.json index ad7abf9d9fa..1d942e65922 100644 --- a/ckan/public/base/vendor/select2/component.json +++ b/ckan/public/base/vendor/select2/component.json @@ -2,7 +2,7 @@ "name": "select2", "repo": "ivaynberg/select2", "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.", - "version": "3.4.8", + "version": "3.5.4", "demo": "http://ivaynberg.github.io/select2/", "keywords": [ "jquery" diff --git a/ckan/public/base/vendor/select2/composer.json b/ckan/public/base/vendor/select2/composer.json index c50fadba855..cb8ddb5f36f 100644 --- a/ckan/public/base/vendor/select2/composer.json +++ b/ckan/public/base/vendor/select2/composer.json @@ -2,7 +2,7 @@ "name": "ivaynberg/select2", "description": "Select2 is a jQuery based replacement for select boxes.", - "version": "3.4.8", + "version": "3.5.4", "type": "component", "homepage": "http://ivaynberg.github.io/select2/", "license": "Apache-2.0", diff --git a/ckan/public/base/vendor/select2/package.json b/ckan/public/base/vendor/select2/package.json index 75ad84acaf8..d61868bd097 100644 --- a/ckan/public/base/vendor/select2/package.json +++ b/ckan/public/base/vendor/select2/package.json @@ -5,7 +5,7 @@ "author": "Igor Vaynberg", "repository": {"type": "git", "url": "git://github.com/ivaynberg/select2.git"}, "main": "select2.js", - "version": "3.4.8", + "version": "3.5.4", "jspm": { "main": "select2", "files": ["select2.js", "select2.png", "select2.css", "select2-spinner.gif"], diff --git a/ckan/public/base/vendor/select2/release.sh b/ckan/public/base/vendor/select2/release.sh index 0d2e279ead4..3b63f96621e 100755 --- a/ckan/public/base/vendor/select2/release.sh +++ b/ckan/public/base/vendor/select2/release.sh @@ -20,7 +20,7 @@ branch="build-$ver" curbranch=`git branch | grep "*" | sed "s/* //"` timestamp=$(date) tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g" -remote="github" +remote="origin" echo "Pulling from origin" diff --git a/ckan/public/base/vendor/select2/select2.css b/ckan/public/base/vendor/select2/select2.css index 1eb4d229f6d..915347037e0 100644 --- a/ckan/public/base/vendor/select2/select2.css +++ b/ckan/public/base/vendor/select2/select2.css @@ -1,13 +1,10 @@ /* -Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 +Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015 */ .select2-container { margin: 0; position: relative; display: inline-block; - /* inline-block for ie7 */ - zoom: 1; - *display: inline; vertical-align: middle; } @@ -56,6 +53,10 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background-image: linear-gradient(to top, #eee 0%, #fff 50%); } +html[dir="rtl"] .select2-container .select2-choice { + padding: 0 8px 0 0; +} + .select2-container.select2-drop-above .select2-choice { border-bottom-color: #aaa; @@ -84,6 +85,11 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 width: auto; } +html[dir="rtl"] .select2-container .select2-choice > .select2-chosen { + margin-left: 26px; + margin-right: 0; +} + .select2-container .select2-choice abbr { display: none; width: 12px; @@ -171,10 +177,6 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 width: auto; } -.select2-drop-auto-width .select2-search { - padding-top: 4px; -} - .select2-container .select2-choice .select2-arrow { display: inline-block; width: 18px; @@ -196,6 +198,15 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background-image: linear-gradient(to top, #ccc 0%, #eee 60%); } +html[dir="rtl"] .select2-container .select2-choice .select2-arrow { + left: 0; + right: auto; + + border-left: none; + border-right: 1px solid #aaa; + border-radius: 4px 0 0 4px; +} + .select2-container .select2-choice .select2-arrow b { display: block; width: 100%; @@ -203,13 +214,16 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background: url('select2.png') no-repeat 0 1px; } +html[dir="rtl"] .select2-container .select2-choice .select2-arrow b { + background-position: 2px 1px; +} + .select2-search { display: inline-block; width: 100%; min-height: 26px; margin: 0; - padding-left: 4px; - padding-right: 4px; + padding: 4px 4px 0 4px; position: relative; z-index: 10000; @@ -241,8 +255,14 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } -.select2-drop.select2-drop-above .select2-search input { - margin-top: 4px; +html[dir="rtl"] .select2-search input { + padding: 4px 5px 4px 20px; + + background: #fff url('select2.png') no-repeat -37px -22px; + background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } .select2-search input.select2-active { @@ -295,10 +315,18 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 border-left: none; filter: none; } +html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow { + border-right: none; +} + .select2-dropdown-open .select2-choice .select2-arrow b { background-position: -18px 1px; } +html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b { + background-position: -16px 1px; +} + .select2-hidden-accessible { border: 0; clip: rect(0 0 0 0); @@ -321,6 +349,11 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } +html[dir="rtl"] .select2-results { + padding: 0 4px 0 0; + margin: 4px 0 4px 4px; +} + .select2-results ul.select2-result-sub { margin: 0; padding-left: 0; @@ -377,9 +410,9 @@ Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 color: #000; } - .select2-results .select2-no-results, .select2-results .select2-searching, +.select2-results .select2-ajax-error, .select2-results .select2-selection-limit { background: #f4f4f4; display: list-item; @@ -409,6 +442,10 @@ disabled look for disabled choices in the results dropdown background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%; } +.select2-results .select2-ajax-error { + background: rgba(255, 50, 50, .2); +} + .select2-more-results { background: #f4f4f4; display: list-item; @@ -440,7 +477,7 @@ disabled look for disabled choices in the results dropdown height: auto !important; height: 1%; margin: 0; - padding: 0; + padding: 0 5px 0 0; position: relative; border: 1px solid #aaa; @@ -454,6 +491,10 @@ disabled look for disabled choices in the results dropdown background-image: linear-gradient(to bottom, #eee 1%, #fff 15%); } +html[dir="rtl"] .select2-container-multi .select2-choices { + padding: 0 0 0 5px; +} + .select2-locked { padding: 3px 5px 3px 5px !important; } @@ -533,12 +574,12 @@ html[dir="rtl"] .select2-container-multi .select2-choices li background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); } html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice { - margin-left: 0; - margin-right: 5px; + margin: 3px 5px 3px 0; + padding: 3px 18px 3px 5px; } .select2-container-multi .select2-choices .select2-search-choice .select2-chosen { cursor: default; @@ -568,6 +609,11 @@ html[dir="rtl"] .select2-search-choice-close { left: 3px; } +html[dir="rtl"] .select2-container-multi .select2-search-choice-close { + left: auto; + right: 2px; +} + .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { background-position: right -11px; } diff --git a/ckan/public/base/vendor/select2/select2.jquery.json b/ckan/public/base/vendor/select2/select2.jquery.json index e9119279f11..ee7443cffbc 100644 --- a/ckan/public/base/vendor/select2/select2.jquery.json +++ b/ckan/public/base/vendor/select2/select2.jquery.json @@ -11,7 +11,7 @@ "tag", "tagging" ], - "version": "3.4.8", + "version": "3.5.4", "author": { "name": "Igor Vaynberg", "url": "https://github.com/ivaynberg" diff --git a/ckan/public/base/vendor/select2/select2.js b/ckan/public/base/vendor/select2/select2.js index 2969da5d1f7..195ccee5bb0 100644 --- a/ckan/public/base/vendor/select2/select2.js +++ b/ckan/public/base/vendor/select2/select2.js @@ -1,7 +1,7 @@ /* Copyright 2012 Igor Vaynberg -Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014 +Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015 This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU General Public License version 2 (the "GPL License"). You may choose either license to govern your @@ -46,7 +46,7 @@ the specific language governing permissions and limitations under the Apache Lic return; } - var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer, + var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer, lastMousePosition={x:0,y:0}, $document, scrollBarDimensions, KEY = { @@ -98,7 +98,7 @@ the specific language governing permissions and limitations under the Apache Lic }, MEASURE_SCROLLBAR_TEMPLATE = "
      ", - DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z"}; + DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"}; $document = $(document); @@ -132,7 +132,7 @@ the specific language governing permissions and limitations under the Apache Lic function measureScrollbar () { var $template = $( MEASURE_SCROLLBAR_TEMPLATE ); - $template.appendTo('body'); + $template.appendTo(document.body); var dim = { width: $template.width() - $template[0].clientWidth, @@ -160,16 +160,16 @@ the specific language governing permissions and limitations under the Apache Lic } /** - * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty + * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty * strings * @param string * @param separator */ - function splitVal(string, separator) { + function splitVal(string, separator, transform) { var val, i, l; if (string === null || string.length < 1) return []; val = string.split(separator); - for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]); + for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]); return val; } @@ -193,10 +193,6 @@ the specific language governing permissions and limitations under the Apache Lic }); } - $document.on("mousemove", function (e) { - lastMousePosition.x = e.pageX; - lastMousePosition.y = e.pageY; - }); /** * filters mouse events so an event is fired only if the mouse moved. @@ -315,7 +311,7 @@ the specific language governing permissions and limitations under the Apache Lic whiteSpace: "nowrap" }); sizer.attr("class","select2-sizer"); - $("body").append(sizer); + $(document.body).append(sizer); } sizer.text(e.val()); return sizer.width(); @@ -324,27 +320,34 @@ the specific language governing permissions and limitations under the Apache Lic function syncCssClasses(dest, src, adapter) { var classes, replacements = [], adapted; - classes = dest.attr("class"); + classes = $.trim(dest.attr("class")); + if (classes) { classes = '' + classes; // for IE which returns object - $(classes.split(" ")).each2(function() { + + $(classes.split(/\s+/)).each2(function() { if (this.indexOf("select2-") === 0) { replacements.push(this); } }); } - classes = src.attr("class"); + + classes = $.trim(src.attr("class")); + if (classes) { classes = '' + classes; // for IE which returns object - $(classes.split(" ")).each2(function() { + + $(classes.split(/\s+/)).each2(function() { if (this.indexOf("select2-") !== 0) { adapted = adapter(this); + if (adapted) { replacements.push(adapted); } } }); } + dest.attr("class", replacements.join(" ")); } @@ -391,7 +394,7 @@ the specific language governing permissions and limitations under the Apache Lic * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url. * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often - * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2. + * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2. * The expected format is an object containing the following keys: * results array of objects that will be used as choices * more (optional) boolean indicating whether there are more results available @@ -438,7 +441,18 @@ the specific language governing permissions and limitations under the Apache Lic data: data, success: function (data) { // TODO - replace query.page with query so users have access to term, page, etc. - var results = options.results(data, query.page); + // added query as third paramter to keep backwards compatibility + var results = options.results(data, query.page, query); + query.callback(results); + }, + error: function(jqXHR, textStatus, errorThrown){ + var results = { + hasError: true, + jqXHR: jqXHR, + textStatus: textStatus, + errorThrown: errorThrown + }; + query.callback(results); } }); @@ -553,10 +567,18 @@ the specific language governing permissions and limitations under the Apache Lic throw new Error(formatterName +" must be a string, function, or falsy value"); } - function evaluate(val) { + /** + * Returns a given value + * If given a function, returns its output + * + * @param val string|function + * @param context value of "this" to be passed to function + * @returns {*} + */ + function evaluate(val, context) { if ($.isFunction(val)) { - var args = Array.prototype.slice.call(arguments, 1); - return val.apply(null, args); + var args = Array.prototype.slice.call(arguments, 2); + return val.apply(context, args); } return val; } @@ -629,7 +651,7 @@ the specific language governing permissions and limitations under the Apache Lic function cleanupJQueryElements() { var self = this; - Array.prototype.forEach.call(arguments, function (element) { + $.each(arguments, function (i, element) { self[element].remove(); self[element] = null; }); @@ -677,12 +699,15 @@ the specific language governing permissions and limitations under the Apache Lic this.container = this.createContainer(); - this.liveRegion = $("", { - role: "status", - "aria-live": "polite" - }) - .addClass("select2-hidden-accessible") - .appendTo(document.body); + this.liveRegion = $('.select2-hidden-accessible'); + if (this.liveRegion.length == 0) { + this.liveRegion = $("", { + role: "status", + "aria-live": "polite" + }) + .addClass("select2-hidden-accessible") + .appendTo(document.body); + } this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid()); this.containerEventName= this.containerId @@ -692,13 +717,13 @@ the specific language governing permissions and limitations under the Apache Lic this.container.attr("title", opts.element.attr("title")); - this.body = $("body"); + this.body = $(document.body); syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); this.container.attr("style", opts.element.attr("style")); - this.container.css(evaluate(opts.containerCss)); - this.container.addClass(evaluate(opts.containerCssClass)); + this.container.css(evaluate(opts.containerCss, this.opts.element)); + this.container.addClass(evaluate(opts.containerCssClass, this.opts.element)); this.elementTabIndex = this.opts.element.attr("tabindex"); @@ -715,7 +740,7 @@ the specific language governing permissions and limitations under the Apache Lic syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); - this.dropdown.addClass(evaluate(opts.dropdownCssClass)); + this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element)); this.dropdown.data("select2", this); this.dropdown.on("click", killEvent); @@ -789,7 +814,7 @@ the specific language governing permissions and limitations under the Apache Lic // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal. this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); }); - this.nextSearchTerm = undefined; + this.lastSearchTerm = undefined; if ($.isFunction(this.opts.initSelection)) { // initialize selection based on the current value of the source element @@ -824,30 +849,42 @@ the specific language governing permissions and limitations under the Apache Lic // abstract destroy: function () { - var element=this.opts.element, select2 = element.data("select2"); + var element=this.opts.element, select2 = element.data("select2"), self = this; this.close(); + if (element.length && element[0].detachEvent && self._sync) { + element.each(function () { + if (self._sync) { + this.detachEvent("onpropertychange", self._sync); + } + }); + } if (this.propertyObserver) { this.propertyObserver.disconnect(); this.propertyObserver = null; } + this._sync = null; if (select2 !== undefined) { select2.container.remove(); select2.liveRegion.remove(); select2.dropdown.remove(); - element - .removeClass("select2-offscreen") - .removeData("select2") - .off(".select2") - .prop("autofocus", this.autofocus || false); - if (this.elementTabIndex) { - element.attr({tabindex: this.elementTabIndex}); + element.removeData("select2") + .off(".select2"); + if (!element.is("input[type='hidden']")) { + element + .show() + .prop("autofocus", this.autofocus || false); + if (this.elementTabIndex) { + element.attr({tabindex: this.elementTabIndex}); + } else { + element.removeAttr("tabindex"); + } + element.show(); } else { - element.removeAttr("tabindex"); + element.css("display", ""); } - element.show(); } cleanupJQueryElements.call(this, @@ -899,6 +936,155 @@ the specific language governing permissions and limitations under the Apache Lic }); } + opts.debug = opts.debug || $.fn.select2.defaults.debug; + + // Warnings for options renamed/removed in Select2 4.0.0 + // Only when it's enabled through debug mode + if (opts.debug && console && console.warn) { + // id was removed + if (opts.id != null) { + console.warn( + 'Select2: The `id` option has been removed in Select2 4.0.0, ' + + 'consider renaming your `id` property or mapping the property before your data makes it to Select2. ' + + 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id' + ); + } + + // text was removed + if (opts.text != null) { + console.warn( + 'Select2: The `text` option has been removed in Select2 4.0.0, ' + + 'consider renaming your `text` property or mapping the property before your data makes it to Select2. ' + + 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id' + ); + } + + // sortResults was renamed to results + if (opts.sortResults != null) { + console.warn( + 'Select2: the `sortResults` option has been renamed to `sorter` in Select2 4.0.0. ' + ); + } + + // selectOnBlur was renamed to selectOnClose + if (opts.selectOnBlur != null) { + console.warn( + 'Select2: The `selectOnBlur` option has been renamed to `selectOnClose` in Select2 4.0.0.' + ); + } + + // ajax.results was renamed to ajax.processResults + if (opts.ajax != null && opts.ajax.results != null) { + console.warn( + 'Select2: The `ajax.results` option has been renamed to `ajax.processResults` in Select2 4.0.0.' + ); + } + + // format* options were renamed to language.* + if (opts.formatNoResults != null) { + console.warn( + 'Select2: The `formatNoResults` option has been renamed to `language.noResults` in Select2 4.0.0.' + ); + } + if (opts.formatSearching != null) { + console.warn( + 'Select2: The `formatSearching` option has been renamed to `language.searching` in Select2 4.0.0.' + ); + } + if (opts.formatInputTooShort != null) { + console.warn( + 'Select2: The `formatInputTooShort` option has been renamed to `language.inputTooShort` in Select2 4.0.0.' + ); + } + if (opts.formatInputTooLong != null) { + console.warn( + 'Select2: The `formatInputTooLong` option has been renamed to `language.inputTooLong` in Select2 4.0.0.' + ); + } + if (opts.formatLoading != null) { + console.warn( + 'Select2: The `formatLoading` option has been renamed to `language.loadingMore` in Select2 4.0.0.' + ); + } + if (opts.formatSelectionTooBig != null) { + console.warn( + 'Select2: The `formatSelectionTooBig` option has been renamed to `language.maximumSelected` in Select2 4.0.0.' + ); + } + + if (opts.element.data('select2Tags')) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been renamed to `data-tags` in Select2 4.0.0.' + ); + } + } + + // Aliasing options renamed in Select2 4.0.0 + + // data-select2-tags -> data-tags + if (opts.element.data('tags') != null) { + var elemTags = opts.element.data('tags'); + + // data-tags should actually be a boolean + if (!$.isArray(elemTags)) { + elemTags = []; + } + + opts.element.data('select2Tags', elemTags); + } + + // sortResults -> sorter + if (opts.sorter != null) { + opts.sortResults = opts.sorter; + } + + // selectOnBlur -> selectOnClose + if (opts.selectOnClose != null) { + opts.selectOnBlur = opts.selectOnClose; + } + + // ajax.results -> ajax.processResults + if (opts.ajax != null) { + if ($.isFunction(opts.ajax.processResults)) { + opts.ajax.results = opts.ajax.processResults; + } + } + + // Formatters/language options + if (opts.language != null) { + var lang = opts.language; + + // formatNoMatches -> language.noMatches + if ($.isFunction(lang.noMatches)) { + opts.formatNoMatches = lang.noMatches; + } + + // formatSearching -> language.searching + if ($.isFunction(lang.searching)) { + opts.formatSearching = lang.searching; + } + + // formatInputTooShort -> language.inputTooShort + if ($.isFunction(lang.inputTooShort)) { + opts.formatInputTooShort = lang.inputTooShort; + } + + // formatInputTooLong -> language.inputTooLong + if ($.isFunction(lang.inputTooLong)) { + opts.formatInputTooLong = lang.inputTooLong; + } + + // formatLoading -> language.loadingMore + if ($.isFunction(lang.loadingMore)) { + opts.formatLoading = lang.loadingMore; + } + + // formatSelectionTooBig -> language.maximumSelected + if ($.isFunction(lang.maximumSelected)) { + opts.formatSelectionTooBig = lang.maximumSelected; + } + } + opts = $.extend({}, { populateResults: function(container, results, query) { var populate, id=this.opts.id, liveRegion=this.liveRegion; @@ -909,6 +1095,8 @@ the specific language governing permissions and limitations under the Apache Lic results = opts.sortResults(results, container, query); + // collect the created nodes for bulk append + var nodes = []; for (i = 0, l = results.length; i < l; i = i + 1) { result=results[i]; @@ -940,7 +1128,6 @@ the specific language governing permissions and limitations under the Apache Lic if (compound) { - innerContainer=$("
        "); innerContainer.addClass("select2-result-sub"); populate(result.children, innerContainer, depth+1); @@ -948,9 +1135,11 @@ the specific language governing permissions and limitations under the Apache Lic } node.data("select2-data", result); - container.append(node); + nodes.push(node[0]); } + // bulk append the created nodes + container.append(nodes); liveRegion.text(opts.formatMatches(results.length)); }; @@ -1005,11 +1194,10 @@ the specific language governing permissions and limitations under the Apache Lic query.callback(data); }); - // this is needed because inside val() we construct choices from options and there id is hardcoded + // this is needed because inside val() we construct choices from options and their id is hardcoded opts.id=function(e) { return e.id; }; } else { if (!("query" in opts)) { - if ("ajax" in opts) { ajaxUrl = opts.element.data("ajax-url"); if (ajaxUrl && ajaxUrl.length > 0) { @@ -1026,7 +1214,7 @@ the specific language governing permissions and limitations under the Apache Lic if (opts.initSelection === undefined) { opts.initSelection = function (element, callback) { var data = []; - $(splitVal(element.val(), opts.separator)).each(function () { + $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () { var obj = { id: this, text: this }, tags = opts.tags; if ($.isFunction(tags)) tags=tags(); @@ -1062,7 +1250,7 @@ the specific language governing permissions and limitations under the Apache Lic */ // abstract monitorSource: function () { - var el = this.opts.element, sync, observer; + var el = this.opts.element, observer, self = this; el.on("change.select2", this.bind(function (e) { if (this.opts.element.data("select2-change-triggered") !== true) { @@ -1070,7 +1258,7 @@ the specific language governing permissions and limitations under the Apache Lic } })); - sync = this.bind(function () { + this._sync = this.bind(function () { // sync enabled state var disabled = el.prop("disabled"); @@ -1081,27 +1269,31 @@ the specific language governing permissions and limitations under the Apache Lic if (readonly === undefined) readonly = false; this.readonly(readonly); - syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); - this.container.addClass(evaluate(this.opts.containerCssClass)); + if (this.container) { + syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); + this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element)); + } - syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); - this.dropdown.addClass(evaluate(this.opts.dropdownCssClass)); + if (this.dropdown) { + syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); + this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element)); + } }); // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener) if (el.length && el[0].attachEvent) { el.each(function() { - this.attachEvent("onpropertychange", sync); + this.attachEvent("onpropertychange", self._sync); }); } - + // safari, chrome, firefox, IE11 observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver; if (observer !== undefined) { if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; } this.propertyObserver = new observer(function (mutations) { - mutations.forEach(sync); + $.each(mutations, self._sync); }); this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false }); } @@ -1109,7 +1301,7 @@ the specific language governing permissions and limitations under the Apache Lic // abstract triggerSelect: function(data) { - var evt = $.Event("select2-selecting", { val: this.id(data), object: data }); + var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data }); this.opts.element.trigger(evt); return !evt.isDefaultPrevented(); }, @@ -1184,15 +1376,16 @@ the specific language governing permissions and limitations under the Apache Lic // abstract opened: function () { - return this.container.hasClass("select2-dropdown-open"); + return (this.container) ? this.container.hasClass("select2-dropdown-open") : false; }, // abstract positionDropdown: function() { var $dropdown = this.dropdown, - offset = this.container.offset(), - height = this.container.outerHeight(false), - width = this.container.outerWidth(false), + container = this.container, + offset = container.offset(), + height = container.outerHeight(false), + width = container.outerWidth(false), dropHeight = $dropdown.outerHeight(false), $window = $(window), windowWidth = $window.width(), @@ -1204,7 +1397,12 @@ the specific language governing permissions and limitations under the Apache Lic enoughRoomBelow = dropTop + dropHeight <= viewportBottom, enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(), dropWidth = $dropdown.outerWidth(false), - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight, + enoughRoomOnRight = function() { + return dropLeft + dropWidth <= viewPortRight; + }, + enoughRoomOnLeft = function() { + return offset.left + viewPortRight + container.outerWidth(false) > dropWidth; + }, aboveNow = $dropdown.hasClass("select2-drop-above"), bodyOffset, above, @@ -1239,7 +1437,6 @@ the specific language governing permissions and limitations under the Apache Lic dropTop = offset.top + height; dropLeft = offset.left; dropWidth = $dropdown.outerWidth(false); - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight; $dropdown.show(); // fix so the cursor does not move to the left within the search-textbox in IE @@ -1254,7 +1451,6 @@ the specific language governing permissions and limitations under the Apache Lic dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width); dropWidth > width ? width = dropWidth : dropWidth = width; dropHeight = $dropdown.outerHeight(false); - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight; } else { this.container.removeClass('select2-drop-auto-width'); @@ -1270,7 +1466,7 @@ the specific language governing permissions and limitations under the Apache Lic dropLeft -= bodyOffset.left; } - if (!enoughRoomOnRight) { + if (!enoughRoomOnRight() && enoughRoomOnLeft()) { dropLeft = offset.left + this.container.outerWidth(false) - dropWidth; } @@ -1280,10 +1476,11 @@ the specific language governing permissions and limitations under the Apache Lic }; if (above) { - css.top = offset.top - dropHeight; - css.bottom = 'auto'; this.container.addClass("select2-drop-above"); $dropdown.addClass("select2-drop-above"); + dropHeight = $dropdown.outerHeight(false); + css.top = offset.top - dropHeight; + css.bottom = 'auto'; } else { css.top = dropTop; @@ -1291,7 +1488,7 @@ the specific language governing permissions and limitations under the Apache Lic this.container.removeClass("select2-drop-above"); $dropdown.removeClass("select2-drop-above"); } - css = $.extend(css, evaluate(this.opts.dropdownCss)); + css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element)); $dropdown.css(css); }, @@ -1329,6 +1526,12 @@ the specific language governing permissions and limitations under the Apache Lic this.opening(); + // Only bind the document mousemove when the dropdown is visible + $document.on("mousemove.select2Event", function (e) { + lastMousePosition.x = e.pageX; + lastMousePosition.y = e.pageY; + }); + return true; }, @@ -1353,7 +1556,7 @@ the specific language governing permissions and limitations under the Apache Lic // create the dropdown mask if doesn't already exist mask = $("#select2-drop-mask"); - if (mask.length == 0) { + if (mask.length === 0) { mask = $(document.createElement("div")); mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask"); mask.hide(); @@ -1425,9 +1628,14 @@ the specific language governing permissions and limitations under the Apache Lic this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"); this.results.empty(); + // Now that the dropdown is closed, unbind the global document mousemove event + $document.off("mousemove.select2Event"); this.clearSearch(); this.search.removeClass("select2-active"); + + // Remove the aria active descendant for highlighted element + this.search.removeAttr("aria-activedescendant"); this.opts.element.trigger($.Event("select2-close")); }, @@ -1446,14 +1654,35 @@ the specific language governing permissions and limitations under the Apache Lic }, + /** + * @return {Boolean} Whether or not search value was changed. + * @private + */ + prefillNextSearchTerm: function () { + // initializes search's value with nextSearchTerm (if defined by user) + // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter + if(this.search.val() !== "") { + return false; + } + + var nextSearchTerm = this.opts.nextSearchTerm(this.data(), this.lastSearchTerm); + if(nextSearchTerm !== undefined){ + this.search.val(nextSearchTerm); + this.search.select(); + return true; + } + + return false; + }, + //abstract getMaximumSelectionSize: function() { - return evaluate(this.opts.maximumSelectionSize); + return evaluate(this.opts.maximumSelectionSize, this.opts.element); }, // abstract ensureHighlightVisible: function () { - var results = this.results, children, index, child, hb, rb, y, more; + var results = this.results, children, index, child, hb, rb, y, more, topOffset; index = this.highlight(); @@ -1473,7 +1702,9 @@ the specific language governing permissions and limitations under the Apache Lic child = $(children[index]); - hb = child.offset().top + child.outerHeight(true); + topOffset = (child.offset() || {}).top || 0; + + hb = topOffset + child.outerHeight(true); // if this is the last child lets also make sure select2-more-results is visible if (index === children.length - 1) { @@ -1483,11 +1714,11 @@ the specific language governing permissions and limitations under the Apache Lic } } - rb = results.offset().top + results.outerHeight(true); + rb = results.offset().top + results.outerHeight(false); if (hb > rb) { results.scrollTop(results.scrollTop() + (hb - rb)); } - y = child.offset().top - results.offset().top; + y = topOffset - results.offset().top; // make sure the top of the element is visible if (y < 0 && child.css('display') != 'none' ) { @@ -1606,7 +1837,7 @@ the specific language governing permissions and limitations under the Apache Lic self.postprocessResults(data, false, false); if (data.more===true) { - more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, page+1)); + more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1))); window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10); } else { more.remove(); @@ -1659,7 +1890,7 @@ the specific language governing permissions and limitations under the Apache Lic self.liveRegion.text(results.text()); } else { - self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length)); + self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length)); } } @@ -1674,14 +1905,14 @@ the specific language governing permissions and limitations under the Apache Lic if (maxSelSize >=1) { data = this.data(); if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) { - render("
      • " + evaluate(opts.formatSelectionTooBig, maxSelSize) + "
      • "); + render("
      • " + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "
      • "); return; } } if (search.val().length < opts.minimumInputLength) { if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) { - render("
      • " + evaluate(opts.formatInputTooShort, search.val(), opts.minimumInputLength) + "
      • "); + render("
      • " + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "
      • "); } else { render(""); } @@ -1691,7 +1922,7 @@ the specific language governing permissions and limitations under the Apache Lic if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) { if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) { - render("
      • " + evaluate(opts.formatInputTooLong, search.val(), opts.maximumInputLength) + "
      • "); + render("
      • " + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "
      • "); } else { render(""); } @@ -1699,7 +1930,7 @@ the specific language governing permissions and limitations under the Apache Lic } if (opts.formatSearching && this.findHighlightableChoices().length === 0) { - render("
      • " + evaluate(opts.formatSearching) + "
      • "); + render("
      • " + evaluate(opts.formatSearching, opts.element) + "
      • "); } search.addClass("select2-active"); @@ -1734,6 +1965,12 @@ the specific language governing permissions and limitations under the Apache Lic return; } + // handle ajax error + if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) { + render("
      • " + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "
      • "); + return; + } + // save context, if any this.context = (data.context===undefined) ? null : data.context; // create a default choice and prepend it to the list @@ -1750,7 +1987,10 @@ the specific language governing permissions and limitations under the Apache Lic } if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) { - render("
      • " + evaluate(opts.formatNoMatches, search.val()) + "
      • "); + render("
      • " + evaluate(opts.formatNoMatches, opts.element, search.val()) + "
      • "); + if(this.showSearch){ + this.showSearch(search.val()); + } return; } @@ -1758,7 +1998,7 @@ the specific language governing permissions and limitations under the Apache Lic self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null}); if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) { - results.append("
      • " + self.opts.escapeMarkup(evaluate(opts.formatLoadMore, this.resultsPage)) + "
      • "); + results.append("
      • " + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "
      • "); window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10); } @@ -1855,7 +2095,7 @@ the specific language governing permissions and limitations under the Apache Lic } else if (this.opts.width === "copy" || this.opts.width === "resolve") { // check if there is inline style on the element that contains width style = this.opts.element.attr('style'); - if (style !== undefined) { + if (typeof(style) === "string") { attrs = style.split(';'); for (i = 0, l = attrs.length; i < l; i = i + 1) { attr = attrs[i].replace(/\s/g, ''); @@ -1954,14 +2194,7 @@ the specific language governing permissions and limitations under the Apache Lic } } - // initializes search's value with nextSearchTerm (if defined by user) - // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter - if(this.search.val() === "") { - if(this.nextSearchTerm != undefined){ - this.search.val(this.nextSearchTerm); - this.search.select(); - } - } + this.prefillNextSearchTerm(); this.focusser.prop("disabled", true).val(""); this.updateResults(true); @@ -2048,6 +2281,7 @@ the specific language governing permissions and limitations under the Apache Lic this.focusser.attr("id", "s2id_autogen"+idSuffix); elementLabel = $("label[for='" + this.opts.element.attr("id") + "']"); + this.opts.element.on('focus.select2', this.bind(function () { this.focus(); })); this.focusser.prev() .text(elementLabel.text()) @@ -2069,6 +2303,9 @@ the specific language governing permissions and limitations under the Apache Lic this.search.on("keydown", this.bind(function (e) { if (!this.isInterfaceEnabled()) return; + // filter 229 keyCodes (input method editor is processing key input) + if (229 == e.keyCode) return; + if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) { // prevent the page from scrolling killEvent(e); @@ -2100,7 +2337,7 @@ the specific language governing permissions and limitations under the Apache Lic // without this the search field loses focus which is annoying if (document.activeElement === this.body.get(0)) { window.setTimeout(this.bind(function() { - if (this.opened()) { + if (this.opened() && this.results && this.results.length > 1) { this.search.focus(); } }), 0); @@ -2149,11 +2386,17 @@ the specific language governing permissions and limitations under the Apache Lic })); selection.on("mousedown touchstart", "abbr", this.bind(function (e) { - if (!this.isInterfaceEnabled()) return; + if (!this.isInterfaceEnabled()) { + return; + } + this.clear(); killEventImmediately(e); this.close(); - this.selection.focus(); + + if (this.selection) { + this.selection.focus(); + } })); selection.on("mousedown touchstart", this.bind(function (e) { @@ -2202,7 +2445,7 @@ the specific language governing permissions and limitations under the Apache Lic })); this.initContainerWidth(); - this.opts.element.addClass("select2-offscreen"); + this.opts.element.hide(); this.setPlaceholder(); }, @@ -2246,7 +2489,7 @@ the specific language governing permissions and limitations under the Apache Lic self.updateSelection(selected); self.close(); self.setPlaceholder(); - self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val()); + self.lastSearchTerm = self.search.val(); } }); } @@ -2383,7 +2626,7 @@ the specific language governing permissions and limitations under the Apache Lic this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data }); - this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val()); + this.lastSearchTerm = this.search.val(); this.close(); if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) { @@ -2437,9 +2680,23 @@ the specific language governing permissions and limitations under the Apache Lic if (arguments.length > 1) { triggerChange = arguments[1]; + + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. ' + + 'The `change` event will always be triggered in 4.0.0.' + ); + } } if (this.select) { + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: Setting the value on a element.")}),c=a.extend({},{populateResults:function(d,e,f){var h,j=this.opts.id,k=this.liveRegion;h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;for(d=c.sortResults(d,e,f),m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a("
      • "),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+g()),t.attr("role","option"),v=c.formatResult(o,t,f,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a("
          "),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),e.append(s);k.text(c.formatMatches(d.length))},h(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(f=c.id,c.id=function(a){return a[f]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var c,d,a=this.opts.element;a.on("change.select2",this.bind(function(){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),c=this.bind(function(){var c=a.prop("disabled");c===b&&(c=!1),this.enable(!c);var d=a.prop("readonly");d===b&&(d=!1),this.readonly(d),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass)),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass))}),a.length&&a[0].attachEvent&&a.each(function(){this.attachEvent("onpropertychange",c)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(a){a.forEach(c)}),this.propertyObserver.observe(a.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container.hasClass("select2-dropdown-open")},positionDropdown:function(){var t,u,v,w,x,b=this.dropdown,c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),g=a(window),h=g.width(),i=g.height(),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,o=l>=m+f,p=c.top-f>=g.scrollTop(),q=b.outerWidth(!1),r=j>=n+q,s=b.hasClass("select2-drop-above");s?(u=!0,!p&&o&&(v=!0,u=!1)):(u=!1,!o&&p&&(v=!0,u=!0)),v&&(b.hide(),c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,q=b.outerWidth(!1),r=j>=n+q,b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(x=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),q=b.outerWidth(!1)+(x.scrollHeight===x.clientHeight?0:k.width),q>e?e=q:q=e,f=b.outerHeight(!1),r=j>=n+q):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(t=this.body.offset(),m-=t.top,n-=t.left),r||(n=c.left+this.container.outerWidth(!1)-q),w={left:n,width:e},u?(w.top=c.top-f,w.bottom="auto",this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above")):(w.top=m,w.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),w=a.extend(w,K(this.opts.dropdownCss)),b.css(w)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0==f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),this.clearSearch(),this.search.removeClass("select2-active"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return b.scrollTop(0),void 0;c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),f=e.offset().top+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!0),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=e.offset().top-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e}),void 0)},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length -},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).text(K(e.opts.formatLoadMore,d+1)),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find(".select2-result-selectable").length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return n("
        • "+K(f.formatSelectionTooBig,o)+"
        • "),void 0;if(d.val().length"+K(f.formatInputTooShort,d.val(),f.minimumInputLength)+""):n(""),c&&this.showSearch&&this.showSearch(!0),void 0;if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return J(f.formatInputTooLong,"formatInputTooLong")?n("
        • "+K(f.formatInputTooLong,d.val(),f.maximumInputLength)+"
        • "):n(""),void 0;f.formatSearching&&0===this.findHighlightableChoices().length&&n("
        • "+K(f.formatSearching)+"
        • "),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return this.search.removeClass("select2-active"),void 0;if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n("
        • "+K(f.formatNoMatches,d.val())+"
        • "),void 0;e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append("
        • "+h.opts.escapeMarkup(K(f.formatLoadMore,this.resultsPage))+"
        • "),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return this.clearTouchMoved(),void 0;var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function c(){var c,d,e,f,g,h;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(c=this.opts.element.attr("style"),c!==b)for(d=c.split(";"),f=0,g=d.length;g>f;f+=1)if(h=d[f].replace(/\s/g,""),e=h.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==e&&e.length>=1)return e[1];return"resolve"===this.opts.width?(c=this.opts.element.css("width"),c.indexOf("%")>0?c:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var d=c.call(this);null!==d&&this.container.css("width",d)}}),e=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html(["","  "," ","","","","
          "," ","
            ","
          ","
          "].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e))),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,h,d=this.container,e=this.dropdown,f=g();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=d.find(".select2-choice"),this.focusser=d.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+f),this.focusser.attr("aria-labelledby","select2-chosen-"+f),this.results.attr("id","select2-results-"+f),this.search.attr("aria-owns","select2-results-"+f),this.focusser.attr("id","s2id_autogen"+f),h=a("label[for='"+this.opts.element.attr("id")+"']"),this.focusser.prev().text(h.text()).attr("for",this.focusser.attr("id"));var i=this.opts.element.attr("title");this.opts.element.attr("title",i||h.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){if(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)return A(a),void 0;switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case c.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.ESC){if(this.opts.openOnEnter===!1&&a.which===c.ENTER)return A(a),void 0;if(a.which==c.DOWN||a.which==c.UP||a.which==c.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==c.DELETE||a.which==c.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),e.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.nextSearchTerm=c.opts.nextSearchTerm(a,c.search.val()))})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),f=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["
            ","
          • "," "," ","
          • ","
          ","
          ","
            ","
          ","
          "].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){p(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,c){this.triggerSelect(a)&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.updateResults(),this.search.select()),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),c&&c.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("
        • "),f=a("
        • "),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith("
          "+j+"
          "),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("
        • "+K(g.opts.formatNoMatches,g.search.val())+"
        • ")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){p(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c0&&c--,a.splice(d,1),d--);return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),d&&this.triggerChange({added:this.data(),removed:e}),void 0;if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(a.text,c.term,e,d),e.join("")},formatSelection:function(a,c,d){return a?d(a.text):b},sortResults:function(a){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(){return b},formatMatches:function(a){return a+" results are available, use up and down arrow keys to navigate."},formatNoMatches:function(){return"No matches found"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b?a.opts.minimumResultsForSearch<0?!1:!0:!0}},a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":d,single:e,multi:f}}}}(jQuery); \ No newline at end of file +!function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++dc;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo(document.body);var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(a,b,c){var d,e,f;if(null===a||a.length<1)return[];for(d=a.split(b),e=0,f=d.length;f>e;e+=1)d[e]=c(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=h;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!g){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);g=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),g.attr("class","select2-sizer"),a(document.body).append(g)}return g.text(b.val()),g.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?void c.push(d(a)):(c.push(d(a.substring(0,e))),c.push(""),c.push(d(a.substring(e,e+f))),c.push(""),void c.push(d(a.substring(e+f,a.length))))}function F(a){var b={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?void b.callback(c()):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),void b.callback(e))}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,i,j,h={x:0,y:0},k={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case k.LEFT:case k.RIGHT:case k.UP:case k.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case k.SHIFT:case k.CTRL:case k.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="
          ",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038a":"\u0399","\u03aa":"\u0399","\u038c":"\u039f","\u038e":"\u03a5","\u03ab":"\u03a5","\u038f":"\u03a9","\u03ac":"\u03b1","\u03ad":"\u03b5","\u03ae":"\u03b7","\u03af":"\u03b9","\u03ca":"\u03b9","\u0390":"\u03b9","\u03cc":"\u03bf","\u03cd":"\u03c5","\u03cb":"\u03c5","\u03b0":"\u03c5","\u03c9":"\u03c9","\u03c2":"\u03c3"};i=a(document),f=function(){var a=1;return function(){return a++}}(),c=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,g=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a(".select2-hidden-accessible"),0==this.liveRegion.length&&(this.liveRegion=a("",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body)),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+f()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a(document.body),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(g),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",g,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",g,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",g,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",g,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(a){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",g,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",g,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.lastSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),j=j||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&d._sync&&a.each(function(){d._sync&&this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.removeData("select2").off(".select2"),a.is("input[type='hidden']")?a.css("display",""):(a.show().prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show())),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,g,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a ","
          "," ","
            ","
          ","
          "].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var b,c,d;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),b=this.search.get(0),b.createTextRange?(c=b.createTextRange(),c.collapse(!1),c.select()):b.setSelectionRange&&(d=this.search.val().length,b.setSelectionRange(d,d))),this.prefillNextSearchTerm(),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,g,c=this.container,d=this.dropdown,e=f();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=c.find(".select2-choice"),this.focusser=c.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+e),this.focusser.attr("aria-labelledby","select2-chosen-"+e),this.results.attr("id","select2-results-"+e),this.search.attr("aria-owns","select2-results-"+e),this.focusser.attr("id","s2id_autogen"+e),g=a("label[for='"+this.opts.element.attr("id")+"']"),this.opts.element.on("focus.select2",this.bind(function(){this.focus()})),this.focusser.prev().text(g.text()).attr("for",this.focusser.attr("id"));var h=this.opts.element.attr("title");this.opts.element.attr("title",h||g.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)return void A(a);switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),void A(a);case k.ENTER:return this.selectHighlighted(),void A(a);case k.TAB:return void this.selectHighlighted({noFocus:!0});case k.ESC:return this.cancel(a),void A(a)}}})),this.search.on("blur",this.bind(function(a){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.results&&this.results.length>1&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.ESC){if(this.opts.openOnEnter===!1&&a.which===k.ENTER)return void A(a);if(a.which==k.DOWN||a.which==k.UP||a.which==k.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),void A(a)}return a.which==k.DELETE||a.which==k.BACKSPACE?(this.opts.allowClear&&this.clear(),void A(a)):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection&&this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),d.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.hide(),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.lastSearchTerm=c.search.val())})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.lastSearchTerm=this.search.val(),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1],this.opts.debug&&console&&console.warn&&console.warn('Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. The `change` event will always be triggered in 4.0.0.')),this.select)this.opts.debug&&console&&console.warn&&console.warn('Select2: Setting the value on a "," ","","
          ","
            ","
          ","
          "].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator,b.transformVal),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.hide(),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),this.prefillNextSearchTerm(),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c={},d=[],e=this;a(b).each(function(){e.id(this)in c||(c[e.id(this)]=0,d.push(this))}),this.selection.find(".select2-search-choice").remove(),this.addSelectedChoice(d),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,b){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.lastSearchTerm=this.search.val(),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.prefillNextSearchTerm()&&this.updateResults(),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),b&&b.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(b){var c=this.getVal(),d=this;a(b).each(function(){c.push(d.createChoice(this))}),this.setVal(c)},createChoice:function(c){var i,j,d=!c.locked,e=a("
        • "),f=a("
        • "),g=d?e:f,h=this.id(c);return i=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),i!=b&&g.find("div").replaceWith(a("
          ").html(i)),j=this.opts.formatSelectionCssClass(c,g.find("div")),j!=b&&g.addClass(j),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),h},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&this.opts.closeOnSelect===!0&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("
        • "+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+"
        • ")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator,this.opts.transformVal))},setVal:function(b){if(this.select)this.select.val(b);else{var c=[],d={};a(b).each(function(){this in d||(c.push(this),d[this]=0)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator))}},buildChangeDetails:function(a,b){ +for(var b=b.slice(0),a=a.slice(0),c=0;c. Attach to instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={debug:!1,width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(this.text(a),c.term,e,d),e.join("")},transformVal:function(b){return a.trim(b)},formatSelection:function(a,c,d){return a?d(this.text(a)):b},sortResults:function(a,b,c){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(a,c){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},text:function(b){return b&&this.data&&this.data.text?a.isFunction(this.data.text)?this.data.text(b):b[this.data.text]:b.text},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(a){return null},nextSearchTerm:function(a,c){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b&&a.opts.minimumResultsForSearch<0?!1:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."},formatNoMatches:function(){return"No matches found"},formatAjaxError:function(a,b,c){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(a){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":c,single:d,multi:e}}}}(jQuery); \ No newline at end of file diff --git a/ckan/public/base/vendor/select2/select2.png b/ckan/public/base/vendor/select2/select2.png index 44e10d63d8d..1d804ffb996 100644 Binary files a/ckan/public/base/vendor/select2/select2.png and b/ckan/public/base/vendor/select2/select2.png differ diff --git a/ckan/public/base/vendor/select2/select2_locale_ar.js b/ckan/public/base/vendor/select2/select2_locale_ar.js index acb33a2f6ad..e991b726cff 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ar.js +++ b/ckan/public/base/vendor/select2/select2_locale_ar.js @@ -1,4 +1,4 @@ -/** +/** * Select2 Arabic translation. * * Author: Adel KEDJOUR @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ar'] = { formatNoMatches: function () { return "لم يتم العثور على مطابقات"; }, formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; }, formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; }, - formatSelectionTooBig: function (limit) { if (n == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return n == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + n + " إختيارات فقط"; }, + formatSelectionTooBig: function (limit) { if (limit == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return limit == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + limit + " إختيارات فقط"; }, formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; }, formatSearching: function () { return "البحث…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_az.js b/ckan/public/base/vendor/select2/select2_locale_az.js new file mode 100644 index 00000000000..19fd95b7a5f --- /dev/null +++ b/ckan/public/base/vendor/select2/select2_locale_az.js @@ -0,0 +1,20 @@ +/** + * Select2 Azerbaijani translation. + * + * Author: Farhad Safarov + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['az'] = { + formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; }, + formatNoMatches: function () { return "Nəticə tapılmadı"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; }, + formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; }, + formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; }, + formatSearching: function () { return "Axtarılır…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['az']); +})(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_bg.js b/ckan/public/base/vendor/select2/select2_locale_bg.js index 585d28a2b0b..3283d0ae5d2 100644 --- a/ckan/public/base/vendor/select2/select2_locale_bg.js +++ b/ckan/public/base/vendor/select2/select2_locale_bg.js @@ -7,12 +7,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['bg'] = { formatNoMatches: function () { return "Няма намерени съвпадения"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); }, formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); }, formatLoadMore: function (pageNumber) { return "Зареждат се още…"; }, formatSearching: function () { return "Търсене…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['bg']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_ca.js b/ckan/public/base/vendor/select2/select2_locale_ca.js index 7e19d3ce966..dbea39e930b 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ca.js +++ b/ckan/public/base/vendor/select2/select2_locale_ca.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ca'] = { formatNoMatches: function () { return "No s'ha trobat cap coincidència"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; }, formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; }, formatSearching: function () { return "S'està cercant…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ca']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_cs.js b/ckan/public/base/vendor/select2/select2_locale_cs.js index 376b54a1352..ef121856485 100644 --- a/ckan/public/base/vendor/select2/select2_locale_cs.js +++ b/ckan/public/base/vendor/select2/select2_locale_cs.js @@ -12,7 +12,7 @@ 3: function() { return "tři"; }, 4: function() { return "čtyři"; } } - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['cs'] = { formatNoMatches: function () { return "Nenalezeny žádné položky"; }, formatInputTooShort: function (input, min) { var n = min - input.length; @@ -45,5 +45,7 @@ }, formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; }, formatSearching: function () { return "Vyhledávání…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['cs']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_da.js b/ckan/public/base/vendor/select2/select2_locale_da.js index dbce3e1748d..702238b9a09 100644 --- a/ckan/public/base/vendor/select2/select2_locale_da.js +++ b/ckan/public/base/vendor/select2/select2_locale_da.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['da'] = { formatNoMatches: function () { return "Ingen resultater fundet"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; }, formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); }, formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; }, formatSearching: function () { return "Søger…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['da']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_de.js b/ckan/public/base/vendor/select2/select2_locale_de.js index 93b18e81f85..e27541720c2 100644 --- a/ckan/public/base/vendor/select2/select2_locale_de.js +++ b/ckan/public/base/vendor/select2/select2_locale_de.js @@ -4,12 +4,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['de'] = { formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; }, formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; }, formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse…"; }, - formatSearching: function () { return "Suche…"; } - }); + formatSearching: function () { return "Suche…"; }, + formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['de']); })(jQuery); \ No newline at end of file diff --git a/ckan/public/base/vendor/select2/select2_locale_el.js b/ckan/public/base/vendor/select2/select2_locale_el.js index e94b02cbc5f..d17459e1df3 100644 --- a/ckan/public/base/vendor/select2/select2_locale_el.js +++ b/ckan/public/base/vendor/select2/select2_locale_el.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['el'] = { formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); }, formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; }, formatSearching: function () { return "Αναζήτηση…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['el']); })(jQuery); \ No newline at end of file diff --git a/ckan/public/base/vendor/select2/select2_locale_en.js.template b/ckan/public/base/vendor/select2/select2_locale_en.js.template index f66bcc844db..f758b110079 100644 --- a/ckan/public/base/vendor/select2/select2_locale_en.js.template +++ b/ckan/public/base/vendor/select2/select2_locale_en.js.template @@ -1,18 +1,20 @@ /** * Select2 translation. - * + * * Author: Your Name */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { - formatMatches: function (matches) { return matches + " results are available, use up and down arrow keys to navigate."; }, + $.fn.select2.locales['en'] = { + formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; }, formatNoMatches: function () { return "No matches found"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " more character" + (n == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); }, formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Loading more results…"; }, formatSearching: function () { return "Searching…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['en']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_es.js b/ckan/public/base/vendor/select2/select2_locale_es.js index f2b581791eb..92a19861e40 100644 --- a/ckan/public/base/vendor/select2/select2_locale_es.js +++ b/ckan/public/base/vendor/select2/select2_locale_es.js @@ -4,12 +4,16 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['es'] = { + formatMatches: function (matches) { if (matches === 1) { return "Un resultado disponible, presione enter para seleccionarlo."; } return matches + " resultados disponibles, use las teclas de dirección para navegar."; }, formatNoMatches: function () { return "No se encontraron resultados"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); }, formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; }, - formatSearching: function () { return "Buscando…"; } - }); + formatSearching: function () { return "Buscando…"; }, + formatAjaxError: function() { return "La carga falló"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['es']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_et.js b/ckan/public/base/vendor/select2/select2_locale_et.js index a4045d22df7..4d69f55e3fb 100644 --- a/ckan/public/base/vendor/select2/select2_locale_et.js +++ b/ckan/public/base/vendor/select2/select2_locale_et.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['et'] = { formatNoMatches: function () { return "Tulemused puuduvad"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; }, formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; }, formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; }, formatSearching: function () { return "Otsin.."; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['et']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_eu.js b/ckan/public/base/vendor/select2/select2_locale_eu.js index 1da1a709481..67ae8d05ae5 100644 --- a/ckan/public/base/vendor/select2/select2_locale_eu.js +++ b/ckan/public/base/vendor/select2/select2_locale_eu.js @@ -6,7 +6,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['eu'] = { formatNoMatches: function () { return "Ez da bat datorrenik aurkitu"; }, @@ -39,5 +39,7 @@ formatSearching: function () { return "Bilatzen…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['eu']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_fa.js b/ckan/public/base/vendor/select2/select2_locale_fa.js index a9e95af4dba..b3ffd8b7da6 100644 --- a/ckan/public/base/vendor/select2/select2_locale_fa.js +++ b/ckan/public/base/vendor/select2/select2_locale_fa.js @@ -7,7 +7,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['fa'] = { formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; }, formatNoMatches: function () { return "نتیجه‌ای یافت نشد."; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; }, @@ -15,5 +15,7 @@ formatSelectionTooBig: function (limit) { return "شما فقط می‌توانید " + limit + " مورد را انتخاب کنید"; }, formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; }, formatSearching: function () { return "در حال جستجو…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fa']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_fi.js b/ckan/public/base/vendor/select2/select2_locale_fi.js index 9bed310f717..6487fbdad35 100644 --- a/ckan/public/base/vendor/select2/select2_locale_fi.js +++ b/ckan/public/base/vendor/select2/select2_locale_fi.js @@ -3,7 +3,7 @@ */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['fi'] = { formatNoMatches: function () { return "Ei tuloksia"; }, @@ -24,5 +24,7 @@ formatSearching: function () { return "Etsitään…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fi']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_fr.js b/ckan/public/base/vendor/select2/select2_locale_fr.js index 9afda2abdcd..d5485d6be76 100644 --- a/ckan/public/base/vendor/select2/select2_locale_fr.js +++ b/ckan/public/base/vendor/select2/select2_locale_fr.js @@ -4,13 +4,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['fr'] = { formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; }, formatNoMatches: function () { return "Aucun résultat trouvé"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Merci de saisir " + n + " caractère" + (n == 1 ? "" : "s") + " de plus"; }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Merci de supprimer " + n + " caractère" + (n == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); }, formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; }, formatSearching: function () { return "Recherche en cours…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_gl.js b/ckan/public/base/vendor/select2/select2_locale_gl.js index 80326320bf0..9335167da96 100644 --- a/ckan/public/base/vendor/select2/select2_locale_gl.js +++ b/ckan/public/base/vendor/select2/select2_locale_gl.js @@ -6,7 +6,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['gl'] = { formatNoMatches: function () { return "Non se atoparon resultados"; }, @@ -39,5 +39,7 @@ formatSearching: function () { return "Buscando…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['gl']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_he.js b/ckan/public/base/vendor/select2/select2_locale_he.js index 00385410804..789dcdcaaf2 100644 --- a/ckan/public/base/vendor/select2/select2_locale_he.js +++ b/ckan/public/base/vendor/select2/select2_locale_he.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['he'] = { formatNoMatches: function () { return "לא נמצאו התאמות"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; }, formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; }, formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; }, formatSearching: function () { return "מחפש…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['he']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_hr.js b/ckan/public/base/vendor/select2/select2_locale_hr.js index c29372524b6..ce8051c788e 100644 --- a/ckan/public/base/vendor/select2/select2_locale_hr.js +++ b/ckan/public/base/vendor/select2/select2_locale_hr.js @@ -7,14 +7,16 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['hr'] = { formatNoMatches: function () { return "Nema rezultata"; }, formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); }, formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; }, formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; }, formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; }, formatSearching: function () { return "Pretraga…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['hr']); function character (n) { return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova"); diff --git a/ckan/public/base/vendor/select2/select2_locale_hu.js b/ckan/public/base/vendor/select2/select2_locale_hu.js index a8c30881928..f431f246360 100644 --- a/ckan/public/base/vendor/select2/select2_locale_hu.js +++ b/ckan/public/base/vendor/select2/select2_locale_hu.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['hu'] = { formatNoMatches: function () { return "Nincs találat."; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " karakterrel több, mint kellene."; }, formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; }, formatLoadMore: function (pageNumber) { return "Töltés…"; }, formatSearching: function () { return "Keresés…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['hu']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_id.js b/ckan/public/base/vendor/select2/select2_locale_id.js index 547454079ba..e7ea0ac6277 100644 --- a/ckan/public/base/vendor/select2/select2_locale_id.js +++ b/ckan/public/base/vendor/select2/select2_locale_id.js @@ -2,16 +2,20 @@ * Select2 Indonesian translation. * * Author: Ibrahim Yusuf + * Author: Salahuddin Hairai */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['id'] = { + formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, formatNoMatches: function () { return "Tidak ada data yang sesuai"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi" + (n == 1 ? "" : "s"); }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapus " + n + " huruf" + (n == 1 ? "" : "s"); }, - formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan" + (limit == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapuskan " + n + " huruf" ; }, + formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan"; }, formatLoadMore: function (pageNumber) { return "Mengambil data…"; }, formatSearching: function () { return "Mencari…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['id']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_is.js b/ckan/public/base/vendor/select2/select2_locale_is.js index aecc6cd7194..273f33de8c0 100644 --- a/ckan/public/base/vendor/select2/select2_locale_is.js +++ b/ckan/public/base/vendor/select2/select2_locale_is.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['is'] = { formatNoMatches: function () { return "Ekkert fannst"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); }, formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; }, formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; }, formatSearching: function () { return "Leita…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['is']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_it.js b/ckan/public/base/vendor/select2/select2_locale_it.js index d4e24de7000..6e2b8e23709 100644 --- a/ckan/public/base/vendor/select2/select2_locale_it.js +++ b/ckan/public/base/vendor/select2/select2_locale_it.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['it'] = { formatNoMatches: function () { return "Nessuna corrispondenza trovata"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; }, formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); }, formatLoadMore: function (pageNumber) { return "Caricamento in corso…"; }, formatSearching: function () { return "Ricerca…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['it']); })(jQuery); \ No newline at end of file diff --git a/ckan/public/base/vendor/select2/select2_locale_ja.js b/ckan/public/base/vendor/select2/select2_locale_ja.js index 81106e78a80..7dbd8d7ee86 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ja.js +++ b/ckan/public/base/vendor/select2/select2_locale_ja.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ja'] = { formatNoMatches: function () { return "該当なし"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; }, formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; }, formatLoadMore: function (pageNumber) { return "読込中・・・"; }, formatSearching: function () { return "検索中・・・"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ja']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_ka.js b/ckan/public/base/vendor/select2/select2_locale_ka.js index 366cc2d9c4d..6cbe1d8f31e 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ka.js +++ b/ckan/public/base/vendor/select2/select2_locale_ka.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ka'] = { formatNoMatches: function () { return "ვერ მოიძებნა"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; }, formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; }, formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; }, formatSearching: function () { return "ძებნა…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ka']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_ko.js b/ckan/public/base/vendor/select2/select2_locale_ko.js index 1a84d21eae6..bf036e09e6e 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ko.js +++ b/ckan/public/base/vendor/select2/select2_locale_ko.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ko'] = { formatNoMatches: function () { return "결과 없음"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; }, formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; }, formatLoadMore: function (pageNumber) { return "불러오는 중…"; }, formatSearching: function () { return "검색 중…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ko']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_lt.js b/ckan/public/base/vendor/select2/select2_locale_lt.js index 2e2f950b00d..7d7040f72f1 100644 --- a/ckan/public/base/vendor/select2/select2_locale_lt.js +++ b/ckan/public/base/vendor/select2/select2_locale_lt.js @@ -7,7 +7,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['lt'] = { formatNoMatches: function () { return "Atitikmenų nerasta"; }, formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); }, formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); }, @@ -16,7 +16,9 @@ }, formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; }, formatSearching: function () { return "Ieškoma…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['lt']); function character (n) { return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į"); diff --git a/ckan/public/base/vendor/select2/select2_locale_lv.js b/ckan/public/base/vendor/select2/select2_locale_lv.js index b300ec770f4..4afc5b41c80 100644 --- a/ckan/public/base/vendor/select2/select2_locale_lv.js +++ b/ckan/public/base/vendor/select2/select2_locale_lv.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['lv'] = { formatNoMatches: function () { return "Sakritību nav"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; }, formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); }, formatLoadMore: function (pageNumber) { return "Datu ielāde…"; }, formatSearching: function () { return "Meklēšana…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['lv']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_mk.js b/ckan/public/base/vendor/select2/select2_locale_mk.js index 513562c51bf..8a51a9e0b3c 100644 --- a/ckan/public/base/vendor/select2/select2_locale_mk.js +++ b/ckan/public/base/vendor/select2/select2_locale_mk.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['mk'] = { formatNoMatches: function () { return "Нема пронајдено совпаѓања"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); }, formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); }, formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; }, formatSearching: function () { return "Пребарување…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['mk']); })(jQuery); \ No newline at end of file diff --git a/ckan/public/base/vendor/select2/select2_locale_ms.js b/ckan/public/base/vendor/select2/select2_locale_ms.js index 262042aab15..6447c089932 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ms.js +++ b/ckan/public/base/vendor/select2/select2_locale_ms.js @@ -2,16 +2,20 @@ * Select2 Malay translation. * * Author: Kepoweran + * Author: Salahuddin Hairai */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ms'] = { + formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, formatNoMatches: function () { return "Tiada padanan yang ditemui"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; }, formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; }, formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; }, formatSearching: function () { return "Mencari…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']); })(jQuery); diff --git a/ckan/public-bs2/base/vendor/select2/select2_locale_no.js b/ckan/public/base/vendor/select2/select2_locale_nb.js similarity index 54% rename from ckan/public-bs2/base/vendor/select2/select2_locale_no.js rename to ckan/public/base/vendor/select2/select2_locale_nb.js index ab61c082a02..cb5dfaeef22 100644 --- a/ckan/public-bs2/base/vendor/select2/select2_locale_no.js +++ b/ckan/public/base/vendor/select2/select2_locale_nb.js @@ -1,18 +1,22 @@ /** - * Select2 Norwegian translation. + * Select2 Norwegian Bokmål translation. * * Author: Torgeir Veimo + * Author: Bjørn Johansen */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['nb'] = { + formatMatches: function (matches) { if (matches === 1) { return "Ett resultat er tilgjengelig, trykk enter for å velge det."; } return matches + " resultater er tilgjengelig. Bruk piltastene opp og ned for å navigere."; }, formatNoMatches: function () { return "Ingen treff"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; }, formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; }, - formatLoadMore: function (pageNumber) { return "Laster flere resultater…"; }, - formatSearching: function () { return "Søker…"; } - }); + formatLoadMore: function (pageNumber) { return "Laster flere resultater …"; }, + formatSearching: function () { return "Søker …"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['no']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_nl.js b/ckan/public/base/vendor/select2/select2_locale_nl.js index 5b5c4156ce1..985741ec20f 100644 --- a/ckan/public/base/vendor/select2/select2_locale_nl.js +++ b/ckan/public/base/vendor/select2/select2_locale_nl.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['nl'] = { formatNoMatches: function () { return "Geen resultaten gevonden"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " meer in"; }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " minder in"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; }, formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; }, formatLoadMore: function (pageNumber) { return "Meer resultaten laden…"; }, formatSearching: function () { return "Zoeken…"; } - }); -})(jQuery); \ No newline at end of file + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['nl']); +})(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_pl.js b/ckan/public/base/vendor/select2/select2_locale_pl.js index 75054e76578..87c26194131 100644 --- a/ckan/public/base/vendor/select2/select2_locale_pl.js +++ b/ckan/public/base/vendor/select2/select2_locale_pl.js @@ -1,22 +1,54 @@ /** * Select2 Polish translation. - * + * * @author Jan Kondratowicz * @author Uriy Efremochkin + * @author Michał Połtyn + * @author Damian Zajkowski */ -(function ($) { +(function($) { "use strict"; - $.extend($.fn.select2.defaults, { - formatNoMatches: function () { return "Brak wyników"; }, - formatInputTooShort: function (input, min) { return "Wpisz jeszcze" + character(min - input.length, "znak", "i"); }, - formatInputTooLong: function (input, max) { return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); }, - formatSelectionTooBig: function (limit) { return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); }, - formatLoadMore: function (pageNumber) { return "Ładowanie wyników…"; }, - formatSearching: function () { return "Szukanie…"; } - }); + $.fn.select2.locales['pl'] = { + formatNoMatches: function() { + return "Brak wyników"; + }, + formatInputTooShort: function(input, min) { + return "Wpisz co najmniej" + character(min - input.length, "znak", "i"); + }, + formatInputTooLong: function(input, max) { + return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); + }, + formatSelectionTooBig: function(limit) { + return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); + }, + formatLoadMore: function(pageNumber) { + return "Ładowanie wyników…"; + }, + formatSearching: function() { + return "Szukanie…"; + } + }; - function character (n, word, pluralSuffix) { - return " " + n + " " + word + (n == 1 ? "" : n%10 < 5 && n%10 > 1 && (n%100 < 5 || n%100 > 20) ? pluralSuffix : "ów"); + $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']); + + function character(n, word, pluralSuffix) { + //Liczba pojedyncza - brak suffiksu + //jeden znak + //jeden element + var suffix = ''; + if (n > 1 && n < 5) { + //Liczaba mnoga ilość od 2 do 4 - własny suffiks + //Dwa znaki, trzy znaki, cztery znaki. + //Dwa elementy, trzy elementy, cztery elementy + suffix = pluralSuffix; + } else if (n == 0 || n >= 5) { + //Ilość 0 suffiks ów + //Liczaba mnoga w ilości 5 i więcej - suffiks ów (nie poprawny dla wszystkich wyrazów, np. 100 wiadomości) + //Zero znaków, Pięć znaków, sześć znaków, siedem znaków, osiem znaków. + //Zero elementów Pięć elementów, sześć elementów, siedem elementów, osiem elementów. + suffix = 'ów'; + } + return " " + n + " " + word + suffix; } })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_pt-BR.js b/ckan/public/base/vendor/select2/select2_locale_pt-BR.js index ac4969acfbb..51b037de580 100644 --- a/ckan/public/base/vendor/select2/select2_locale_pt-BR.js +++ b/ckan/public/base/vendor/select2/select2_locale_pt-BR.js @@ -4,12 +4,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['pt-BR'] = { formatNoMatches: function () { return "Nenhum resultado encontrado"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite mais " + n + " caracter" + (n == 1? "" : "es"); }, + formatAjaxError: function () { return "Erro na busca"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite " + (min == 1 ? "" : "mais") + " " + n + " caracter" + (n == 1? "" : "es"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); }, formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; }, formatSearching: function () { return "Buscando…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_pt-PT.js b/ckan/public/base/vendor/select2/select2_locale_pt-PT.js index cced7cf3ec1..ae55a4fc4ef 100644 --- a/ckan/public/base/vendor/select2/select2_locale_pt-PT.js +++ b/ckan/public/base/vendor/select2/select2_locale_pt-PT.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['pt-PT'] = { formatNoMatches: function () { return "Nenhum resultado encontrado"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "A carregar mais resultados…"; }, formatSearching: function () { return "A pesquisar…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_ro.js b/ckan/public/base/vendor/select2/select2_locale_ro.js index 87eca4cf740..21b0cf18186 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ro.js +++ b/ckan/public/base/vendor/select2/select2_locale_ro.js @@ -4,12 +4,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ro'] = { formatNoMatches: function () { return "Nu a fost găsit nimic"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); }, formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); }, formatLoadMore: function (pageNumber) { return "Se încarcă…"; }, formatSearching: function () { return "Căutare…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ro']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_rs.js b/ckan/public/base/vendor/select2/select2_locale_rs.js index 300c01bc5e5..72c16389c9e 100644 --- a/ckan/public/base/vendor/select2/select2_locale_rs.js +++ b/ckan/public/base/vendor/select2/select2_locale_rs.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['rs'] = { formatNoMatches: function () { return "Ništa nije pronađeno"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); }, formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; }, formatSearching: function () { return "Pretraga…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['rs']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_ru.js b/ckan/public/base/vendor/select2/select2_locale_ru.js index 0f45ce0dddf..2a6c7702c42 100644 --- a/ckan/public/base/vendor/select2/select2_locale_ru.js +++ b/ckan/public/base/vendor/select2/select2_locale_ru.js @@ -6,14 +6,16 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['ru'] = { formatNoMatches: function () { return "Совпадений не найдено"; }, - formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще" + character(min - input.length); }, + formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); }, formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; }, formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); }, formatLoadMore: function (pageNumber) { return "Загрузка данных…"; }, formatSearching: function () { return "Поиск…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ru']); function character (n) { return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов"); diff --git a/ckan/public/base/vendor/select2/select2_locale_sk.js b/ckan/public/base/vendor/select2/select2_locale_sk.js index 772f304aca9..027530c9388 100644 --- a/ckan/public/base/vendor/select2/select2_locale_sk.js +++ b/ckan/public/base/vendor/select2/select2_locale_sk.js @@ -10,33 +10,33 @@ 2: function(masc) { return (masc ? "dva" : "dve"); }, 3: function() { return "tri"; }, 4: function() { return "štyri"; } - } - $.extend($.fn.select2.defaults, { + }; + $.fn.select2.locales['sk'] = { formatNoMatches: function () { return "Nenašli sa žiadne položky"; }, formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1) { - return "Prosím zadajte ešte jeden znak"; + return "Prosím, zadajte ešte jeden znak"; } else if (n <= 4) { - return "Prosím zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky"; + return "Prosím, zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky"; } else { - return "Prosím zadajte ešte ďalších "+n+" znakov"; + return "Prosím, zadajte ešte ďalších "+n+" znakov"; } }, formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1) { - return "Prosím zadajte o jeden znak menej"; - } else if (n <= 4) { - return "Prosím zadajte o "+smallNumbers[n](true)+" znaky menej"; + return "Prosím, zadajte o jeden znak menej"; + } else if (n >= 2 && n <= 4) { + return "Prosím, zadajte o "+smallNumbers[n](true)+" znaky menej"; } else { - return "Prosím zadajte o "+n+" znakov menej"; + return "Prosím, zadajte o "+n+" znakov menej"; } }, formatSelectionTooBig: function (limit) { if (limit == 1) { return "Môžete zvoliť len jednu položku"; - } else if (limit <= 4) { + } else if (limit >= 2 && limit <= 4) { return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky"; } else { return "Môžete zvoliť najviac "+limit+" položiek"; @@ -44,5 +44,7 @@ }, formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; }, formatSearching: function () { return "Vyhľadávanie…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['sk']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_sv.js b/ckan/public/base/vendor/select2/select2_locale_sv.js index d611189a593..96f8c0a881d 100644 --- a/ckan/public/base/vendor/select2/select2_locale_sv.js +++ b/ckan/public/base/vendor/select2/select2_locale_sv.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['sv'] = { formatNoMatches: function () { return "Inga träffar"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); }, formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; }, formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; }, formatLoadMore: function (pageNumber) { return "Laddar fler resultat…"; }, formatSearching: function () { return "Söker…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['sv']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_th.js b/ckan/public/base/vendor/select2/select2_locale_th.js index df59bdac36d..7f3e6ef8c39 100644 --- a/ckan/public/base/vendor/select2/select2_locale_th.js +++ b/ckan/public/base/vendor/select2/select2_locale_th.js @@ -6,12 +6,14 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['th'] = { formatNoMatches: function () { return "ไม่พบข้อมูล"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "โปรดพิมพ์เพิ่มอีก " + n + " ตัวอักษร"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return "โปรดลบออก " + n + " ตัวอักษร"; }, formatSelectionTooBig: function (limit) { return "คุณสามารถเลือกได้ไม่เกิน " + limit + " รายการ"; }, formatLoadMore: function (pageNumber) { return "กำลังค้นข้อมูลเพิ่ม…"; }, formatSearching: function () { return "กำลังค้นข้อมูล…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['th']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_tr.js b/ckan/public/base/vendor/select2/select2_locale_tr.js index f834dad2b89..2330bc205ba 100644 --- a/ckan/public/base/vendor/select2/select2_locale_tr.js +++ b/ckan/public/base/vendor/select2/select2_locale_tr.js @@ -6,12 +6,15 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['tr'] = { + formatMatches: function (matches) { if (matches === 1) { return "Sadece bir sonuç bulundu, seçmek için enter tuşuna basabilirsiniz."; } return matches + " sonuç bulundu, yukarı ve aşağı tuşları ile seçebilirsiniz."; }, formatNoMatches: function () { return "Sonuç bulunamadı"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; }, formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; }, formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; }, formatLoadMore: function (pageNumber) { return "Daha fazla…"; }, formatSearching: function () { return "Aranıyor…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_ug-CN.js b/ckan/public/base/vendor/select2/select2_locale_ug-CN.js new file mode 100644 index 00000000000..579588a7ac0 --- /dev/null +++ b/ckan/public/base/vendor/select2/select2_locale_ug-CN.js @@ -0,0 +1,16 @@ +/** + * Select2 Uyghur translation + */ +(function ($) { + "use strict"; + $.fn.select2.locales['ug-CN'] = { + formatNoMatches: function () { return "ماس كېلىدىغان ئۇچۇر تېپىلمىدى"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "يەنە " + n + " ھەرپ كىرگۈزۈڭ";}, + formatInputTooLong: function (input, max) { var n = input.length - max; return "" + n + "ھەرپ ئۆچۈرۈڭ";}, + formatSelectionTooBig: function (limit) { return "ئەڭ كۆپ بولغاندا" + limit + " تال ئۇچۇر تاللىيالايسىز"; }, + formatLoadMore: function (pageNumber) { return "ئۇچۇرلار ئوقۇلىۋاتىدۇ…"; }, + formatSearching: function () { return "ئىزدەۋاتىدۇ…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ug-CN']); +})(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_uk.js b/ckan/public/base/vendor/select2/select2_locale_uk.js index 8d31a056080..b5bd0e02d2c 100644 --- a/ckan/public/base/vendor/select2/select2_locale_uk.js +++ b/ckan/public/base/vendor/select2/select2_locale_uk.js @@ -7,7 +7,7 @@ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['uk'] = { formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; }, formatNoMatches: function () { return "Нічого не знайдено"; }, formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); }, @@ -15,7 +15,9 @@ formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); }, formatLoadMore: function (pageNumber) { return "Завантаження даних…"; }, formatSearching: function () { return "Пошук…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['uk']); function character (n, word) { return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів"); diff --git a/ckan/public/base/vendor/select2/select2_locale_vi.js b/ckan/public/base/vendor/select2/select2_locale_vi.js index 5dbc275361f..9517cb6bd8e 100644 --- a/ckan/public/base/vendor/select2/select2_locale_vi.js +++ b/ckan/public/base/vendor/select2/select2_locale_vi.js @@ -1,18 +1,20 @@ /** * Select2 Vietnamese translation. * - * Author: Long Nguyen + * Author: Long Nguyen , Nguyen Chien Cong */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['vi'] = { formatNoMatches: function () { return "Không tìm thấy kết quả"; }, - formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự" + (n == 1 ? "" : "s"); }, - formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự" + (n == 1? "" : "s"); }, - formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " tùy chọn" + (limit == 1 ? "" : "s"); }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự"; }, + formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " lựa chọn"; }, formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; }, formatSearching: function () { return "Đang tìm…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['vi']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_zh-CN.js b/ckan/public/base/vendor/select2/select2_locale_zh-CN.js index 6add3c52518..e988dac1a4c 100644 --- a/ckan/public/base/vendor/select2/select2_locale_zh-CN.js +++ b/ckan/public/base/vendor/select2/select2_locale_zh-CN.js @@ -3,12 +3,14 @@ */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['zh-CN'] = { formatNoMatches: function () { return "没有找到匹配项"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";}, formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";}, formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; }, formatLoadMore: function (pageNumber) { return "加载结果中…"; }, formatSearching: function () { return "搜索中…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-CN']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2_locale_zh-TW.js b/ckan/public/base/vendor/select2/select2_locale_zh-TW.js old mode 100755 new mode 100644 index f072381faae..85dbd5afc23 --- a/ckan/public/base/vendor/select2/select2_locale_zh-TW.js +++ b/ckan/public/base/vendor/select2/select2_locale_zh-TW.js @@ -3,12 +3,14 @@ */ (function ($) { "use strict"; - $.extend($.fn.select2.defaults, { + $.fn.select2.locales['zh-TW'] = { formatNoMatches: function () { return "沒有找到相符的項目"; }, formatInputTooShort: function (input, min) { var n = min - input.length; return "請再輸入" + n + "個字元";}, formatInputTooLong: function (input, max) { var n = input.length - max; return "請刪掉" + n + "個字元";}, formatSelectionTooBig: function (limit) { return "你只能選擇最多" + limit + "項"; }, formatLoadMore: function (pageNumber) { return "載入中…"; }, formatSearching: function () { return "搜尋中…"; } - }); + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-TW']); })(jQuery); diff --git a/ckan/public/base/vendor/select2/select2x2.png b/ckan/public/base/vendor/select2/select2x2.png index c4bf72ca859..4bdd5c961d4 100644 Binary files a/ckan/public/base/vendor/select2/select2x2.png and b/ckan/public/base/vendor/select2/select2x2.png differ diff --git a/ckan/templates-bs2/admin/trash.html b/ckan/templates-bs2/admin/trash.html index 108ce9e6b35..d1991ce6a5e 100644 --- a/ckan/templates-bs2/admin/trash.html +++ b/ckan/templates-bs2/admin/trash.html @@ -6,7 +6,7 @@
            {% for pkg in deleted_packages %} {% set title = pkg.title or pkg.name %} -
          • {{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='package', action='read', id=pkg.name)) }}
          • +
          • {{ h.link_to(h.truncate(title, truncate_title), h.url_for('dataset.read', id=pkg.name)) }}
          • {% endfor %}
          diff --git a/ckan/templates-bs2/dataviewer/base.html b/ckan/templates-bs2/dataviewer/base.html index ad67e0f3794..49ee2c1636f 100644 --- a/ckan/templates-bs2/dataviewer/base.html +++ b/ckan/templates-bs2/dataviewer/base.html @@ -1,13 +1,12 @@ {% extends "base.html" %} -{# use of c.resource and c.package are for backwards compatibility with old previews that need them #} -{% block subtitle %}{{ h.dataset_display_name(package or c.package) }} - {{h.resource_display_name(resource or c.resource) }}{% endblock %} +{% block subtitle %}{{ h.dataset_display_name(package) }} - {{h.resource_display_name(resource) }}{% endblock %} {# remove any scripts #} {% block scripts %} {% endblock %} diff --git a/ckan/templates-bs2/error_document_template.html b/ckan/templates-bs2/error_document_template.html index 50d35d160c4..0baecba15bf 100644 --- a/ckan/templates-bs2/error_document_template.html +++ b/ckan/templates-bs2/error_document_template.html @@ -1,11 +1,11 @@ {% extends "page.html" %} -{% block subtitle %}{{ gettext('Error %(error_code)s', error_code=c.code[0]) }}{% endblock %} +{% block subtitle %}{{ gettext('Error %(error_code)s', error_code=code[0]) }}{% endblock %} {% block primary %}
          - {{ c.content}} + {{ content}}
          {% endblock %} diff --git a/ckan/templates-bs2/group/about.html b/ckan/templates-bs2/group/about.html index bcbabb23f41..413027c2c75 100644 --- a/ckan/templates-bs2/group/about.html +++ b/ckan/templates-bs2/group/about.html @@ -5,16 +5,16 @@ {% block primary_content_inner %}

          {% block page_heading %} - {{ h.get_translated(c.group_dict, 'title') or c.group_dict.display_name }} + {{ h.get_translated(group_dict, 'title') or group_dict.display_name }} {% endblock %}

          {% block group_description %} - {% if h.get_translated(c.group_dict, 'description') %} - {{ h.render_markdown(h.get_translated(c.group_dict, 'description')) }} + {% if h.get_translated(group_dict, 'description') %} + {{ h.render_markdown(h.get_translated(group_dict, 'description')) }} {% endif %} {% endblock %} {% block group_extras %} - {% snippet 'snippets/additional_info.html', extras = h.sorted_extras(c.group_dict.extras) %} + {% snippet 'snippets/additional_info.html', extras = h.sorted_extras(group_dict.extras) %} {% endblock %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/ckan/templates-bs2/group/activity_stream.html b/ckan/templates-bs2/group/activity_stream.html index 47a6d029bb4..3977256a716 100644 --- a/ckan/templates-bs2/group/activity_stream.html +++ b/ckan/templates-bs2/group/activity_stream.html @@ -5,6 +5,6 @@ {% block primary_content_inner %}

          {% block page_heading %}{{ _('Activity Stream') }}{% endblock %}

          {% block activity_stream %} - {{ c.group_activity_stream | safe }} + {{ group_activity_stream | safe }} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/group/admins.html b/ckan/templates-bs2/group/admins.html index e032eb7e546..ba6d8704d40 100644 --- a/ckan/templates-bs2/group/admins.html +++ b/ckan/templates-bs2/group/admins.html @@ -1,10 +1,10 @@ {% extends "group/read_base.html" %} -{% block subtitle %}{{ _('Administrators') }} - {{ c.group_dict.title or c.group_dict.name }}{% endblock %} +{% block subtitle %}{{ _('Administrators') }} - {{ group_dict.title or group_dict.name }}{% endblock %} {% block primary_content_inner %}

          {% block page_heading %}{{ _('Administrators') }}{% endblock %}

          {% block admins_list %} - {% snippet "user/snippets/followers.html", followers=c.admins %} + {% snippet "user/snippets/followers.html", followers=admins %} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/group/base_form_page.html b/ckan/templates-bs2/group/base_form_page.html index 7d1664aa844..17571fc2a81 100644 --- a/ckan/templates-bs2/group/base_form_page.html +++ b/ckan/templates-bs2/group/base_form_page.html @@ -3,13 +3,13 @@ {% block page_primary_action %}{% endblock %} {% block breadcrumb_content %} -
        • {{ h.nav_link(_('Groups'), controller='group', action='index') }}
        • -
        • {% block breadcrumb_link %}{{ h.nav_link(_('Add a Group'), controller='group', action='new') }}{% endblock %}
        • +
        • {{ h.nav_link(_('Groups'), named_route=group_type+'.index') }}
        • +
        • {% block breadcrumb_link %}{{ h.nav_link(_('Add a Group'), named_route=group_type+'.new') }}{% endblock %}
        • {% endblock %} {% block primary_content_inner %}

          {% block page_heading %}{{ _('Group Form') }}{% endblock %}

          {% block form %} - {{ c.form | safe }} + {{ form | safe }} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/group/confirm_delete.html b/ckan/templates-bs2/group/confirm_delete.html index 6ec0c0bc347..155f5790690 100644 --- a/ckan/templates-bs2/group/confirm_delete.html +++ b/ckan/templates-bs2/group/confirm_delete.html @@ -8,9 +8,9 @@
          {% block form %} -

          {{ _('Are you sure you want to delete group - {name}?').format(name=c.group_dict.name) }}

          +

          {{ _('Are you sure you want to delete group - {name}?').format(name=group_dict.name) }}

          -

          +
          diff --git a/ckan/templates-bs2/group/confirm_delete_member.html b/ckan/templates-bs2/group/confirm_delete_member.html index dd314ac7af0..7bfaf369d6d 100644 --- a/ckan/templates-bs2/group/confirm_delete_member.html +++ b/ckan/templates-bs2/group/confirm_delete_member.html @@ -8,10 +8,10 @@
          {% block form %} -

          {{ _('Are you sure you want to delete member - {name}?').format(name=c.user_dict.name) }}

          +

          {{ _('Are you sure you want to delete member - {name}?').format(name=user_dict.name) }}

          -

          - + +
          diff --git a/ckan/templates-bs2/group/edit.html b/ckan/templates-bs2/group/edit.html index 72a3c18d0af..3bcf125b683 100644 --- a/ckan/templates-bs2/group/edit.html +++ b/ckan/templates-bs2/group/edit.html @@ -1,10 +1,10 @@ {% extends "group/base_form_page.html" %} {% block breadcrumb_content %} -
        • {% link_for _('Groups'), controller='group', action='index' %}
        • +
        • {% link_for _('Groups'), named_route=group_type+'.index' %}
        • {% block breadcrumb_content_inner %} -
        • {% link_for h.get_translated(group, 'title') or group.display_name |truncate(35), controller='group', action='read', id=group.name %}
        • -
        • {% link_for _('Manage'), controller='group', action='edit', id=group.name %}
        • +
        • {% link_for h.get_translated(group, 'title') or group.display_name |truncate(35), named_route=group_type+'.read', id=group.name %}
        • +
        • {% link_for _('Manage'), named_route=group_type+'.edit', id=group.name %}
        • {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/group/edit_base.html b/ckan/templates-bs2/group/edit_base.html index 2bd2bd29de2..a53adf17a00 100644 --- a/ckan/templates-bs2/group/edit_base.html +++ b/ckan/templates-bs2/group/edit_base.html @@ -1,28 +1,28 @@ {% extends "page.html" %} {% block subtitle %} - {{ _('Manage') }} - {{ h.get_translated(c.group_dict, 'title') or c.group_dict.display_name }} - {{ _('Groups') }} + {{ _('Manage') }} - {{ h.get_translated(group_dict, 'title') or group_dict.display_name }} - {{ _('Groups') }} {% endblock %} -{% set group = c.group_dict %} +{% set group = group_dict %} {% block breadcrumb_content %} -
        • {% link_for _('Groups'), controller='group', action='index' %}
        • +
        • {% link_for _('Groups'), named_route=group_type+'.index' %}
        • {% block breadcrumb_content_inner %} -
        • {% link_for h.get_translated(group, 'title') or group.display_name |truncate(35), controller='group', action='read', id=group.name %}
        • -
        • {% link_for _('Manage'), controller='group', action='edit', id=group.name %}
        • +
        • {% link_for h.get_translated(group, 'title') or group.display_name |truncate(35), named_route=group_type+'.read', id=group.name %}
        • +
        • {% link_for _('Manage'), named_route=group_type+'.edit', id=group.name, named_route=group_type + '_edit' %}
        • {% endblock %} {% endblock %} {% block content_action %} - {% link_for _('View'), controller='group', action='read', id=c.group_dict.name, class_='btn', icon='eye' %} + {% link_for _('View'), named_route=group_type+'.read', id=group_dict.name, class_='btn', icon='eye' %} {% endblock %} {% block content_primary_nav %} - {{ h.build_nav_icon('group_edit', _('Edit'), id=c.group_dict.name) }} - {{ h.build_nav_icon('group_members', _('Members'), id=c.group_dict.name) }} + {{ h.build_nav_icon(group_type + '.edit', _('Edit'), id=group_dict.name) }} + {{ h.build_nav_icon(group_type + '.members', _('Members'), id=group_dict.name) }} {% endblock %} {% block secondary_content %} - {% snippet "group/snippets/info.html", group=c.group_dict, show_nums=false %} + {% snippet "group/snippets/info.html", group=group_dict, show_nums=false %} {% endblock %} diff --git a/ckan/templates-bs2/group/followers.html b/ckan/templates-bs2/group/followers.html index 37ee035f840..d5db5683e8b 100644 --- a/ckan/templates-bs2/group/followers.html +++ b/ckan/templates-bs2/group/followers.html @@ -1,10 +1,10 @@ {% extends "group/read_base.html" %} -{% block subtitle %}{{ _('Followers') }} - {{ c.group_dict.title or c.group_dict.name }}{% endblock %} +{% block subtitle %}{{ _('Followers') }} - {{ group_dict.title or group_dict.name }}{% endblock %} {% block primary_content_inner %}

          {% block page_heading %}{{ _('Followers') }}{% endblock %}

          {% block followers_list %} - {% snippet "user/snippets/followers.html", followers=c.followers %} + {% snippet "user/snippets/followers.html", followers=followers %} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/group/history.html b/ckan/templates-bs2/group/history.html index 021c85005d8..dd59b7cba82 100644 --- a/ckan/templates-bs2/group/history.html +++ b/ckan/templates-bs2/group/history.html @@ -1,10 +1,10 @@ {% extends "group/read_base.html" %} -{% block subtitle %}{{ _('History') }} - {{ c.group_dict.display_name }}{% endblock %} +{% block subtitle %}{{ _('History') }} - {{ group_dict.display_name }}{% endblock %} {% block primary_content_inner %}

          {{ _('History') }}

          {% block group_history_revisions %} - {% snippet "group/snippets/history_revisions.html", group_dict=c.group_dict, group_revisions=c.group_revisions %} + {% snippet "group/snippets/history_revisions.html", group_dict=group_dict, group_revisions=group_revisions %} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/group/index.html b/ckan/templates-bs2/group/index.html index bcd5a54daa5..3c20e9d50c4 100644 --- a/ckan/templates-bs2/group/index.html +++ b/ckan/templates-bs2/group/index.html @@ -3,38 +3,38 @@ {% block subtitle %}{{ _('Groups') }}{% endblock %} {% block breadcrumb_content %} -
        • {% link_for _('Groups'), controller='group', action='index' %}
        • +
        • {% link_for _('Groups'), named_route=group_type+'.index' %}
        • {% endblock %} {% block page_header %}{% endblock %} {% block page_primary_action %} {% if h.check_access('group_create') %} - {% link_for _('Add Group'), controller='group', action='new', class_='btn btn-primary', icon='plus-square' %} + {% link_for _('Add Group'), named_route=group_type+'.new', class_='btn btn-primary', icon='plus-square' %} {% endif %} {% endblock %} {% block primary_content_inner %}

          {{ _('Groups') }}

          {% block groups_search_form %} - {% snippet 'snippets/search_form.html', form_id='group-search-form', type='group', query=c.q, sorting_selected=c.sort_by_selected, count=c.page.item_count, placeholder=_('Search groups...'), show_empty=request.params, no_bottom_border=true if c.page.items, sorting = [(_('Name Ascending'), 'title asc'), (_('Name Descending'), 'title desc')] %} + {% snippet 'snippets/search_form.html', form_id='group-search-form', type='group', query=q, sorting_selected=sort_by_selected, count=page.item_count, placeholder=_('Search groups...'), show_empty=request.params, no_bottom_border=true if page.items, sorting = [(_('Name Ascending'), 'title asc'), (_('Name Descending'), 'title desc')] %} {% endblock %} {% block groups_list %} - {% if c.page.items or request.params %} - {% if c.page.items %} - {% snippet "group/snippets/group_list.html", groups=c.page.items %} + {% if page.items or request.params %} + {% if page.items %} + {% snippet "group/snippets/group_list.html", groups=page.items %} {% endif %} {% else %}

          {{ _('There are currently no groups for this site') }}. {% if h.check_access('group_create') %} - {% link_for _('How about creating one?'), controller='group', action='new' %}. + {% link_for _('How about creating one?'), named_route=group_type+'.new' %}. {% endif %}

          {% endif %} {% endblock %} {% block page_pagination %} - {{ c.page.pager(q=c.q or '', sort=c.sort_by_selected or '') }} + {{ page.pager(q=q or '', sort=sort_by_selected or '') }} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/group/member_new.html b/ckan/templates-bs2/group/member_new.html index 71968e33dbd..a820f6ff769 100644 --- a/ckan/templates-bs2/group/member_new.html +++ b/ckan/templates-bs2/group/member_new.html @@ -2,10 +2,10 @@ {% import 'macros/form.html' as form %} -{% set user = c.user_dict %} +{% set user = user_dict %} {% block primary_content_inner %} - {% link_for _('Back to all members'), controller='group', action='members', id=group.name, class_='btn pull-right', icon='arrow-left' %} + {% link_for _('Back to all members'), named_route=group_type+'.members', id=group.name, class_='btn pull-right', icon='arrow-left' %}

          {% block page_heading %}{{ _('Edit Member') if user else _('Add Member') }}{% endblock %}

          @@ -52,10 +52,10 @@

          {% set format_attrs = {'data-module': 'autocomplete'} %} - {{ form.select('role', label=_('Role'), options=c.roles, selected=c.user_role, error='', attrs=format_attrs) }} + {{ form.select('role', label=_('Role'), options=roles, selected=user_role, error='', attrs=format_attrs) }}
          {% if user %} - {{ _('Delete') }} + {{ _('Delete') }} diff --git a/ckan/templates-bs2/group/members.html b/ckan/templates-bs2/group/members.html index 4cec329a585..54dab5a818b 100644 --- a/ckan/templates-bs2/group/members.html +++ b/ckan/templates-bs2/group/members.html @@ -1,13 +1,13 @@ {% extends "group/edit_base.html" %} -{% block subtitle %}{{ _('Members') }} - {{ c.group_dict.display_name }} - {{ _('Groups') }}{% endblock %} +{% block subtitle %}{{ _('Members') }} - {{ group_dict.display_name }} - {{ _('Groups') }}{% endblock %} {% block page_primary_action %} - {% link_for _('Add Member'), controller='group', action='member_new', id=c.group_dict.id, class_='btn btn-primary', icon='plus-square' %} + {% link_for _('Add Member'), named_route=group_type+'.member_new', id=group_dict.id, class_='btn btn-primary', icon='plus-square' %} {% endblock %} {% block primary_content_inner %} -

          {{ _('{0} members'.format(c.members|length)) }}

          +

          {{ _('{0} members'.format(members|length)) }}

          @@ -17,7 +17,7 @@

          {{ _('{0} members'.format(c.members|length)) }}

          - {% for user_id, user, role in c.members %} + {% for user_id, user, role in members %} diff --git a/ckan/templates-bs2/group/new.html b/ckan/templates-bs2/group/new.html index 1d78ac40010..75fad5ef460 100644 --- a/ckan/templates-bs2/group/new.html +++ b/ckan/templates-bs2/group/new.html @@ -2,7 +2,7 @@ {% block subtitle %}{{ _('Create a Group') }}{% endblock %} -{% block breadcrumb_link %}{{ h.nav_link(_('Create a Group'), controller='group', action='edit', id=c.group.name) }}{% endblock %} +{% block breadcrumb_link %}{{ h.nav_link(_('Create a Group'), named_route=group_type+'.new') }}{% endblock %} {% block page_heading %}{{ _('Create a Group') }}{% endblock %} diff --git a/ckan/templates-bs2/group/read.html b/ckan/templates-bs2/group/read.html index 8f6ca94cd89..db9f3744009 100644 --- a/ckan/templates-bs2/group/read.html +++ b/ckan/templates-bs2/group/read.html @@ -1,15 +1,15 @@ {% extends "group/read_base.html" %} -{% block subtitle %}{{ h.get_translated(c.group_dict, 'title') or c.group_dict.display_name }}{% endblock %} +{% block subtitle %}{{ h.get_translated(group_dict, 'title') or group_dict.display_name }}{% endblock %} {% block primary_content_inner %} {% block groups_search_form %} {% set facets = { - 'fields': c.fields_grouped, - 'search': c.search_facets, - 'titles': c.facet_titles, - 'translated_fields': c.translated_fields, - 'remove_field': c.remove_field } + 'fields': fields_grouped, + 'search': search_facets, + 'titles': facet_titles, + 'translated_fields': translated_fields, + 'remove_field': remove_field } %} {% set sorting = [ (_('Relevance'), 'score desc, metadata_modified desc'), @@ -18,15 +18,15 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'snippets/search_form.html', form_id='group-datasets-search-form', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, placeholder=_('Search datasets...'), show_empty=request.params, fields=c.fields %} + {% snippet 'snippets/search_form.html', form_id='group-datasets-search-form', type='dataset', query=q, sorting=sorting, sorting_selected=sort_by_selected, count=page.item_count, facets=facets, placeholder=_('Search datasets...'), show_empty=request.params, fields=fields %} {% endblock %} {% block packages_list %} - {% if c.page.items %} - {{ h.snippet('snippets/package_list.html', packages=c.page.items) }} + {% if page.items %} + {{ h.snippet('snippets/package_list.html', packages=page.items) }} {% endif %} {% endblock %} {% block page_pagination %} - {{ c.page.pager(q=c.q) }} + {{ page.pager(q=q) }} {% endblock %} {% endblock %} @@ -34,8 +34,8 @@ {{ super() }}
          - {% for facet in c.facet_titles %} - {{ h.snippet('snippets/facet_list.html', title=c.facet_titles[facet], name=facet, extras={'id':c.group_dict.id}) }} + {% for facet in facet_titles %} + {{ h.snippet('snippets/facet_list.html', title=facet_titles[facet], name=facet, extras={'id':group_dict.id}) }} {% endfor %}
          close diff --git a/ckan/templates-bs2/group/read_base.html b/ckan/templates-bs2/group/read_base.html index 56b9559b1a1..e0c98de02f2 100644 --- a/ckan/templates-bs2/group/read_base.html +++ b/ckan/templates-bs2/group/read_base.html @@ -1,26 +1,26 @@ {% extends "page.html" %} -{% block subtitle %}{{ h.get_translated(c.group_dict, 'title') or c.group_dict.display_name }} - {{ _('Groups') }}{% endblock %} +{% block subtitle %}{{ h.get_translated(group_dict, 'title') or group_dict.display_name }} - {{ _('Groups') }}{% endblock %} {% block breadcrumb_content %} -
        • {% link_for _('Groups'), controller='group', action='index' %}
        • -
        • {% link_for h.get_translated(c.group_dict, 'title') or c.group_dict.display_name |truncate(35), controller='group', action='read', id=c.group_dict.name %}
        • +
        • {% link_for _('Groups'), named_route=group_type+'.index' %}
        • +
        • {% link_for h.get_translated(group_dict, 'title') or group_dict.display_name |truncate(35), named_route=group_type+'.read', id=group_dict.name %}
        • {% endblock %} {% block content_action %} - {% if h.check_access('group_update', {'id': c.group_dict.id}) %} - {% link_for _('Manage'), controller='group', action='edit', id=c.group_dict.name, class_='btn', icon='wrench' %} + {% if h.check_access('group_update', {'id': group_dict.id}) %} + {% link_for _('Manage'), named_route=group_type+'.edit', id=group_dict.name, class_='btn', icon='wrench' %} {% endif %} {% endblock %} {% block content_primary_nav %} - {{ h.build_nav_icon('group_read', _('Datasets'), id=c.group_dict.name) }} - {{ h.build_nav_icon('group_activity', _('Activity Stream'), id=c.group_dict.name, offset=0) }} - {{ h.build_nav_icon('group_about', _('About'), id=c.group_dict.name) }} + {{ h.build_nav_icon(group_type + '.read', _('Datasets'), id=group_dict.name) }} + {{ h.build_nav_icon(group_type + '.activity', _('Activity Stream'), id=group_dict.name, offset=0) }} + {{ h.build_nav_icon(group_type + '.about', _('About'), id=group_dict.name) }} {% endblock %} {% block secondary_content %} - {% snippet "group/snippets/info.html", group=c.group_dict, show_nums=true %} + {% snippet "group/snippets/info.html", group=group_dict, show_nums=true %} {% endblock %} {% block links %} diff --git a/ckan/templates-bs2/group/snippets/feeds.html b/ckan/templates-bs2/group/snippets/feeds.html index dabed46ae1d..c60eadcd6c4 100644 --- a/ckan/templates-bs2/group/snippets/feeds.html +++ b/ckan/templates-bs2/group/snippets/feeds.html @@ -1,4 +1,4 @@ -{%- set dataset_feed = h.url_for(controller='feed', action='group', id=c.group_dict.name) -%} +{%- set dataset_feed = h.url_for('feeds.group', id=group_dict.name) -%} {%- set history_feed = h.url_for(controller='revision', action='list', format='atom', days=1) -%} - + diff --git a/ckan/templates-bs2/group/snippets/group_form.html b/ckan/templates-bs2/group/snippets/group_form.html index 8c3f4f4e5e3..058f4d2e50a 100644 --- a/ckan/templates-bs2/group/snippets/group_form.html +++ b/ckan/templates-bs2/group/snippets/group_form.html @@ -10,12 +10,12 @@ {{ form.input('title', label=_('Name'), id='field-name', placeholder=_('My Group'), value=data.title, error=errors.title, classes=['control-full'], attrs=attrs) }} {# Perhaps these should be moved into the controller? #} - {% set prefix = h.url_for(controller='group', action='read', id='') %} - {% set domain = h.url_for(controller='group', action='read', id='', qualified=true) %} + {% set prefix = h.url_for(group_type + '.read', id='') %} + {% set domain = h.url_for(group_type + '.read', id='', qualified=true) %} {% set domain = domain|replace("http://", "")|replace("https://", "") %} - {% set attrs = {'data-module': 'slug-preview-slug', 'data-module-prefix': domain, 'data-module-placeholder': ''} %} + {% set attrs = {'data-module': 'slug-preview-slug', 'data-module-prefix': domain, 'data-module-placeholder': '<' + group_type + '>'} %} - {{ form.prepend('name', label=_('URL'), prepend=prefix, id='field-url', placeholder=_('my-group'), value=data.name, error=errors.name, attrs=attrs, is_required=true) }} + {{ form.prepend('name', label=_('URL'), prepend=prefix, id='field-url', placeholder=_('my-' + group_type), value=data.name, error=errors.name, attrs=attrs, is_required=true) }} {{ form.markdown('description', label=_('Description'), id='field-description', placeholder=_('A little information about my group...'), value=data.description, error=errors.description) }} @@ -27,29 +27,7 @@ {% endblock %} {% block custom_fields %} - {% for extra in data.extras %} - {% set prefix = 'extras__%d__' % loop.index0 %} - {{ form.custom( - names=(prefix ~ 'key', prefix ~ 'value', prefix ~ 'deleted'), - id='field-extras-%d' % loop.index, - label=_('Custom Field'), - values=(extra.key, extra.value, extra.deleted), - error=errors[prefix ~ 'key'] or errors[prefix ~ 'value'] - ) }} - {% endfor %} - - {# Add a max if 3 empty columns #} - {% for extra in range(data.extras|count, 3) %} - {% set index = (loop.index0 + data.extras|count) %} - {% set prefix = 'extras__%d__' % index %} - {{ form.custom( - names=(prefix ~ 'key', prefix ~ 'value', prefix ~ 'deleted'), - id='field-extras-%d' % index, - label=_('Custom Field'), - values=(extra.key, extra.value, extra.deleted), - error=errors[prefix ~ 'key'] or errors[prefix ~ 'value'] - ) }} - {% endfor %} + {% snippet 'snippets/custom_form_fields.html', extras=data.extras, errors=errors, limit=3 %} {% endblock %} {{ form.required_message() }} @@ -57,7 +35,7 @@
          {% block delete_button %} {% if h.check_access('group_delete', {'id': data.id}) %} - {% block delete_button_text %}{{ _('Delete') }}{% endblock %} + {% block delete_button_text %}{{ _('Delete') }}{% endblock %} {% endif %} {% endblock %} diff --git a/ckan/templates-bs2/group/snippets/info.html b/ckan/templates-bs2/group/snippets/info.html index d757baa6e16..a62ff8cce5c 100644 --- a/ckan/templates-bs2/group/snippets/info.html +++ b/ckan/templates-bs2/group/snippets/info.html @@ -21,7 +21,7 @@

          {% if h.get_translated(group, 'description') %}

          {{ h.markdown_extract(h.get_translated(group, 'description'), 180) }} - {% link_for _('read more'), controller='group', action='about', id=group.name %} + {% link_for _('read more'), named_route=group_type+'.about', id=group.name %}

          {% endif %} {% endblock %} diff --git a/ckan/templates-bs2/header.html b/ckan/templates-bs2/header.html index 60699841a2f..f54463bb6e8 100644 --- a/ckan/templates-bs2/header.html +++ b/ckan/templates-bs2/header.html @@ -80,10 +80,10 @@ {% block header_logo %} {% if g.site_logo %} - + {% else %}

          - {{ g.site_title }} + {{ g.site_title }}

          {% if g.site_description %}

          {{ g.site_description }}

          {% endif %} {% endif %} @@ -98,10 +98,10 @@

          @@ -109,7 +109,7 @@

          {% endblock %} {% block header_site_search %} - +
          diff --git a/ckan/templates-bs2/home/snippets/search.html b/ckan/templates-bs2/home/snippets/search.html index 710694173ab..72b74d4cdcd 100644 --- a/ckan/templates-bs2/home/snippets/search.html +++ b/ckan/templates-bs2/home/snippets/search.html @@ -1,8 +1,8 @@ -{% set tags = h.get_facet_items_dict('tags', limit=3) %} +{% set tags = h.get_facet_items_dict('tags', c.search_facets, limit=3) %} {% set placeholder = _('E.g. environment') %}

          diff --git a/ckan/templates-bs2/organization/new.html b/ckan/templates-bs2/organization/new.html index 7af6a1d08db..1244a567e7d 100644 --- a/ckan/templates-bs2/organization/new.html +++ b/ckan/templates-bs2/organization/new.html @@ -2,7 +2,7 @@ {% block subtitle %}{{ _('Create an Organization') }}{% endblock %} -{% block breadcrumb_link %}{{ h.nav_link(_('Create an Organization'), controller='organization', action='edit', id=c.organization.name) }}{% endblock %} +{% block breadcrumb_link %}{{ h.nav_link(_('Create an Organization'), named_route=group_type+'.edit', id=c.organization.name) }}{% endblock %} {% block page_heading %}{{ _('Create an Organization') }}{% endblock %} diff --git a/ckan/templates-bs2/organization/read.html b/ckan/templates-bs2/organization/read.html index 3ed6065dabb..506130eb521 100644 --- a/ckan/templates-bs2/organization/read.html +++ b/ckan/templates-bs2/organization/read.html @@ -2,7 +2,7 @@ {% block page_primary_action %} {% if h.check_access('package_create', {'owner_org': c.group_dict.id}) %} - {% link_for _('Add Dataset'), controller='package', action='new', group=c.group_dict.id, class_='btn btn-primary', icon='plus-square' %} + {% link_for _('Add Dataset'), named_route='dataset.new', group=c.group_dict.id, class_='btn btn-primary', icon='plus-square' %} {% endif %} {% endblock %} diff --git a/ckan/templates-bs2/organization/read_base.html b/ckan/templates-bs2/organization/read_base.html index 866debf7b81..1fd76976fe4 100644 --- a/ckan/templates-bs2/organization/read_base.html +++ b/ckan/templates-bs2/organization/read_base.html @@ -3,24 +3,24 @@ {% block subtitle %}{{ c.group_dict.display_name }} - {{ _('Organizations') }}{% endblock %} {% block breadcrumb_content %} -
        • {% link_for _('Organizations'), controller='organization', action='index' %}
        • -
        • {% link_for c.group_dict.display_name|truncate(35), controller='organization', action='read', id=c.group_dict.name %}
        • +
        • {% link_for _('Organizations'), named_route=group_type+'.index' %}
        • +
        • {% link_for c.group_dict.display_name|truncate(35), named_route=group_type+'.read', id=c.group_dict.name %}
        • {% endblock %} {% block content_action %} {% if h.check_access('organization_update', {'id': c.group_dict.id}) %} - {% link_for _('Manage'), controller='organization', action='edit', id=c.group_dict.name, class_='btn', icon='wrench' %} + {% link_for _('Manage'), named_route=group_type+'.edit', id=c.group_dict.name, class_='btn', icon='wrench' %} {% endif %} {% endblock %} {% block content_primary_nav %} - {{ h.build_nav_icon('organization_read', _('Datasets'), id=c.group_dict.name) }} - {{ h.build_nav_icon('organization_activity', _('Activity Stream'), id=c.group_dict.name, offset=0) }} - {{ h.build_nav_icon('organization_about', _('About'), id=c.group_dict.name) }} + {{ h.build_nav_icon(group_type + '.read', _('Datasets'), id=c.group_dict.name) }} + {{ h.build_nav_icon(group_type + '.activity', _('Activity Stream'), id=c.group_dict.name, offset=0) }} + {{ h.build_nav_icon(group_type + '.about', _('About'), id=c.group_dict.name) }} {% endblock %} {% block secondary_content %} - {% snippet 'snippets/organization.html', organization=c.group_dict, show_nums=true %} + {% snippet 'snippets/organization.html', organization=c.group_dict, show_nums=true, group_type=group_type %} {% block organization_facets %}{% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/organization/snippets/feeds.html b/ckan/templates-bs2/organization/snippets/feeds.html index dd26a4d5043..29a3bcca5cd 100644 --- a/ckan/templates-bs2/organization/snippets/feeds.html +++ b/ckan/templates-bs2/organization/snippets/feeds.html @@ -1,4 +1,4 @@ -{%- set dataset_feed = h.url_for(controller='feed', action='organization', id=c.group_dict.name) -%} +{%- set dataset_feed = h.url_for('feeds.organization', id=c.group_dict.name) -%} {%- set history_feed = h.url_for(controller='revision', action='list', format='atom', days=1) -%} diff --git a/ckan/templates-bs2/organization/snippets/info.html b/ckan/templates-bs2/organization/snippets/info.html index 93be5e42610..47917f19b57 100644 --- a/ckan/templates-bs2/organization/snippets/info.html +++ b/ckan/templates-bs2/organization/snippets/info.html @@ -13,8 +13,8 @@

          {{ _("Edit Organization") }}

          -{% endif %} \ No newline at end of file +{% endif %} diff --git a/ckan/templates-bs2/organization/snippets/organization_form.html b/ckan/templates-bs2/organization/snippets/organization_form.html index b6f121cec3c..02e3aa4fabe 100644 --- a/ckan/templates-bs2/organization/snippets/organization_form.html +++ b/ckan/templates-bs2/organization/snippets/organization_form.html @@ -10,12 +10,12 @@ {{ form.input('title', label=_('Name'), id='field-name', placeholder=_('My Organization'), value=data.title, error=errors.title, classes=['control-full'], attrs=attrs) }} {# Perhaps these should be moved into the controller? #} - {% set prefix = h.url_for(controller='organization', action='read', id='') %} - {% set domain = h.url_for(controller='organization', action='read', id='', qualified=true) %} + {% set prefix = h.url_for(group_type + '.read', id='') %} + {% set domain = h.url_for(group_type + '.read', id='', qualified=true) %} {% set domain = domain|replace("http://", "")|replace("https://", "") %} - {% set attrs = {'data-module': 'slug-preview-slug', 'data-module-prefix': domain, 'data-module-placeholder': ''} %} + {% set attrs = {'data-module': 'slug-preview-slug', 'data-module-prefix': domain, 'data-module-placeholder': '<' + group_type + '>'} %} - {{ form.prepend('name', label=_('URL'), prepend=prefix, id='field-url', placeholder=_('my-organization'), value=data.name, error=errors.name, attrs=attrs, is_required=true) }} + {{ form.prepend('name', label=_('URL'), prepend=prefix, id='field-url', placeholder=_('my-' + group_type), value=data.name, error=errors.name, attrs=attrs, is_required=true) }} {{ form.markdown('description', label=_('Description'), id='field-description', placeholder=_('A little information about my organization...'), value=data.description, error=errors.description) }} @@ -27,29 +27,7 @@ {% endblock %} {% block custom_fields %} - {% for extra in data.extras %} - {% set prefix = 'extras__%d__' % loop.index0 %} - {{ form.custom( - names=(prefix ~ 'key', prefix ~ 'value', prefix ~ 'deleted'), - id='field-extras-%d' % loop.index, - label=_('Custom Field'), - values=(extra.key, extra.value, extra.deleted), - error=errors[prefix ~ 'key'] or errors[prefix ~ 'value'] - ) }} - {% endfor %} - - {# Add a max if 3 empty columns #} - {% for extra in range(data.extras|count, 3) %} - {% set index = (loop.index0 + data.extras|count) %} - {% set prefix = 'extras__%d__' % index %} - {{ form.custom( - names=(prefix ~ 'key', prefix ~ 'value', prefix ~ 'deleted'), - id='field-extras-%d' % index, - label=_('Custom Field'), - values=(extra.key, extra.value, extra.deleted), - error=errors[prefix ~ 'key'] or errors[prefix ~ 'value'] - ) }} - {% endfor %} + {% snippet 'snippets/custom_form_fields.html', extras=data.extras, errors=errors, limit=3 %} {% endblock %} {{ form.required_message() }} @@ -57,7 +35,7 @@
          {% block delete_button %} {% if h.check_access('organization_delete', {'id': data.id}) %} - {% block delete_button_text %}{{ _('Delete') }}{% endblock %} + {% block delete_button_text %}{{ _('Delete') }}{% endblock %} {% endif %} {% endblock %} diff --git a/ckan/templates-bs2/organization/snippets/organization_item.html b/ckan/templates-bs2/organization/snippets/organization_item.html index b0151d712e1..f587941483e 100644 --- a/ckan/templates-bs2/organization/snippets/organization_item.html +++ b/ckan/templates-bs2/organization/snippets/organization_item.html @@ -11,7 +11,7 @@ {% endfor %} #} -{% set url = h.url_for(organization.type ~ '_read', action='read', id=organization.name) %} +{% set url = h.url_for(organization.type ~ '.read', id=organization.name) %} {% block item %}
        • {% block item_inner %} diff --git a/ckan/templates-bs2/package/activity.html b/ckan/templates-bs2/package/activity.html index 3941a6dda02..fa2f6b08c57 100644 --- a/ckan/templates-bs2/package/activity.html +++ b/ckan/templates-bs2/package/activity.html @@ -5,6 +5,6 @@ {% block primary_content_inner %}

          {% block page_heading %}{{ _('Activity Stream') }}{% endblock %}

          {% block activity_stream %} - {{ c.package_activity_stream | safe }} + {{ package_activity_stream | safe }} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/package/base.html b/ckan/templates-bs2/package/base.html index 1a2954a7b73..8d0ef0ce83f 100644 --- a/ckan/templates-bs2/package/base.html +++ b/ckan/templates-bs2/package/base.html @@ -1,24 +1,24 @@ {% extends "page.html" %} -{% set pkg = c.pkg_dict or pkg_dict %} +{% set pkg = pkg_dict %} {% block breadcrumb_content_selected %} class="active"{% endblock %} {% block subtitle %}{{ _('Datasets') }}{% endblock %} {% block breadcrumb_content %} - {% if pkg %} - {% set dataset = h.dataset_display_name(pkg) %} - {% if pkg.organization %} - {% set organization = h.get_translated(pkg.organization, 'title') or pkg.organization.name %} -
        • {% link_for _('Organizations'), controller='organization', action='index' %}
        • -
        • {% link_for organization|truncate(30), controller='organization', action='read', id=pkg.organization.name %}
        • + {% if pkg %} + {% set dataset = h.dataset_display_name(pkg) %} + {% if pkg.organization %} + {% set organization = h.get_translated(pkg.organization, 'title') or pkg.organization.name %} +
        • {% link_for _('Organizations'), controller='organization', action='index' %}
        • +
        • {% link_for organization|truncate(30), controller='organization', action='read', id=pkg.organization.name %}
        • + {% else %} +
        • {% link_for _('Datasets'), named_route='dataset.search' %}
        • + {% endif %} + {% link_for dataset|truncate(30), named_route='dataset.read', id=pkg.name %} {% else %} -
        • {% link_for _('Datasets'), controller='package', action='search' %}
        • +
        • {% link_for _('Datasets'), named_route='dataset.search' %}
        • +
        • {{ _('Create Dataset') }}
        • {% endif %} - {% link_for dataset|truncate(30), controller='package', action='read', id=pkg.name %} - {% else %} -
        • {% link_for _('Datasets'), controller='package', action='search' %}
        • -
        • {{ _('Create Dataset') }}
        • - {% endif %} {% endblock %} diff --git a/ckan/templates-bs2/package/base_form_page.html b/ckan/templates-bs2/package/base_form_page.html index 2aae2f3b0d3..fe2b7d5e1d9 100644 --- a/ckan/templates-bs2/package/base_form_page.html +++ b/ckan/templates-bs2/package/base_form_page.html @@ -6,10 +6,7 @@
          {% block primary_content_inner %} {% block form %} - {#- passing c to a snippet is bad but is required here - for backwards compatibility with old templates and - plugins using setup_template_variables() -#} - {{- h.snippet(form_snippet, c=c, **form_vars) -}} + {{- h.snippet(form_snippet, pkg_dict=pkg_dict, **form_vars) -}} {% endblock %} {% endblock %}
          diff --git a/ckan/templates-bs2/package/confirm_delete.html b/ckan/templates-bs2/package/confirm_delete.html index 2ab7596fd97..2f3c0553998 100644 --- a/ckan/templates-bs2/package/confirm_delete.html +++ b/ckan/templates-bs2/package/confirm_delete.html @@ -8,10 +8,10 @@
          {% block form %} - {% set dataset = h.dataset_display_name(c.pkg_dict) %} + {% set dataset = h.dataset_display_name(pkg_dict) %}

          {{ _('Are you sure you want to delete dataset - {name}?').format(name=dataset) }}

          - + diff --git a/ckan/templates-bs2/package/confirm_delete_resource.html b/ckan/templates-bs2/package/confirm_delete_resource.html index f03278c3b4a..ab3961ce61b 100644 --- a/ckan/templates-bs2/package/confirm_delete_resource.html +++ b/ckan/templates-bs2/package/confirm_delete_resource.html @@ -8,9 +8,9 @@

          {% block form %} -

          {{ _('Are you sure you want to delete resource - {name}?').format(name=h.resource_display_name(c.resource_dict)) }}

          +

          {{ _('Are you sure you want to delete resource - {name}?').format(name=h.resource_display_name(resource_dict)) }}

          -
          + diff --git a/ckan/templates-bs2/package/edit.html b/ckan/templates-bs2/package/edit.html index a4c120b0a72..b0cac63a7a1 100644 --- a/ckan/templates-bs2/package/edit.html +++ b/ckan/templates-bs2/package/edit.html @@ -1,10 +1,7 @@ {% extends 'package/edit_base.html' %} {% block primary_content_inner %} - {% block form %} - {#- passing c to a snippet is bad but is required here - for backwards compatibility with old templates and - plugins using setup_template_variables() -#} - {{- h.snippet(form_snippet, c=c, **form_vars) -}} - {% endblock %} + {% block form %} + {{- h.snippet(form_snippet, pkg_dict=pkg_dict, **form_vars) -}} + {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/package/edit_base.html b/ckan/templates-bs2/package/edit_base.html index fd1b5bf7a98..a29d5ffead0 100644 --- a/ckan/templates-bs2/package/edit_base.html +++ b/ckan/templates-bs2/package/edit_base.html @@ -1,26 +1,23 @@ {% extends 'package/base.html' %} -{% set pkg = c.pkg_dict %} -{% set pkg_dict = c.pkg_dict %} - {% block breadcrumb_content_selected %}{% endblock %} {% block breadcrumb_content %} - {{ super() }} - {% if pkg %} -

        • {% link_for _('Edit'), controller='package', action='edit', id=pkg.name %}
        • - {% endif %} + {{ super() }} + {% if pkg %} +
        • {% link_for _('Edit'), named_route='dataset.edit', id=pkg.name %}
        • + {% endif %} {% endblock %} {% block content_action %} - {% link_for _('View dataset'), controller='package', action='read', id=pkg.name, class_='btn', icon='eye' %} + {% link_for _('View dataset'), named_route='dataset.read', id=pkg.name, class_='btn', icon='eye' %} {% endblock %} {% block content_primary_nav %} - {{ h.build_nav_icon('dataset_edit', _('Edit metadata'), id=pkg.name) }} - {{ h.build_nav_icon('dataset_resources', _('Resources'), id=pkg.name) }} + {{ h.build_nav_icon('dataset.edit', _('Edit metadata'), id=pkg.name) }} + {{ h.build_nav_icon('dataset.resources', _('Resources'), id=pkg.name) }} {% endblock %} {% block secondary_content %} - {% snippet 'package/snippets/info.html', pkg=pkg, hide_follow_button=true %} + {% snippet 'package/snippets/info.html', pkg=pkg, hide_follow_button=true %} {% endblock %} diff --git a/ckan/templates-bs2/package/edit_view.html b/ckan/templates-bs2/package/edit_view.html index 9031a42d6b4..682bad1047c 100644 --- a/ckan/templates-bs2/package/edit_view.html +++ b/ckan/templates-bs2/package/edit_view.html @@ -1,6 +1,6 @@ {% extends "package/view_edit_base.html" %} -{% block subtitle %}{{ _('Edit view') }} - {{ h.resource_display_name(c.resource) }}{% endblock %} +{% block subtitle %}{{ _('Edit view') }} - {{ h.resource_display_name(resource) }}{% endblock %} {% block form_title %}{{ _('Edit view') }}{% endblock %} {% block breadcrumb_content %} diff --git a/ckan/templates-bs2/package/followers.html b/ckan/templates-bs2/package/followers.html index 7ede940b879..bce4280da0e 100644 --- a/ckan/templates-bs2/package/followers.html +++ b/ckan/templates-bs2/package/followers.html @@ -1,10 +1,10 @@ {% extends "package/read_base.html" %} -{% block subtitle %}{{ _('Followers') }} - {{ h.dataset_display_name(c.pkg_dict) }}{% endblock %} +{% block subtitle %}{{ _('Followers') }} - {{ h.dataset_display_name(pkg_dict) }}{% endblock %} {% block primary_content_inner %}

          {% block page_heading %}{{ _('Followers') }}{% endblock %}

          {% block followers_list %} - {% snippet "user/snippets/followers.html", followers=c.followers %} + {% snippet "user/snippets/followers.html", followers=followers %} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/package/group_list.html b/ckan/templates-bs2/package/group_list.html index 34b29496c11..b27bbf7baea 100644 --- a/ckan/templates-bs2/package/group_list.html +++ b/ckan/templates-bs2/package/group_list.html @@ -4,10 +4,10 @@ {% block primary_content_inner %}

          {{ _('Groups') }}

          - {% if c.group_dropdown %} + {% if group_dropdown %}
          @@ -15,9 +15,9 @@

          {{ _('Groups') }}

          {% endif %} - {% if c.pkg_dict.groups %} + {% if pkg_dict.groups %}
          - {% snippet 'group/snippets/group_list.html', groups=c.pkg_dict.groups %} + {% snippet 'group/snippets/group_list.html', groups=pkg_dict.groups %} {% else %}

          {{ _('There are no groups associated with this dataset') }}

          diff --git a/ckan/templates-bs2/package/new_package_form.html b/ckan/templates-bs2/package/new_package_form.html index 06fd718d238..e89ac5705d6 100644 --- a/ckan/templates-bs2/package/new_package_form.html +++ b/ckan/templates-bs2/package/new_package_form.html @@ -1,6 +1,5 @@ {% extends 'package/snippets/package_form.html' %} -{% set form_style = c.form_style or c.action %} {% block stages %} {% if form_style != 'edit' %} @@ -23,7 +22,7 @@ {% endblock %} {% block delete_button %} - {% if form_style == 'edit' and h.check_access('package_delete', {'id': c.pkg_dict.id}) %} + {% if form_style == 'edit' and h.check_access('package_delete', {'id': pkg_dict.id}) %} {{ super() }} {% endif %} {% endblock %} diff --git a/ckan/templates-bs2/package/new_view.html b/ckan/templates-bs2/package/new_view.html index 60ddfceefd7..c7782310ac4 100644 --- a/ckan/templates-bs2/package/new_view.html +++ b/ckan/templates-bs2/package/new_view.html @@ -1,6 +1,6 @@ {% extends "package/view_edit_base.html" %} -{% block subtitle %}{{ _('Add view') }} - {{ h.resource_display_name(c.resource) }}{% endblock %} +{% block subtitle %}{{ _('Add view') }} - {{ h.resource_display_name(resource) }}{% endblock %} {% block form_title %}{{ _('Add view') }}{% endblock %} {% block breadcrumb_content %} diff --git a/ckan/templates-bs2/package/read.html b/ckan/templates-bs2/package/read.html index 708e15083a1..8246e2cc6ba 100644 --- a/ckan/templates-bs2/package/read.html +++ b/ckan/templates-bs2/package/read.html @@ -1,7 +1,5 @@ {% extends "package/read_base.html" %} -{% set pkg = c.pkg_dict %} - {% block primary_content_inner %} {{ super() }} {% block package_description %} diff --git a/ckan/templates-bs2/package/read_base.html b/ckan/templates-bs2/package/read_base.html index 448f31a8706..b18322707b0 100644 --- a/ckan/templates-bs2/package/read_base.html +++ b/ckan/templates-bs2/package/read_base.html @@ -11,14 +11,14 @@ {% block content_action %} {% if h.check_access('package_update', {'id':pkg.id }) %} - {% link_for _('Manage'), controller='package', action='edit', id=pkg.name, class_='btn', icon='wrench' %} + {% link_for _('Manage'), named_route='dataset.edit', id=pkg.name, class_='btn', icon='wrench' %} {% endif %} {% endblock %} {% block content_primary_nav %} - {{ h.build_nav_icon('dataset_read', _('Dataset'), id=pkg.name) }} - {{ h.build_nav_icon('dataset_groups', _('Groups'), id=pkg.name) }} - {{ h.build_nav_icon('dataset_activity', _('Activity Stream'), id=pkg.name) }} + {{ h.build_nav_icon('dataset.read', _('Dataset'), id=pkg.name) }} + {{ h.build_nav_icon('dataset.groups', _('Groups'), id=pkg.name) }} + {{ h.build_nav_icon('dataset.activity', _('Activity Stream'), id=pkg.name) }} {% endblock %} {% block primary_content_inner %} @@ -27,7 +27,7 @@

          {% set timestamp = h.render_datetime(c.revision_date, with_hours=True) %} - {% set url = h.url_for(controller='package', action='read', id=pkg.name) %} + {% set url = h.url_for('dataset.read', id=pkg.name) %} {% trans timestamp=timestamp, url=url %}This is an old revision of this dataset, as edited at {{ timestamp }}. It may differ significantly from the current revision.{% endtrans %}

          diff --git a/ckan/templates-bs2/package/resource_edit.html b/ckan/templates-bs2/package/resource_edit.html index c68edd2763a..5d0a65c30aa 100644 --- a/ckan/templates-bs2/package/resource_edit.html +++ b/ckan/templates-bs2/package/resource_edit.html @@ -8,7 +8,7 @@ errors=errors, error_summary=error_summary, pkg_name=pkg.name, - form_action=c.form_action, + form_action=form_action, allow_upload=g.ofs_impl and logged_in, resource_form_snippet=resource_form_snippet, dataset_type=dataset_type %} diff --git a/ckan/templates-bs2/package/resource_edit_base.html b/ckan/templates-bs2/package/resource_edit_base.html index a3e952c9506..fb6606e0702 100644 --- a/ckan/templates-bs2/package/resource_edit_base.html +++ b/ckan/templates-bs2/package/resource_edit_base.html @@ -1,29 +1,29 @@ {% extends "package/base.html" %} {% set logged_in = true if c.userobj else false %} -{% set res = c.resource %} +{% set res = resource %} {% block breadcrumb_content_selected %}{% endblock %} {% block breadcrumb_content %} - {{ super() }} - {% if res %} -
        • {% link_for h.resource_display_name(res)|truncate(30), controller='package', action='resource_read', id=pkg.name, resource_id=res.id %}
        • - {{ _('Edit') }} - {% endif %} + {{ super() }} + {% if res %} +
        • {% link_for h.resource_display_name(res)|truncate(30), named_route='resource.read', id=pkg.name, resource_id=res.id %}
        • + {{ _('Edit') }} + {% endif %} {% endblock %} {% block content_action %} - {% link_for _('All resources'), controller='package', action='resources', id=pkg.name, class_='btn', icon='arrow-left' %} - {% if res %} - {% link_for _('View resource'), controller='package', action='resource_read', id=pkg.name, resource_id=res.id, class_='btn', icon='eye' %} + {% link_for _('All resources'), named_route='dataset.resources', id=pkg.name, class_='btn', icon='arrow-left' %} + {% if res %} + {% link_for _('View resource'), named_route='resource.read', id=pkg.name, resource_id=res.id, class_='btn', icon='eye' %} {% endif %} {% endblock %} {% block content_primary_nav %} - {{ h.build_nav_icon('resource_edit', _('Edit resource'), id=pkg.name, resource_id=res.id) }} + {{ h.build_nav_icon('resource.edit', _('Edit resource'), id=pkg.name, resource_id=res.id) }} {% block inner_primary_nav %}{% endblock %} - {{ h.build_nav_icon('views', _('Views'), id=pkg.name, resource_id=res.id) }} + {{ h.build_nav_icon('resource.views', _('Views'), id=pkg.name, resource_id=res.id) }} {% endblock %} {% block primary_content_inner %} diff --git a/ckan/templates-bs2/package/resource_read.html b/ckan/templates-bs2/package/resource_read.html index 8e51e1862eb..c57cda08e48 100644 --- a/ckan/templates-bs2/package/resource_read.html +++ b/ckan/templates-bs2/package/resource_read.html @@ -1,15 +1,15 @@ {% extends "package/base.html" %} -{% set res = c.resource %} +{% set res = resource %} {% block head_extras -%} {{ super() }} - {% set description = h.markdown_extract(h.get_translated(res, 'description'), extract_length=200) if res.description else h.markdown_extract(h.get_translated(c.package, 'notes'), extract_length=200) %} - + {% set description = h.markdown_extract(h.get_translated(res, 'description'), extract_length=200) if res.description else h.markdown_extract(h.get_translated(package, 'notes'), extract_length=200) %} + {% endblock -%} -{% block subtitle %}{{ h.dataset_display_name(c.package) }} - {{ h.resource_display_name(res) }}{% endblock %} +{% block subtitle %}{{ h.dataset_display_name(package) }} - {{ h.resource_display_name(res) }}{% endblock %} {% block breadcrumb_content_selected %}{% endblock %} @@ -28,7 +28,7 @@
            {% block resource_actions_inner %} {% if h.check_access('package_update', {'id':pkg.id }) %} -
          • {% link_for _('Manage'), controller='package', action='resource_edit', id=pkg.name, resource_id=res.id, class_='btn', icon='wrench' %}
          • +
          • {% link_for _('Manage'), named_route='resource.edit', id=pkg.name, resource_id=res.id, class_='btn', icon='wrench' %}
          • {% endif %} {% if res.url and h.is_url(res.url) %}
          • @@ -38,7 +38,7 @@ {{ _('View') }} {% elif res.resource_type == 'api' %} {{ _('API Endpoint') }} - {% elif (not res.has_views or not res.can_be_previewed) and not res.url_type == 'upload' %} + {% elif not res.has_views and not res.url_type == 'upload' %} {{ _('Go to resource') }} {% else %} {{ _('Download') }} @@ -88,10 +88,10 @@ {% if res.description %} {{ h.render_markdown(res.description) }} {% endif %} - {% if not res.description and c.package.notes %} + {% if not res.description and package.notes %}

            {{ _('From the dataset abstract') }}

            -
            {{ h.markdown_extract(h.get_translated(c.package, 'notes')) }}
            -

            {% trans dataset=c.package.title, url=h.url_for(controller='package', action='read', id=c.package['name']) %}Source: {{ dataset }}{% endtrans %} +

            {{ h.markdown_extract(h.get_translated(package, 'notes')) }}
            +

            {% trans dataset=package.title, url=h.url_for('dataset.read', id=package['name']) %}Source: {{ dataset }}{% endtrans %} {% endif %}

          {% endblock %} @@ -99,32 +99,32 @@

          {{ _('From the dataset abstract') }}

          {% block data_preview %} {% block resource_view %} {% block resource_view_nav %} - {% set resource_preview = h.resource_preview(c.resource, c.package) %} + {% set resource_preview = h.resource_preview(resource, package) %} {% snippet "package/snippets/resource_views_list.html", views=resource_views, pkg=pkg, is_edit=false, view_id=current_resource_view['id'], resource_preview=resource_preview, - resource=c.resource, + resource=resource, extra_class="nav-tabs-plain" %} {% endblock %}
          {% block resource_view_content %}
          - {% set resource_preview = h.resource_preview(c.resource, c.package) %} + {% set resource_preview = h.resource_preview(resource, package) %} {% set views_created = res.has_views or resource_preview %} {% if views_created %} {% if resource_preview and not current_resource_view %} - {{ h.resource_preview(c.resource, c.package) }} + {{ h.resource_preview(resource, package) }} {% else %} {% for resource_view in resource_views %} {% if resource_view == current_resource_view %} {% snippet 'package/snippets/resource_view.html', resource_view=resource_view, - resource=c.resource, - package=c.package + resource=resource, + package=package %} {% endif %} {% endfor %} @@ -133,7 +133,7 @@

          {{ _('From the dataset abstract') }}

          {# Views not created #}

          {{ _("There are no views created for this resource yet.") }}

          - {% if h.check_access('resource_view_create', {'resource_id': c.resource.id}) %} + {% if h.check_access('resource_view_create', {'resource_id': resource.id}) %}

          {{ _("Not seeing the views you were expecting?")}} @@ -218,4 +218,3 @@

          {{ _('Additional Information') }}

          {% snippet "snippets/social.html" %} {% endblock %} {% endblock %} - diff --git a/ckan/templates-bs2/package/resource_views.html b/ckan/templates-bs2/package/resource_views.html index 5e4860c9c0d..f167d92a2c9 100644 --- a/ckan/templates-bs2/package/resource_views.html +++ b/ckan/templates-bs2/package/resource_views.html @@ -5,14 +5,14 @@ {% block page_primary_action %}
          - + {{ _('New view') }} @@ -22,8 +22,8 @@ {% block primary_content_inner %}
          - {% if c.views %} - {% snippet "package/snippets/resource_views_list.html", views=c.views, pkg=pkg, is_edit=true, extra_attributes='data-module = resource-view-reorder data-module-id=' + c.resource.id, extra_class='nav-stacked' %} + {% if views %} + {% snippet "package/snippets/resource_views_list.html", views=views, pkg=pkg, is_edit=true, extra_attributes='data-module = resource-view-reorder data-module-id=' + resource.id, extra_class='nav-stacked' %} {% else %}

          {{ _('This resource has no views') }}

          {% endif %} diff --git a/ckan/templates-bs2/package/resources.html b/ckan/templates-bs2/package/resources.html index dcb708e6d40..991b16db48b 100644 --- a/ckan/templates-bs2/package/resources.html +++ b/ckan/templates-bs2/package/resources.html @@ -1,11 +1,11 @@ {% extends "package/edit_base.html" %} -{% set has_reorder = c.pkg_dict and c.pkg_dict.resources and c.pkg_dict.resources|length > 0 %} +{% set has_reorder = pkg_dict and pkg_dict.resources and pkg_dict.resources|length > 0 %} {% block subtitle %}{{ _('Resources') }} - {{ h.dataset_display_name(pkg) }}{% endblock %} {% block page_primary_action %} - {% link_for _('Add new resource'), controller='package', action='new_resource', id=c.pkg_dict.name, class_='btn btn-primary', icon='plus' %} + {% link_for _('Add new resource'), named_route='resource.new', id=pkg_dict.name, class_='btn btn-primary', icon='plus' %} {% endblock %} {% block primary_content_inner %} @@ -17,7 +17,7 @@ {% endfor %} {% else %} - {% trans url=h.url_for(controller='package', action='new_resource', id=pkg.name) %} + {% trans url=h.url_for('resource.new', id=pkg.name) %}

          This dataset has no data, why not add some?

          {% endtrans %} {% endif %} diff --git a/ckan/templates-bs2/package/search.html b/ckan/templates-bs2/package/search.html index c86f515c850..ea657773be8 100644 --- a/ckan/templates-bs2/package/search.html +++ b/ckan/templates-bs2/package/search.html @@ -4,7 +4,7 @@ {% block subtitle %}{{ _("Datasets") }}{% endblock %} {% block breadcrumb_content %} -
        • {{ h.nav_link(_('Datasets'), controller='package', action='search', highlight_actions = 'new index') }}
        • +
        • {{ h.nav_link(_('Datasets'), named_route='dataset.search', highlight_actions = 'new index') }}
        • {% endblock %} {% block primary_content %} @@ -13,17 +13,17 @@ {% block page_primary_action %} {% if h.check_access('package_create') %}
          - {% link_for _('Add Dataset'), controller='package', action='new', class_='btn btn-primary', icon='plus-square' %} + {% link_for _('Add Dataset'), named_route='dataset.new', class_='btn btn-primary', icon='plus-square' %}
          {% endif %} {% endblock %} {% block form %} {% set facets = { - 'fields': c.fields_grouped, - 'search': c.search_facets, - 'titles': c.facet_titles, - 'translated_fields': c.translated_fields, - 'remove_field': c.remove_field } + 'fields': fields_grouped, + 'search': search_facets, + 'titles': facet_titles, + 'translated_fields': translated_fields, + 'remove_field': remove_field } %} {% set sorting = [ (_('Relevance'), 'score desc, metadata_modified desc'), @@ -32,15 +32,15 @@ (_('Last Modified'), 'metadata_modified desc'), (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] %} - {% snippet 'snippets/search_form.html', form_id='dataset-search-form', type='dataset', query=c.q, sorting=sorting, sorting_selected=c.sort_by_selected, count=c.page.item_count, facets=facets, show_empty=request.params, error=c.query_error, fields=c.fields %} + {% snippet 'snippets/search_form.html', form_id='dataset-search-form', type='dataset', query=q, sorting=sorting, sorting_selected=sort_by_selected, count=page.item_count, facets=facets, show_empty=request.params, error=query_error, fields=fields %} {% endblock %} {% block package_search_results_list %} - {{ h.snippet('snippets/package_list.html', packages=c.page.items) }} + {{ h.snippet('snippets/package_list.html', packages=page.items) }} {% endblock %}
          {% block page_pagination %} - {{ c.page.pager(q=c.q) }} + {{ page.pager(q=q) }} {% endblock %}
          @@ -72,11 +72,10 @@ {% block secondary_content %}
          - {% for facet in c.facet_titles %} - {{ h.snippet('snippets/facet_list.html', title=c.facet_titles[facet], name=facet) }} + {% for facet in facet_titles %} + {{ h.snippet('snippets/facet_list.html', title=facet_titles[facet], name=facet, search_facets=search_facets) }} {% endfor %}
          close
          {% endblock %} - diff --git a/ckan/templates-bs2/package/snippets/new_package_breadcrumb.html b/ckan/templates-bs2/package/snippets/new_package_breadcrumb.html index 8835695ec99..6ad61e21766 100644 --- a/ckan/templates-bs2/package/snippets/new_package_breadcrumb.html +++ b/ckan/templates-bs2/package/snippets/new_package_breadcrumb.html @@ -1,2 +1,2 @@ -
        • {% link_for _('Datasets'), controller='package', action='search', highlight_actions = 'new index' %}
        • -
        • {% link_for _('Create Dataset'), controller='package', action='new' %}
        • +
        • {% link_for _('Datasets'), named_route='dataset.search', highlight_actions = 'new index' %}
        • +
        • {% link_for _('Create Dataset'), named_route='dataset.new' %}
        • diff --git a/ckan/templates-bs2/package/snippets/package_basic_fields.html b/ckan/templates-bs2/package/snippets/package_basic_fields.html index 760338448bd..5ab5b581dad 100644 --- a/ckan/templates-bs2/package/snippets/package_basic_fields.html +++ b/ckan/templates-bs2/package/snippets/package_basic_fields.html @@ -5,8 +5,8 @@ {% endblock %} {% block package_basic_fields_url %} - {% set prefix = h.url_for(controller='package', action='read', id='') %} - {% set domain = h.url_for(controller='package', action='read', id='', qualified=true) %} + {% set prefix = h.url_for('dataset.read', id='') %} + {% set domain = h.url_for('dataset.read', id='', qualified=true) %} {% set domain = domain|replace("http://", "")|replace("https://", "") %} {% set attrs = {'data-module': 'slug-preview-slug', 'data-module-prefix': domain, 'data-module-placeholder': ''} %} diff --git a/ckan/templates-bs2/package/snippets/package_context.html b/ckan/templates-bs2/package/snippets/package_context.html deleted file mode 100644 index ff28ff63c87..00000000000 --- a/ckan/templates-bs2/package/snippets/package_context.html +++ /dev/null @@ -1,17 +0,0 @@ -
          -
          -

          {{ h.dataset_display_name(pkg) }}

          - {% if pkg.notes %} -

          - {{ h.markdown_extract(pkg.notes, 180) }} - {% link_for _('read more'), controller='package', action='about', id=pkg.name %} -

          - {% endif %} -
          -
          -
          {{ _('Resources') }}
          -
          {{ h.SI_number_span(pkg.resources|length) }}
          -
          -
          -
          -
          diff --git a/ckan/templates-bs2/package/snippets/package_form.html b/ckan/templates-bs2/package/snippets/package_form.html index ce53eca3573..82a4ad6b912 100644 --- a/ckan/templates-bs2/package/snippets/package_form.html +++ b/ckan/templates-bs2/package/snippets/package_form.html @@ -1,5 +1,5 @@ {% import 'macros/form.html' as form %} -{% set action = c.form_action or '' %} +{% set action = g.form_action or '' %} {# This provides a full page that renders a form for adding a dataset. It can then itself be extended to add/remove blocks of functionality. #} @@ -14,7 +14,7 @@ {% block errors %}{{ form.errors(error_summary) }}{% endblock %} {% block basic_fields %} - {% snippet 'package/snippets/package_basic_fields.html', data=data, errors=errors, licenses=c.licenses, groups_available=c.groups_available %} + {% snippet 'package/snippets/package_basic_fields.html', data=data, errors=errors %} {% endblock %} {% block metadata_fields %} @@ -36,7 +36,7 @@ {% endblock %} {% block delete_button %} {% if h.check_access('package_delete', {'id': data.id}) and not data.state == 'deleted' %} - {% block delete_button_text %}{{ _('Delete') }}{% endblock %} + {% block delete_button_text %}{{ _('Delete') }}{% endblock %} {% endif %} {% endblock %} {% block save_button %} diff --git a/ckan/templates-bs2/package/snippets/resource_form.html b/ckan/templates-bs2/package/snippets/resource_form.html index a6f6bfcb512..7dac327e794 100644 --- a/ckan/templates-bs2/package/snippets/resource_form.html +++ b/ckan/templates-bs2/package/snippets/resource_form.html @@ -2,7 +2,7 @@ {% set data = data or {} %} {% set errors = errors or {} %} -{% set action = form_action or h.url_for(controller='package', action='new_resource', id=pkg_name) %} +{% set action = form_action or h.url_for('resource.new', id=pkg_name) %}
          {% block stages %} @@ -62,7 +62,7 @@ {% block delete_button %} {% if data.id %} {% if h.check_access('resource_delete', {'id': data.id}) %} - {% block delete_button_text %}{{ _('Delete') }}{% endblock %} + {% block delete_button_text %}{{ _('Delete') }}{% endblock %} {% endif %} {% endif %} {% endblock %} diff --git a/ckan/templates-bs2/package/snippets/resource_item.html b/ckan/templates-bs2/package/snippets/resource_item.html index 63541c2cc64..53265ff57e5 100644 --- a/ckan/templates-bs2/package/snippets/resource_item.html +++ b/ckan/templates-bs2/package/snippets/resource_item.html @@ -1,5 +1,5 @@ -{% set url_action = 'resource_edit' if url_is_edit and can_edit else 'resource_read' %} -{% set url = h.url_for(controller='package', action=url_action, id=pkg.name, resource_id=res.id) %} +{% set url_action = 'resource.edit' if url_is_edit and can_edit else 'resource.read' %} +{% set url = h.url_for(url_action, id=pkg.name, resource_id=res.id) %}
        • {% block resource_item_title %} @@ -51,7 +51,7 @@ {% endif %} {% if can_edit %}
        • - + {{ _('Edit') }} diff --git a/ckan/templates-bs2/package/snippets/resource_view.html b/ckan/templates-bs2/package/snippets/resource_view.html index a19135eaa24..37e9aa2bc83 100644 --- a/ckan/templates-bs2/package/snippets/resource_view.html +++ b/ckan/templates-bs2/package/snippets/resource_view.html @@ -29,28 +29,26 @@

          - - {{ _('Download resource') }} + + {{ _('Download resource') }}

        • {% if not to_preview %} - {% set current_filters = request.str_GET.get('filters') %} - {% if current_filters %} - {% set src = h.url_for(qualified=true, controller='package', - action='resource_view', id=package['name'], - resource_id=resource['id'], - view_id=resource_view['id'], - filters=current_filters) %} - {% else %} - {% set src = h.url_for(qualified=true, controller='package', - action='resource_view', id=package['name'], - resource_id=resource['id'], - view_id=resource_view['id']) %} - {% endif %} + {% set current_filters = request.args.get('filters') %} + {% if current_filters %} + {% set src = h.url_for('resource.view', id=package['name'], + resource_id=resource['id'], + view_id=resource_view['id'], + filters=current_filters, qualified=true) %} + {% else %} + {% set src = h.url_for('resource.view', id=package['name'], + resource_id=resource['id'], + view_id=resource_view['id'], qualified=true) %} + {% endif %} {% else %} - {# When previewing we need to stick the whole resource_view as a param as there is no other way to pass to information on to the iframe #} - {% set src = h.url_for(qualified=true, controller='package', action='resource_view', id=package['name'], resource_id=resource['id']) + '?' + h.urlencode({'resource_view': h.dump_json(resource_view)}) %} + {# When previewing we need to stick the whole resource_view as a param as there is no other way to pass to information on to the iframe #} + {% set src = h.url_for('resource.view', id=package['name'], resource_id=resource['id'], qualified=true) + '?' + h.urlencode({'resource_view': h.dump_json(resource_view)}) %} {% endif %}
          {{ h.linked_user(user_id, maxlength=20) }} @@ -25,10 +25,10 @@

          {{ _('{0} members'.format(c.members|length)) }}

          {{ role }}
          - + {{ _('Edit') }}

          - {{ h.link_to(h.truncate(title, truncate_title), h.url_for(controller='package', action='read', id=package.name)) }} + {{ h.link_to(h.truncate(title, truncate_title), h.url_for('dataset.read', id=package.name)) }} {% if package.get('state', '').startswith('draft') %} {{ _('Draft') }} {% elif package.get('state', '').startswith('deleted') %} diff --git a/ckan/templates-bs2/organization/confirm_delete.html b/ckan/templates-bs2/organization/confirm_delete.html index 6d93e6802cf..53c6179a3f1 100644 --- a/ckan/templates-bs2/organization/confirm_delete.html +++ b/ckan/templates-bs2/organization/confirm_delete.html @@ -10,7 +10,7 @@ {% block form %}

          {{ _('Are you sure you want to delete organization - {name}?').format(name=c.group_dict.name) }}

          - + diff --git a/ckan/templates-bs2/organization/confirm_delete_member.html b/ckan/templates-bs2/organization/confirm_delete_member.html index 1154691c111..581447a30d8 100644 --- a/ckan/templates-bs2/organization/confirm_delete_member.html +++ b/ckan/templates-bs2/organization/confirm_delete_member.html @@ -10,7 +10,7 @@ {% block form %}

          {{ _('Are you sure you want to delete member - {name}?').format(name=c.user_dict.name) }}

          -

          + diff --git a/ckan/templates-bs2/organization/edit_base.html b/ckan/templates-bs2/organization/edit_base.html index de0094042a9..d76741ccc4f 100644 --- a/ckan/templates-bs2/organization/edit_base.html +++ b/ckan/templates-bs2/organization/edit_base.html @@ -5,23 +5,23 @@ {% block subtitle %}{{ c.group_dict.display_name }} - {{ _('Organizations') }}{% endblock %} {% block breadcrumb_content %} -
        • {% link_for _('Organizations'), controller='organization', action='index' %}
        • +
        • {% link_for _('Organizations'), named_route=group_type+'.index' %}
        • {% block breadcrumb_content_inner %} -
        • {% link_for organization.display_name|truncate(35), controller='organization', action='read', id=organization.name %}
        • -
        • {% link_for _('Manage'), controller='organization', action='edit', id=organization.name %}
        • +
        • {% link_for organization.display_name|truncate(35), named_route=group_type+'.read', id=organization.name %}
        • +
        • {% link_for _('Manage'), named_route=group_type+'.edit', id=organization.name %}
        • {% endblock %} {% endblock %} {% block content_action %} {% if organization and h.check_access('organization_update', {'id': organization.id}) %} - {% link_for _('View'), controller='organization', action='read', id=organization.name, class_='btn', icon='eye' %} + {% link_for _('View'), named_route=group_type+'.read', id=organization.name, class_='btn', icon='eye' %} {% endif %} {% endblock %} {% block content_primary_nav %} - {{ h.build_nav_icon('organization_edit', _('Edit'), id=c.group_dict.name) }} - {{ h.build_nav_icon('organization_bulk_process', _('Datasets'), id=c.group_dict.name) }} - {{ h.build_nav_icon('organization_members', _('Members'), id=c.group_dict.name) }} + {{ h.build_nav_icon(group_type + '.edit', _('Edit'), id=c.group_dict.name) }} + {{ h.build_nav_icon(group_type + '.bulk_process', _('Datasets'), id=c.group_dict.name) }} + {{ h.build_nav_icon(group_type + '.members', _('Members'), id=c.group_dict.name) }} {% endblock %} {% block secondary_content %} @@ -31,8 +31,3 @@ {{ super() }} {% endif %} {% endblock %} - -{% block links %} - {{ super() }} - {% include "organization/snippets/feeds.html" %} -{% endblock %} diff --git a/ckan/templates-bs2/organization/index.html b/ckan/templates-bs2/organization/index.html index 4214ce6b165..231b5108876 100644 --- a/ckan/templates-bs2/organization/index.html +++ b/ckan/templates-bs2/organization/index.html @@ -3,38 +3,38 @@ {% block subtitle %}{{ _('Organizations') }}{% endblock %} {% block breadcrumb_content %} -
        • {% link_for _('Organizations'), controller='organization', action='index' %}
        • +
        • {% link_for _('Organizations'), named_route=group_type+'.index' %}
        • {% endblock %} {% block page_header %}{% endblock %} {% block page_primary_action %} {% if h.check_access('organization_create') %} - {% link_for _('Add Organization'), controller='organization', action='new', class_='btn btn-primary', icon='plus-square' %} + {% link_for _('Add Organization'), named_route=group_type+'.new', class_='btn btn-primary', icon='plus-square' %} {% endif %} {% endblock %} {% block primary_content_inner %}

          {% block page_heading %}{{ _('Organizations') }}{% endblock %}

          {% block organizations_search_form %} - {% snippet 'snippets/search_form.html', form_id='organization-search-form', type='organization', query=c.q, sorting_selected=c.sort_by_selected, count=c.page.item_count, placeholder=_('Search organizations...'), show_empty=request.params, no_bottom_border=true if c.page.items, sorting = [(_('Name Ascending'), 'title asc'), (_('Name Descending'), 'title desc')] %} + {% snippet 'snippets/search_form.html', form_id='organization-search-form', type='organization', query=q, sorting_selected=sort_by_selected, count=page.item_count, placeholder=_('Search organizations...'), show_empty=request.params, no_bottom_border=true if page.items, sorting = [(_('Name Ascending'), 'title asc'), (_('Name Descending'), 'title desc')] %} {% endblock %} {% block organizations_list %} - {% if c.page.items or request.params %} - {% if c.page.items %} - {% snippet "organization/snippets/organization_list.html", organizations=c.page.items %} + {% if page.items or request.params %} + {% if page.items %} + {% snippet "organization/snippets/organization_list.html", organizations=page.items %} {% endif %} {% else %}

          {{ _('There are currently no organizations for this site') }}. {% if h.check_access('organization_create') %} - {% link_for _('How about creating one?'), controller='organization', action='new' %}. + {% link_for _('How about creating one?'), named_route=group_type+'.new' %}. {% endif %}

          {% endif %} {% endblock %} {% block page_pagination %} - {{ c.page.pager(q=c.q or '', sort=c.sort_by_selected or '') }} + {{ page.pager(q=q or '', sort=sort_by_selected or '') }} {% endblock %} {% endblock %} diff --git a/ckan/templates-bs2/organization/member_new.html b/ckan/templates-bs2/organization/member_new.html index 9da94a46ab1..aacef9238f3 100644 --- a/ckan/templates-bs2/organization/member_new.html +++ b/ckan/templates-bs2/organization/member_new.html @@ -7,7 +7,7 @@ {% block subtitle %}{{ _('Edit Member') if user else _('Add Member') }} - {{ super() }}{% endblock %} {% block primary_content_inner %} - {% link_for _('Back to all members'), controller='organization', action='members', id=organization.name, class_='btn pull-right', icon='arrow-left' %} + {% link_for _('Back to all members'), named_route=group_type+'.members', id=organization.name, class_='btn pull-right', icon='arrow-left' %}

          {% block page_heading %}{{ _('Edit Member') if user else _('Add Member') }}{% endblock %}

          @@ -56,7 +56,7 @@

          {{ form.select('role', label=_('Role'), options=c.roles, selected=c.user_role, error='', attrs=format_attrs) }}
          {% if user %} - {{ _('Delete') }} + {{ _('Delete') }} diff --git a/ckan/templates-bs2/organization/members.html b/ckan/templates-bs2/organization/members.html index 2f2e8130f42..e3b262b1423 100644 --- a/ckan/templates-bs2/organization/members.html +++ b/ckan/templates-bs2/organization/members.html @@ -5,7 +5,7 @@ {% block page_primary_action %} {% if h.check_access('organization_update', {'id': organization.id}) %} - {% link_for _('Add Member'), controller='organization', action='member_new', id=c.group_dict.id, class_='btn btn-primary', icon='plus-square' %} + {% link_for _('Add Member'), named_route=group_type+'.member_new', id=c.group_dict.id, class_='btn btn-primary', icon='plus-square' %} {% endif %} {% endblock %} @@ -30,10 +30,10 @@

          {{ members_count }}

          {{ role }}